A local-first note taking app
0

Configure Feed

Select the types of activity you want to include in your feed.

Add file creation

Ethan Graf (May 21, 2026, 9:07 PM EDT) 8ed36d7b 459f7d48

+3033 -238
+2218 -68
package-lock.json
··· 20 20 "@libp2p/websockets": "^9.2.19", 21 21 "@libp2p/webtransport": "^5.0.41", 22 22 "@multiformats/multiaddr": "^12.5.1", 23 + "@tanstack/react-query": "^5.100.11", 23 24 "@tiptap/extension-collaboration": "^3.23.4", 24 25 "@tiptap/extension-collaboration-caret": "^3.23.4", 25 26 "@tiptap/extension-placeholder": "^3.23.4", ··· 67 68 "typescript": "~6.0.3", 68 69 "vite": "^8.0.10", 69 70 "vitest": "^4.1.5" 71 + } 72 + }, 73 + "node_modules/@babel/code-frame": { 74 + "version": "7.29.0", 75 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", 76 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", 77 + "license": "MIT", 78 + "peer": true, 79 + "dependencies": { 80 + "@babel/helper-validator-identifier": "^7.28.5", 81 + "js-tokens": "^4.0.0", 82 + "picocolors": "^1.1.1" 83 + }, 84 + "engines": { 85 + "node": ">=6.9.0" 86 + } 87 + }, 88 + "node_modules/@babel/compat-data": { 89 + "version": "7.29.3", 90 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", 91 + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", 92 + "license": "MIT", 93 + "peer": true, 94 + "engines": { 95 + "node": ">=6.9.0" 96 + } 97 + }, 98 + "node_modules/@babel/core": { 99 + "version": "7.29.0", 100 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", 101 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", 102 + "license": "MIT", 103 + "peer": true, 104 + "dependencies": { 105 + "@babel/code-frame": "^7.29.0", 106 + "@babel/generator": "^7.29.0", 107 + "@babel/helper-compilation-targets": "^7.28.6", 108 + "@babel/helper-module-transforms": "^7.28.6", 109 + "@babel/helpers": "^7.28.6", 110 + "@babel/parser": "^7.29.0", 111 + "@babel/template": "^7.28.6", 112 + "@babel/traverse": "^7.29.0", 113 + "@babel/types": "^7.29.0", 114 + "@jridgewell/remapping": "^2.3.5", 115 + "convert-source-map": "^2.0.0", 116 + "debug": "^4.1.0", 117 + "gensync": "^1.0.0-beta.2", 118 + "json5": "^2.2.3", 119 + "semver": "^6.3.1" 120 + }, 121 + "engines": { 122 + "node": ">=6.9.0" 123 + }, 124 + "funding": { 125 + "type": "opencollective", 126 + "url": "https://opencollective.com/babel" 127 + } 128 + }, 129 + "node_modules/@babel/core/node_modules/json5": { 130 + "version": "2.2.3", 131 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 132 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 133 + "license": "MIT", 134 + "peer": true, 135 + "bin": { 136 + "json5": "lib/cli.js" 137 + }, 138 + "engines": { 139 + "node": ">=6" 140 + } 141 + }, 142 + "node_modules/@babel/core/node_modules/semver": { 143 + "version": "6.3.1", 144 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 145 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 146 + "license": "ISC", 147 + "peer": true, 148 + "bin": { 149 + "semver": "bin/semver.js" 150 + } 151 + }, 152 + "node_modules/@babel/generator": { 153 + "version": "7.29.1", 154 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", 155 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", 156 + "license": "MIT", 157 + "peer": true, 158 + "dependencies": { 159 + "@babel/parser": "^7.29.0", 160 + "@babel/types": "^7.29.0", 161 + "@jridgewell/gen-mapping": "^0.3.12", 162 + "@jridgewell/trace-mapping": "^0.3.28", 163 + "jsesc": "^3.0.2" 164 + }, 165 + "engines": { 166 + "node": ">=6.9.0" 167 + } 168 + }, 169 + "node_modules/@babel/helper-compilation-targets": { 170 + "version": "7.28.6", 171 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", 172 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", 173 + "license": "MIT", 174 + "peer": true, 175 + "dependencies": { 176 + "@babel/compat-data": "^7.28.6", 177 + "@babel/helper-validator-option": "^7.27.1", 178 + "browserslist": "^4.24.0", 179 + "lru-cache": "^5.1.1", 180 + "semver": "^6.3.1" 181 + }, 182 + "engines": { 183 + "node": ">=6.9.0" 184 + } 185 + }, 186 + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { 187 + "version": "5.1.1", 188 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 189 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 190 + "license": "ISC", 191 + "peer": true, 192 + "dependencies": { 193 + "yallist": "^3.0.2" 194 + } 195 + }, 196 + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { 197 + "version": "6.3.1", 198 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 199 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 200 + "license": "ISC", 201 + "peer": true, 202 + "bin": { 203 + "semver": "bin/semver.js" 204 + } 205 + }, 206 + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { 207 + "version": "3.1.1", 208 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 209 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 210 + "license": "ISC", 211 + "peer": true 212 + }, 213 + "node_modules/@babel/helper-globals": { 214 + "version": "7.28.0", 215 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 216 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 217 + "license": "MIT", 218 + "peer": true, 219 + "engines": { 220 + "node": ">=6.9.0" 221 + } 222 + }, 223 + "node_modules/@babel/helper-module-imports": { 224 + "version": "7.28.6", 225 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", 226 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", 227 + "license": "MIT", 228 + "peer": true, 229 + "dependencies": { 230 + "@babel/traverse": "^7.28.6", 231 + "@babel/types": "^7.28.6" 232 + }, 233 + "engines": { 234 + "node": ">=6.9.0" 235 + } 236 + }, 237 + "node_modules/@babel/helper-module-transforms": { 238 + "version": "7.28.6", 239 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", 240 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", 241 + "license": "MIT", 242 + "peer": true, 243 + "dependencies": { 244 + "@babel/helper-module-imports": "^7.28.6", 245 + "@babel/helper-validator-identifier": "^7.28.5", 246 + "@babel/traverse": "^7.28.6" 247 + }, 248 + "engines": { 249 + "node": ">=6.9.0" 250 + }, 251 + "peerDependencies": { 252 + "@babel/core": "^7.0.0" 253 + } 254 + }, 255 + "node_modules/@babel/helper-string-parser": { 256 + "version": "7.27.1", 257 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 258 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 259 + "license": "MIT", 260 + "peer": true, 261 + "engines": { 262 + "node": ">=6.9.0" 263 + } 264 + }, 265 + "node_modules/@babel/helper-validator-identifier": { 266 + "version": "7.28.5", 267 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 268 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 269 + "license": "MIT", 270 + "peer": true, 271 + "engines": { 272 + "node": ">=6.9.0" 273 + } 274 + }, 275 + "node_modules/@babel/helper-validator-option": { 276 + "version": "7.27.1", 277 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 278 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 279 + "license": "MIT", 280 + "peer": true, 281 + "engines": { 282 + "node": ">=6.9.0" 283 + } 284 + }, 285 + "node_modules/@babel/helpers": { 286 + "version": "7.29.2", 287 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", 288 + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", 289 + "license": "MIT", 290 + "peer": true, 291 + "dependencies": { 292 + "@babel/template": "^7.28.6", 293 + "@babel/types": "^7.29.0" 294 + }, 295 + "engines": { 296 + "node": ">=6.9.0" 297 + } 298 + }, 299 + "node_modules/@babel/parser": { 300 + "version": "7.29.3", 301 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", 302 + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", 303 + "license": "MIT", 304 + "peer": true, 305 + "dependencies": { 306 + "@babel/types": "^7.29.0" 307 + }, 308 + "bin": { 309 + "parser": "bin/babel-parser.js" 310 + }, 311 + "engines": { 312 + "node": ">=6.0.0" 313 + } 314 + }, 315 + "node_modules/@babel/runtime": { 316 + "version": "7.29.2", 317 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", 318 + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", 319 + "license": "MIT", 320 + "peer": true, 321 + "engines": { 322 + "node": ">=6.9.0" 323 + } 324 + }, 325 + "node_modules/@babel/template": { 326 + "version": "7.28.6", 327 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", 328 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", 329 + "license": "MIT", 330 + "peer": true, 331 + "dependencies": { 332 + "@babel/code-frame": "^7.28.6", 333 + "@babel/parser": "^7.28.6", 334 + "@babel/types": "^7.28.6" 335 + }, 336 + "engines": { 337 + "node": ">=6.9.0" 338 + } 339 + }, 340 + "node_modules/@babel/traverse": { 341 + "version": "7.29.0", 342 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", 343 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", 344 + "license": "MIT", 345 + "peer": true, 346 + "dependencies": { 347 + "@babel/code-frame": "^7.29.0", 348 + "@babel/generator": "^7.29.0", 349 + "@babel/helper-globals": "^7.28.0", 350 + "@babel/parser": "^7.29.0", 351 + "@babel/template": "^7.28.6", 352 + "@babel/types": "^7.29.0", 353 + "debug": "^4.3.1" 354 + }, 355 + "engines": { 356 + "node": ">=6.9.0" 357 + } 358 + }, 359 + "node_modules/@babel/types": { 360 + "version": "7.29.0", 361 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", 362 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", 363 + "license": "MIT", 364 + "peer": true, 365 + "dependencies": { 366 + "@babel/helper-string-parser": "^7.27.1", 367 + "@babel/helper-validator-identifier": "^7.28.5" 368 + }, 369 + "engines": { 370 + "node": ">=6.9.0" 70 371 } 71 372 }, 72 373 "node_modules/@chainsafe/as-chacha20poly1305": { ··· 1611 1912 "node": ">=18.20.0" 1612 1913 } 1613 1914 }, 1915 + "node_modules/@isaacs/ttlcache": { 1916 + "version": "1.4.1", 1917 + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", 1918 + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", 1919 + "license": "ISC", 1920 + "peer": true, 1921 + "engines": { 1922 + "node": ">=12" 1923 + } 1924 + }, 1925 + "node_modules/@jest/schemas": { 1926 + "version": "29.6.3", 1927 + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", 1928 + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", 1929 + "license": "MIT", 1930 + "peer": true, 1931 + "dependencies": { 1932 + "@sinclair/typebox": "^0.27.8" 1933 + }, 1934 + "engines": { 1935 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1936 + } 1937 + }, 1938 + "node_modules/@jest/types": { 1939 + "version": "29.6.3", 1940 + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", 1941 + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", 1942 + "license": "MIT", 1943 + "peer": true, 1944 + "dependencies": { 1945 + "@jest/schemas": "^29.6.3", 1946 + "@types/istanbul-lib-coverage": "^2.0.0", 1947 + "@types/istanbul-reports": "^3.0.0", 1948 + "@types/node": "*", 1949 + "@types/yargs": "^17.0.8", 1950 + "chalk": "^4.0.0" 1951 + }, 1952 + "engines": { 1953 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1954 + } 1955 + }, 1614 1956 "node_modules/@jridgewell/gen-mapping": { 1615 1957 "version": "0.3.13", 1616 1958 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 1617 1959 "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 1618 - "dev": true, 1619 1960 "license": "MIT", 1620 1961 "dependencies": { 1621 1962 "@jridgewell/sourcemap-codec": "^1.5.0", ··· 1626 1967 "version": "2.3.5", 1627 1968 "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 1628 1969 "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 1629 - "dev": true, 1630 1970 "license": "MIT", 1631 1971 "dependencies": { 1632 1972 "@jridgewell/gen-mapping": "^0.3.5", ··· 1637 1977 "version": "3.1.2", 1638 1978 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1639 1979 "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1640 - "dev": true, 1641 1980 "license": "MIT", 1642 1981 "engines": { 1643 1982 "node": ">=6.0.0" ··· 1647 1986 "version": "0.3.11", 1648 1987 "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", 1649 1988 "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", 1650 - "dev": true, 1651 1989 "license": "MIT", 1652 1990 "dependencies": { 1653 1991 "@jridgewell/gen-mapping": "^0.3.5", ··· 1658 1996 "version": "1.5.5", 1659 1997 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 1660 1998 "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 1661 - "dev": true, 1662 1999 "license": "MIT" 1663 2000 }, 1664 2001 "node_modules/@jridgewell/trace-mapping": { 1665 2002 "version": "0.3.31", 1666 2003 "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 1667 2004 "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 1668 - "dev": true, 1669 2005 "license": "MIT", 1670 2006 "dependencies": { 1671 2007 "@jridgewell/resolve-uri": "^3.1.0", ··· 2755 3091 "node": ">=20.0.0" 2756 3092 } 2757 3093 }, 3094 + "node_modules/@react-native/assets-registry": { 3095 + "version": "0.85.3", 3096 + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.3.tgz", 3097 + "integrity": "sha512-u9ZiYP23vA2IFtdFQFmetzSmk6SM0xgKIoiOsr1hXNHjHaLhOm+/Ph1ud57wX6+Dbwdzx8coJgnzSKL3W21PCg==", 3098 + "license": "MIT", 3099 + "peer": true, 3100 + "engines": { 3101 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3102 + } 3103 + }, 3104 + "node_modules/@react-native/codegen": { 3105 + "version": "0.85.3", 3106 + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.3.tgz", 3107 + "integrity": "sha512-/JkS1lGLyzBWP1FbgDwaqEf7qShIC6pUC1M0a/YMAd/v4iqR24MRkQWe7jkYvcBQ2LpEhs5NGE9InhxSv21zCA==", 3108 + "license": "MIT", 3109 + "peer": true, 3110 + "dependencies": { 3111 + "@babel/core": "^7.25.2", 3112 + "@babel/parser": "^7.29.0", 3113 + "hermes-parser": "0.33.3", 3114 + "invariant": "^2.2.4", 3115 + "nullthrows": "^1.1.1", 3116 + "tinyglobby": "^0.2.15", 3117 + "yargs": "^17.6.2" 3118 + }, 3119 + "engines": { 3120 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3121 + }, 3122 + "peerDependencies": { 3123 + "@babel/core": "*" 3124 + } 3125 + }, 3126 + "node_modules/@react-native/community-cli-plugin": { 3127 + "version": "0.85.3", 3128 + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.3.tgz", 3129 + "integrity": "sha512-fs85dmbIqNmtzEixDb0g+q6R3Vt4H9eAt8/inIZdDKfjN76+sUJA2r1nxODQ76bU23MrIbz8sI7KFBPaWk/zQw==", 3130 + "license": "MIT", 3131 + "peer": true, 3132 + "dependencies": { 3133 + "@react-native/dev-middleware": "0.85.3", 3134 + "debug": "^4.4.0", 3135 + "invariant": "^2.2.4", 3136 + "metro": "^0.84.3", 3137 + "metro-config": "^0.84.3", 3138 + "metro-core": "^0.84.3", 3139 + "semver": "^7.1.3" 3140 + }, 3141 + "engines": { 3142 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3143 + }, 3144 + "peerDependencies": { 3145 + "@react-native-community/cli": "*", 3146 + "@react-native/metro-config": "0.85.3" 3147 + }, 3148 + "peerDependenciesMeta": { 3149 + "@react-native-community/cli": { 3150 + "optional": true 3151 + }, 3152 + "@react-native/metro-config": { 3153 + "optional": true 3154 + } 3155 + } 3156 + }, 3157 + "node_modules/@react-native/debugger-frontend": { 3158 + "version": "0.85.3", 3159 + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.3.tgz", 3160 + "integrity": "sha512-uAu7rM5o/Np1zgp6fi5zM1sP1aB8DcS7DdOLcj/TkSutOAjkMqqd2lWt1/+3S7qXexRHVK5XcP+o3VXo4L/V0A==", 3161 + "license": "BSD-3-Clause", 3162 + "peer": true, 3163 + "engines": { 3164 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3165 + } 3166 + }, 3167 + "node_modules/@react-native/debugger-shell": { 3168 + "version": "0.85.3", 3169 + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.3.tgz", 3170 + "integrity": "sha512-/jRAaT9boiCttIcEwS02WPwYkUihqsjSaK/TMtHz05vT6uMgac9PaQt5kzBQLIABv5aEIa5gtrMmKVz49MjkjQ==", 3171 + "license": "MIT", 3172 + "peer": true, 3173 + "dependencies": { 3174 + "cross-spawn": "^7.0.6", 3175 + "debug": "^4.4.0", 3176 + "fb-dotslash": "0.5.8" 3177 + }, 3178 + "engines": { 3179 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3180 + } 3181 + }, 3182 + "node_modules/@react-native/dev-middleware": { 3183 + "version": "0.85.3", 3184 + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.3.tgz", 3185 + "integrity": "sha512-JYzBiT4A8w+KQt+dOD5v+ti+tDrGoPnsSTuApq3Ls4RB5sfWbDlYMyz3dbc8qBIHz9tv0sQ5+eOu6Xwqzr5AQA==", 3186 + "license": "MIT", 3187 + "peer": true, 3188 + "dependencies": { 3189 + "@isaacs/ttlcache": "^1.4.1", 3190 + "@react-native/debugger-frontend": "0.85.3", 3191 + "@react-native/debugger-shell": "0.85.3", 3192 + "chrome-launcher": "^0.15.2", 3193 + "chromium-edge-launcher": "^0.3.0", 3194 + "connect": "^3.6.5", 3195 + "debug": "^4.4.0", 3196 + "invariant": "^2.2.4", 3197 + "nullthrows": "^1.1.1", 3198 + "open": "^7.0.3", 3199 + "serve-static": "^1.16.2", 3200 + "ws": "^7.5.10" 3201 + }, 3202 + "engines": { 3203 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3204 + } 3205 + }, 3206 + "node_modules/@react-native/dev-middleware/node_modules/ws": { 3207 + "version": "7.5.10", 3208 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 3209 + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 3210 + "license": "MIT", 3211 + "peer": true, 3212 + "engines": { 3213 + "node": ">=8.3.0" 3214 + }, 3215 + "peerDependencies": { 3216 + "bufferutil": "^4.0.1", 3217 + "utf-8-validate": "^5.0.2" 3218 + }, 3219 + "peerDependenciesMeta": { 3220 + "bufferutil": { 3221 + "optional": true 3222 + }, 3223 + "utf-8-validate": { 3224 + "optional": true 3225 + } 3226 + } 3227 + }, 3228 + "node_modules/@react-native/gradle-plugin": { 3229 + "version": "0.85.3", 3230 + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.3.tgz", 3231 + "integrity": "sha512-39dY2j50Q1pntejzwt3XL7vwXtrj8jcIfHq6E+gyu3jzYxZJVvMkMutQ39vSg6zinIQOX36oQDhidXUbCXzgoA==", 3232 + "license": "MIT", 3233 + "peer": true, 3234 + "engines": { 3235 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3236 + } 3237 + }, 3238 + "node_modules/@react-native/js-polyfills": { 3239 + "version": "0.85.3", 3240 + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.3.tgz", 3241 + "integrity": "sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==", 3242 + "license": "MIT", 3243 + "peer": true, 3244 + "engines": { 3245 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3246 + } 3247 + }, 3248 + "node_modules/@react-native/normalize-colors": { 3249 + "version": "0.85.3", 3250 + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.3.tgz", 3251 + "integrity": "sha512-hj0PScZEhIbcOvQV5yMKX3ha4XEIOy/SVE1Rrpp0beW0dpNLOgSC7KDxGewmDnIHK9YdQUXGY9eMEfShUMIaZw==", 3252 + "license": "MIT", 3253 + "peer": true 3254 + }, 3255 + "node_modules/@react-native/virtualized-lists": { 3256 + "version": "0.85.3", 3257 + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.3.tgz", 3258 + "integrity": "sha512-dsCjI//OIPEUJMyNHp4l7zNLVjCx7bcaRUceOCkU+IB17hkbtbGWvi7HjGFSzy7FJGmS/MOlcfpb72xXiy1Oig==", 3259 + "license": "MIT", 3260 + "peer": true, 3261 + "dependencies": { 3262 + "invariant": "^2.2.4", 3263 + "nullthrows": "^1.1.1" 3264 + }, 3265 + "engines": { 3266 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 3267 + }, 3268 + "peerDependencies": { 3269 + "@types/react": "^19.2.0", 3270 + "react": "*", 3271 + "react-native": "0.85.3" 3272 + }, 3273 + "peerDependenciesMeta": { 3274 + "@types/react": { 3275 + "optional": true 3276 + } 3277 + } 3278 + }, 2758 3279 "node_modules/@rolldown/binding-android-arm64": { 2759 3280 "version": "1.0.0-rc.17", 2760 3281 "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", ··· 3025 3546 "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", 3026 3547 "dev": true, 3027 3548 "license": "MIT" 3549 + }, 3550 + "node_modules/@sinclair/typebox": { 3551 + "version": "0.27.10", 3552 + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", 3553 + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", 3554 + "license": "MIT", 3555 + "peer": true 3028 3556 }, 3029 3557 "node_modules/@sindresorhus/fnv1a": { 3030 3558 "version": "3.1.0", ··· 3341 3869 }, 3342 3870 "peerDependencies": { 3343 3871 "vite": "^5.2.0 || ^6 || ^7 || ^8" 3872 + } 3873 + }, 3874 + "node_modules/@tanstack/query-core": { 3875 + "version": "5.100.11", 3876 + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.11.tgz", 3877 + "integrity": "sha512-lmE0994apShXPj8CUxgx4ch5yUJhE9k/+tVwihBvPOyerACWdBocfFg24t8+0RhtlTd7tEgchDkhlCxNssvDxw==", 3878 + "license": "MIT", 3879 + "funding": { 3880 + "type": "github", 3881 + "url": "https://github.com/sponsors/tannerlinsley" 3882 + } 3883 + }, 3884 + "node_modules/@tanstack/react-query": { 3885 + "version": "5.100.11", 3886 + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.11.tgz", 3887 + "integrity": "sha512-J0f9s5x3LE1450nNNfYx+e/n0DMa0uOBdFJUy5r0RvmsXd4nB/n0rbHtHI1vYXhikNFan+wf51p6Tmp4c8ucrg==", 3888 + "license": "MIT", 3889 + "dependencies": { 3890 + "@tanstack/query-core": "5.100.11" 3891 + }, 3892 + "funding": { 3893 + "type": "github", 3894 + "url": "https://github.com/sponsors/tannerlinsley" 3895 + }, 3896 + "peerDependencies": { 3897 + "react": "^18 || ^19" 3344 3898 } 3345 3899 }, 3346 3900 "node_modules/@tiptap/core": { ··· 3958 4512 "dev": true, 3959 4513 "license": "MIT" 3960 4514 }, 4515 + "node_modules/@types/istanbul-lib-coverage": { 4516 + "version": "2.0.6", 4517 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", 4518 + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", 4519 + "license": "MIT", 4520 + "peer": true 4521 + }, 4522 + "node_modules/@types/istanbul-lib-report": { 4523 + "version": "3.0.3", 4524 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", 4525 + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", 4526 + "license": "MIT", 4527 + "peer": true, 4528 + "dependencies": { 4529 + "@types/istanbul-lib-coverage": "*" 4530 + } 4531 + }, 4532 + "node_modules/@types/istanbul-reports": { 4533 + "version": "3.0.4", 4534 + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", 4535 + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", 4536 + "license": "MIT", 4537 + "peer": true, 4538 + "dependencies": { 4539 + "@types/istanbul-lib-report": "*" 4540 + } 4541 + }, 3961 4542 "node_modules/@types/json-schema": { 3962 4543 "version": "7.0.15", 3963 4544 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", ··· 4005 4586 "version": "19.2.14", 4006 4587 "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", 4007 4588 "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", 4008 - "dev": true, 4009 4589 "license": "MIT", 4010 4590 "dependencies": { 4011 4591 "csstype": "^3.2.2" ··· 4015 4595 "version": "19.2.3", 4016 4596 "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", 4017 4597 "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", 4018 - "dev": true, 4019 4598 "license": "MIT", 4020 4599 "peerDependencies": { 4021 4600 "@types/react": "^19.2.0" ··· 4058 4637 "dependencies": { 4059 4638 "@types/node": "*" 4060 4639 } 4640 + }, 4641 + "node_modules/@types/yargs": { 4642 + "version": "17.0.35", 4643 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", 4644 + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", 4645 + "license": "MIT", 4646 + "peer": true, 4647 + "dependencies": { 4648 + "@types/yargs-parser": "*" 4649 + } 4650 + }, 4651 + "node_modules/@types/yargs-parser": { 4652 + "version": "21.0.3", 4653 + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", 4654 + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", 4655 + "license": "MIT", 4656 + "peer": true 4061 4657 }, 4062 4658 "node_modules/@types/yauzl": { 4063 4659 "version": "2.10.3", ··· 4986 5582 "dev": true, 4987 5583 "license": "ISC" 4988 5584 }, 5585 + "node_modules/abort-controller": { 5586 + "version": "3.0.0", 5587 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 5588 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 5589 + "license": "MIT", 5590 + "peer": true, 5591 + "dependencies": { 5592 + "event-target-shim": "^5.0.0" 5593 + }, 5594 + "engines": { 5595 + "node": ">=6.5" 5596 + } 5597 + }, 5598 + "node_modules/abort-controller/node_modules/event-target-shim": { 5599 + "version": "5.0.1", 5600 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 5601 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 5602 + "license": "MIT", 5603 + "peer": true, 5604 + "engines": { 5605 + "node": ">=6" 5606 + } 5607 + }, 4989 5608 "node_modules/abort-error": { 4990 5609 "version": "1.0.2", 4991 5610 "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.2.tgz", 4992 5611 "integrity": "sha512-lVgvB2NyPLqbXXhVmXcYFTC1x5K7CiVdPgdY7LGgFQWC8506oN01sPN3i9cl9ynuwF4iJ0TS9exnR7cZ9FuX4w==", 4993 5612 "license": "Apache-2.0 OR MIT" 4994 5613 }, 5614 + "node_modules/accepts": { 5615 + "version": "2.0.0", 5616 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 5617 + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 5618 + "license": "MIT", 5619 + "peer": true, 5620 + "dependencies": { 5621 + "mime-types": "^3.0.0", 5622 + "negotiator": "^1.0.0" 5623 + }, 5624 + "engines": { 5625 + "node": ">= 0.6" 5626 + } 5627 + }, 5628 + "node_modules/accepts/node_modules/negotiator": { 5629 + "version": "1.0.0", 5630 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 5631 + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 5632 + "license": "MIT", 5633 + "peer": true, 5634 + "engines": { 5635 + "node": ">= 0.6" 5636 + } 5637 + }, 4995 5638 "node_modules/acorn": { 4996 5639 "version": "8.16.0", 4997 5640 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", 4998 5641 "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", 4999 - "dev": true, 5000 5642 "license": "MIT", 5001 5643 "bin": { 5002 5644 "acorn": "bin/acorn" ··· 5127 5769 "dev": true, 5128 5770 "license": "MIT" 5129 5771 }, 5772 + "node_modules/anser": { 5773 + "version": "1.4.10", 5774 + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", 5775 + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", 5776 + "license": "MIT", 5777 + "peer": true 5778 + }, 5130 5779 "node_modules/ansi-escapes": { 5131 5780 "version": "5.0.0", 5132 5781 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", ··· 5160 5809 "version": "5.0.1", 5161 5810 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 5162 5811 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 5163 - "dev": true, 5164 5812 "license": "MIT", 5165 5813 "engines": { 5166 5814 "node": ">=8" ··· 5170 5818 "version": "4.3.0", 5171 5819 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 5172 5820 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 5173 - "dev": true, 5174 5821 "license": "MIT", 5175 5822 "dependencies": { 5176 5823 "color-convert": "^2.0.1" ··· 5321 5968 "url": "https://github.com/sponsors/ljharb" 5322 5969 } 5323 5970 }, 5971 + "node_modules/asap": { 5972 + "version": "2.0.6", 5973 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 5974 + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", 5975 + "license": "MIT", 5976 + "peer": true 5977 + }, 5324 5978 "node_modules/asn1js": { 5325 5979 "version": "3.0.10", 5326 5980 "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", ··· 5391 6045 "url": "https://github.com/sponsors/ljharb" 5392 6046 } 5393 6047 }, 6048 + "node_modules/babel-plugin-syntax-hermes-parser": { 6049 + "version": "0.33.3", 6050 + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz", 6051 + "integrity": "sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==", 6052 + "license": "MIT", 6053 + "peer": true, 6054 + "dependencies": { 6055 + "hermes-parser": "0.33.3" 6056 + } 6057 + }, 5394 6058 "node_modules/balanced-match": { 5395 6059 "version": "1.0.2", 5396 6060 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ··· 5422 6086 "version": "2.10.27", 5423 6087 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", 5424 6088 "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", 5425 - "dev": true, 5426 6089 "license": "Apache-2.0", 5427 6090 "bin": { 5428 6091 "baseline-browser-mapping": "dist/cli.cjs" ··· 5473 6136 "version": "3.0.3", 5474 6137 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 5475 6138 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 5476 - "dev": true, 5477 6139 "license": "MIT", 5478 6140 "dependencies": { 5479 6141 "fill-range": "^7.1.1" ··· 5486 6148 "version": "4.28.2", 5487 6149 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", 5488 6150 "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", 5489 - "dev": true, 5490 6151 "funding": [ 5491 6152 { 5492 6153 "type": "opencollective", ··· 5514 6175 }, 5515 6176 "engines": { 5516 6177 "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 6178 + } 6179 + }, 6180 + "node_modules/bser": { 6181 + "version": "2.1.1", 6182 + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 6183 + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 6184 + "license": "Apache-2.0", 6185 + "peer": true, 6186 + "dependencies": { 6187 + "node-int64": "^0.4.0" 5517 6188 } 5518 6189 }, 5519 6190 "node_modules/buffer": { ··· 5554 6225 "version": "1.1.2", 5555 6226 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 5556 6227 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 5557 - "dev": true, 5558 6228 "license": "MIT" 5559 6229 }, 5560 6230 "node_modules/cacache": { ··· 5720 6390 "node": ">=6" 5721 6391 } 5722 6392 }, 6393 + "node_modules/camelcase": { 6394 + "version": "6.3.0", 6395 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 6396 + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 6397 + "license": "MIT", 6398 + "peer": true, 6399 + "engines": { 6400 + "node": ">=10" 6401 + }, 6402 + "funding": { 6403 + "url": "https://github.com/sponsors/sindresorhus" 6404 + } 6405 + }, 5723 6406 "node_modules/caniuse-lite": { 5724 6407 "version": "1.0.30001791", 5725 6408 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", 5726 6409 "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", 5727 - "dev": true, 5728 6410 "funding": [ 5729 6411 { 5730 6412 "type": "opencollective", ··· 5755 6437 "version": "4.1.2", 5756 6438 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 5757 6439 "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 5758 - "dev": true, 5759 6440 "license": "MIT", 5760 6441 "dependencies": { 5761 6442 "ansi-styles": "^4.1.0", ··· 5785 6466 "node": ">=10" 5786 6467 } 5787 6468 }, 6469 + "node_modules/chrome-launcher": { 6470 + "version": "0.15.2", 6471 + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", 6472 + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", 6473 + "license": "Apache-2.0", 6474 + "peer": true, 6475 + "dependencies": { 6476 + "@types/node": "*", 6477 + "escape-string-regexp": "^4.0.0", 6478 + "is-wsl": "^2.2.0", 6479 + "lighthouse-logger": "^1.0.0" 6480 + }, 6481 + "bin": { 6482 + "print-chrome-path": "bin/print-chrome-path.js" 6483 + }, 6484 + "engines": { 6485 + "node": ">=12.13.0" 6486 + } 6487 + }, 5788 6488 "node_modules/chrome-trace-event": { 5789 6489 "version": "1.0.4", 5790 6490 "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", ··· 5794 6494 "engines": { 5795 6495 "node": ">=6.0" 5796 6496 } 6497 + }, 6498 + "node_modules/chromium-edge-launcher": { 6499 + "version": "0.3.0", 6500 + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", 6501 + "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", 6502 + "license": "Apache-2.0", 6503 + "peer": true, 6504 + "dependencies": { 6505 + "@types/node": "*", 6506 + "escape-string-regexp": "^4.0.0", 6507 + "is-wsl": "^2.2.0", 6508 + "lighthouse-logger": "^1.0.0", 6509 + "mkdirp": "^1.0.4" 6510 + } 6511 + }, 6512 + "node_modules/ci-info": { 6513 + "version": "2.0.0", 6514 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 6515 + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", 6516 + "license": "MIT", 6517 + "peer": true 5797 6518 }, 5798 6519 "node_modules/clean-stack": { 5799 6520 "version": "2.2.0", ··· 5865 6586 "version": "8.0.1", 5866 6587 "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 5867 6588 "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 5868 - "dev": true, 5869 6589 "license": "ISC", 5870 6590 "dependencies": { 5871 6591 "string-width": "^4.2.0", ··· 5880 6600 "version": "8.0.0", 5881 6601 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 5882 6602 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 5883 - "dev": true, 5884 6603 "license": "MIT" 5885 6604 }, 5886 6605 "node_modules/cliui/node_modules/is-fullwidth-code-point": { 5887 6606 "version": "3.0.0", 5888 6607 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 5889 6608 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 5890 - "dev": true, 5891 6609 "license": "MIT", 5892 6610 "engines": { 5893 6611 "node": ">=8" ··· 5897 6615 "version": "4.2.3", 5898 6616 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 5899 6617 "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 5900 - "dev": true, 5901 6618 "license": "MIT", 5902 6619 "dependencies": { 5903 6620 "emoji-regex": "^8.0.0", ··· 5912 6629 "version": "7.0.0", 5913 6630 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 5914 6631 "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 5915 - "dev": true, 5916 6632 "license": "MIT", 5917 6633 "dependencies": { 5918 6634 "ansi-styles": "^4.0.0", ··· 5953 6669 "version": "2.0.1", 5954 6670 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 5955 6671 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 5956 - "dev": true, 5957 6672 "license": "MIT", 5958 6673 "dependencies": { 5959 6674 "color-name": "~1.1.4" ··· 5966 6681 "version": "1.1.4", 5967 6682 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 5968 6683 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 5969 - "dev": true, 5970 6684 "license": "MIT" 5971 6685 }, 5972 6686 "node_modules/colorette": { ··· 6003 6717 "dev": true, 6004 6718 "license": "MIT" 6005 6719 }, 6720 + "node_modules/connect": { 6721 + "version": "3.7.0", 6722 + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", 6723 + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", 6724 + "license": "MIT", 6725 + "peer": true, 6726 + "dependencies": { 6727 + "debug": "2.6.9", 6728 + "finalhandler": "1.1.2", 6729 + "parseurl": "~1.3.3", 6730 + "utils-merge": "1.0.1" 6731 + }, 6732 + "engines": { 6733 + "node": ">= 0.10.0" 6734 + } 6735 + }, 6736 + "node_modules/connect/node_modules/debug": { 6737 + "version": "2.6.9", 6738 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 6739 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 6740 + "license": "MIT", 6741 + "peer": true, 6742 + "dependencies": { 6743 + "ms": "2.0.0" 6744 + } 6745 + }, 6746 + "node_modules/connect/node_modules/ms": { 6747 + "version": "2.0.0", 6748 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 6749 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 6750 + "license": "MIT", 6751 + "peer": true 6752 + }, 6006 6753 "node_modules/convert-source-map": { 6007 6754 "version": "2.0.0", 6008 6755 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 6009 6756 "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 6010 - "dev": true, 6011 6757 "license": "MIT" 6012 6758 }, 6013 6759 "node_modules/cookie": { ··· 6034 6780 "version": "7.0.6", 6035 6781 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 6036 6782 "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 6037 - "dev": true, 6038 6783 "license": "MIT", 6039 6784 "dependencies": { 6040 6785 "path-key": "^3.1.0", ··· 6073 6818 "version": "3.2.3", 6074 6819 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 6075 6820 "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 6076 - "dev": true, 6077 6821 "license": "MIT" 6078 6822 }, 6079 6823 "node_modules/data-view-buffer": { ··· 6152 6896 "version": "4.4.3", 6153 6897 "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 6154 6898 "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 6155 - "dev": true, 6156 6899 "license": "MIT", 6157 6900 "dependencies": { 6158 6901 "ms": "^2.1.3" ··· 6289 7032 "node": ">=0.10" 6290 7033 } 6291 7034 }, 7035 + "node_modules/depd": { 7036 + "version": "2.0.0", 7037 + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 7038 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 7039 + "license": "MIT", 7040 + "peer": true, 7041 + "engines": { 7042 + "node": ">= 0.8" 7043 + } 7044 + }, 7045 + "node_modules/destroy": { 7046 + "version": "1.2.0", 7047 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 7048 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 7049 + "license": "MIT", 7050 + "peer": true, 7051 + "engines": { 7052 + "node": ">= 0.8", 7053 + "npm": "1.2.8000 || >= 1.4.16" 7054 + } 7055 + }, 6292 7056 "node_modules/detect-browser": { 6293 7057 "version": "5.3.0", 6294 7058 "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", ··· 6357 7121 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 6358 7122 "dev": true, 6359 7123 "license": "MIT" 7124 + }, 7125 + "node_modules/ee-first": { 7126 + "version": "1.1.1", 7127 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 7128 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 7129 + "license": "MIT", 7130 + "peer": true 6360 7131 }, 6361 7132 "node_modules/electron": { 6362 7133 "version": "41.5.0", ··· 6807 7578 "version": "1.5.350", 6808 7579 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.350.tgz", 6809 7580 "integrity": "sha512-/KWD4qK8nMqIoJh35Rpc37fiVyOe80mcUQKpfje0Dp9uot2ROuipsh+EriCdfInxjleD5v1S4OlIn41I0LXP0g==", 6810 - "dev": true, 6811 7581 "license": "ISC" 6812 7582 }, 6813 7583 "node_modules/electron-winstaller": { ··· 6961 7731 "dev": true, 6962 7732 "license": "MIT" 6963 7733 }, 7734 + "node_modules/encodeurl": { 7735 + "version": "1.0.2", 7736 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 7737 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 7738 + "license": "MIT", 7739 + "peer": true, 7740 + "engines": { 7741 + "node": ">= 0.8" 7742 + } 7743 + }, 6964 7744 "node_modules/encoding": { 6965 7745 "version": "0.1.13", 6966 7746 "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", ··· 7020 7800 "license": "MIT", 7021 7801 "dependencies": { 7022 7802 "is-arrayish": "^0.2.1" 7803 + } 7804 + }, 7805 + "node_modules/error-stack-parser": { 7806 + "version": "2.1.4", 7807 + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", 7808 + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", 7809 + "license": "MIT", 7810 + "peer": true, 7811 + "dependencies": { 7812 + "stackframe": "^1.3.4" 7023 7813 } 7024 7814 }, 7025 7815 "node_modules/es-abstract": { ··· 7190 7980 "version": "3.2.0", 7191 7981 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 7192 7982 "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 7193 - "dev": true, 7194 7983 "license": "MIT", 7195 7984 "engines": { 7196 7985 "node": ">=6" 7197 7986 } 7198 7987 }, 7988 + "node_modules/escape-html": { 7989 + "version": "1.0.3", 7990 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 7991 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 7992 + "license": "MIT", 7993 + "peer": true 7994 + }, 7199 7995 "node_modules/escape-string-regexp": { 7200 7996 "version": "4.0.0", 7201 7997 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 7202 7998 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 7203 - "dev": true, 7204 7999 "license": "MIT", 7205 8000 "engines": { 7206 8001 "node": ">=10" ··· 7631 8426 "node": ">=0.10.0" 7632 8427 } 7633 8428 }, 8429 + "node_modules/etag": { 8430 + "version": "1.8.1", 8431 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 8432 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 8433 + "license": "MIT", 8434 + "peer": true, 8435 + "engines": { 8436 + "node": ">= 0.6" 8437 + } 8438 + }, 7634 8439 "node_modules/event-iterator": { 7635 8440 "version": "2.0.0", 7636 8441 "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", ··· 7793 8598 "version": "3.1.3", 7794 8599 "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", 7795 8600 "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", 7796 - "dev": true, 7797 8601 "license": "Apache-2.0" 7798 8602 }, 7799 8603 "node_modules/external-editor": { ··· 7932 8736 "reusify": "^1.0.4" 7933 8737 } 7934 8738 }, 8739 + "node_modules/fb-dotslash": { 8740 + "version": "0.5.8", 8741 + "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", 8742 + "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", 8743 + "license": "(MIT OR Apache-2.0)", 8744 + "peer": true, 8745 + "bin": { 8746 + "dotslash": "bin/dotslash" 8747 + }, 8748 + "engines": { 8749 + "node": ">=20" 8750 + } 8751 + }, 8752 + "node_modules/fb-watchman": { 8753 + "version": "2.0.2", 8754 + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", 8755 + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", 8756 + "license": "Apache-2.0", 8757 + "peer": true, 8758 + "dependencies": { 8759 + "bser": "2.1.1" 8760 + } 8761 + }, 7935 8762 "node_modules/fd-slicer": { 7936 8763 "version": "1.1.0", 7937 8764 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", ··· 7987 8814 "version": "7.1.1", 7988 8815 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 7989 8816 "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 7990 - "dev": true, 7991 8817 "license": "MIT", 7992 8818 "dependencies": { 7993 8819 "to-regex-range": "^5.0.1" ··· 7995 8821 "engines": { 7996 8822 "node": ">=8" 7997 8823 } 8824 + }, 8825 + "node_modules/finalhandler": { 8826 + "version": "1.1.2", 8827 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 8828 + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 8829 + "license": "MIT", 8830 + "peer": true, 8831 + "dependencies": { 8832 + "debug": "2.6.9", 8833 + "encodeurl": "~1.0.2", 8834 + "escape-html": "~1.0.3", 8835 + "on-finished": "~2.3.0", 8836 + "parseurl": "~1.3.3", 8837 + "statuses": "~1.5.0", 8838 + "unpipe": "~1.0.0" 8839 + }, 8840 + "engines": { 8841 + "node": ">= 0.8" 8842 + } 8843 + }, 8844 + "node_modules/finalhandler/node_modules/debug": { 8845 + "version": "2.6.9", 8846 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 8847 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 8848 + "license": "MIT", 8849 + "peer": true, 8850 + "dependencies": { 8851 + "ms": "2.0.0" 8852 + } 8853 + }, 8854 + "node_modules/finalhandler/node_modules/ms": { 8855 + "version": "2.0.0", 8856 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 8857 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 8858 + "license": "MIT", 8859 + "peer": true 7998 8860 }, 7999 8861 "node_modules/find-up": { 8000 8862 "version": "5.0.0", ··· 8049 8911 "node": ">= 12" 8050 8912 } 8051 8913 }, 8914 + "node_modules/flow-enums-runtime": { 8915 + "version": "0.0.6", 8916 + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", 8917 + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", 8918 + "license": "MIT", 8919 + "peer": true 8920 + }, 8052 8921 "node_modules/for-each": { 8053 8922 "version": "0.3.5", 8054 8923 "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", ··· 8063 8932 }, 8064 8933 "funding": { 8065 8934 "url": "https://github.com/sponsors/ljharb" 8935 + } 8936 + }, 8937 + "node_modules/fresh": { 8938 + "version": "0.5.2", 8939 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 8940 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 8941 + "license": "MIT", 8942 + "peer": true, 8943 + "engines": { 8944 + "node": ">= 0.6" 8066 8945 } 8067 8946 }, 8068 8947 "node_modules/fs-constants": { ··· 8196 9075 "node": ">= 0.4" 8197 9076 } 8198 9077 }, 9078 + "node_modules/gensync": { 9079 + "version": "1.0.0-beta.2", 9080 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 9081 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 9082 + "license": "MIT", 9083 + "peer": true, 9084 + "engines": { 9085 + "node": ">=6.9.0" 9086 + } 9087 + }, 8199 9088 "node_modules/get-caller-file": { 8200 9089 "version": "2.0.5", 8201 9090 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 8202 9091 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 8203 - "dev": true, 8204 9092 "license": "ISC", 8205 9093 "engines": { 8206 9094 "node": "6.* || 8.* || >= 10.*" ··· 8517 9405 "version": "4.2.11", 8518 9406 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 8519 9407 "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 8520 - "dev": true, 8521 9408 "license": "ISC" 8522 9409 }, 8523 9410 "node_modules/graphemer": { ··· 8544 9431 "version": "4.0.0", 8545 9432 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 8546 9433 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 8547 - "dev": true, 8548 9434 "license": "MIT", 8549 9435 "engines": { 8550 9436 "node": ">=8" ··· 8627 9513 "node": ">= 0.4" 8628 9514 } 8629 9515 }, 9516 + "node_modules/hermes-compiler": { 9517 + "version": "250829098.0.10", 9518 + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.10.tgz", 9519 + "integrity": "sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==", 9520 + "license": "MIT", 9521 + "peer": true 9522 + }, 9523 + "node_modules/hermes-estree": { 9524 + "version": "0.33.3", 9525 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", 9526 + "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", 9527 + "license": "MIT", 9528 + "peer": true 9529 + }, 9530 + "node_modules/hermes-parser": { 9531 + "version": "0.33.3", 9532 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", 9533 + "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", 9534 + "license": "MIT", 9535 + "peer": true, 9536 + "dependencies": { 9537 + "hermes-estree": "0.33.3" 9538 + } 9539 + }, 8630 9540 "node_modules/hosted-git-info": { 8631 9541 "version": "2.8.9", 8632 9542 "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", ··· 8640 9550 "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", 8641 9551 "dev": true, 8642 9552 "license": "BSD-2-Clause" 9553 + }, 9554 + "node_modules/http-errors": { 9555 + "version": "2.0.1", 9556 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", 9557 + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", 9558 + "license": "MIT", 9559 + "peer": true, 9560 + "dependencies": { 9561 + "depd": "~2.0.0", 9562 + "inherits": "~2.0.4", 9563 + "setprototypeof": "~1.2.0", 9564 + "statuses": "~2.0.2", 9565 + "toidentifier": "~1.0.1" 9566 + }, 9567 + "engines": { 9568 + "node": ">= 0.8" 9569 + }, 9570 + "funding": { 9571 + "type": "opencollective", 9572 + "url": "https://opencollective.com/express" 9573 + } 9574 + }, 9575 + "node_modules/http-errors/node_modules/statuses": { 9576 + "version": "2.0.2", 9577 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", 9578 + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", 9579 + "license": "MIT", 9580 + "peer": true, 9581 + "engines": { 9582 + "node": ">= 0.8" 9583 + } 8643 9584 }, 8644 9585 "node_modules/http-proxy-agent": { 8645 9586 "version": "5.0.0", ··· 8736 9677 "license": "MIT", 8737 9678 "engines": { 8738 9679 "node": ">= 4" 9680 + } 9681 + }, 9682 + "node_modules/image-size": { 9683 + "version": "1.2.1", 9684 + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", 9685 + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", 9686 + "license": "MIT", 9687 + "peer": true, 9688 + "dependencies": { 9689 + "queue": "6.0.2" 9690 + }, 9691 + "bin": { 9692 + "image-size": "bin/image-size.js" 9693 + }, 9694 + "engines": { 9695 + "node": ">=16.x" 8739 9696 } 8740 9697 }, 8741 9698 "node_modules/import-fresh": { ··· 8849 9806 "license": "MIT", 8850 9807 "engines": { 8851 9808 "node": ">=10.13.0" 9809 + } 9810 + }, 9811 + "node_modules/invariant": { 9812 + "version": "2.2.4", 9813 + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 9814 + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 9815 + "license": "MIT", 9816 + "peer": true, 9817 + "dependencies": { 9818 + "loose-envify": "^1.0.0" 8852 9819 } 8853 9820 }, 8854 9821 "node_modules/ip-address": { ··· 9013 9980 "url": "https://github.com/sponsors/ljharb" 9014 9981 } 9015 9982 }, 9983 + "node_modules/is-docker": { 9984 + "version": "2.2.1", 9985 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 9986 + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 9987 + "license": "MIT", 9988 + "peer": true, 9989 + "bin": { 9990 + "is-docker": "cli.js" 9991 + }, 9992 + "engines": { 9993 + "node": ">=8" 9994 + }, 9995 + "funding": { 9996 + "url": "https://github.com/sponsors/sindresorhus" 9997 + } 9998 + }, 9016 9999 "node_modules/is-electron": { 9017 10000 "version": "2.2.2", 9018 10001 "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", ··· 9156 10139 "version": "7.0.0", 9157 10140 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 9158 10141 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 9159 - "dev": true, 9160 10142 "license": "MIT", 9161 10143 "engines": { 9162 10144 "node": ">=0.12.0" ··· 9369 10351 "url": "https://github.com/sponsors/ljharb" 9370 10352 } 9371 10353 }, 10354 + "node_modules/is-wsl": { 10355 + "version": "2.2.0", 10356 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 10357 + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 10358 + "license": "MIT", 10359 + "peer": true, 10360 + "dependencies": { 10361 + "is-docker": "^2.0.0" 10362 + }, 10363 + "engines": { 10364 + "node": ">=8" 10365 + } 10366 + }, 9372 10367 "node_modules/isarray": { 9373 10368 "version": "2.0.5", 9374 10369 "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", ··· 9393 10388 "version": "2.0.0", 9394 10389 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 9395 10390 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 9396 - "dev": true, 9397 10391 "license": "ISC" 9398 10392 }, 9399 10393 "node_modules/isomorphic.js": { ··· 9747 10741 "npm": ">=7.0.0" 9748 10742 } 9749 10743 }, 10744 + "node_modules/jest-get-type": { 10745 + "version": "29.6.3", 10746 + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", 10747 + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", 10748 + "license": "MIT", 10749 + "peer": true, 10750 + "engines": { 10751 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 10752 + } 10753 + }, 10754 + "node_modules/jest-util": { 10755 + "version": "29.7.0", 10756 + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", 10757 + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", 10758 + "license": "MIT", 10759 + "peer": true, 10760 + "dependencies": { 10761 + "@jest/types": "^29.6.3", 10762 + "@types/node": "*", 10763 + "chalk": "^4.0.0", 10764 + "ci-info": "^3.2.0", 10765 + "graceful-fs": "^4.2.9", 10766 + "picomatch": "^2.2.3" 10767 + }, 10768 + "engines": { 10769 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 10770 + } 10771 + }, 10772 + "node_modules/jest-util/node_modules/ci-info": { 10773 + "version": "3.9.0", 10774 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", 10775 + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", 10776 + "funding": [ 10777 + { 10778 + "type": "github", 10779 + "url": "https://github.com/sponsors/sibiraj-s" 10780 + } 10781 + ], 10782 + "license": "MIT", 10783 + "peer": true, 10784 + "engines": { 10785 + "node": ">=8" 10786 + } 10787 + }, 10788 + "node_modules/jest-validate": { 10789 + "version": "29.7.0", 10790 + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", 10791 + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", 10792 + "license": "MIT", 10793 + "peer": true, 10794 + "dependencies": { 10795 + "@jest/types": "^29.6.3", 10796 + "camelcase": "^6.2.0", 10797 + "chalk": "^4.0.0", 10798 + "jest-get-type": "^29.6.3", 10799 + "leven": "^3.1.0", 10800 + "pretty-format": "^29.7.0" 10801 + }, 10802 + "engines": { 10803 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 10804 + } 10805 + }, 9750 10806 "node_modules/jest-worker": { 9751 10807 "version": "27.5.1", 9752 10808 "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", ··· 9797 10853 "url": "https://github.com/sponsors/panva" 9798 10854 } 9799 10855 }, 10856 + "node_modules/js-tokens": { 10857 + "version": "4.0.0", 10858 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 10859 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 10860 + "license": "MIT", 10861 + "peer": true 10862 + }, 9800 10863 "node_modules/js-yaml": { 9801 10864 "version": "4.1.1", 9802 10865 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", ··· 9808 10871 }, 9809 10872 "bin": { 9810 10873 "js-yaml": "bin/js-yaml.js" 10874 + } 10875 + }, 10876 + "node_modules/jsc-safe-url": { 10877 + "version": "0.2.4", 10878 + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", 10879 + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", 10880 + "license": "0BSD", 10881 + "peer": true 10882 + }, 10883 + "node_modules/jsesc": { 10884 + "version": "3.1.0", 10885 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 10886 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 10887 + "license": "MIT", 10888 + "peer": true, 10889 + "bin": { 10890 + "jsesc": "bin/jsesc" 10891 + }, 10892 + "engines": { 10893 + "node": ">=6" 9811 10894 } 9812 10895 }, 9813 10896 "node_modules/json-buffer": { ··· 9883 10966 "license": "MIT", 9884 10967 "dependencies": { 9885 10968 "json-buffer": "3.0.1" 10969 + } 10970 + }, 10971 + "node_modules/leven": { 10972 + "version": "3.1.0", 10973 + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 10974 + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 10975 + "license": "MIT", 10976 + "peer": true, 10977 + "engines": { 10978 + "node": ">=6" 9886 10979 } 9887 10980 }, 9888 10981 "node_modules/levn": { ··· 9999 11092 "funding": { 10000 11093 "url": "https://github.com/sponsors/sindresorhus" 10001 11094 } 11095 + }, 11096 + "node_modules/lighthouse-logger": { 11097 + "version": "1.4.2", 11098 + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", 11099 + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", 11100 + "license": "Apache-2.0", 11101 + "peer": true, 11102 + "dependencies": { 11103 + "debug": "^2.6.9", 11104 + "marky": "^1.2.2" 11105 + } 11106 + }, 11107 + "node_modules/lighthouse-logger/node_modules/debug": { 11108 + "version": "2.6.9", 11109 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 11110 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 11111 + "license": "MIT", 11112 + "peer": true, 11113 + "dependencies": { 11114 + "ms": "2.0.0" 11115 + } 11116 + }, 11117 + "node_modules/lighthouse-logger/node_modules/ms": { 11118 + "version": "2.0.0", 11119 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 11120 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 11121 + "license": "MIT", 11122 + "peer": true 10002 11123 }, 10003 11124 "node_modules/lightningcss": { 10004 11125 "version": "1.32.0", ··· 10353 11474 "dev": true, 10354 11475 "license": "MIT" 10355 11476 }, 11477 + "node_modules/lodash.throttle": { 11478 + "version": "4.1.1", 11479 + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 11480 + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", 11481 + "license": "MIT", 11482 + "peer": true 11483 + }, 10356 11484 "node_modules/log-symbols": { 10357 11485 "version": "4.1.0", 10358 11486 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", ··· 10419 11547 "url": "https://github.com/chalk/strip-ansi?sponsor=1" 10420 11548 } 10421 11549 }, 11550 + "node_modules/loose-envify": { 11551 + "version": "1.4.0", 11552 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 11553 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 11554 + "license": "MIT", 11555 + "peer": true, 11556 + "dependencies": { 11557 + "js-tokens": "^3.0.0 || ^4.0.0" 11558 + }, 11559 + "bin": { 11560 + "loose-envify": "cli.js" 11561 + } 11562 + }, 10422 11563 "node_modules/lowercase-keys": { 10423 11564 "version": "2.0.0", 10424 11565 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", ··· 10483 11624 "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 10484 11625 } 10485 11626 }, 11627 + "node_modules/makeerror": { 11628 + "version": "1.0.12", 11629 + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", 11630 + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", 11631 + "license": "BSD-3-Clause", 11632 + "peer": true, 11633 + "dependencies": { 11634 + "tmpl": "1.0.5" 11635 + } 11636 + }, 10486 11637 "node_modules/map-age-cleaner": { 10487 11638 "version": "0.1.3", 10488 11639 "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", ··· 10507 11658 "engines": { 10508 11659 "node": ">= 20" 10509 11660 } 11661 + }, 11662 + "node_modules/marky": { 11663 + "version": "1.3.0", 11664 + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", 11665 + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", 11666 + "license": "Apache-2.0", 11667 + "peer": true 10510 11668 }, 10511 11669 "node_modules/matcher": { 10512 11670 "version": "3.0.0", ··· 10547 11705 "node": ">=6" 10548 11706 } 10549 11707 }, 11708 + "node_modules/memoize-one": { 11709 + "version": "5.2.1", 11710 + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", 11711 + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", 11712 + "license": "MIT", 11713 + "peer": true 11714 + }, 10550 11715 "node_modules/merge-options": { 10551 11716 "version": "3.0.4", 10552 11717 "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", ··· 10572 11737 "version": "2.0.0", 10573 11738 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 10574 11739 "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 10575 - "dev": true, 10576 11740 "license": "MIT" 10577 11741 }, 10578 11742 "node_modules/merge2": { ··· 10585 11749 "node": ">= 8" 10586 11750 } 10587 11751 }, 11752 + "node_modules/metro": { 11753 + "version": "0.84.4", 11754 + "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz", 11755 + "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==", 11756 + "license": "MIT", 11757 + "peer": true, 11758 + "dependencies": { 11759 + "@babel/code-frame": "^7.29.0", 11760 + "@babel/core": "^7.25.2", 11761 + "@babel/generator": "^7.29.1", 11762 + "@babel/parser": "^7.29.0", 11763 + "@babel/template": "^7.28.6", 11764 + "@babel/traverse": "^7.29.0", 11765 + "@babel/types": "^7.29.0", 11766 + "accepts": "^2.0.0", 11767 + "ci-info": "^2.0.0", 11768 + "connect": "^3.6.5", 11769 + "debug": "^4.4.0", 11770 + "error-stack-parser": "^2.0.6", 11771 + "flow-enums-runtime": "^0.0.6", 11772 + "graceful-fs": "^4.2.4", 11773 + "hermes-parser": "0.35.0", 11774 + "image-size": "^1.0.2", 11775 + "invariant": "^2.2.4", 11776 + "jest-worker": "^29.7.0", 11777 + "jsc-safe-url": "^0.2.2", 11778 + "lodash.throttle": "^4.1.1", 11779 + "metro-babel-transformer": "0.84.4", 11780 + "metro-cache": "0.84.4", 11781 + "metro-cache-key": "0.84.4", 11782 + "metro-config": "0.84.4", 11783 + "metro-core": "0.84.4", 11784 + "metro-file-map": "0.84.4", 11785 + "metro-resolver": "0.84.4", 11786 + "metro-runtime": "0.84.4", 11787 + "metro-source-map": "0.84.4", 11788 + "metro-symbolicate": "0.84.4", 11789 + "metro-transform-plugins": "0.84.4", 11790 + "metro-transform-worker": "0.84.4", 11791 + "mime-types": "^3.0.1", 11792 + "nullthrows": "^1.1.1", 11793 + "serialize-error": "^2.1.0", 11794 + "source-map": "^0.5.6", 11795 + "throat": "^5.0.0", 11796 + "ws": "^7.5.10", 11797 + "yargs": "^17.6.2" 11798 + }, 11799 + "bin": { 11800 + "metro": "src/cli.js" 11801 + }, 11802 + "engines": { 11803 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11804 + } 11805 + }, 11806 + "node_modules/metro-babel-transformer": { 11807 + "version": "0.84.4", 11808 + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz", 11809 + "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==", 11810 + "license": "MIT", 11811 + "peer": true, 11812 + "dependencies": { 11813 + "@babel/core": "^7.25.2", 11814 + "flow-enums-runtime": "^0.0.6", 11815 + "hermes-parser": "0.35.0", 11816 + "metro-cache-key": "0.84.4", 11817 + "nullthrows": "^1.1.1" 11818 + }, 11819 + "engines": { 11820 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11821 + } 11822 + }, 11823 + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { 11824 + "version": "0.35.0", 11825 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", 11826 + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", 11827 + "license": "MIT", 11828 + "peer": true 11829 + }, 11830 + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { 11831 + "version": "0.35.0", 11832 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", 11833 + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", 11834 + "license": "MIT", 11835 + "peer": true, 11836 + "dependencies": { 11837 + "hermes-estree": "0.35.0" 11838 + } 11839 + }, 11840 + "node_modules/metro-cache": { 11841 + "version": "0.84.4", 11842 + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz", 11843 + "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==", 11844 + "license": "MIT", 11845 + "peer": true, 11846 + "dependencies": { 11847 + "exponential-backoff": "^3.1.1", 11848 + "flow-enums-runtime": "^0.0.6", 11849 + "https-proxy-agent": "^7.0.5", 11850 + "metro-core": "0.84.4" 11851 + }, 11852 + "engines": { 11853 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11854 + } 11855 + }, 11856 + "node_modules/metro-cache-key": { 11857 + "version": "0.84.4", 11858 + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz", 11859 + "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==", 11860 + "license": "MIT", 11861 + "peer": true, 11862 + "dependencies": { 11863 + "flow-enums-runtime": "^0.0.6" 11864 + }, 11865 + "engines": { 11866 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11867 + } 11868 + }, 11869 + "node_modules/metro-cache/node_modules/agent-base": { 11870 + "version": "7.1.4", 11871 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 11872 + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 11873 + "license": "MIT", 11874 + "peer": true, 11875 + "engines": { 11876 + "node": ">= 14" 11877 + } 11878 + }, 11879 + "node_modules/metro-cache/node_modules/https-proxy-agent": { 11880 + "version": "7.0.6", 11881 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 11882 + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 11883 + "license": "MIT", 11884 + "peer": true, 11885 + "dependencies": { 11886 + "agent-base": "^7.1.2", 11887 + "debug": "4" 11888 + }, 11889 + "engines": { 11890 + "node": ">= 14" 11891 + } 11892 + }, 11893 + "node_modules/metro-config": { 11894 + "version": "0.84.4", 11895 + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz", 11896 + "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==", 11897 + "license": "MIT", 11898 + "peer": true, 11899 + "dependencies": { 11900 + "connect": "^3.6.5", 11901 + "flow-enums-runtime": "^0.0.6", 11902 + "jest-validate": "^29.7.0", 11903 + "metro": "0.84.4", 11904 + "metro-cache": "0.84.4", 11905 + "metro-core": "0.84.4", 11906 + "metro-runtime": "0.84.4", 11907 + "yaml": "^2.6.1" 11908 + }, 11909 + "engines": { 11910 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11911 + } 11912 + }, 11913 + "node_modules/metro-core": { 11914 + "version": "0.84.4", 11915 + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz", 11916 + "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==", 11917 + "license": "MIT", 11918 + "peer": true, 11919 + "dependencies": { 11920 + "flow-enums-runtime": "^0.0.6", 11921 + "lodash.throttle": "^4.1.1", 11922 + "metro-resolver": "0.84.4" 11923 + }, 11924 + "engines": { 11925 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11926 + } 11927 + }, 11928 + "node_modules/metro-file-map": { 11929 + "version": "0.84.4", 11930 + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz", 11931 + "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==", 11932 + "license": "MIT", 11933 + "peer": true, 11934 + "dependencies": { 11935 + "debug": "^4.4.0", 11936 + "fb-watchman": "^2.0.0", 11937 + "flow-enums-runtime": "^0.0.6", 11938 + "graceful-fs": "^4.2.4", 11939 + "invariant": "^2.2.4", 11940 + "jest-worker": "^29.7.0", 11941 + "micromatch": "^4.0.4", 11942 + "nullthrows": "^1.1.1", 11943 + "walker": "^1.0.7" 11944 + }, 11945 + "engines": { 11946 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11947 + } 11948 + }, 11949 + "node_modules/metro-file-map/node_modules/jest-worker": { 11950 + "version": "29.7.0", 11951 + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", 11952 + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", 11953 + "license": "MIT", 11954 + "peer": true, 11955 + "dependencies": { 11956 + "@types/node": "*", 11957 + "jest-util": "^29.7.0", 11958 + "merge-stream": "^2.0.0", 11959 + "supports-color": "^8.0.0" 11960 + }, 11961 + "engines": { 11962 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 11963 + } 11964 + }, 11965 + "node_modules/metro-file-map/node_modules/supports-color": { 11966 + "version": "8.1.1", 11967 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 11968 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 11969 + "license": "MIT", 11970 + "peer": true, 11971 + "dependencies": { 11972 + "has-flag": "^4.0.0" 11973 + }, 11974 + "engines": { 11975 + "node": ">=10" 11976 + }, 11977 + "funding": { 11978 + "url": "https://github.com/chalk/supports-color?sponsor=1" 11979 + } 11980 + }, 11981 + "node_modules/metro-minify-terser": { 11982 + "version": "0.84.4", 11983 + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz", 11984 + "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==", 11985 + "license": "MIT", 11986 + "peer": true, 11987 + "dependencies": { 11988 + "flow-enums-runtime": "^0.0.6", 11989 + "terser": "^5.15.0" 11990 + }, 11991 + "engines": { 11992 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11993 + } 11994 + }, 11995 + "node_modules/metro-resolver": { 11996 + "version": "0.84.4", 11997 + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz", 11998 + "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==", 11999 + "license": "MIT", 12000 + "peer": true, 12001 + "dependencies": { 12002 + "flow-enums-runtime": "^0.0.6" 12003 + }, 12004 + "engines": { 12005 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12006 + } 12007 + }, 12008 + "node_modules/metro-runtime": { 12009 + "version": "0.84.4", 12010 + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz", 12011 + "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==", 12012 + "license": "MIT", 12013 + "peer": true, 12014 + "dependencies": { 12015 + "@babel/runtime": "^7.25.0", 12016 + "flow-enums-runtime": "^0.0.6" 12017 + }, 12018 + "engines": { 12019 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12020 + } 12021 + }, 12022 + "node_modules/metro-source-map": { 12023 + "version": "0.84.4", 12024 + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz", 12025 + "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==", 12026 + "license": "MIT", 12027 + "peer": true, 12028 + "dependencies": { 12029 + "@babel/traverse": "^7.29.0", 12030 + "@babel/types": "^7.29.0", 12031 + "flow-enums-runtime": "^0.0.6", 12032 + "invariant": "^2.2.4", 12033 + "metro-symbolicate": "0.84.4", 12034 + "nullthrows": "^1.1.1", 12035 + "ob1": "0.84.4", 12036 + "source-map": "^0.5.6", 12037 + "vlq": "^1.0.0" 12038 + }, 12039 + "engines": { 12040 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12041 + } 12042 + }, 12043 + "node_modules/metro-source-map/node_modules/source-map": { 12044 + "version": "0.5.7", 12045 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 12046 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 12047 + "license": "BSD-3-Clause", 12048 + "peer": true, 12049 + "engines": { 12050 + "node": ">=0.10.0" 12051 + } 12052 + }, 12053 + "node_modules/metro-symbolicate": { 12054 + "version": "0.84.4", 12055 + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz", 12056 + "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==", 12057 + "license": "MIT", 12058 + "peer": true, 12059 + "dependencies": { 12060 + "flow-enums-runtime": "^0.0.6", 12061 + "invariant": "^2.2.4", 12062 + "metro-source-map": "0.84.4", 12063 + "nullthrows": "^1.1.1", 12064 + "source-map": "^0.5.6", 12065 + "vlq": "^1.0.0" 12066 + }, 12067 + "bin": { 12068 + "metro-symbolicate": "src/index.js" 12069 + }, 12070 + "engines": { 12071 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12072 + } 12073 + }, 12074 + "node_modules/metro-symbolicate/node_modules/source-map": { 12075 + "version": "0.5.7", 12076 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 12077 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 12078 + "license": "BSD-3-Clause", 12079 + "peer": true, 12080 + "engines": { 12081 + "node": ">=0.10.0" 12082 + } 12083 + }, 12084 + "node_modules/metro-transform-plugins": { 12085 + "version": "0.84.4", 12086 + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz", 12087 + "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==", 12088 + "license": "MIT", 12089 + "peer": true, 12090 + "dependencies": { 12091 + "@babel/core": "^7.25.2", 12092 + "@babel/generator": "^7.29.1", 12093 + "@babel/template": "^7.28.6", 12094 + "@babel/traverse": "^7.29.0", 12095 + "flow-enums-runtime": "^0.0.6", 12096 + "nullthrows": "^1.1.1" 12097 + }, 12098 + "engines": { 12099 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12100 + } 12101 + }, 12102 + "node_modules/metro-transform-worker": { 12103 + "version": "0.84.4", 12104 + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz", 12105 + "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==", 12106 + "license": "MIT", 12107 + "peer": true, 12108 + "dependencies": { 12109 + "@babel/core": "^7.25.2", 12110 + "@babel/generator": "^7.29.1", 12111 + "@babel/parser": "^7.29.0", 12112 + "@babel/types": "^7.29.0", 12113 + "flow-enums-runtime": "^0.0.6", 12114 + "metro": "0.84.4", 12115 + "metro-babel-transformer": "0.84.4", 12116 + "metro-cache": "0.84.4", 12117 + "metro-cache-key": "0.84.4", 12118 + "metro-minify-terser": "0.84.4", 12119 + "metro-source-map": "0.84.4", 12120 + "metro-transform-plugins": "0.84.4", 12121 + "nullthrows": "^1.1.1" 12122 + }, 12123 + "engines": { 12124 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 12125 + } 12126 + }, 12127 + "node_modules/metro/node_modules/hermes-estree": { 12128 + "version": "0.35.0", 12129 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", 12130 + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", 12131 + "license": "MIT", 12132 + "peer": true 12133 + }, 12134 + "node_modules/metro/node_modules/hermes-parser": { 12135 + "version": "0.35.0", 12136 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", 12137 + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", 12138 + "license": "MIT", 12139 + "peer": true, 12140 + "dependencies": { 12141 + "hermes-estree": "0.35.0" 12142 + } 12143 + }, 12144 + "node_modules/metro/node_modules/jest-worker": { 12145 + "version": "29.7.0", 12146 + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", 12147 + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", 12148 + "license": "MIT", 12149 + "peer": true, 12150 + "dependencies": { 12151 + "@types/node": "*", 12152 + "jest-util": "^29.7.0", 12153 + "merge-stream": "^2.0.0", 12154 + "supports-color": "^8.0.0" 12155 + }, 12156 + "engines": { 12157 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 12158 + } 12159 + }, 12160 + "node_modules/metro/node_modules/serialize-error": { 12161 + "version": "2.1.0", 12162 + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", 12163 + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", 12164 + "license": "MIT", 12165 + "peer": true, 12166 + "engines": { 12167 + "node": ">=0.10.0" 12168 + } 12169 + }, 12170 + "node_modules/metro/node_modules/source-map": { 12171 + "version": "0.5.7", 12172 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 12173 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 12174 + "license": "BSD-3-Clause", 12175 + "peer": true, 12176 + "engines": { 12177 + "node": ">=0.10.0" 12178 + } 12179 + }, 12180 + "node_modules/metro/node_modules/supports-color": { 12181 + "version": "8.1.1", 12182 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 12183 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 12184 + "license": "MIT", 12185 + "peer": true, 12186 + "dependencies": { 12187 + "has-flag": "^4.0.0" 12188 + }, 12189 + "engines": { 12190 + "node": ">=10" 12191 + }, 12192 + "funding": { 12193 + "url": "https://github.com/chalk/supports-color?sponsor=1" 12194 + } 12195 + }, 12196 + "node_modules/metro/node_modules/ws": { 12197 + "version": "7.5.10", 12198 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 12199 + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 12200 + "license": "MIT", 12201 + "peer": true, 12202 + "engines": { 12203 + "node": ">=8.3.0" 12204 + }, 12205 + "peerDependencies": { 12206 + "bufferutil": "^4.0.1", 12207 + "utf-8-validate": "^5.0.2" 12208 + }, 12209 + "peerDependenciesMeta": { 12210 + "bufferutil": { 12211 + "optional": true 12212 + }, 12213 + "utf-8-validate": { 12214 + "optional": true 12215 + } 12216 + } 12217 + }, 10588 12218 "node_modules/micromatch": { 10589 12219 "version": "4.0.8", 10590 12220 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 10591 12221 "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 10592 - "dev": true, 10593 12222 "license": "MIT", 10594 12223 "dependencies": { 10595 12224 "braces": "^3.0.3", ··· 10599 12228 "node": ">=8.6" 10600 12229 } 10601 12230 }, 12231 + "node_modules/mime": { 12232 + "version": "1.6.0", 12233 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 12234 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 12235 + "license": "MIT", 12236 + "peer": true, 12237 + "bin": { 12238 + "mime": "cli.js" 12239 + }, 12240 + "engines": { 12241 + "node": ">=4" 12242 + } 12243 + }, 10602 12244 "node_modules/mime-db": { 10603 12245 "version": "1.54.0", 10604 12246 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 10605 12247 "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 10606 - "dev": true, 10607 12248 "license": "MIT", 10608 12249 "engines": { 10609 12250 "node": ">= 0.6" 12251 + } 12252 + }, 12253 + "node_modules/mime-types": { 12254 + "version": "3.0.2", 12255 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", 12256 + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", 12257 + "license": "MIT", 12258 + "peer": true, 12259 + "dependencies": { 12260 + "mime-db": "^1.54.0" 12261 + }, 12262 + "engines": { 12263 + "node": ">=18" 12264 + }, 12265 + "funding": { 12266 + "type": "opencollective", 12267 + "url": "https://opencollective.com/express" 10610 12268 } 10611 12269 }, 10612 12270 "node_modules/mimic-fn": { ··· 10752 12410 "version": "1.0.4", 10753 12411 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 10754 12412 "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 10755 - "dev": true, 10756 12413 "license": "MIT", 10757 12414 "bin": { 10758 12415 "mkdirp": "bin/cmd.js" ··· 10782 12439 "version": "2.1.3", 10783 12440 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 10784 12441 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 10785 - "dev": true, 10786 12442 "license": "MIT" 10787 12443 }, 10788 12444 "node_modules/multiformats": { ··· 10954 12610 } 10955 12611 } 10956 12612 }, 12613 + "node_modules/node-int64": { 12614 + "version": "0.4.0", 12615 + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 12616 + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 12617 + "license": "MIT", 12618 + "peer": true 12619 + }, 10957 12620 "node_modules/node-releases": { 10958 12621 "version": "2.0.38", 10959 12622 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", 10960 12623 "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", 10961 - "dev": true, 10962 12624 "license": "MIT" 10963 12625 }, 10964 12626 "node_modules/nopt": { ··· 11036 12698 "node": ">=4" 11037 12699 } 11038 12700 }, 12701 + "node_modules/nullthrows": { 12702 + "version": "1.1.1", 12703 + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", 12704 + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", 12705 + "license": "MIT", 12706 + "peer": true 12707 + }, 11039 12708 "node_modules/oauth4webapi": { 11040 12709 "version": "3.8.6", 11041 12710 "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.6.tgz", ··· 11043 12712 "license": "MIT", 11044 12713 "funding": { 11045 12714 "url": "https://github.com/sponsors/panva" 12715 + } 12716 + }, 12717 + "node_modules/ob1": { 12718 + "version": "0.84.4", 12719 + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz", 12720 + "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==", 12721 + "license": "MIT", 12722 + "peer": true, 12723 + "dependencies": { 12724 + "flow-enums-runtime": "^0.0.6" 12725 + }, 12726 + "engines": { 12727 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 11046 12728 } 11047 12729 }, 11048 12730 "node_modules/object-inspect": { ··· 11169 12851 ], 11170 12852 "license": "MIT" 11171 12853 }, 12854 + "node_modules/on-finished": { 12855 + "version": "2.3.0", 12856 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 12857 + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 12858 + "license": "MIT", 12859 + "peer": true, 12860 + "dependencies": { 12861 + "ee-first": "1.1.1" 12862 + }, 12863 + "engines": { 12864 + "node": ">= 0.8" 12865 + } 12866 + }, 11172 12867 "node_modules/once": { 11173 12868 "version": "1.4.0", 11174 12869 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", ··· 11189 12884 }, 11190 12885 "engines": { 11191 12886 "node": ">=6" 12887 + }, 12888 + "funding": { 12889 + "url": "https://github.com/sponsors/sindresorhus" 12890 + } 12891 + }, 12892 + "node_modules/open": { 12893 + "version": "7.4.2", 12894 + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", 12895 + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", 12896 + "license": "MIT", 12897 + "peer": true, 12898 + "dependencies": { 12899 + "is-docker": "^2.0.0", 12900 + "is-wsl": "^2.1.1" 12901 + }, 12902 + "engines": { 12903 + "node": ">=8" 11192 12904 }, 11193 12905 "funding": { 11194 12906 "url": "https://github.com/sponsors/sindresorhus" ··· 11567 13279 "node": ">=0.10.0" 11568 13280 } 11569 13281 }, 13282 + "node_modules/parseurl": { 13283 + "version": "1.3.3", 13284 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 13285 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 13286 + "license": "MIT", 13287 + "peer": true, 13288 + "engines": { 13289 + "node": ">= 0.8" 13290 + } 13291 + }, 11570 13292 "node_modules/path-exists": { 11571 13293 "version": "4.0.0", 11572 13294 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ··· 11591 13313 "version": "3.1.1", 11592 13314 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 11593 13315 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 11594 - "dev": true, 11595 13316 "license": "MIT", 11596 13317 "engines": { 11597 13318 "node": ">=8" ··· 11637 13358 "version": "1.1.1", 11638 13359 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 11639 13360 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 11640 - "dev": true, 11641 13361 "license": "ISC" 11642 13362 }, 11643 13363 "node_modules/picomatch": { 11644 13364 "version": "2.3.2", 11645 13365 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", 11646 13366 "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", 11647 - "dev": true, 11648 13367 "license": "MIT", 11649 13368 "engines": { 11650 13369 "node": ">=8.6" ··· 11875 13594 } 11876 13595 } 11877 13596 }, 13597 + "node_modules/pretty-format": { 13598 + "version": "29.7.0", 13599 + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", 13600 + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", 13601 + "license": "MIT", 13602 + "peer": true, 13603 + "dependencies": { 13604 + "@jest/schemas": "^29.6.3", 13605 + "ansi-styles": "^5.0.0", 13606 + "react-is": "^18.0.0" 13607 + }, 13608 + "engines": { 13609 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 13610 + } 13611 + }, 13612 + "node_modules/pretty-format/node_modules/ansi-styles": { 13613 + "version": "5.2.0", 13614 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 13615 + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 13616 + "license": "MIT", 13617 + "peer": true, 13618 + "engines": { 13619 + "node": ">=10" 13620 + }, 13621 + "funding": { 13622 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 13623 + } 13624 + }, 11878 13625 "node_modules/proc-log": { 11879 13626 "version": "2.0.1", 11880 13627 "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", ··· 11900 13647 "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.1.0.tgz", 11901 13648 "integrity": "sha512-82DVc5tI36neVB3IjdXR11ztwGuoBc98em9ijzubeZKxI47OlV2Znq6mlPqE5xPDzO2Uw98GHiQSjj2favBCRQ==", 11902 13649 "license": "Apache-2.0 OR MIT" 13650 + }, 13651 + "node_modules/promise": { 13652 + "version": "8.3.0", 13653 + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", 13654 + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", 13655 + "license": "MIT", 13656 + "peer": true, 13657 + "dependencies": { 13658 + "asap": "~2.0.6" 13659 + } 11903 13660 }, 11904 13661 "node_modules/promise-inflight": { 11905 13662 "version": "1.0.1", ··· 12100 13857 "node": ">=16.0.0" 12101 13858 } 12102 13859 }, 13860 + "node_modules/queue": { 13861 + "version": "6.0.2", 13862 + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", 13863 + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", 13864 + "license": "MIT", 13865 + "peer": true, 13866 + "dependencies": { 13867 + "inherits": "~2.0.3" 13868 + } 13869 + }, 12103 13870 "node_modules/queue-microtask": { 12104 13871 "version": "1.2.3", 12105 13872 "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", ··· 12149 13916 "integrity": "sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==", 12150 13917 "license": "Apache-2.0 OR MIT" 12151 13918 }, 13919 + "node_modules/range-parser": { 13920 + "version": "1.2.1", 13921 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 13922 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 13923 + "license": "MIT", 13924 + "peer": true, 13925 + "engines": { 13926 + "node": ">= 0.6" 13927 + } 13928 + }, 12152 13929 "node_modules/rc": { 12153 13930 "version": "1.2.8", 12154 13931 "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", ··· 12188 13965 "node": ">=0.10.0" 12189 13966 } 12190 13967 }, 13968 + "node_modules/react-devtools-core": { 13969 + "version": "6.1.5", 13970 + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", 13971 + "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", 13972 + "license": "MIT", 13973 + "peer": true, 13974 + "dependencies": { 13975 + "shell-quote": "^1.6.1", 13976 + "ws": "^7" 13977 + } 13978 + }, 13979 + "node_modules/react-devtools-core/node_modules/ws": { 13980 + "version": "7.5.10", 13981 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 13982 + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 13983 + "license": "MIT", 13984 + "peer": true, 13985 + "engines": { 13986 + "node": ">=8.3.0" 13987 + }, 13988 + "peerDependencies": { 13989 + "bufferutil": "^4.0.1", 13990 + "utf-8-validate": "^5.0.2" 13991 + }, 13992 + "peerDependenciesMeta": { 13993 + "bufferutil": { 13994 + "optional": true 13995 + }, 13996 + "utf-8-validate": { 13997 + "optional": true 13998 + } 13999 + } 14000 + }, 12191 14001 "node_modules/react-dom": { 12192 14002 "version": "19.2.5", 12193 14003 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", ··· 12198 14008 }, 12199 14009 "peerDependencies": { 12200 14010 "react": "^19.2.5" 14011 + } 14012 + }, 14013 + "node_modules/react-is": { 14014 + "version": "18.3.1", 14015 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", 14016 + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", 14017 + "license": "MIT", 14018 + "peer": true 14019 + }, 14020 + "node_modules/react-native": { 14021 + "version": "0.85.3", 14022 + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.3.tgz", 14023 + "integrity": "sha512-HN/fGC+3nZVcDNcw7gfbM/DuqZAvI9Mz+/SxuhODaua4JY0BPzhfTzWXRyTR4mRgMHmShTPpH2PYMTxvZrsdZA==", 14024 + "license": "MIT", 14025 + "peer": true, 14026 + "dependencies": { 14027 + "@react-native/assets-registry": "0.85.3", 14028 + "@react-native/codegen": "0.85.3", 14029 + "@react-native/community-cli-plugin": "0.85.3", 14030 + "@react-native/gradle-plugin": "0.85.3", 14031 + "@react-native/js-polyfills": "0.85.3", 14032 + "@react-native/normalize-colors": "0.85.3", 14033 + "@react-native/virtualized-lists": "0.85.3", 14034 + "abort-controller": "^3.0.0", 14035 + "anser": "^1.4.9", 14036 + "ansi-regex": "^5.0.0", 14037 + "babel-plugin-syntax-hermes-parser": "0.33.3", 14038 + "base64-js": "^1.5.1", 14039 + "commander": "^12.0.0", 14040 + "flow-enums-runtime": "^0.0.6", 14041 + "hermes-compiler": "250829098.0.10", 14042 + "invariant": "^2.2.4", 14043 + "memoize-one": "^5.0.0", 14044 + "metro-runtime": "^0.84.3", 14045 + "metro-source-map": "^0.84.3", 14046 + "nullthrows": "^1.1.1", 14047 + "pretty-format": "^29.7.0", 14048 + "promise": "^8.3.0", 14049 + "react-devtools-core": "^6.1.5", 14050 + "react-refresh": "^0.14.0", 14051 + "regenerator-runtime": "^0.13.2", 14052 + "scheduler": "0.27.0", 14053 + "semver": "^7.1.3", 14054 + "stacktrace-parser": "^0.1.10", 14055 + "tinyglobby": "^0.2.15", 14056 + "whatwg-fetch": "^3.0.0", 14057 + "ws": "^7.5.10", 14058 + "yargs": "^17.6.2" 14059 + }, 14060 + "bin": { 14061 + "react-native": "cli.js" 14062 + }, 14063 + "engines": { 14064 + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" 14065 + }, 14066 + "peerDependencies": { 14067 + "@react-native/jest-preset": "0.85.3", 14068 + "@types/react": "^19.1.1", 14069 + "react": "^19.2.3" 14070 + }, 14071 + "peerDependenciesMeta": { 14072 + "@react-native/jest-preset": { 14073 + "optional": true 14074 + }, 14075 + "@types/react": { 14076 + "optional": true 14077 + } 12201 14078 } 12202 14079 }, 12203 14080 "node_modules/react-native-webrtc": { ··· 12236 14113 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 12237 14114 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 12238 14115 "license": "MIT" 14116 + }, 14117 + "node_modules/react-native/node_modules/commander": { 14118 + "version": "12.1.0", 14119 + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", 14120 + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", 14121 + "license": "MIT", 14122 + "peer": true, 14123 + "engines": { 14124 + "node": ">=18" 14125 + } 14126 + }, 14127 + "node_modules/react-native/node_modules/ws": { 14128 + "version": "7.5.10", 14129 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 14130 + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 14131 + "license": "MIT", 14132 + "peer": true, 14133 + "engines": { 14134 + "node": ">=8.3.0" 14135 + }, 14136 + "peerDependencies": { 14137 + "bufferutil": "^4.0.1", 14138 + "utf-8-validate": "^5.0.2" 14139 + }, 14140 + "peerDependenciesMeta": { 14141 + "bufferutil": { 14142 + "optional": true 14143 + }, 14144 + "utf-8-validate": { 14145 + "optional": true 14146 + } 14147 + } 14148 + }, 14149 + "node_modules/react-refresh": { 14150 + "version": "0.14.2", 14151 + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", 14152 + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 14153 + "license": "MIT", 14154 + "peer": true, 14155 + "engines": { 14156 + "node": ">=0.10.0" 14157 + } 12239 14158 }, 12240 14159 "node_modules/react-router": { 12241 14160 "version": "7.15.0", ··· 12449 14368 "url": "https://github.com/sponsors/ljharb" 12450 14369 } 12451 14370 }, 14371 + "node_modules/regenerator-runtime": { 14372 + "version": "0.13.11", 14373 + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 14374 + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", 14375 + "license": "MIT", 14376 + "peer": true 14377 + }, 12452 14378 "node_modules/regexp.prototype.flags": { 12453 14379 "version": "1.5.4", 12454 14380 "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", ··· 12474 14400 "version": "2.1.1", 12475 14401 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 12476 14402 "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 12477 - "dev": true, 12478 14403 "license": "MIT", 12479 14404 "engines": { 12480 14405 "node": ">=0.10.0" ··· 12895 14820 "license": "MIT", 12896 14821 "optional": true 12897 14822 }, 14823 + "node_modules/send": { 14824 + "version": "0.19.2", 14825 + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", 14826 + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", 14827 + "license": "MIT", 14828 + "peer": true, 14829 + "dependencies": { 14830 + "debug": "2.6.9", 14831 + "depd": "2.0.0", 14832 + "destroy": "1.2.0", 14833 + "encodeurl": "~2.0.0", 14834 + "escape-html": "~1.0.3", 14835 + "etag": "~1.8.1", 14836 + "fresh": "~0.5.2", 14837 + "http-errors": "~2.0.1", 14838 + "mime": "1.6.0", 14839 + "ms": "2.1.3", 14840 + "on-finished": "~2.4.1", 14841 + "range-parser": "~1.2.1", 14842 + "statuses": "~2.0.2" 14843 + }, 14844 + "engines": { 14845 + "node": ">= 0.8.0" 14846 + } 14847 + }, 14848 + "node_modules/send/node_modules/debug": { 14849 + "version": "2.6.9", 14850 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 14851 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 14852 + "license": "MIT", 14853 + "peer": true, 14854 + "dependencies": { 14855 + "ms": "2.0.0" 14856 + } 14857 + }, 14858 + "node_modules/send/node_modules/debug/node_modules/ms": { 14859 + "version": "2.0.0", 14860 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 14861 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 14862 + "license": "MIT", 14863 + "peer": true 14864 + }, 14865 + "node_modules/send/node_modules/encodeurl": { 14866 + "version": "2.0.0", 14867 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 14868 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 14869 + "license": "MIT", 14870 + "peer": true, 14871 + "engines": { 14872 + "node": ">= 0.8" 14873 + } 14874 + }, 14875 + "node_modules/send/node_modules/on-finished": { 14876 + "version": "2.4.1", 14877 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 14878 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 14879 + "license": "MIT", 14880 + "peer": true, 14881 + "dependencies": { 14882 + "ee-first": "1.1.1" 14883 + }, 14884 + "engines": { 14885 + "node": ">= 0.8" 14886 + } 14887 + }, 14888 + "node_modules/send/node_modules/statuses": { 14889 + "version": "2.0.2", 14890 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", 14891 + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", 14892 + "license": "MIT", 14893 + "peer": true, 14894 + "engines": { 14895 + "node": ">= 0.8" 14896 + } 14897 + }, 12898 14898 "node_modules/serialize-error": { 12899 14899 "version": "7.0.1", 12900 14900 "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", ··· 12924 14924 }, 12925 14925 "funding": { 12926 14926 "url": "https://github.com/sponsors/sindresorhus" 14927 + } 14928 + }, 14929 + "node_modules/serve-static": { 14930 + "version": "1.16.3", 14931 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", 14932 + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", 14933 + "license": "MIT", 14934 + "peer": true, 14935 + "dependencies": { 14936 + "encodeurl": "~2.0.0", 14937 + "escape-html": "~1.0.3", 14938 + "parseurl": "~1.3.3", 14939 + "send": "~0.19.1" 14940 + }, 14941 + "engines": { 14942 + "node": ">= 0.8.0" 14943 + } 14944 + }, 14945 + "node_modules/serve-static/node_modules/encodeurl": { 14946 + "version": "2.0.0", 14947 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 14948 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 14949 + "license": "MIT", 14950 + "peer": true, 14951 + "engines": { 14952 + "node": ">= 0.8" 12927 14953 } 12928 14954 }, 12929 14955 "node_modules/set-cookie-parser": { ··· 12981 15007 "node": ">= 0.4" 12982 15008 } 12983 15009 }, 15010 + "node_modules/setprototypeof": { 15011 + "version": "1.2.0", 15012 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 15013 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 15014 + "license": "ISC", 15015 + "peer": true 15016 + }, 12984 15017 "node_modules/shebang-command": { 12985 15018 "version": "2.0.0", 12986 15019 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 12987 15020 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 12988 - "dev": true, 12989 15021 "license": "MIT", 12990 15022 "dependencies": { 12991 15023 "shebang-regex": "^3.0.0" ··· 12998 15030 "version": "3.0.0", 12999 15031 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 13000 15032 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 13001 - "dev": true, 13002 15033 "license": "MIT", 13003 15034 "engines": { 13004 15035 "node": ">=8" 15036 + } 15037 + }, 15038 + "node_modules/shell-quote": { 15039 + "version": "1.8.3", 15040 + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", 15041 + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", 15042 + "license": "MIT", 15043 + "peer": true, 15044 + "engines": { 15045 + "node": ">= 0.4" 15046 + }, 15047 + "funding": { 15048 + "url": "https://github.com/sponsors/ljharb" 13005 15049 } 13006 15050 }, 13007 15051 "node_modules/side-channel": { ··· 13214 15258 "version": "0.6.1", 13215 15259 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 13216 15260 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 13217 - "dev": true, 13218 15261 "license": "BSD-3-Clause", 13219 15262 "engines": { 13220 15263 "node": ">=0.10.0" ··· 13234 15277 "version": "0.5.21", 13235 15278 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 13236 15279 "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 13237 - "dev": true, 13238 15280 "license": "MIT", 13239 15281 "dependencies": { 13240 15282 "buffer-from": "^1.0.0", ··· 13314 15356 "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 13315 15357 "dev": true, 13316 15358 "license": "MIT" 15359 + }, 15360 + "node_modules/stackframe": { 15361 + "version": "1.3.4", 15362 + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", 15363 + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", 15364 + "license": "MIT", 15365 + "peer": true 15366 + }, 15367 + "node_modules/stacktrace-parser": { 15368 + "version": "0.1.11", 15369 + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", 15370 + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", 15371 + "license": "MIT", 15372 + "peer": true, 15373 + "dependencies": { 15374 + "type-fest": "^0.7.1" 15375 + }, 15376 + "engines": { 15377 + "node": ">=6" 15378 + } 15379 + }, 15380 + "node_modules/stacktrace-parser/node_modules/type-fest": { 15381 + "version": "0.7.1", 15382 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", 15383 + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", 15384 + "license": "(MIT OR CC0-1.0)", 15385 + "peer": true, 15386 + "engines": { 15387 + "node": ">=8" 15388 + } 15389 + }, 15390 + "node_modules/statuses": { 15391 + "version": "1.5.0", 15392 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 15393 + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 15394 + "license": "MIT", 15395 + "peer": true, 15396 + "engines": { 15397 + "node": ">= 0.6" 15398 + } 13317 15399 }, 13318 15400 "node_modules/std-env": { 13319 15401 "version": "4.1.0", ··· 13455 15537 "version": "6.0.1", 13456 15538 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 13457 15539 "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 13458 - "dev": true, 13459 15540 "license": "MIT", 13460 15541 "dependencies": { 13461 15542 "ansi-regex": "^5.0.1" ··· 13537 15618 "version": "7.2.0", 13538 15619 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 13539 15620 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 13540 - "dev": true, 13541 15621 "license": "MIT", 13542 15622 "dependencies": { 13543 15623 "has-flag": "^4.0.0" ··· 13691 15771 "version": "5.46.2", 13692 15772 "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", 13693 15773 "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", 13694 - "dev": true, 13695 15774 "license": "BSD-2-Clause", 13696 15775 "dependencies": { 13697 15776 "@jridgewell/source-map": "^0.3.3", ··· 13744 15823 "version": "2.20.3", 13745 15824 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 13746 15825 "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 13747 - "dev": true, 13748 15826 "license": "MIT" 13749 15827 }, 13750 15828 "node_modules/text-table": { ··· 13753 15831 "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 13754 15832 "dev": true, 13755 15833 "license": "MIT" 15834 + }, 15835 + "node_modules/throat": { 15836 + "version": "5.0.0", 15837 + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", 15838 + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", 15839 + "license": "MIT", 15840 + "peer": true 13756 15841 }, 13757 15842 "node_modules/tiny-each-async": { 13758 15843 "version": "2.0.3", ··· 13783 15868 "version": "0.2.16", 13784 15869 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", 13785 15870 "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", 13786 - "dev": true, 13787 15871 "license": "MIT", 13788 15872 "dependencies": { 13789 15873 "fdir": "^6.5.0", ··· 13800 15884 "version": "6.5.0", 13801 15885 "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 13802 15886 "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 13803 - "dev": true, 13804 15887 "license": "MIT", 13805 15888 "engines": { 13806 15889 "node": ">=12.0.0" ··· 13818 15901 "version": "4.0.4", 13819 15902 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", 13820 15903 "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", 13821 - "dev": true, 13822 15904 "license": "MIT", 13823 15905 "engines": { 13824 15906 "node": ">=12" ··· 13872 15954 "node": ">=14.14" 13873 15955 } 13874 15956 }, 15957 + "node_modules/tmpl": { 15958 + "version": "1.0.5", 15959 + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", 15960 + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", 15961 + "license": "BSD-3-Clause", 15962 + "peer": true 15963 + }, 13875 15964 "node_modules/to-regex-range": { 13876 15965 "version": "5.0.1", 13877 15966 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 13878 15967 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 13879 - "dev": true, 13880 15968 "license": "MIT", 13881 15969 "dependencies": { 13882 15970 "is-number": "^7.0.0" 13883 15971 }, 13884 15972 "engines": { 13885 15973 "node": ">=8.0" 15974 + } 15975 + }, 15976 + "node_modules/toidentifier": { 15977 + "version": "1.0.1", 15978 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 15979 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 15980 + "license": "MIT", 15981 + "peer": true, 15982 + "engines": { 15983 + "node": ">=0.6" 13886 15984 } 13887 15985 }, 13888 15986 "node_modules/tr46": { ··· 14193 16291 "node": ">= 10.0.0" 14194 16292 } 14195 16293 }, 16294 + "node_modules/unpipe": { 16295 + "version": "1.0.0", 16296 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 16297 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 16298 + "license": "MIT", 16299 + "peer": true, 16300 + "engines": { 16301 + "node": ">= 0.8" 16302 + } 16303 + }, 14196 16304 "node_modules/unrs-resolver": { 14197 16305 "version": "1.11.1", 14198 16306 "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", ··· 14232 16340 "version": "1.2.3", 14233 16341 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 14234 16342 "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 14235 - "dev": true, 14236 16343 "funding": [ 14237 16344 { 14238 16345 "type": "opencollective", ··· 14309 16416 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 14310 16417 "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 14311 16418 "license": "MIT" 16419 + }, 16420 + "node_modules/utils-merge": { 16421 + "version": "1.0.1", 16422 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 16423 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 16424 + "license": "MIT", 16425 + "peer": true, 16426 + "engines": { 16427 + "node": ">= 0.4.0" 16428 + } 14312 16429 }, 14313 16430 "node_modules/validate-npm-package-license": { 14314 16431 "version": "3.0.4", ··· 14515 16632 "url": "https://github.com/sponsors/jonschlinkert" 14516 16633 } 14517 16634 }, 16635 + "node_modules/vlq": { 16636 + "version": "1.0.1", 16637 + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", 16638 + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", 16639 + "license": "MIT", 16640 + "peer": true 16641 + }, 14518 16642 "node_modules/w3c-keyname": { 14519 16643 "version": "2.2.8", 14520 16644 "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 14521 16645 "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 14522 16646 "license": "MIT" 16647 + }, 16648 + "node_modules/walker": { 16649 + "version": "1.0.8", 16650 + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", 16651 + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", 16652 + "license": "Apache-2.0", 16653 + "peer": true, 16654 + "dependencies": { 16655 + "makeerror": "1.0.12" 16656 + } 14523 16657 }, 14524 16658 "node_modules/watchpack": { 14525 16659 "version": "2.5.1", ··· 14654 16788 "node": ">=10.13.0" 14655 16789 } 14656 16790 }, 16791 + "node_modules/whatwg-fetch": { 16792 + "version": "3.6.20", 16793 + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", 16794 + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", 16795 + "license": "MIT", 16796 + "peer": true 16797 + }, 14657 16798 "node_modules/whatwg-url": { 14658 16799 "version": "5.0.0", 14659 16800 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", ··· 14682 16823 "version": "2.0.2", 14683 16824 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 14684 16825 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 14685 - "dev": true, 14686 16826 "license": "ISC", 14687 16827 "dependencies": { 14688 16828 "isexe": "^2.0.0" ··· 14931 17071 "version": "5.0.8", 14932 17072 "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 14933 17073 "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 14934 - "dev": true, 14935 17074 "license": "ISC", 14936 17075 "engines": { 14937 17076 "node": ">=10" ··· 14944 17083 "dev": true, 14945 17084 "license": "ISC" 14946 17085 }, 17086 + "node_modules/yaml": { 17087 + "version": "2.9.0", 17088 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", 17089 + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", 17090 + "license": "ISC", 17091 + "peer": true, 17092 + "bin": { 17093 + "yaml": "bin.mjs" 17094 + }, 17095 + "engines": { 17096 + "node": ">= 14.6" 17097 + }, 17098 + "funding": { 17099 + "url": "https://github.com/sponsors/eemeli" 17100 + } 17101 + }, 14947 17102 "node_modules/yargs": { 14948 17103 "version": "17.7.2", 14949 17104 "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 14950 17105 "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 14951 - "dev": true, 14952 17106 "license": "MIT", 14953 17107 "dependencies": { 14954 17108 "cliui": "^8.0.1", ··· 14967 17121 "version": "21.1.1", 14968 17122 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 14969 17123 "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 14970 - "dev": true, 14971 17124 "license": "ISC", 14972 17125 "engines": { 14973 17126 "node": ">=12" ··· 14977 17130 "version": "8.0.0", 14978 17131 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 14979 17132 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 14980 - "dev": true, 14981 17133 "license": "MIT" 14982 17134 }, 14983 17135 "node_modules/yargs/node_modules/is-fullwidth-code-point": { 14984 17136 "version": "3.0.0", 14985 17137 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 14986 17138 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 14987 - "dev": true, 14988 17139 "license": "MIT", 14989 17140 "engines": { 14990 17141 "node": ">=8" ··· 14994 17145 "version": "4.2.3", 14995 17146 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 14996 17147 "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 14997 - "dev": true, 14998 17148 "license": "MIT", 14999 17149 "dependencies": { 15000 17150 "emoji-regex": "^8.0.0",
+1
package.json
··· 60 60 "@libp2p/websockets": "^9.2.19", 61 61 "@libp2p/webtransport": "^5.0.41", 62 62 "@multiformats/multiaddr": "^12.5.1", 63 + "@tanstack/react-query": "^5.100.11", 63 64 "@tiptap/extension-collaboration": "^3.23.4", 64 65 "@tiptap/extension-collaboration-caret": "^3.23.4", 65 66 "@tiptap/extension-placeholder": "^3.23.4",
+380
.opencode/package-lock.json
··· 1 + { 2 + "name": ".opencode", 3 + "lockfileVersion": 3, 4 + "requires": true, 5 + "packages": { 6 + "": { 7 + "dependencies": { 8 + "@opencode-ai/plugin": "1.15.5" 9 + } 10 + }, 11 + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { 12 + "version": "3.0.3", 13 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", 14 + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", 15 + "cpu": [ 16 + "arm64" 17 + ], 18 + "license": "MIT", 19 + "optional": true, 20 + "os": [ 21 + "darwin" 22 + ] 23 + }, 24 + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { 25 + "version": "3.0.3", 26 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", 27 + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", 28 + "cpu": [ 29 + "x64" 30 + ], 31 + "license": "MIT", 32 + "optional": true, 33 + "os": [ 34 + "darwin" 35 + ] 36 + }, 37 + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { 38 + "version": "3.0.3", 39 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", 40 + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", 41 + "cpu": [ 42 + "arm" 43 + ], 44 + "license": "MIT", 45 + "optional": true, 46 + "os": [ 47 + "linux" 48 + ] 49 + }, 50 + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { 51 + "version": "3.0.3", 52 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", 53 + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", 54 + "cpu": [ 55 + "arm64" 56 + ], 57 + "license": "MIT", 58 + "optional": true, 59 + "os": [ 60 + "linux" 61 + ] 62 + }, 63 + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { 64 + "version": "3.0.3", 65 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", 66 + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", 67 + "cpu": [ 68 + "x64" 69 + ], 70 + "license": "MIT", 71 + "optional": true, 72 + "os": [ 73 + "linux" 74 + ] 75 + }, 76 + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { 77 + "version": "3.0.3", 78 + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", 79 + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", 80 + "cpu": [ 81 + "x64" 82 + ], 83 + "license": "MIT", 84 + "optional": true, 85 + "os": [ 86 + "win32" 87 + ] 88 + }, 89 + "node_modules/@opencode-ai/plugin": { 90 + "version": "1.15.5", 91 + "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.15.5.tgz", 92 + "integrity": "sha512-QvhrDLlQuLeFGET1zB2crMWPvou6PpAzYtKrbun9akWvaskyAcXIAVn3lNYX/InMcut5VzL6ERbPgvM7ucHfLA==", 93 + "license": "MIT", 94 + "dependencies": { 95 + "@opencode-ai/sdk": "1.15.5", 96 + "effect": "4.0.0-beta.65", 97 + "zod": "4.1.8" 98 + }, 99 + "peerDependencies": { 100 + "@opentui/core": ">=0.2.14", 101 + "@opentui/keymap": ">=0.2.14", 102 + "@opentui/solid": ">=0.2.14" 103 + }, 104 + "peerDependenciesMeta": { 105 + "@opentui/core": { 106 + "optional": true 107 + }, 108 + "@opentui/keymap": { 109 + "optional": true 110 + }, 111 + "@opentui/solid": { 112 + "optional": true 113 + } 114 + } 115 + }, 116 + "node_modules/@opencode-ai/sdk": { 117 + "version": "1.15.5", 118 + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.15.5.tgz", 119 + "integrity": "sha512-ozJuEmXzrOvia5n0L1KAuvpyf9ESGmTk1FiPhn0RK5X1whbzjlTXL0NAxqNCEkqETxL35jS1KHArEiTpvtJ6FQ==", 120 + "license": "MIT", 121 + "dependencies": { 122 + "cross-spawn": "7.0.6" 123 + } 124 + }, 125 + "node_modules/@standard-schema/spec": { 126 + "version": "1.1.0", 127 + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", 128 + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", 129 + "license": "MIT" 130 + }, 131 + "node_modules/cross-spawn": { 132 + "version": "7.0.6", 133 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 134 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 135 + "license": "MIT", 136 + "dependencies": { 137 + "path-key": "^3.1.0", 138 + "shebang-command": "^2.0.0", 139 + "which": "^2.0.1" 140 + }, 141 + "engines": { 142 + "node": ">= 8" 143 + } 144 + }, 145 + "node_modules/detect-libc": { 146 + "version": "2.1.2", 147 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 148 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 149 + "license": "Apache-2.0", 150 + "optional": true, 151 + "engines": { 152 + "node": ">=8" 153 + } 154 + }, 155 + "node_modules/effect": { 156 + "version": "4.0.0-beta.65", 157 + "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.65.tgz", 158 + "integrity": "sha512-QYKvQPAj3CmtsvWkHQww15wX4KG2gNsszDWEcOO5sZCMknp66u6Si/Opmt3wwWCwsyvRmDAdIg+JIz5qzbbFIw==", 159 + "license": "MIT", 160 + "dependencies": { 161 + "@standard-schema/spec": "^1.1.0", 162 + "fast-check": "^4.6.0", 163 + "find-my-way-ts": "^0.1.6", 164 + "ini": "^6.0.0", 165 + "kubernetes-types": "^1.30.0", 166 + "msgpackr": "^1.11.9", 167 + "multipasta": "^0.2.7", 168 + "toml": "^4.1.1", 169 + "uuid": "^13.0.0", 170 + "yaml": "^2.8.3" 171 + } 172 + }, 173 + "node_modules/fast-check": { 174 + "version": "4.8.0", 175 + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.8.0.tgz", 176 + "integrity": "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==", 177 + "funding": [ 178 + { 179 + "type": "individual", 180 + "url": "https://github.com/sponsors/dubzzz" 181 + }, 182 + { 183 + "type": "opencollective", 184 + "url": "https://opencollective.com/fast-check" 185 + } 186 + ], 187 + "license": "MIT", 188 + "dependencies": { 189 + "pure-rand": "^8.0.0" 190 + }, 191 + "engines": { 192 + "node": ">=12.17.0" 193 + } 194 + }, 195 + "node_modules/find-my-way-ts": { 196 + "version": "0.1.6", 197 + "resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz", 198 + "integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==", 199 + "license": "MIT" 200 + }, 201 + "node_modules/ini": { 202 + "version": "6.0.0", 203 + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", 204 + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", 205 + "license": "ISC", 206 + "engines": { 207 + "node": "^20.17.0 || >=22.9.0" 208 + } 209 + }, 210 + "node_modules/isexe": { 211 + "version": "2.0.0", 212 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 213 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 214 + "license": "ISC" 215 + }, 216 + "node_modules/kubernetes-types": { 217 + "version": "1.30.0", 218 + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz", 219 + "integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==", 220 + "license": "Apache-2.0" 221 + }, 222 + "node_modules/msgpackr": { 223 + "version": "1.11.12", 224 + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.12.tgz", 225 + "integrity": "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==", 226 + "license": "MIT", 227 + "optionalDependencies": { 228 + "msgpackr-extract": "^3.0.2" 229 + } 230 + }, 231 + "node_modules/msgpackr-extract": { 232 + "version": "3.0.3", 233 + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", 234 + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", 235 + "hasInstallScript": true, 236 + "license": "MIT", 237 + "optional": true, 238 + "dependencies": { 239 + "node-gyp-build-optional-packages": "5.2.2" 240 + }, 241 + "bin": { 242 + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" 243 + }, 244 + "optionalDependencies": { 245 + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", 246 + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", 247 + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", 248 + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", 249 + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", 250 + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" 251 + } 252 + }, 253 + "node_modules/multipasta": { 254 + "version": "0.2.7", 255 + "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz", 256 + "integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==", 257 + "license": "MIT" 258 + }, 259 + "node_modules/node-gyp-build-optional-packages": { 260 + "version": "5.2.2", 261 + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", 262 + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", 263 + "license": "MIT", 264 + "optional": true, 265 + "dependencies": { 266 + "detect-libc": "^2.0.1" 267 + }, 268 + "bin": { 269 + "node-gyp-build-optional-packages": "bin.js", 270 + "node-gyp-build-optional-packages-optional": "optional.js", 271 + "node-gyp-build-optional-packages-test": "build-test.js" 272 + } 273 + }, 274 + "node_modules/path-key": { 275 + "version": "3.1.1", 276 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 277 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 278 + "license": "MIT", 279 + "engines": { 280 + "node": ">=8" 281 + } 282 + }, 283 + "node_modules/pure-rand": { 284 + "version": "8.4.0", 285 + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz", 286 + "integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==", 287 + "funding": [ 288 + { 289 + "type": "individual", 290 + "url": "https://github.com/sponsors/dubzzz" 291 + }, 292 + { 293 + "type": "opencollective", 294 + "url": "https://opencollective.com/fast-check" 295 + } 296 + ], 297 + "license": "MIT" 298 + }, 299 + "node_modules/shebang-command": { 300 + "version": "2.0.0", 301 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 302 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 303 + "license": "MIT", 304 + "dependencies": { 305 + "shebang-regex": "^3.0.0" 306 + }, 307 + "engines": { 308 + "node": ">=8" 309 + } 310 + }, 311 + "node_modules/shebang-regex": { 312 + "version": "3.0.0", 313 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 314 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 315 + "license": "MIT", 316 + "engines": { 317 + "node": ">=8" 318 + } 319 + }, 320 + "node_modules/toml": { 321 + "version": "4.1.1", 322 + "resolved": "https://registry.npmjs.org/toml/-/toml-4.1.1.tgz", 323 + "integrity": "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==", 324 + "license": "MIT", 325 + "engines": { 326 + "node": ">=20" 327 + } 328 + }, 329 + "node_modules/uuid": { 330 + "version": "13.0.2", 331 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz", 332 + "integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==", 333 + "funding": [ 334 + "https://github.com/sponsors/broofa", 335 + "https://github.com/sponsors/ctavan" 336 + ], 337 + "license": "MIT", 338 + "bin": { 339 + "uuid": "dist-node/bin/uuid" 340 + } 341 + }, 342 + "node_modules/which": { 343 + "version": "2.0.2", 344 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 345 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 346 + "license": "ISC", 347 + "dependencies": { 348 + "isexe": "^2.0.0" 349 + }, 350 + "bin": { 351 + "node-which": "bin/node-which" 352 + }, 353 + "engines": { 354 + "node": ">= 8" 355 + } 356 + }, 357 + "node_modules/yaml": { 358 + "version": "2.9.0", 359 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", 360 + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", 361 + "license": "ISC", 362 + "bin": { 363 + "yaml": "bin.mjs" 364 + }, 365 + "engines": { 366 + "node": ">= 14.6" 367 + }, 368 + "funding": { 369 + "url": "https://github.com/sponsors/eemeli" 370 + } 371 + }, 372 + "node_modules/zod": { 373 + "version": "4.1.8", 374 + "license": "MIT", 375 + "funding": { 376 + "url": "https://github.com/sponsors/colinhacks" 377 + } 378 + } 379 + } 380 + }
+1
src/ARCHITECTURE.md
··· 7 7 **Role:** Talk to a **source** about the file tree and other top-level actions. 8 8 9 9 - Lists entries (sidebar): names and stable ids 10 + - `createFile()` for new persisted entries (sidebar “New document”) 10 11 - Readiness and auth hints (`isReady`, `subscribeReady`) 11 12 - Does **not** open document contents or run merge/sync 12 13 - Pairs with a `DocumentProvider` via `documents` + `defaultEditorKind` (injected in `App.tsx`)
+14
src/App.tsx
··· 1 1 import { useCallback, useEffect, useMemo, useState } from 'react'; 2 + import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; 2 3 import { MemoryRouter, Route, Routes } from 'react-router-dom'; 3 4 import { UserIdentityProvider } from './auth/UserIdentityContext'; 4 5 import { AppBottomBar } from './components/AppBottomBar'; ··· 16 17 type OpenDocRequest, 17 18 type WorkspaceKind, 18 19 } from './workspaces/workspace'; 20 + 21 + const queryClient = new QueryClient({ 22 + defaultOptions: { 23 + queries: { 24 + // File listings are invalidated explicitly (on auth change, on create); 25 + // don't refetch silently in the background on every mount/focus. 26 + staleTime: 30_000, 27 + refetchOnWindowFocus: false, 28 + }, 29 + }, 30 + }); 19 31 20 32 const WORKSPACE_KIND_STORAGE_KEY = 'textile.workspaceKind'; 21 33 ··· 90 102 }, []); 91 103 92 104 return ( 105 + <QueryClientProvider client={queryClient}> 93 106 <UserIdentityProvider> 94 107 <MemoryRouter initialEntries={['/']}> 95 108 {/* TODO: Replace this unsupported screen with full non-macOS UI path. */} ··· 153 166 )} 154 167 </MemoryRouter> 155 168 </UserIdentityProvider> 169 + </QueryClientProvider> 156 170 ); 157 171 }
+247 -159
src/components/AppSidebar.tsx
··· 1 - import { useEffect, useMemo, useRef, useState } from 'react'; 1 + import { useCallback, useEffect, useMemo, useState } from 'react'; 2 + import { useQuery, useQueryClient } from '@tanstack/react-query'; 2 3 import type { FileSystemEntry, FileSystemProvider } from '../filesystem/types'; 3 4 import type { OpenDocRequest } from '../workspaces/workspace'; 4 5 ··· 7 8 providers: FileSystemProvider[]; 8 9 /** Emitted when the user picks an entry; the shell forwards it to the active workspace. */ 9 10 onOpenEntry?: (request: OpenDocRequest) => void; 10 - }; 11 - 12 - type ListingState = { 13 - entries: FileSystemEntry[]; 14 - loading: boolean; 15 - error: string | null; 16 11 }; 17 12 18 13 type Selection = { providerId: string; entryId: string } | null; ··· 35 30 ); 36 31 } 37 32 38 - function defaultListing(): ListingState { 39 - return { entries: [], loading: true, error: null }; 33 + /** File with pencil (lucide-style), for "new document". */ 34 + function NewDocumentIcon({ className }: { className?: string }) { 35 + return ( 36 + <svg 37 + className={className} 38 + viewBox="0 0 24 24" 39 + fill="none" 40 + stroke="currentColor" 41 + strokeWidth="2" 42 + strokeLinecap="round" 43 + strokeLinejoin="round" 44 + aria-hidden 45 + > 46 + {/* Document with folded corner */} 47 + <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5Z" /> 48 + <polyline points="14 2 14 8 20 8" /> 49 + {/* Pencil diagonal on the page: eraser upper-right, tip lower-left. 50 + Axis runs from (15,12) to (9,18); perpendicular is (1,1)/√2. 51 + Shaft half-width 1.5; tip 2.5 units before the point. */} 52 + <polygon points="14,11 16,13 12,17 9,18 10,15" /> 53 + {/* Ferrule line, perpendicular to axis, spanning shaft edge-to-edge */} 54 + <line x1="14.5" y1="14.5" x2="12.5" y2="12.5" /> 55 + </svg> 56 + ); 57 + } 58 + 59 + function filesQueryKey(providerId: string) { 60 + return ['files', providerId] as const; 61 + } 62 + 63 + type ProviderSectionProps = { 64 + provider: FileSystemProvider; 65 + selection: Selection; 66 + onSelect: (sel: Selection) => void; 67 + onOpenEntry?: (request: OpenDocRequest) => void; 68 + }; 69 + 70 + function ProviderSection({ 71 + provider, 72 + selection, 73 + onSelect, 74 + onOpenEntry, 75 + }: ProviderSectionProps) { 76 + const queryClient = useQueryClient(); 77 + 78 + // Core listing query. 79 + const query = useQuery({ 80 + queryKey: filesQueryKey(provider.id), 81 + queryFn: () => provider.listFiles(), 82 + enabled: provider.isReady(), 83 + }); 84 + 85 + // Invalidate (re-fetch) when the provider transitions from not-ready → ready, 86 + // e.g. the user signs in. 87 + useEffect(() => { 88 + if (!provider.subscribeReady) return; 89 + return provider.subscribeReady(() => { 90 + void queryClient.invalidateQueries({ queryKey: filesQueryKey(provider.id) }); 91 + }); 92 + }, [provider, queryClient]); 93 + 94 + // Patch individual entry names in the cache as the user edits document 95 + // headings, without requiring a full re-fetch. 96 + useEffect(() => { 97 + if (!provider.subscribeEntryTitles) return; 98 + return provider.subscribeEntryTitles((entryId, name) => { 99 + queryClient.setQueryData<FileSystemEntry[]>( 100 + filesQueryKey(provider.id), 101 + (entries) => { 102 + if (!entries) return entries; 103 + const index = entries.findIndex((e) => e.id === entryId); 104 + if (index < 0 || entries[index]?.name === name) return entries; 105 + const next = entries.slice(); 106 + next[index] = { id: entryId, name }; 107 + return next; 108 + }, 109 + ); 110 + }); 111 + }, [provider, queryClient]); 112 + 113 + // Clear the selection if the selected entry disappears from this provider's 114 + // listing (e.g. deleted remotely). 115 + useEffect(() => { 116 + if (!selection || selection.providerId !== provider.id) return; 117 + if (query.isPending) return; 118 + if (query.data && !query.data.some((e) => e.id === selection.entryId)) { 119 + onSelect(null); 120 + } 121 + }, [query.data, query.isPending, selection, provider.id, onSelect]); 122 + 123 + const entries = useMemo( 124 + () => [...(query.data ?? [])].sort((a, b) => a.name.localeCompare(b.name)), 125 + [query.data], 126 + ); 127 + const idleCopy = 128 + provider.idleHint ?? 129 + 'Connect an account in Settings (⌘,) to see files here.'; 130 + 131 + return ( 132 + <section className="flex min-h-0 min-w-0 flex-1 flex-col gap-1"> 133 + <h2 className="text-foreground/80 shrink-0 text-xs font-semibold tracking-wide uppercase"> 134 + {provider.displayName} 135 + </h2> 136 + <div className="flex min-h-0 flex-1 flex-col gap-0.5"> 137 + {!provider.isReady() ? ( 138 + <p className="text-foreground/60 px-2 text-xs leading-snug"> 139 + {idleCopy} 140 + </p> 141 + ) : query.isLoading ? ( 142 + <p className="text-foreground/60 px-2 text-xs">Loading…</p> 143 + ) : query.isError ? ( 144 + <p className="text-destructive px-2 text-xs leading-snug"> 145 + {query.error instanceof Error 146 + ? query.error.message 147 + : 'Failed to load files'} 148 + </p> 149 + ) : entries.length === 0 ? ( 150 + <p className="text-foreground/60 px-2 text-xs leading-snug"> 151 + No files. 152 + </p> 153 + ) : ( 154 + <div 155 + role="list" 156 + className="flex min-h-0 flex-1 flex-col gap-0.5" 157 + > 158 + {entries.map((entry) => { 159 + const isSelected = 160 + selection?.providerId === provider.id && 161 + selection.entryId === entry.id; 162 + return ( 163 + <button 164 + key={`${provider.id}:${entry.id}`} 165 + type="button" 166 + role="listitem" 167 + title={entry.name} 168 + aria-current={isSelected ? 'true' : undefined} 169 + onClick={() => { 170 + onSelect({ 171 + providerId: provider.id, 172 + entryId: entry.id, 173 + }); 174 + onOpenEntry?.({ 175 + providerId: provider.id, 176 + entryId: entry.id, 177 + title: entry.name, 178 + }); 179 + }} 180 + className={`font-inherit focus-visible:ring-accent/50 flex w-full min-w-0 shrink-0 cursor-pointer items-center gap-2 rounded-md border-0 px-2 py-1.5 text-left text-sm outline-none select-none focus-visible:ring-2 ${ 181 + isSelected 182 + ? 'bg-accent/10 text-foreground' 183 + : 'text-foreground/70 hover:bg-border/35 bg-transparent' 184 + }`} 185 + > 186 + <DocFileIcon 187 + className={`size-4 shrink-0 ${isSelected ? 'text-accent' : 'text-foreground/40'}`} 188 + /> 189 + <span className="truncate">{entry.name}</span> 190 + </button> 191 + ); 192 + })} 193 + </div> 194 + )} 195 + </div> 196 + </section> 197 + ); 40 198 } 41 199 42 200 export function AppSidebar({ open, providers, onOpenEntry }: AppSidebarProps) { 43 - const [listings, setListings] = useState<Record<string, ListingState>>({}); 44 - // TODO: When workspace tabs change the active document, update this selection to match. 201 + const queryClient = useQueryClient(); 45 202 const [selection, setSelection] = useState<Selection>(null); 46 - const loadGenerationRef = useRef<Record<string, number>>({}); 203 + const [creatingFor, setCreatingFor] = useState<string | null>(null); 204 + const [createError, setCreateError] = useState<string | null>(null); 47 205 48 - const providerKey = useMemo( 49 - () => providers.map((p) => p.id).join('\0'), 206 + const creatableProviders = useMemo( 207 + () => providers.filter((p) => p.isReady()), 50 208 [providers], 51 209 ); 52 210 53 - useEffect(() => { 54 - const bump = (id: string) => { 55 - loadGenerationRef.current[id] = (loadGenerationRef.current[id] ?? 0) + 1; 56 - return loadGenerationRef.current[id]; 57 - }; 58 - 59 - const loadOne = (provider: FileSystemProvider) => { 60 - const { id } = provider; 61 - const gen = bump(id); 62 - 63 - if (!provider.isReady()) { 64 - setListings((s) => ({ 65 - ...s, 66 - [id]: { entries: [], loading: false, error: null }, 67 - })); 68 - setSelection((sel) => (sel?.providerId === id ? null : sel)); 69 - return; 70 - } 71 - 72 - setListings((s) => ({ 73 - ...s, 74 - [id]: { 75 - ...(s[id] ?? defaultListing()), 76 - loading: true, 77 - error: null, 78 - }, 79 - })); 80 - 81 - provider 82 - .listFiles() 83 - .then((entries) => { 84 - if (loadGenerationRef.current[id] !== gen) return; 85 - setListings((s) => ({ 86 - ...s, 87 - [id]: { entries, loading: false, error: null }, 88 - })); 89 - }) 90 - .catch((e: unknown) => { 91 - if (loadGenerationRef.current[id] !== gen) return; 92 - setListings((s) => ({ 93 - ...s, 94 - [id]: { 95 - entries: [], 96 - loading: false, 97 - error: e instanceof Error ? e.message : 'Failed to load files', 98 - }, 99 - })); 211 + const handleCreate = useCallback( 212 + async (provider: FileSystemProvider) => { 213 + setCreateError(null); 214 + setCreatingFor(provider.id); 215 + try { 216 + const entry = await provider.createFile(); 217 + // Optimistically insert so the selection effect doesn't race and clear 218 + // the selection before the invalidation re-fetch resolves. 219 + queryClient.setQueryData<FileSystemEntry[]>( 220 + filesQueryKey(provider.id), 221 + (entries) => 222 + entries && !entries.some((e) => e.id === entry.id) 223 + ? [...entries, entry] 224 + : (entries ?? [entry]), 225 + ); 226 + setSelection({ providerId: provider.id, entryId: entry.id }); 227 + onOpenEntry?.({ 228 + providerId: provider.id, 229 + entryId: entry.id, 230 + title: entry.name, 100 231 }); 101 - }; 102 - 103 - const unsubscribers: (() => void)[] = []; 104 - 105 - for (const p of providers) { 106 - loadOne(p); 107 - if (p.subscribeReady) { 108 - unsubscribers.push(p.subscribeReady(() => loadOne(p))); 232 + void queryClient.invalidateQueries({ queryKey: filesQueryKey(provider.id) }); 233 + } catch (e: unknown) { 234 + setCreateError( 235 + e instanceof Error ? e.message : 'Could not create document', 236 + ); 237 + } finally { 238 + setCreatingFor(null); 109 239 } 110 - } 111 - 112 - return () => { 113 - for (const p of providers) { 114 - bump(p.id); 115 - } 116 - unsubscribers.forEach((u) => u()); 117 - }; 118 - }, [providerKey, providers]); 119 - 120 - useEffect(() => { 121 - if (!selection) return; 122 - const listing = listings[selection.providerId]; 123 - if (!listing || listing.loading) return; 124 - if (!listing.entries.some((e) => e.id === selection.entryId)) { 125 - setSelection(null); 126 - } 127 - }, [listings, selection]); 240 + }, 241 + [queryClient, setSelection, onOpenEntry], 242 + ); 128 243 129 244 return ( 130 245 <aside ··· 140 255 }} 141 256 aria-hidden={!open} 142 257 > 143 - <div className="flex h-full min-h-0 w-56 flex-col gap-4 p-3"> 144 - {providers.map((provider) => { 145 - const listing = listings[provider.id] ?? defaultListing(); 146 - const idleCopy = 147 - provider.idleHint ?? 148 - 'Connect an account in Settings (⌘,) to see files here.'; 258 + <div className="flex h-full min-h-0 w-56 flex-col"> 259 + {creatableProviders.length > 0 ? ( 260 + <div className="border-border flex shrink-0 items-center border-b px-3 py-2"> 261 + {creatableProviders.map((provider) => { 262 + const isCreating = creatingFor === provider.id; 263 + return ( 264 + <button 265 + key={provider.id} 266 + type="button" 267 + disabled={creatingFor !== null} 268 + title={ 269 + isCreating 270 + ? 'Creating document…' 271 + : `New document in ${provider.displayName}` 272 + } 273 + aria-label={ 274 + isCreating 275 + ? 'Creating document…' 276 + : `New document in ${provider.displayName}` 277 + } 278 + aria-busy={isCreating} 279 + onClick={() => void handleCreate(provider)} 280 + className="text-foreground hover:bg-border/40 focus-visible:ring-accent/50 cursor-pointer rounded-md p-1.5 outline-none focus-visible:ring-2 disabled:opacity-50" 281 + > 282 + <NewDocumentIcon className="size-4 shrink-0" /> 283 + </button> 284 + ); 285 + })} 286 + {createError ? ( 287 + <p className="text-destructive mt-2 text-xs leading-snug"> 288 + {createError} 289 + </p> 290 + ) : null} 291 + </div> 292 + ) : null} 149 293 150 - return ( 151 - <section 294 + <div className="flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-3"> 295 + {providers.map((provider) => ( 296 + <ProviderSection 152 297 key={provider.id} 153 - className="flex min-h-0 min-w-0 flex-1 flex-col gap-1" 154 - > 155 - <h2 className="text-foreground/80 shrink-0 text-xs font-semibold tracking-wide uppercase"> 156 - {provider.displayName} 157 - </h2> 158 - <div className="flex min-h-0 flex-1 flex-col gap-0.5"> 159 - {!provider.isReady() ? ( 160 - <p className="text-foreground/60 px-2 text-xs leading-snug"> 161 - {idleCopy} 162 - </p> 163 - ) : listing.loading ? ( 164 - <p className="text-foreground/60 px-2 text-xs">Loading…</p> 165 - ) : listing.error ? ( 166 - <p className="text-destructive px-2 text-xs leading-snug"> 167 - {listing.error} 168 - </p> 169 - ) : listing.entries.length === 0 ? ( 170 - <p className="text-foreground/60 px-2 text-xs leading-snug"> 171 - No files. 172 - </p> 173 - ) : ( 174 - <div 175 - role="list" 176 - className="flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto" 177 - > 178 - {listing.entries.map((entry) => { 179 - const isSelected = 180 - selection?.providerId === provider.id && 181 - selection.entryId === entry.id; 182 - return ( 183 - <button 184 - key={`${provider.id}:${entry.id}`} 185 - type="button" 186 - role="listitem" 187 - title={entry.name} 188 - aria-current={isSelected ? 'true' : undefined} 189 - onClick={() => { 190 - setSelection({ 191 - providerId: provider.id, 192 - entryId: entry.id, 193 - }); 194 - onOpenEntry?.({ 195 - providerId: provider.id, 196 - entryId: entry.id, 197 - title: entry.name, 198 - }); 199 - }} 200 - className={`font-inherit focus-visible:ring-accent/50 flex w-full min-w-0 shrink-0 cursor-pointer items-center gap-2 rounded-md border-0 px-2 py-1.5 text-left text-sm outline-none select-none focus-visible:ring-2 ${ 201 - isSelected 202 - ? 'bg-border/50 text-foreground' 203 - : 'text-foreground/90 hover:bg-border/35 bg-transparent' 204 - }`} 205 - > 206 - <DocFileIcon className="text-foreground/50 size-4 shrink-0" /> 207 - <span className="truncate">{entry.name}</span> 208 - </button> 209 - ); 210 - })} 211 - </div> 212 - )} 213 - </div> 214 - </section> 215 - ); 216 - })} 298 + provider={provider} 299 + selection={selection} 300 + onSelect={setSelection} 301 + onOpenEntry={onOpenEntry} 302 + /> 303 + ))} 304 + </div> 217 305 </div> 218 306 </aside> 219 307 );
+12
src/filesystem/types.ts
··· 32 32 /** List entries for this source; reject on transport errors. */ 33 33 listFiles(): Promise<FileSystemEntry[]>; 34 34 /** 35 + * Create a new persisted entry in this source (e.g. a new Habitat docs 36 + * record). The shell optimistically inserts it, then refreshes the listing. 37 + */ 38 + createFile(): Promise<FileSystemEntry>; 39 + /** 40 + * When implemented, called when a listed entry's display name changes 41 + * (e.g. habitat doc heading edits). Used to keep the sidebar in sync. 42 + */ 43 + subscribeEntryTitles?( 44 + listener: (entryId: string, name: string) => void, 45 + ): () => void; 46 + /** 35 47 * Backend kind used when creating new documents from this source. 36 48 * TODO: Let users pick the default per source (or globally) in settings. 37 49 */
+63 -8
src/habitat/docSession.ts
··· 6 6 HabitatLibp2pNode, 7 7 } from './connectionProvider'; 8 8 import { 9 - getHeadingFromYdoc, 10 9 loadHabitatDoc, 11 10 mergeAllEdits, 11 + resolveDocDisplayTitle, 12 12 saveHabitatDoc, 13 13 type LoadDocResult, 14 14 } from './habitatDoc'; ··· 70 70 * to be stopped. 71 71 */ 72 72 teardownPromise: Promise<void> | null; 73 + /** Mirrors habitat docs `syncHeading` for sidebar list labels. */ 74 + titleSyncHandler: (() => void) | null; 75 + lastEmittedTitle: string | null; 73 76 }; 74 77 75 78 const ydocRegistry = new Map<string, RegistryEntry>(); 79 + 80 + const entryTitleListeners = new Set<(uri: string, name: string) => void>(); 81 + 82 + /** Subscribe to live title changes for open habitat docs (sidebar labels). */ 83 + export function subscribeEntryTitleChanges( 84 + listener: (uri: string, name: string) => void, 85 + ): () => void { 86 + entryTitleListeners.add(listener); 87 + return () => { 88 + entryTitleListeners.delete(listener); 89 + }; 90 + } 91 + 92 + function emitEntryTitle(uri: string, name: string): void { 93 + for (const listener of entryTitleListeners) { 94 + listener(uri, name); 95 + } 96 + } 76 97 77 98 const SAVE_DEBOUNCE_MS = 1000; 78 99 ··· 144 165 async function runSave(entry: RegistryEntry) { 145 166 const myDid = habitatAuth.getAuthInfo()?.did; 146 167 if (!myDid || !entry.ownerRecord) return; 168 + const ownerRecord = entry.ownerRecord; 147 169 entry.pendingSave = saveHabitatDoc({ 148 - ownerRecord: entry.ownerRecord, 170 + ownerRecord, 149 171 ydoc: entry.ydoc, 150 172 myDid, 151 173 }) 152 - .then(() => undefined) 174 + .then(() => { 175 + const name = resolveDocDisplayTitle(entry.ydoc, ownerRecord.value.name); 176 + entry.ownerRecord = { 177 + ...ownerRecord, 178 + value: { ...ownerRecord.value, name }, 179 + }; 180 + syncEntryTitle(entry, name); 181 + }) 153 182 .catch((e) => { 154 183 console.error('[habitat] save failed', e); 155 184 }) ··· 157 186 entry.pendingSave = null; 158 187 }); 159 188 await entry.pendingSave; 189 + } 190 + 191 + function syncEntryTitle(entry: RegistryEntry, name?: string): void { 192 + if (!entry.ownerRecord) return; 193 + const next = 194 + name ?? resolveDocDisplayTitle(entry.ydoc, entry.ownerRecord.value.name); 195 + if (next === entry.lastEmittedTitle) return; 196 + entry.lastEmittedTitle = next; 197 + emitEntryTitle(entry.uri, next); 198 + } 199 + 200 + function attachTitleSyncHandler(entry: RegistryEntry): void { 201 + if (entry.titleSyncHandler) return; 202 + entry.titleSyncHandler = () => syncEntryTitle(entry); 203 + entry.ydoc.on('update', entry.titleSyncHandler); 204 + syncEntryTitle(entry); 205 + } 206 + 207 + function detachTitleSyncHandler(entry: RegistryEntry): void { 208 + if (!entry.titleSyncHandler) return; 209 + entry.ydoc.off('update', entry.titleSyncHandler); 210 + entry.titleSyncHandler = null; 160 211 } 161 212 162 213 function attachSaveHandler(entry: RegistryEntry) { ··· 199 250 saveTimer: null, 200 251 pendingSave: null, 201 252 teardownPromise: null, 253 + titleSyncHandler: null, 254 + lastEmittedTitle: null, 202 255 }; 203 256 ydocRegistry.set(uri, entry); 257 + attachTitleSyncHandler(entry); 204 258 // First-time init: load from PDS, then stand up libp2p. 205 259 assignLoadPromise(entry, initSession(entry)); 206 260 } else if (entry.teardownPromise || !entry.node) { ··· 221 275 const result = await loadHabitatDoc(entry.uri, entry.ydoc); 222 276 entry.ownerRecord = result.ownerRecord; 223 277 attachSaveHandler(entry); 278 + syncEntryTitle(entry); 224 279 await ensureLiveEditing(entry); 225 280 return result; 226 281 } catch (e) { ··· 241 296 const result = await loadHabitatDoc(entry.uri, entry.ydoc); 242 297 entry.ownerRecord = result.ownerRecord; 243 298 attachSaveHandler(entry); 299 + syncEntryTitle(entry); 244 300 await ensureLiveEditing(entry); 245 301 return result; 246 302 } catch (e) { ··· 287 343 }, 288 344 loadPromise, 289 345 getTitle() { 290 - return ( 291 - getHeadingFromYdoc(entry.ydoc) ?? 292 - entry.ownerRecord?.value.name ?? 293 - 'Untitled' 294 - ); 346 + if (!entry.ownerRecord) return ''; 347 + return resolveDocDisplayTitle(entry.ydoc, entry.ownerRecord.value.name); 295 348 }, 296 349 resync: () => resyncEntry(entry), 297 350 release: () => { ··· 348 401 export function __resetDocSessionRegistryForTests() { 349 402 for (const entry of ydocRegistry.values()) { 350 403 if (entry.saveTimer) clearTimeout(entry.saveTimer); 404 + detachTitleSyncHandler(entry); 351 405 try { 352 406 entry.provider?.destroy(); 353 407 } catch { ··· 357 411 if (stopped) void stopped.catch(() => undefined); 358 412 } 359 413 ydocRegistry.clear(); 414 + entryTitleListeners.clear(); 360 415 }
+17
src/habitat/habitatDoc.test.ts
··· 7 7 editRkeyFor, 8 8 getHeadingFromYdoc, 9 9 parseDocUri, 10 + resolveDocDisplayTitle, 10 11 } from './habitatDoc'; 11 12 12 13 function encode(ydoc: Y.Doc): string { ··· 74 75 applyHabitatBlob(ydoc, undefined); 75 76 applyHabitatBlob(ydoc, ''); 76 77 expect(encode(ydoc)).toEqual(encode(new Y.Doc())); 78 + }); 79 + }); 80 + 81 + describe('resolveDocDisplayTitle', () => { 82 + it('prefers heading over stored name', () => { 83 + const ydoc = new Y.Doc(); 84 + const heading = new Y.XmlElement('heading'); 85 + heading.insert(0, [new Y.XmlText('From heading')]); 86 + ydoc.getXmlFragment('default').insert(0, [heading]); 87 + expect(resolveDocDisplayTitle(ydoc, 'Stored')).toBe('From heading'); 88 + }); 89 + 90 + it('falls back to stored name then Untitled', () => { 91 + const ydoc = new Y.Doc(); 92 + expect(resolveDocDisplayTitle(ydoc, 'My doc')).toBe('My doc'); 93 + expect(resolveDocDisplayTitle(ydoc)).toBe('Untitled'); 77 94 }); 78 95 }); 79 96
+41 -2
src/habitat/habitatDoc.ts
··· 154 154 return undefined; 155 155 } 156 156 157 + /** Title for UI and PDS `name`, preferring the doc's first heading (habitat docs app). */ 158 + export function resolveDocDisplayTitle( 159 + ydoc: Y.Doc, 160 + storedName?: string | null, 161 + ): string { 162 + const heading = getHeadingFromYdoc(ydoc)?.trim(); 163 + if (heading) return heading; 164 + const name = storedName?.trim(); 165 + if (name) return name; 166 + return 'Untitled'; 167 + } 168 + 157 169 export type SaveTarget = { 158 170 repo: string; 159 171 collection: string; ··· 187 199 * caller. Debouncing is the caller's responsibility (1s trailing-edge 188 200 * matches upstream). 189 201 */ 202 + /** 203 + * Create a new owner doc with an empty editor clique, matching the habitat docs 204 + * web app (`_requireAuth.tsx` create mutation). 205 + */ 206 + export async function createHabitatDoc( 207 + myDid: string, 208 + ): Promise<{ uri: string; cid: string }> { 209 + const { clique } = await procedure('network.habitat.clique.createClique', { 210 + members: [], 211 + }); 212 + 213 + return procedure('network.habitat.repo.putRecord', { 214 + repo: myDid, 215 + collection: HABITAT_DOCS_COLLECTION, 216 + record: { 217 + name: 'Untitled', 218 + blob: null, 219 + editorClique: clique, 220 + }, 221 + grantees: [ 222 + { 223 + $type: 'network.habitat.grantee#clique', 224 + clique, 225 + }, 226 + ], 227 + }); 228 + } 229 + 190 230 export async function saveHabitatDoc({ 191 231 ownerRecord, 192 232 ydoc, 193 233 myDid, 194 234 }: SaveHabitatDocArgs): Promise<{ uri: string; cid: string }> { 195 235 const target = chooseSaveTarget(ownerRecord.uri, myDid); 196 - const heading = getHeadingFromYdoc(ydoc); 197 236 const record: HabitatDoc = { 198 - name: heading?.trim() || ownerRecord.value.name || 'Untitled', 237 + name: resolveDocDisplayTitle(ydoc, ownerRecord.value.name), 199 238 blob: encodeBlob(ydoc), 200 239 editorClique: ownerRecord.value.editorClique, 201 240 };
+4
src/habitat/xrpc.ts
··· 46 46 }; 47 47 48 48 type ProcedureEndpoints = { 49 + 'network.habitat.clique.createClique': { 50 + params: { members: string[] }; 51 + output: { clique: string }; 52 + }; 49 53 'network.habitat.repo.putRecord': { 50 54 params: { 51 55 repo: string;
+16 -1
src/documents/providers/habitatDocumentsProvider.ts
··· 1 1 import * as Y from 'yjs'; 2 2 3 + import { habitatAuth } from '../../auth/habitatAuth'; 3 4 import { createYjsBinding } from '../../editors/yjs/yjsEditorBinding'; 4 5 import { acquireDocSession } from '../../habitat/docSession'; 6 + import { createHabitatDoc } from '../../habitat/habitatDoc'; 5 7 import type { DocumentHandle, DocumentProvider } from '../types'; 6 8 7 9 export class HabitatDocumentsProvider implements DocumentProvider { ··· 28 30 } 29 31 30 32 async createDocument(options?: { id?: string }): Promise<DocumentHandle> { 31 - const id = options?.id ?? `local:${crypto.randomUUID()}`; 33 + if (options?.id?.startsWith('local:')) { 34 + return this.createLocalDocument(options.id); 35 + } 36 + 37 + const did = habitatAuth.getAuthInfo()?.did; 38 + if (!did) { 39 + throw new Error('Not signed in.'); 40 + } 41 + 42 + const { uri } = await createHabitatDoc(did); 43 + return this.openDocument(uri); 44 + } 45 + 46 + private createLocalDocument(id: string): DocumentHandle { 32 47 const ydoc = new Y.Doc(); 33 48 let released = false; 34 49
+19
src/filesystem/providers/habitatFilesystemProvider.ts
··· 2 2 import { HABITAT_DOCS_COLLECTION } from '../../habitat/config'; 3 3 import type { DocumentProvider } from '../../documents/types'; 4 4 import type { EditorKind } from '../../editors/types'; 5 + import { createHabitatDoc } from '../../habitat/habitatDoc'; 6 + import { subscribeEntryTitleChanges } from '../../habitat/docSession'; 5 7 import { listPrivateRecords } from '../../habitat/xrpc'; 6 8 import type { HabitatDoc } from '../../habitat/types'; 7 9 import type { FileSystemEntry, FileSystemProvider } from '../types'; ··· 35 37 36 38 listFiles(): Promise<FileSystemEntry[]> { 37 39 return this.listHabitatDocsRecords(); 40 + } 41 + 42 + subscribeEntryTitles( 43 + listener: (entryId: string, name: string) => void, 44 + ): () => void { 45 + return subscribeEntryTitleChanges(listener); 46 + } 47 + 48 + async createFile(): Promise<FileSystemEntry> { 49 + const did = habitatAuth.getAuthInfo()?.did; 50 + if (!did) { 51 + throw new Error( 52 + `Sign in via Settings (⌘,) to create ${LOGIN_NAME} docs.`, 53 + ); 54 + } 55 + const { uri } = await createHabitatDoc(did); 56 + return { id: uri, name: 'Untitled' }; 38 57 } 39 58 40 59 private async listHabitatDocsRecords(