├── .gitignore ├── README.md ├── icon ├── icon128.png ├── icon16.png ├── icon32.png └── icon48.png ├── package-lock.json ├── package.json ├── src ├── Overlay.ts ├── background.ts ├── constants.ts ├── content-main-world.ts ├── content.ts ├── devtools.html ├── devtools.ts ├── options.html ├── options.ts ├── utils.ts └── vite-env.d.ts ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Inspector 2 | 3 | YOU CAN TRY 👉 https://chrome.google.com/webstore/detail/react-inspector/gkkcgbepkkhfnnjolcaggogkjodmlpkh 4 | 5 | Easily detect React components source code from Chrome! 6 | 7 | ![CleanShot 2022-09-02 at 18 08 23](https://user-images.githubusercontent.com/24843808/188106077-ff409aeb-0145-4977-9be2-16d04809cc78.gif) 8 | 9 | The Inspector launch with Ctrl+Shift+X (Command+Shift+X on Mac). 10 | You can detect and open the React component source code easily. 11 | 12 | 1. Run the Dev server and Open your react app. 13 | 2. Press Ctrl+Shift+X (Command+Shift+X on Mac) on Chrome. 14 | 3. Inspect your react components and click it. 15 | 16 | --- 17 | 18 | You can edit the open in editor URL on the options page. If you are not VSCode user, you can edit it to your favorite editor URL-schemes. 19 | 20 | ![CleanShot 2022-09-12 at 13 11 18](https://user-images.githubusercontent.com/24843808/189572510-a54463ff-1f11-4c92-a19f-007ad113009b.png) 21 | 22 | ![CleanShot 2022-09-12 at 13 10 27](https://user-images.githubusercontent.com/24843808/189572514-0c7993b4-0067-4984-8ee2-89ba978907ed.png) 23 | 24 | 25 | 26 | ## Requirements 27 | 28 | - Installed [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) 29 | - Works only with development builds. 30 | - Source code must be stored on local disk 31 | 32 | ## How it works 33 | 34 | The React Inspector accesses the `__REACT_DEVTOOLS_GLOBAL_HOOK__` set globally by the React Devtools and finds the [React Fiber](https://reactjs.org/docs/faq-internals.html#what-is-react-fiber) in the HTML element that the inspector hovered over. 35 | The React Fiber contains information about the source code that will be added during development, so we use that information to open the VSCode. 36 | 37 | Reference 38 | - https://github.com/facebook/react/tree/main/packages/react-devtools#faq 39 | - https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-source 40 | - https://github.com/facebook/react/blob/f0efa1164b7ca8523b081223954d05c88e92053b/packages/react-reconciler/src/ReactInternalTypes.js#L193 41 | -------------------------------------------------------------------------------- /icon/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hand-dot/react-inspector/ac33da40bd8771977040b18dd3c088d9c945c5da/icon/icon128.png -------------------------------------------------------------------------------- /icon/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hand-dot/react-inspector/ac33da40bd8771977040b18dd3c088d9c945c5da/icon/icon16.png -------------------------------------------------------------------------------- /icon/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hand-dot/react-inspector/ac33da40bd8771977040b18dd3c088d9c945c5da/icon/icon32.png -------------------------------------------------------------------------------- /icon/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hand-dot/react-inspector/ac33da40bd8771977040b18dd3c088d9c945c5da/icon/icon48.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-inspector", 3 | "version": "1.2.4", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "react-inspector", 9 | "version": "1.2.4", 10 | "devDependencies": { 11 | "@crxjs/vite-plugin": "2.0.0-beta.26", 12 | "@types/chrome": "^0.0.195", 13 | "typescript": "^4.6.4", 14 | "vite": "^5.4.10" 15 | } 16 | }, 17 | "node_modules/@crxjs/vite-plugin": { 18 | "version": "2.0.0-beta.26", 19 | "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.0.0-beta.26.tgz", 20 | "integrity": "sha512-fZiSeOB4LOwq3cLIwHJnJ4x/duBU/Gkn3JKF7b7mZIRAXtu1waorJ6QaH7qoZPcN5LzyA3J+/t3Kuwa/oo8XNg==", 21 | "dev": true, 22 | "dependencies": { 23 | "@rollup/pluginutils": "^4.1.2", 24 | "@webcomponents/custom-elements": "^1.5.0", 25 | "acorn-walk": "^8.2.0", 26 | "cheerio": "^1.0.0-rc.10", 27 | "connect-injector": "^0.4.4", 28 | "convert-source-map": "^1.7.0", 29 | "debug": "^4.3.3", 30 | "es-module-lexer": "^0.10.0", 31 | "fast-glob": "^3.2.11", 32 | "fs-extra": "^10.0.1", 33 | "jsesc": "^3.0.2", 34 | "magic-string": "^0.26.0", 35 | "picocolors": "^1.0.0", 36 | "react-refresh": "^0.13.0", 37 | "rollup": "2.78.1", 38 | "rxjs": "7.5.7" 39 | } 40 | }, 41 | "node_modules/@esbuild/aix-ppc64": { 42 | "version": "0.21.5", 43 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 44 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 45 | "cpu": [ 46 | "ppc64" 47 | ], 48 | "dev": true, 49 | "optional": true, 50 | "os": [ 51 | "aix" 52 | ], 53 | "engines": { 54 | "node": ">=12" 55 | } 56 | }, 57 | "node_modules/@esbuild/android-arm": { 58 | "version": "0.21.5", 59 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 60 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 61 | "cpu": [ 62 | "arm" 63 | ], 64 | "dev": true, 65 | "optional": true, 66 | "os": [ 67 | "android" 68 | ], 69 | "engines": { 70 | "node": ">=12" 71 | } 72 | }, 73 | "node_modules/@esbuild/android-arm64": { 74 | "version": "0.21.5", 75 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 76 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 77 | "cpu": [ 78 | "arm64" 79 | ], 80 | "dev": true, 81 | "optional": true, 82 | "os": [ 83 | "android" 84 | ], 85 | "engines": { 86 | "node": ">=12" 87 | } 88 | }, 89 | "node_modules/@esbuild/android-x64": { 90 | "version": "0.21.5", 91 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 92 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 93 | "cpu": [ 94 | "x64" 95 | ], 96 | "dev": true, 97 | "optional": true, 98 | "os": [ 99 | "android" 100 | ], 101 | "engines": { 102 | "node": ">=12" 103 | } 104 | }, 105 | "node_modules/@esbuild/darwin-arm64": { 106 | "version": "0.21.5", 107 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 108 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 109 | "cpu": [ 110 | "arm64" 111 | ], 112 | "dev": true, 113 | "optional": true, 114 | "os": [ 115 | "darwin" 116 | ], 117 | "engines": { 118 | "node": ">=12" 119 | } 120 | }, 121 | "node_modules/@esbuild/darwin-x64": { 122 | "version": "0.21.5", 123 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 124 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 125 | "cpu": [ 126 | "x64" 127 | ], 128 | "dev": true, 129 | "optional": true, 130 | "os": [ 131 | "darwin" 132 | ], 133 | "engines": { 134 | "node": ">=12" 135 | } 136 | }, 137 | "node_modules/@esbuild/freebsd-arm64": { 138 | "version": "0.21.5", 139 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 140 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 141 | "cpu": [ 142 | "arm64" 143 | ], 144 | "dev": true, 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=12" 151 | } 152 | }, 153 | "node_modules/@esbuild/freebsd-x64": { 154 | "version": "0.21.5", 155 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 156 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 157 | "cpu": [ 158 | "x64" 159 | ], 160 | "dev": true, 161 | "optional": true, 162 | "os": [ 163 | "freebsd" 164 | ], 165 | "engines": { 166 | "node": ">=12" 167 | } 168 | }, 169 | "node_modules/@esbuild/linux-arm": { 170 | "version": "0.21.5", 171 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 172 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 173 | "cpu": [ 174 | "arm" 175 | ], 176 | "dev": true, 177 | "optional": true, 178 | "os": [ 179 | "linux" 180 | ], 181 | "engines": { 182 | "node": ">=12" 183 | } 184 | }, 185 | "node_modules/@esbuild/linux-arm64": { 186 | "version": "0.21.5", 187 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 188 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 189 | "cpu": [ 190 | "arm64" 191 | ], 192 | "dev": true, 193 | "optional": true, 194 | "os": [ 195 | "linux" 196 | ], 197 | "engines": { 198 | "node": ">=12" 199 | } 200 | }, 201 | "node_modules/@esbuild/linux-ia32": { 202 | "version": "0.21.5", 203 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 204 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 205 | "cpu": [ 206 | "ia32" 207 | ], 208 | "dev": true, 209 | "optional": true, 210 | "os": [ 211 | "linux" 212 | ], 213 | "engines": { 214 | "node": ">=12" 215 | } 216 | }, 217 | "node_modules/@esbuild/linux-loong64": { 218 | "version": "0.21.5", 219 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 220 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 221 | "cpu": [ 222 | "loong64" 223 | ], 224 | "dev": true, 225 | "optional": true, 226 | "os": [ 227 | "linux" 228 | ], 229 | "engines": { 230 | "node": ">=12" 231 | } 232 | }, 233 | "node_modules/@esbuild/linux-mips64el": { 234 | "version": "0.21.5", 235 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 236 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 237 | "cpu": [ 238 | "mips64el" 239 | ], 240 | "dev": true, 241 | "optional": true, 242 | "os": [ 243 | "linux" 244 | ], 245 | "engines": { 246 | "node": ">=12" 247 | } 248 | }, 249 | "node_modules/@esbuild/linux-ppc64": { 250 | "version": "0.21.5", 251 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 252 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 253 | "cpu": [ 254 | "ppc64" 255 | ], 256 | "dev": true, 257 | "optional": true, 258 | "os": [ 259 | "linux" 260 | ], 261 | "engines": { 262 | "node": ">=12" 263 | } 264 | }, 265 | "node_modules/@esbuild/linux-riscv64": { 266 | "version": "0.21.5", 267 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 268 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 269 | "cpu": [ 270 | "riscv64" 271 | ], 272 | "dev": true, 273 | "optional": true, 274 | "os": [ 275 | "linux" 276 | ], 277 | "engines": { 278 | "node": ">=12" 279 | } 280 | }, 281 | "node_modules/@esbuild/linux-s390x": { 282 | "version": "0.21.5", 283 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 284 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 285 | "cpu": [ 286 | "s390x" 287 | ], 288 | "dev": true, 289 | "optional": true, 290 | "os": [ 291 | "linux" 292 | ], 293 | "engines": { 294 | "node": ">=12" 295 | } 296 | }, 297 | "node_modules/@esbuild/linux-x64": { 298 | "version": "0.21.5", 299 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 300 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 301 | "cpu": [ 302 | "x64" 303 | ], 304 | "dev": true, 305 | "optional": true, 306 | "os": [ 307 | "linux" 308 | ], 309 | "engines": { 310 | "node": ">=12" 311 | } 312 | }, 313 | "node_modules/@esbuild/netbsd-x64": { 314 | "version": "0.21.5", 315 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 316 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 317 | "cpu": [ 318 | "x64" 319 | ], 320 | "dev": true, 321 | "optional": true, 322 | "os": [ 323 | "netbsd" 324 | ], 325 | "engines": { 326 | "node": ">=12" 327 | } 328 | }, 329 | "node_modules/@esbuild/openbsd-x64": { 330 | "version": "0.21.5", 331 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 332 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 333 | "cpu": [ 334 | "x64" 335 | ], 336 | "dev": true, 337 | "optional": true, 338 | "os": [ 339 | "openbsd" 340 | ], 341 | "engines": { 342 | "node": ">=12" 343 | } 344 | }, 345 | "node_modules/@esbuild/sunos-x64": { 346 | "version": "0.21.5", 347 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 348 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 349 | "cpu": [ 350 | "x64" 351 | ], 352 | "dev": true, 353 | "optional": true, 354 | "os": [ 355 | "sunos" 356 | ], 357 | "engines": { 358 | "node": ">=12" 359 | } 360 | }, 361 | "node_modules/@esbuild/win32-arm64": { 362 | "version": "0.21.5", 363 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 364 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 365 | "cpu": [ 366 | "arm64" 367 | ], 368 | "dev": true, 369 | "optional": true, 370 | "os": [ 371 | "win32" 372 | ], 373 | "engines": { 374 | "node": ">=12" 375 | } 376 | }, 377 | "node_modules/@esbuild/win32-ia32": { 378 | "version": "0.21.5", 379 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 380 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 381 | "cpu": [ 382 | "ia32" 383 | ], 384 | "dev": true, 385 | "optional": true, 386 | "os": [ 387 | "win32" 388 | ], 389 | "engines": { 390 | "node": ">=12" 391 | } 392 | }, 393 | "node_modules/@esbuild/win32-x64": { 394 | "version": "0.21.5", 395 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 396 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 397 | "cpu": [ 398 | "x64" 399 | ], 400 | "dev": true, 401 | "optional": true, 402 | "os": [ 403 | "win32" 404 | ], 405 | "engines": { 406 | "node": ">=12" 407 | } 408 | }, 409 | "node_modules/@nodelib/fs.scandir": { 410 | "version": "2.1.5", 411 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 412 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 413 | "dev": true, 414 | "dependencies": { 415 | "@nodelib/fs.stat": "2.0.5", 416 | "run-parallel": "^1.1.9" 417 | }, 418 | "engines": { 419 | "node": ">= 8" 420 | } 421 | }, 422 | "node_modules/@nodelib/fs.stat": { 423 | "version": "2.0.5", 424 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 425 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 426 | "dev": true, 427 | "engines": { 428 | "node": ">= 8" 429 | } 430 | }, 431 | "node_modules/@nodelib/fs.walk": { 432 | "version": "1.2.8", 433 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 434 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 435 | "dev": true, 436 | "dependencies": { 437 | "@nodelib/fs.scandir": "2.1.5", 438 | "fastq": "^1.6.0" 439 | }, 440 | "engines": { 441 | "node": ">= 8" 442 | } 443 | }, 444 | "node_modules/@rollup/pluginutils": { 445 | "version": "4.2.1", 446 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 447 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 448 | "dev": true, 449 | "dependencies": { 450 | "estree-walker": "^2.0.1", 451 | "picomatch": "^2.2.2" 452 | }, 453 | "engines": { 454 | "node": ">= 8.0.0" 455 | } 456 | }, 457 | "node_modules/@rollup/rollup-android-arm-eabi": { 458 | "version": "4.24.3", 459 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", 460 | "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", 461 | "cpu": [ 462 | "arm" 463 | ], 464 | "dev": true, 465 | "optional": true, 466 | "os": [ 467 | "android" 468 | ] 469 | }, 470 | "node_modules/@rollup/rollup-android-arm64": { 471 | "version": "4.24.3", 472 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", 473 | "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", 474 | "cpu": [ 475 | "arm64" 476 | ], 477 | "dev": true, 478 | "optional": true, 479 | "os": [ 480 | "android" 481 | ] 482 | }, 483 | "node_modules/@rollup/rollup-darwin-arm64": { 484 | "version": "4.24.3", 485 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", 486 | "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==", 487 | "cpu": [ 488 | "arm64" 489 | ], 490 | "dev": true, 491 | "optional": true, 492 | "os": [ 493 | "darwin" 494 | ] 495 | }, 496 | "node_modules/@rollup/rollup-darwin-x64": { 497 | "version": "4.24.3", 498 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", 499 | "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", 500 | "cpu": [ 501 | "x64" 502 | ], 503 | "dev": true, 504 | "optional": true, 505 | "os": [ 506 | "darwin" 507 | ] 508 | }, 509 | "node_modules/@rollup/rollup-freebsd-arm64": { 510 | "version": "4.24.3", 511 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", 512 | "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", 513 | "cpu": [ 514 | "arm64" 515 | ], 516 | "dev": true, 517 | "optional": true, 518 | "os": [ 519 | "freebsd" 520 | ] 521 | }, 522 | "node_modules/@rollup/rollup-freebsd-x64": { 523 | "version": "4.24.3", 524 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", 525 | "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", 526 | "cpu": [ 527 | "x64" 528 | ], 529 | "dev": true, 530 | "optional": true, 531 | "os": [ 532 | "freebsd" 533 | ] 534 | }, 535 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 536 | "version": "4.24.3", 537 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", 538 | "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", 539 | "cpu": [ 540 | "arm" 541 | ], 542 | "dev": true, 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ] 547 | }, 548 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 549 | "version": "4.24.3", 550 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", 551 | "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", 552 | "cpu": [ 553 | "arm" 554 | ], 555 | "dev": true, 556 | "optional": true, 557 | "os": [ 558 | "linux" 559 | ] 560 | }, 561 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 562 | "version": "4.24.3", 563 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", 564 | "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", 565 | "cpu": [ 566 | "arm64" 567 | ], 568 | "dev": true, 569 | "optional": true, 570 | "os": [ 571 | "linux" 572 | ] 573 | }, 574 | "node_modules/@rollup/rollup-linux-arm64-musl": { 575 | "version": "4.24.3", 576 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", 577 | "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", 578 | "cpu": [ 579 | "arm64" 580 | ], 581 | "dev": true, 582 | "optional": true, 583 | "os": [ 584 | "linux" 585 | ] 586 | }, 587 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 588 | "version": "4.24.3", 589 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", 590 | "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", 591 | "cpu": [ 592 | "ppc64" 593 | ], 594 | "dev": true, 595 | "optional": true, 596 | "os": [ 597 | "linux" 598 | ] 599 | }, 600 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 601 | "version": "4.24.3", 602 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", 603 | "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", 604 | "cpu": [ 605 | "riscv64" 606 | ], 607 | "dev": true, 608 | "optional": true, 609 | "os": [ 610 | "linux" 611 | ] 612 | }, 613 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 614 | "version": "4.24.3", 615 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", 616 | "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", 617 | "cpu": [ 618 | "s390x" 619 | ], 620 | "dev": true, 621 | "optional": true, 622 | "os": [ 623 | "linux" 624 | ] 625 | }, 626 | "node_modules/@rollup/rollup-linux-x64-gnu": { 627 | "version": "4.24.3", 628 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", 629 | "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", 630 | "cpu": [ 631 | "x64" 632 | ], 633 | "dev": true, 634 | "optional": true, 635 | "os": [ 636 | "linux" 637 | ] 638 | }, 639 | "node_modules/@rollup/rollup-linux-x64-musl": { 640 | "version": "4.24.3", 641 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", 642 | "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", 643 | "cpu": [ 644 | "x64" 645 | ], 646 | "dev": true, 647 | "optional": true, 648 | "os": [ 649 | "linux" 650 | ] 651 | }, 652 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 653 | "version": "4.24.3", 654 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", 655 | "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", 656 | "cpu": [ 657 | "arm64" 658 | ], 659 | "dev": true, 660 | "optional": true, 661 | "os": [ 662 | "win32" 663 | ] 664 | }, 665 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 666 | "version": "4.24.3", 667 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", 668 | "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", 669 | "cpu": [ 670 | "ia32" 671 | ], 672 | "dev": true, 673 | "optional": true, 674 | "os": [ 675 | "win32" 676 | ] 677 | }, 678 | "node_modules/@rollup/rollup-win32-x64-msvc": { 679 | "version": "4.24.3", 680 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", 681 | "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", 682 | "cpu": [ 683 | "x64" 684 | ], 685 | "dev": true, 686 | "optional": true, 687 | "os": [ 688 | "win32" 689 | ] 690 | }, 691 | "node_modules/@types/chrome": { 692 | "version": "0.0.195", 693 | "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.195.tgz", 694 | "integrity": "sha512-kmFh1xx7ehXoOVl6OjEBxmiYaquhxCaILjFGwPbW6xwbqzwDKCte+Mzl99aNWg3EP1B4rKVUuRm1vBsiRYks5g==", 695 | "dev": true, 696 | "dependencies": { 697 | "@types/filesystem": "*", 698 | "@types/har-format": "*" 699 | } 700 | }, 701 | "node_modules/@types/estree": { 702 | "version": "1.0.6", 703 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 704 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 705 | "dev": true 706 | }, 707 | "node_modules/@types/filesystem": { 708 | "version": "0.0.32", 709 | "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", 710 | "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", 711 | "dev": true, 712 | "dependencies": { 713 | "@types/filewriter": "*" 714 | } 715 | }, 716 | "node_modules/@types/filewriter": { 717 | "version": "0.0.29", 718 | "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", 719 | "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", 720 | "dev": true 721 | }, 722 | "node_modules/@types/har-format": { 723 | "version": "1.2.8", 724 | "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", 725 | "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", 726 | "dev": true 727 | }, 728 | "node_modules/@webcomponents/custom-elements": { 729 | "version": "1.5.0", 730 | "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.5.0.tgz", 731 | "integrity": "sha512-c+7jPQCs9h/BYVcZ2Kna/3tsl3A/9EyXfvWjp5RiTDm1OpTcbZaCa1z4RNcTe/hUtXaqn64JjNW1yrWT+rZ8gg==", 732 | "dev": true 733 | }, 734 | "node_modules/acorn-walk": { 735 | "version": "8.2.0", 736 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 737 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 738 | "dev": true, 739 | "engines": { 740 | "node": ">=0.4.0" 741 | } 742 | }, 743 | "node_modules/boolbase": { 744 | "version": "1.0.0", 745 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 746 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 747 | "dev": true 748 | }, 749 | "node_modules/braces": { 750 | "version": "3.0.2", 751 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 752 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 753 | "dev": true, 754 | "dependencies": { 755 | "fill-range": "^7.0.1" 756 | }, 757 | "engines": { 758 | "node": ">=8" 759 | } 760 | }, 761 | "node_modules/cheerio": { 762 | "version": "1.0.0-rc.12", 763 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 764 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 765 | "dev": true, 766 | "dependencies": { 767 | "cheerio-select": "^2.1.0", 768 | "dom-serializer": "^2.0.0", 769 | "domhandler": "^5.0.3", 770 | "domutils": "^3.0.1", 771 | "htmlparser2": "^8.0.1", 772 | "parse5": "^7.0.0", 773 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 774 | }, 775 | "engines": { 776 | "node": ">= 6" 777 | }, 778 | "funding": { 779 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 780 | } 781 | }, 782 | "node_modules/cheerio-select": { 783 | "version": "2.1.0", 784 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 785 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 786 | "dev": true, 787 | "dependencies": { 788 | "boolbase": "^1.0.0", 789 | "css-select": "^5.1.0", 790 | "css-what": "^6.1.0", 791 | "domelementtype": "^2.3.0", 792 | "domhandler": "^5.0.3", 793 | "domutils": "^3.0.1" 794 | }, 795 | "funding": { 796 | "url": "https://github.com/sponsors/fb55" 797 | } 798 | }, 799 | "node_modules/connect-injector": { 800 | "version": "0.4.4", 801 | "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.4.tgz", 802 | "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==", 803 | "dev": true, 804 | "dependencies": { 805 | "debug": "^2.0.0", 806 | "q": "^1.0.1", 807 | "stream-buffers": "^0.2.3", 808 | "uberproto": "^1.1.0" 809 | }, 810 | "engines": { 811 | "node": ">= 0.8.0" 812 | } 813 | }, 814 | "node_modules/connect-injector/node_modules/debug": { 815 | "version": "2.6.9", 816 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 817 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 818 | "dev": true, 819 | "dependencies": { 820 | "ms": "2.0.0" 821 | } 822 | }, 823 | "node_modules/connect-injector/node_modules/ms": { 824 | "version": "2.0.0", 825 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 826 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 827 | "dev": true 828 | }, 829 | "node_modules/convert-source-map": { 830 | "version": "1.9.0", 831 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 832 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 833 | "dev": true 834 | }, 835 | "node_modules/css-select": { 836 | "version": "5.1.0", 837 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 838 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 839 | "dev": true, 840 | "dependencies": { 841 | "boolbase": "^1.0.0", 842 | "css-what": "^6.1.0", 843 | "domhandler": "^5.0.2", 844 | "domutils": "^3.0.1", 845 | "nth-check": "^2.0.1" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/sponsors/fb55" 849 | } 850 | }, 851 | "node_modules/css-what": { 852 | "version": "6.1.0", 853 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 854 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 855 | "dev": true, 856 | "engines": { 857 | "node": ">= 6" 858 | }, 859 | "funding": { 860 | "url": "https://github.com/sponsors/fb55" 861 | } 862 | }, 863 | "node_modules/debug": { 864 | "version": "4.3.7", 865 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 866 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 867 | "dev": true, 868 | "dependencies": { 869 | "ms": "^2.1.3" 870 | }, 871 | "engines": { 872 | "node": ">=6.0" 873 | }, 874 | "peerDependenciesMeta": { 875 | "supports-color": { 876 | "optional": true 877 | } 878 | } 879 | }, 880 | "node_modules/dom-serializer": { 881 | "version": "2.0.0", 882 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 883 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 884 | "dev": true, 885 | "dependencies": { 886 | "domelementtype": "^2.3.0", 887 | "domhandler": "^5.0.2", 888 | "entities": "^4.2.0" 889 | }, 890 | "funding": { 891 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 892 | } 893 | }, 894 | "node_modules/domelementtype": { 895 | "version": "2.3.0", 896 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 897 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 898 | "dev": true, 899 | "funding": [ 900 | { 901 | "type": "github", 902 | "url": "https://github.com/sponsors/fb55" 903 | } 904 | ] 905 | }, 906 | "node_modules/domhandler": { 907 | "version": "5.0.3", 908 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 909 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 910 | "dev": true, 911 | "dependencies": { 912 | "domelementtype": "^2.3.0" 913 | }, 914 | "engines": { 915 | "node": ">= 4" 916 | }, 917 | "funding": { 918 | "url": "https://github.com/fb55/domhandler?sponsor=1" 919 | } 920 | }, 921 | "node_modules/domutils": { 922 | "version": "3.0.1", 923 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", 924 | "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", 925 | "dev": true, 926 | "dependencies": { 927 | "dom-serializer": "^2.0.0", 928 | "domelementtype": "^2.3.0", 929 | "domhandler": "^5.0.1" 930 | }, 931 | "funding": { 932 | "url": "https://github.com/fb55/domutils?sponsor=1" 933 | } 934 | }, 935 | "node_modules/entities": { 936 | "version": "4.3.1", 937 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", 938 | "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=0.12" 942 | }, 943 | "funding": { 944 | "url": "https://github.com/fb55/entities?sponsor=1" 945 | } 946 | }, 947 | "node_modules/es-module-lexer": { 948 | "version": "0.10.5", 949 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", 950 | "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", 951 | "dev": true 952 | }, 953 | "node_modules/esbuild": { 954 | "version": "0.21.5", 955 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 956 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 957 | "dev": true, 958 | "hasInstallScript": true, 959 | "bin": { 960 | "esbuild": "bin/esbuild" 961 | }, 962 | "engines": { 963 | "node": ">=12" 964 | }, 965 | "optionalDependencies": { 966 | "@esbuild/aix-ppc64": "0.21.5", 967 | "@esbuild/android-arm": "0.21.5", 968 | "@esbuild/android-arm64": "0.21.5", 969 | "@esbuild/android-x64": "0.21.5", 970 | "@esbuild/darwin-arm64": "0.21.5", 971 | "@esbuild/darwin-x64": "0.21.5", 972 | "@esbuild/freebsd-arm64": "0.21.5", 973 | "@esbuild/freebsd-x64": "0.21.5", 974 | "@esbuild/linux-arm": "0.21.5", 975 | "@esbuild/linux-arm64": "0.21.5", 976 | "@esbuild/linux-ia32": "0.21.5", 977 | "@esbuild/linux-loong64": "0.21.5", 978 | "@esbuild/linux-mips64el": "0.21.5", 979 | "@esbuild/linux-ppc64": "0.21.5", 980 | "@esbuild/linux-riscv64": "0.21.5", 981 | "@esbuild/linux-s390x": "0.21.5", 982 | "@esbuild/linux-x64": "0.21.5", 983 | "@esbuild/netbsd-x64": "0.21.5", 984 | "@esbuild/openbsd-x64": "0.21.5", 985 | "@esbuild/sunos-x64": "0.21.5", 986 | "@esbuild/win32-arm64": "0.21.5", 987 | "@esbuild/win32-ia32": "0.21.5", 988 | "@esbuild/win32-x64": "0.21.5" 989 | } 990 | }, 991 | "node_modules/estree-walker": { 992 | "version": "2.0.2", 993 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 994 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 995 | "dev": true 996 | }, 997 | "node_modules/fast-glob": { 998 | "version": "3.2.11", 999 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 1000 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "@nodelib/fs.stat": "^2.0.2", 1004 | "@nodelib/fs.walk": "^1.2.3", 1005 | "glob-parent": "^5.1.2", 1006 | "merge2": "^1.3.0", 1007 | "micromatch": "^4.0.4" 1008 | }, 1009 | "engines": { 1010 | "node": ">=8.6.0" 1011 | } 1012 | }, 1013 | "node_modules/fastq": { 1014 | "version": "1.13.0", 1015 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1016 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1017 | "dev": true, 1018 | "dependencies": { 1019 | "reusify": "^1.0.4" 1020 | } 1021 | }, 1022 | "node_modules/fill-range": { 1023 | "version": "7.0.1", 1024 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1025 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "to-regex-range": "^5.0.1" 1029 | }, 1030 | "engines": { 1031 | "node": ">=8" 1032 | } 1033 | }, 1034 | "node_modules/fs-extra": { 1035 | "version": "10.1.0", 1036 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 1037 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "graceful-fs": "^4.2.0", 1041 | "jsonfile": "^6.0.1", 1042 | "universalify": "^2.0.0" 1043 | }, 1044 | "engines": { 1045 | "node": ">=12" 1046 | } 1047 | }, 1048 | "node_modules/fsevents": { 1049 | "version": "2.3.3", 1050 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1051 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1052 | "dev": true, 1053 | "hasInstallScript": true, 1054 | "optional": true, 1055 | "os": [ 1056 | "darwin" 1057 | ], 1058 | "engines": { 1059 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1060 | } 1061 | }, 1062 | "node_modules/glob-parent": { 1063 | "version": "5.1.2", 1064 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1065 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1066 | "dev": true, 1067 | "dependencies": { 1068 | "is-glob": "^4.0.1" 1069 | }, 1070 | "engines": { 1071 | "node": ">= 6" 1072 | } 1073 | }, 1074 | "node_modules/graceful-fs": { 1075 | "version": "4.2.10", 1076 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1077 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1078 | "dev": true 1079 | }, 1080 | "node_modules/htmlparser2": { 1081 | "version": "8.0.1", 1082 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", 1083 | "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", 1084 | "dev": true, 1085 | "funding": [ 1086 | "https://github.com/fb55/htmlparser2?sponsor=1", 1087 | { 1088 | "type": "github", 1089 | "url": "https://github.com/sponsors/fb55" 1090 | } 1091 | ], 1092 | "dependencies": { 1093 | "domelementtype": "^2.3.0", 1094 | "domhandler": "^5.0.2", 1095 | "domutils": "^3.0.1", 1096 | "entities": "^4.3.0" 1097 | } 1098 | }, 1099 | "node_modules/is-extglob": { 1100 | "version": "2.1.1", 1101 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1102 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1103 | "dev": true, 1104 | "engines": { 1105 | "node": ">=0.10.0" 1106 | } 1107 | }, 1108 | "node_modules/is-glob": { 1109 | "version": "4.0.3", 1110 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1111 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1112 | "dev": true, 1113 | "dependencies": { 1114 | "is-extglob": "^2.1.1" 1115 | }, 1116 | "engines": { 1117 | "node": ">=0.10.0" 1118 | } 1119 | }, 1120 | "node_modules/is-number": { 1121 | "version": "7.0.0", 1122 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1123 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1124 | "dev": true, 1125 | "engines": { 1126 | "node": ">=0.12.0" 1127 | } 1128 | }, 1129 | "node_modules/jsesc": { 1130 | "version": "3.0.2", 1131 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 1132 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 1133 | "dev": true, 1134 | "bin": { 1135 | "jsesc": "bin/jsesc" 1136 | }, 1137 | "engines": { 1138 | "node": ">=6" 1139 | } 1140 | }, 1141 | "node_modules/jsonfile": { 1142 | "version": "6.1.0", 1143 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1144 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "universalify": "^2.0.0" 1148 | }, 1149 | "optionalDependencies": { 1150 | "graceful-fs": "^4.1.6" 1151 | } 1152 | }, 1153 | "node_modules/magic-string": { 1154 | "version": "0.26.7", 1155 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", 1156 | "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", 1157 | "dev": true, 1158 | "dependencies": { 1159 | "sourcemap-codec": "^1.4.8" 1160 | }, 1161 | "engines": { 1162 | "node": ">=12" 1163 | } 1164 | }, 1165 | "node_modules/merge2": { 1166 | "version": "1.4.1", 1167 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1168 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1169 | "dev": true, 1170 | "engines": { 1171 | "node": ">= 8" 1172 | } 1173 | }, 1174 | "node_modules/micromatch": { 1175 | "version": "4.0.5", 1176 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1177 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "braces": "^3.0.2", 1181 | "picomatch": "^2.3.1" 1182 | }, 1183 | "engines": { 1184 | "node": ">=8.6" 1185 | } 1186 | }, 1187 | "node_modules/ms": { 1188 | "version": "2.1.3", 1189 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1190 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1191 | "dev": true 1192 | }, 1193 | "node_modules/nanoid": { 1194 | "version": "3.3.7", 1195 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1196 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1197 | "dev": true, 1198 | "funding": [ 1199 | { 1200 | "type": "github", 1201 | "url": "https://github.com/sponsors/ai" 1202 | } 1203 | ], 1204 | "bin": { 1205 | "nanoid": "bin/nanoid.cjs" 1206 | }, 1207 | "engines": { 1208 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1209 | } 1210 | }, 1211 | "node_modules/nth-check": { 1212 | "version": "2.1.1", 1213 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 1214 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 1215 | "dev": true, 1216 | "dependencies": { 1217 | "boolbase": "^1.0.0" 1218 | }, 1219 | "funding": { 1220 | "url": "https://github.com/fb55/nth-check?sponsor=1" 1221 | } 1222 | }, 1223 | "node_modules/parse5": { 1224 | "version": "7.0.0", 1225 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", 1226 | "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", 1227 | "dev": true, 1228 | "dependencies": { 1229 | "entities": "^4.3.0" 1230 | }, 1231 | "funding": { 1232 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1233 | } 1234 | }, 1235 | "node_modules/parse5-htmlparser2-tree-adapter": { 1236 | "version": "7.0.0", 1237 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 1238 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 1239 | "dev": true, 1240 | "dependencies": { 1241 | "domhandler": "^5.0.2", 1242 | "parse5": "^7.0.0" 1243 | }, 1244 | "funding": { 1245 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1246 | } 1247 | }, 1248 | "node_modules/picocolors": { 1249 | "version": "1.1.1", 1250 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1251 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1252 | "dev": true 1253 | }, 1254 | "node_modules/picomatch": { 1255 | "version": "2.3.1", 1256 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1257 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">=8.6" 1261 | }, 1262 | "funding": { 1263 | "url": "https://github.com/sponsors/jonschlinkert" 1264 | } 1265 | }, 1266 | "node_modules/postcss": { 1267 | "version": "8.4.47", 1268 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 1269 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 1270 | "dev": true, 1271 | "funding": [ 1272 | { 1273 | "type": "opencollective", 1274 | "url": "https://opencollective.com/postcss/" 1275 | }, 1276 | { 1277 | "type": "tidelift", 1278 | "url": "https://tidelift.com/funding/github/npm/postcss" 1279 | }, 1280 | { 1281 | "type": "github", 1282 | "url": "https://github.com/sponsors/ai" 1283 | } 1284 | ], 1285 | "dependencies": { 1286 | "nanoid": "^3.3.7", 1287 | "picocolors": "^1.1.0", 1288 | "source-map-js": "^1.2.1" 1289 | }, 1290 | "engines": { 1291 | "node": "^10 || ^12 || >=14" 1292 | } 1293 | }, 1294 | "node_modules/q": { 1295 | "version": "1.5.1", 1296 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1297 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 1298 | "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", 1299 | "dev": true, 1300 | "engines": { 1301 | "node": ">=0.6.0", 1302 | "teleport": ">=0.2.0" 1303 | } 1304 | }, 1305 | "node_modules/queue-microtask": { 1306 | "version": "1.2.3", 1307 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1308 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1309 | "dev": true, 1310 | "funding": [ 1311 | { 1312 | "type": "github", 1313 | "url": "https://github.com/sponsors/feross" 1314 | }, 1315 | { 1316 | "type": "patreon", 1317 | "url": "https://www.patreon.com/feross" 1318 | }, 1319 | { 1320 | "type": "consulting", 1321 | "url": "https://feross.org/support" 1322 | } 1323 | ] 1324 | }, 1325 | "node_modules/react-refresh": { 1326 | "version": "0.13.0", 1327 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 1328 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 1329 | "dev": true, 1330 | "engines": { 1331 | "node": ">=0.10.0" 1332 | } 1333 | }, 1334 | "node_modules/reusify": { 1335 | "version": "1.0.4", 1336 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1337 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1338 | "dev": true, 1339 | "engines": { 1340 | "iojs": ">=1.0.0", 1341 | "node": ">=0.10.0" 1342 | } 1343 | }, 1344 | "node_modules/rollup": { 1345 | "version": "2.78.1", 1346 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 1347 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 1348 | "dev": true, 1349 | "bin": { 1350 | "rollup": "dist/bin/rollup" 1351 | }, 1352 | "engines": { 1353 | "node": ">=10.0.0" 1354 | }, 1355 | "optionalDependencies": { 1356 | "fsevents": "~2.3.2" 1357 | } 1358 | }, 1359 | "node_modules/run-parallel": { 1360 | "version": "1.2.0", 1361 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1362 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1363 | "dev": true, 1364 | "funding": [ 1365 | { 1366 | "type": "github", 1367 | "url": "https://github.com/sponsors/feross" 1368 | }, 1369 | { 1370 | "type": "patreon", 1371 | "url": "https://www.patreon.com/feross" 1372 | }, 1373 | { 1374 | "type": "consulting", 1375 | "url": "https://feross.org/support" 1376 | } 1377 | ], 1378 | "dependencies": { 1379 | "queue-microtask": "^1.2.2" 1380 | } 1381 | }, 1382 | "node_modules/rxjs": { 1383 | "version": "7.5.7", 1384 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", 1385 | "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", 1386 | "dev": true, 1387 | "dependencies": { 1388 | "tslib": "^2.1.0" 1389 | } 1390 | }, 1391 | "node_modules/source-map-js": { 1392 | "version": "1.2.1", 1393 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1394 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1395 | "dev": true, 1396 | "engines": { 1397 | "node": ">=0.10.0" 1398 | } 1399 | }, 1400 | "node_modules/sourcemap-codec": { 1401 | "version": "1.4.8", 1402 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1403 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1404 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1405 | "dev": true 1406 | }, 1407 | "node_modules/stream-buffers": { 1408 | "version": "0.2.6", 1409 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz", 1410 | "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==", 1411 | "dev": true, 1412 | "engines": { 1413 | "node": ">= 0.3.0" 1414 | } 1415 | }, 1416 | "node_modules/to-regex-range": { 1417 | "version": "5.0.1", 1418 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1419 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1420 | "dev": true, 1421 | "dependencies": { 1422 | "is-number": "^7.0.0" 1423 | }, 1424 | "engines": { 1425 | "node": ">=8.0" 1426 | } 1427 | }, 1428 | "node_modules/tslib": { 1429 | "version": "2.8.1", 1430 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1431 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1432 | "dev": true 1433 | }, 1434 | "node_modules/typescript": { 1435 | "version": "4.8.2", 1436 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 1437 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 1438 | "dev": true, 1439 | "bin": { 1440 | "tsc": "bin/tsc", 1441 | "tsserver": "bin/tsserver" 1442 | }, 1443 | "engines": { 1444 | "node": ">=4.2.0" 1445 | } 1446 | }, 1447 | "node_modules/uberproto": { 1448 | "version": "1.2.0", 1449 | "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", 1450 | "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==", 1451 | "dev": true, 1452 | "engines": { 1453 | "node": "*" 1454 | } 1455 | }, 1456 | "node_modules/universalify": { 1457 | "version": "2.0.0", 1458 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 1459 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 1460 | "dev": true, 1461 | "engines": { 1462 | "node": ">= 10.0.0" 1463 | } 1464 | }, 1465 | "node_modules/vite": { 1466 | "version": "5.4.10", 1467 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", 1468 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "esbuild": "^0.21.3", 1472 | "postcss": "^8.4.43", 1473 | "rollup": "^4.20.0" 1474 | }, 1475 | "bin": { 1476 | "vite": "bin/vite.js" 1477 | }, 1478 | "engines": { 1479 | "node": "^18.0.0 || >=20.0.0" 1480 | }, 1481 | "funding": { 1482 | "url": "https://github.com/vitejs/vite?sponsor=1" 1483 | }, 1484 | "optionalDependencies": { 1485 | "fsevents": "~2.3.3" 1486 | }, 1487 | "peerDependencies": { 1488 | "@types/node": "^18.0.0 || >=20.0.0", 1489 | "less": "*", 1490 | "lightningcss": "^1.21.0", 1491 | "sass": "*", 1492 | "sass-embedded": "*", 1493 | "stylus": "*", 1494 | "sugarss": "*", 1495 | "terser": "^5.4.0" 1496 | }, 1497 | "peerDependenciesMeta": { 1498 | "@types/node": { 1499 | "optional": true 1500 | }, 1501 | "less": { 1502 | "optional": true 1503 | }, 1504 | "lightningcss": { 1505 | "optional": true 1506 | }, 1507 | "sass": { 1508 | "optional": true 1509 | }, 1510 | "sass-embedded": { 1511 | "optional": true 1512 | }, 1513 | "stylus": { 1514 | "optional": true 1515 | }, 1516 | "sugarss": { 1517 | "optional": true 1518 | }, 1519 | "terser": { 1520 | "optional": true 1521 | } 1522 | } 1523 | }, 1524 | "node_modules/vite/node_modules/rollup": { 1525 | "version": "4.24.3", 1526 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", 1527 | "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", 1528 | "dev": true, 1529 | "dependencies": { 1530 | "@types/estree": "1.0.6" 1531 | }, 1532 | "bin": { 1533 | "rollup": "dist/bin/rollup" 1534 | }, 1535 | "engines": { 1536 | "node": ">=18.0.0", 1537 | "npm": ">=8.0.0" 1538 | }, 1539 | "optionalDependencies": { 1540 | "@rollup/rollup-android-arm-eabi": "4.24.3", 1541 | "@rollup/rollup-android-arm64": "4.24.3", 1542 | "@rollup/rollup-darwin-arm64": "4.24.3", 1543 | "@rollup/rollup-darwin-x64": "4.24.3", 1544 | "@rollup/rollup-freebsd-arm64": "4.24.3", 1545 | "@rollup/rollup-freebsd-x64": "4.24.3", 1546 | "@rollup/rollup-linux-arm-gnueabihf": "4.24.3", 1547 | "@rollup/rollup-linux-arm-musleabihf": "4.24.3", 1548 | "@rollup/rollup-linux-arm64-gnu": "4.24.3", 1549 | "@rollup/rollup-linux-arm64-musl": "4.24.3", 1550 | "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3", 1551 | "@rollup/rollup-linux-riscv64-gnu": "4.24.3", 1552 | "@rollup/rollup-linux-s390x-gnu": "4.24.3", 1553 | "@rollup/rollup-linux-x64-gnu": "4.24.3", 1554 | "@rollup/rollup-linux-x64-musl": "4.24.3", 1555 | "@rollup/rollup-win32-arm64-msvc": "4.24.3", 1556 | "@rollup/rollup-win32-ia32-msvc": "4.24.3", 1557 | "@rollup/rollup-win32-x64-msvc": "4.24.3", 1558 | "fsevents": "~2.3.2" 1559 | } 1560 | } 1561 | }, 1562 | "dependencies": { 1563 | "@crxjs/vite-plugin": { 1564 | "version": "2.0.0-beta.26", 1565 | "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.0.0-beta.26.tgz", 1566 | "integrity": "sha512-fZiSeOB4LOwq3cLIwHJnJ4x/duBU/Gkn3JKF7b7mZIRAXtu1waorJ6QaH7qoZPcN5LzyA3J+/t3Kuwa/oo8XNg==", 1567 | "dev": true, 1568 | "requires": { 1569 | "@rollup/pluginutils": "^4.1.2", 1570 | "@webcomponents/custom-elements": "^1.5.0", 1571 | "acorn-walk": "^8.2.0", 1572 | "cheerio": "^1.0.0-rc.10", 1573 | "connect-injector": "^0.4.4", 1574 | "convert-source-map": "^1.7.0", 1575 | "debug": "^4.3.3", 1576 | "es-module-lexer": "^0.10.0", 1577 | "fast-glob": "^3.2.11", 1578 | "fs-extra": "^10.0.1", 1579 | "jsesc": "^3.0.2", 1580 | "magic-string": "^0.26.0", 1581 | "picocolors": "^1.0.0", 1582 | "react-refresh": "^0.13.0", 1583 | "rollup": "2.78.1", 1584 | "rxjs": "7.5.7" 1585 | } 1586 | }, 1587 | "@esbuild/aix-ppc64": { 1588 | "version": "0.21.5", 1589 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 1590 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 1591 | "dev": true, 1592 | "optional": true 1593 | }, 1594 | "@esbuild/android-arm": { 1595 | "version": "0.21.5", 1596 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 1597 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 1598 | "dev": true, 1599 | "optional": true 1600 | }, 1601 | "@esbuild/android-arm64": { 1602 | "version": "0.21.5", 1603 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 1604 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 1605 | "dev": true, 1606 | "optional": true 1607 | }, 1608 | "@esbuild/android-x64": { 1609 | "version": "0.21.5", 1610 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 1611 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 1612 | "dev": true, 1613 | "optional": true 1614 | }, 1615 | "@esbuild/darwin-arm64": { 1616 | "version": "0.21.5", 1617 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 1618 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 1619 | "dev": true, 1620 | "optional": true 1621 | }, 1622 | "@esbuild/darwin-x64": { 1623 | "version": "0.21.5", 1624 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 1625 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 1626 | "dev": true, 1627 | "optional": true 1628 | }, 1629 | "@esbuild/freebsd-arm64": { 1630 | "version": "0.21.5", 1631 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 1632 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 1633 | "dev": true, 1634 | "optional": true 1635 | }, 1636 | "@esbuild/freebsd-x64": { 1637 | "version": "0.21.5", 1638 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 1639 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 1640 | "dev": true, 1641 | "optional": true 1642 | }, 1643 | "@esbuild/linux-arm": { 1644 | "version": "0.21.5", 1645 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 1646 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 1647 | "dev": true, 1648 | "optional": true 1649 | }, 1650 | "@esbuild/linux-arm64": { 1651 | "version": "0.21.5", 1652 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 1653 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 1654 | "dev": true, 1655 | "optional": true 1656 | }, 1657 | "@esbuild/linux-ia32": { 1658 | "version": "0.21.5", 1659 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 1660 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 1661 | "dev": true, 1662 | "optional": true 1663 | }, 1664 | "@esbuild/linux-loong64": { 1665 | "version": "0.21.5", 1666 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 1667 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 1668 | "dev": true, 1669 | "optional": true 1670 | }, 1671 | "@esbuild/linux-mips64el": { 1672 | "version": "0.21.5", 1673 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 1674 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 1675 | "dev": true, 1676 | "optional": true 1677 | }, 1678 | "@esbuild/linux-ppc64": { 1679 | "version": "0.21.5", 1680 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 1681 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 1682 | "dev": true, 1683 | "optional": true 1684 | }, 1685 | "@esbuild/linux-riscv64": { 1686 | "version": "0.21.5", 1687 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 1688 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 1689 | "dev": true, 1690 | "optional": true 1691 | }, 1692 | "@esbuild/linux-s390x": { 1693 | "version": "0.21.5", 1694 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 1695 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 1696 | "dev": true, 1697 | "optional": true 1698 | }, 1699 | "@esbuild/linux-x64": { 1700 | "version": "0.21.5", 1701 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 1702 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 1703 | "dev": true, 1704 | "optional": true 1705 | }, 1706 | "@esbuild/netbsd-x64": { 1707 | "version": "0.21.5", 1708 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 1709 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 1710 | "dev": true, 1711 | "optional": true 1712 | }, 1713 | "@esbuild/openbsd-x64": { 1714 | "version": "0.21.5", 1715 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 1716 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 1717 | "dev": true, 1718 | "optional": true 1719 | }, 1720 | "@esbuild/sunos-x64": { 1721 | "version": "0.21.5", 1722 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 1723 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 1724 | "dev": true, 1725 | "optional": true 1726 | }, 1727 | "@esbuild/win32-arm64": { 1728 | "version": "0.21.5", 1729 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 1730 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 1731 | "dev": true, 1732 | "optional": true 1733 | }, 1734 | "@esbuild/win32-ia32": { 1735 | "version": "0.21.5", 1736 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 1737 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 1738 | "dev": true, 1739 | "optional": true 1740 | }, 1741 | "@esbuild/win32-x64": { 1742 | "version": "0.21.5", 1743 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 1744 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 1745 | "dev": true, 1746 | "optional": true 1747 | }, 1748 | "@nodelib/fs.scandir": { 1749 | "version": "2.1.5", 1750 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1751 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1752 | "dev": true, 1753 | "requires": { 1754 | "@nodelib/fs.stat": "2.0.5", 1755 | "run-parallel": "^1.1.9" 1756 | } 1757 | }, 1758 | "@nodelib/fs.stat": { 1759 | "version": "2.0.5", 1760 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1761 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1762 | "dev": true 1763 | }, 1764 | "@nodelib/fs.walk": { 1765 | "version": "1.2.8", 1766 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1767 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1768 | "dev": true, 1769 | "requires": { 1770 | "@nodelib/fs.scandir": "2.1.5", 1771 | "fastq": "^1.6.0" 1772 | } 1773 | }, 1774 | "@rollup/pluginutils": { 1775 | "version": "4.2.1", 1776 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 1777 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 1778 | "dev": true, 1779 | "requires": { 1780 | "estree-walker": "^2.0.1", 1781 | "picomatch": "^2.2.2" 1782 | } 1783 | }, 1784 | "@rollup/rollup-android-arm-eabi": { 1785 | "version": "4.24.3", 1786 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", 1787 | "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", 1788 | "dev": true, 1789 | "optional": true 1790 | }, 1791 | "@rollup/rollup-android-arm64": { 1792 | "version": "4.24.3", 1793 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", 1794 | "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", 1795 | "dev": true, 1796 | "optional": true 1797 | }, 1798 | "@rollup/rollup-darwin-arm64": { 1799 | "version": "4.24.3", 1800 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", 1801 | "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==", 1802 | "dev": true, 1803 | "optional": true 1804 | }, 1805 | "@rollup/rollup-darwin-x64": { 1806 | "version": "4.24.3", 1807 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", 1808 | "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", 1809 | "dev": true, 1810 | "optional": true 1811 | }, 1812 | "@rollup/rollup-freebsd-arm64": { 1813 | "version": "4.24.3", 1814 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", 1815 | "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", 1816 | "dev": true, 1817 | "optional": true 1818 | }, 1819 | "@rollup/rollup-freebsd-x64": { 1820 | "version": "4.24.3", 1821 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", 1822 | "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", 1823 | "dev": true, 1824 | "optional": true 1825 | }, 1826 | "@rollup/rollup-linux-arm-gnueabihf": { 1827 | "version": "4.24.3", 1828 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", 1829 | "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", 1830 | "dev": true, 1831 | "optional": true 1832 | }, 1833 | "@rollup/rollup-linux-arm-musleabihf": { 1834 | "version": "4.24.3", 1835 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", 1836 | "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", 1837 | "dev": true, 1838 | "optional": true 1839 | }, 1840 | "@rollup/rollup-linux-arm64-gnu": { 1841 | "version": "4.24.3", 1842 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", 1843 | "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", 1844 | "dev": true, 1845 | "optional": true 1846 | }, 1847 | "@rollup/rollup-linux-arm64-musl": { 1848 | "version": "4.24.3", 1849 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", 1850 | "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", 1851 | "dev": true, 1852 | "optional": true 1853 | }, 1854 | "@rollup/rollup-linux-powerpc64le-gnu": { 1855 | "version": "4.24.3", 1856 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", 1857 | "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", 1858 | "dev": true, 1859 | "optional": true 1860 | }, 1861 | "@rollup/rollup-linux-riscv64-gnu": { 1862 | "version": "4.24.3", 1863 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", 1864 | "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", 1865 | "dev": true, 1866 | "optional": true 1867 | }, 1868 | "@rollup/rollup-linux-s390x-gnu": { 1869 | "version": "4.24.3", 1870 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", 1871 | "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", 1872 | "dev": true, 1873 | "optional": true 1874 | }, 1875 | "@rollup/rollup-linux-x64-gnu": { 1876 | "version": "4.24.3", 1877 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", 1878 | "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", 1879 | "dev": true, 1880 | "optional": true 1881 | }, 1882 | "@rollup/rollup-linux-x64-musl": { 1883 | "version": "4.24.3", 1884 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", 1885 | "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", 1886 | "dev": true, 1887 | "optional": true 1888 | }, 1889 | "@rollup/rollup-win32-arm64-msvc": { 1890 | "version": "4.24.3", 1891 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", 1892 | "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", 1893 | "dev": true, 1894 | "optional": true 1895 | }, 1896 | "@rollup/rollup-win32-ia32-msvc": { 1897 | "version": "4.24.3", 1898 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", 1899 | "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", 1900 | "dev": true, 1901 | "optional": true 1902 | }, 1903 | "@rollup/rollup-win32-x64-msvc": { 1904 | "version": "4.24.3", 1905 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", 1906 | "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", 1907 | "dev": true, 1908 | "optional": true 1909 | }, 1910 | "@types/chrome": { 1911 | "version": "0.0.195", 1912 | "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.195.tgz", 1913 | "integrity": "sha512-kmFh1xx7ehXoOVl6OjEBxmiYaquhxCaILjFGwPbW6xwbqzwDKCte+Mzl99aNWg3EP1B4rKVUuRm1vBsiRYks5g==", 1914 | "dev": true, 1915 | "requires": { 1916 | "@types/filesystem": "*", 1917 | "@types/har-format": "*" 1918 | } 1919 | }, 1920 | "@types/estree": { 1921 | "version": "1.0.6", 1922 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1923 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1924 | "dev": true 1925 | }, 1926 | "@types/filesystem": { 1927 | "version": "0.0.32", 1928 | "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", 1929 | "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", 1930 | "dev": true, 1931 | "requires": { 1932 | "@types/filewriter": "*" 1933 | } 1934 | }, 1935 | "@types/filewriter": { 1936 | "version": "0.0.29", 1937 | "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", 1938 | "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", 1939 | "dev": true 1940 | }, 1941 | "@types/har-format": { 1942 | "version": "1.2.8", 1943 | "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", 1944 | "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", 1945 | "dev": true 1946 | }, 1947 | "@webcomponents/custom-elements": { 1948 | "version": "1.5.0", 1949 | "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.5.0.tgz", 1950 | "integrity": "sha512-c+7jPQCs9h/BYVcZ2Kna/3tsl3A/9EyXfvWjp5RiTDm1OpTcbZaCa1z4RNcTe/hUtXaqn64JjNW1yrWT+rZ8gg==", 1951 | "dev": true 1952 | }, 1953 | "acorn-walk": { 1954 | "version": "8.2.0", 1955 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1956 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1957 | "dev": true 1958 | }, 1959 | "boolbase": { 1960 | "version": "1.0.0", 1961 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 1962 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 1963 | "dev": true 1964 | }, 1965 | "braces": { 1966 | "version": "3.0.2", 1967 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1968 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1969 | "dev": true, 1970 | "requires": { 1971 | "fill-range": "^7.0.1" 1972 | } 1973 | }, 1974 | "cheerio": { 1975 | "version": "1.0.0-rc.12", 1976 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 1977 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 1978 | "dev": true, 1979 | "requires": { 1980 | "cheerio-select": "^2.1.0", 1981 | "dom-serializer": "^2.0.0", 1982 | "domhandler": "^5.0.3", 1983 | "domutils": "^3.0.1", 1984 | "htmlparser2": "^8.0.1", 1985 | "parse5": "^7.0.0", 1986 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 1987 | } 1988 | }, 1989 | "cheerio-select": { 1990 | "version": "2.1.0", 1991 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 1992 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 1993 | "dev": true, 1994 | "requires": { 1995 | "boolbase": "^1.0.0", 1996 | "css-select": "^5.1.0", 1997 | "css-what": "^6.1.0", 1998 | "domelementtype": "^2.3.0", 1999 | "domhandler": "^5.0.3", 2000 | "domutils": "^3.0.1" 2001 | } 2002 | }, 2003 | "connect-injector": { 2004 | "version": "0.4.4", 2005 | "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.4.tgz", 2006 | "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==", 2007 | "dev": true, 2008 | "requires": { 2009 | "debug": "^2.0.0", 2010 | "q": "^1.0.1", 2011 | "stream-buffers": "^0.2.3", 2012 | "uberproto": "^1.1.0" 2013 | }, 2014 | "dependencies": { 2015 | "debug": { 2016 | "version": "2.6.9", 2017 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2018 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2019 | "dev": true, 2020 | "requires": { 2021 | "ms": "2.0.0" 2022 | } 2023 | }, 2024 | "ms": { 2025 | "version": "2.0.0", 2026 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2027 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2028 | "dev": true 2029 | } 2030 | } 2031 | }, 2032 | "convert-source-map": { 2033 | "version": "1.9.0", 2034 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 2035 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 2036 | "dev": true 2037 | }, 2038 | "css-select": { 2039 | "version": "5.1.0", 2040 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 2041 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 2042 | "dev": true, 2043 | "requires": { 2044 | "boolbase": "^1.0.0", 2045 | "css-what": "^6.1.0", 2046 | "domhandler": "^5.0.2", 2047 | "domutils": "^3.0.1", 2048 | "nth-check": "^2.0.1" 2049 | } 2050 | }, 2051 | "css-what": { 2052 | "version": "6.1.0", 2053 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 2054 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 2055 | "dev": true 2056 | }, 2057 | "debug": { 2058 | "version": "4.3.7", 2059 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 2060 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 2061 | "dev": true, 2062 | "requires": { 2063 | "ms": "^2.1.3" 2064 | } 2065 | }, 2066 | "dom-serializer": { 2067 | "version": "2.0.0", 2068 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 2069 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 2070 | "dev": true, 2071 | "requires": { 2072 | "domelementtype": "^2.3.0", 2073 | "domhandler": "^5.0.2", 2074 | "entities": "^4.2.0" 2075 | } 2076 | }, 2077 | "domelementtype": { 2078 | "version": "2.3.0", 2079 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 2080 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 2081 | "dev": true 2082 | }, 2083 | "domhandler": { 2084 | "version": "5.0.3", 2085 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 2086 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 2087 | "dev": true, 2088 | "requires": { 2089 | "domelementtype": "^2.3.0" 2090 | } 2091 | }, 2092 | "domutils": { 2093 | "version": "3.0.1", 2094 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", 2095 | "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", 2096 | "dev": true, 2097 | "requires": { 2098 | "dom-serializer": "^2.0.0", 2099 | "domelementtype": "^2.3.0", 2100 | "domhandler": "^5.0.1" 2101 | } 2102 | }, 2103 | "entities": { 2104 | "version": "4.3.1", 2105 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", 2106 | "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", 2107 | "dev": true 2108 | }, 2109 | "es-module-lexer": { 2110 | "version": "0.10.5", 2111 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", 2112 | "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", 2113 | "dev": true 2114 | }, 2115 | "esbuild": { 2116 | "version": "0.21.5", 2117 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 2118 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 2119 | "dev": true, 2120 | "requires": { 2121 | "@esbuild/aix-ppc64": "0.21.5", 2122 | "@esbuild/android-arm": "0.21.5", 2123 | "@esbuild/android-arm64": "0.21.5", 2124 | "@esbuild/android-x64": "0.21.5", 2125 | "@esbuild/darwin-arm64": "0.21.5", 2126 | "@esbuild/darwin-x64": "0.21.5", 2127 | "@esbuild/freebsd-arm64": "0.21.5", 2128 | "@esbuild/freebsd-x64": "0.21.5", 2129 | "@esbuild/linux-arm": "0.21.5", 2130 | "@esbuild/linux-arm64": "0.21.5", 2131 | "@esbuild/linux-ia32": "0.21.5", 2132 | "@esbuild/linux-loong64": "0.21.5", 2133 | "@esbuild/linux-mips64el": "0.21.5", 2134 | "@esbuild/linux-ppc64": "0.21.5", 2135 | "@esbuild/linux-riscv64": "0.21.5", 2136 | "@esbuild/linux-s390x": "0.21.5", 2137 | "@esbuild/linux-x64": "0.21.5", 2138 | "@esbuild/netbsd-x64": "0.21.5", 2139 | "@esbuild/openbsd-x64": "0.21.5", 2140 | "@esbuild/sunos-x64": "0.21.5", 2141 | "@esbuild/win32-arm64": "0.21.5", 2142 | "@esbuild/win32-ia32": "0.21.5", 2143 | "@esbuild/win32-x64": "0.21.5" 2144 | } 2145 | }, 2146 | "estree-walker": { 2147 | "version": "2.0.2", 2148 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2149 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2150 | "dev": true 2151 | }, 2152 | "fast-glob": { 2153 | "version": "3.2.11", 2154 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 2155 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 2156 | "dev": true, 2157 | "requires": { 2158 | "@nodelib/fs.stat": "^2.0.2", 2159 | "@nodelib/fs.walk": "^1.2.3", 2160 | "glob-parent": "^5.1.2", 2161 | "merge2": "^1.3.0", 2162 | "micromatch": "^4.0.4" 2163 | } 2164 | }, 2165 | "fastq": { 2166 | "version": "1.13.0", 2167 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 2168 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 2169 | "dev": true, 2170 | "requires": { 2171 | "reusify": "^1.0.4" 2172 | } 2173 | }, 2174 | "fill-range": { 2175 | "version": "7.0.1", 2176 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2177 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2178 | "dev": true, 2179 | "requires": { 2180 | "to-regex-range": "^5.0.1" 2181 | } 2182 | }, 2183 | "fs-extra": { 2184 | "version": "10.1.0", 2185 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 2186 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 2187 | "dev": true, 2188 | "requires": { 2189 | "graceful-fs": "^4.2.0", 2190 | "jsonfile": "^6.0.1", 2191 | "universalify": "^2.0.0" 2192 | } 2193 | }, 2194 | "fsevents": { 2195 | "version": "2.3.3", 2196 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2197 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2198 | "dev": true, 2199 | "optional": true 2200 | }, 2201 | "glob-parent": { 2202 | "version": "5.1.2", 2203 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2204 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2205 | "dev": true, 2206 | "requires": { 2207 | "is-glob": "^4.0.1" 2208 | } 2209 | }, 2210 | "graceful-fs": { 2211 | "version": "4.2.10", 2212 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 2213 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 2214 | "dev": true 2215 | }, 2216 | "htmlparser2": { 2217 | "version": "8.0.1", 2218 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", 2219 | "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", 2220 | "dev": true, 2221 | "requires": { 2222 | "domelementtype": "^2.3.0", 2223 | "domhandler": "^5.0.2", 2224 | "domutils": "^3.0.1", 2225 | "entities": "^4.3.0" 2226 | } 2227 | }, 2228 | "is-extglob": { 2229 | "version": "2.1.1", 2230 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2231 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2232 | "dev": true 2233 | }, 2234 | "is-glob": { 2235 | "version": "4.0.3", 2236 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2237 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2238 | "dev": true, 2239 | "requires": { 2240 | "is-extglob": "^2.1.1" 2241 | } 2242 | }, 2243 | "is-number": { 2244 | "version": "7.0.0", 2245 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2246 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2247 | "dev": true 2248 | }, 2249 | "jsesc": { 2250 | "version": "3.0.2", 2251 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 2252 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 2253 | "dev": true 2254 | }, 2255 | "jsonfile": { 2256 | "version": "6.1.0", 2257 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 2258 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 2259 | "dev": true, 2260 | "requires": { 2261 | "graceful-fs": "^4.1.6", 2262 | "universalify": "^2.0.0" 2263 | } 2264 | }, 2265 | "magic-string": { 2266 | "version": "0.26.7", 2267 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", 2268 | "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", 2269 | "dev": true, 2270 | "requires": { 2271 | "sourcemap-codec": "^1.4.8" 2272 | } 2273 | }, 2274 | "merge2": { 2275 | "version": "1.4.1", 2276 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2277 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2278 | "dev": true 2279 | }, 2280 | "micromatch": { 2281 | "version": "4.0.5", 2282 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2283 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2284 | "dev": true, 2285 | "requires": { 2286 | "braces": "^3.0.2", 2287 | "picomatch": "^2.3.1" 2288 | } 2289 | }, 2290 | "ms": { 2291 | "version": "2.1.3", 2292 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2293 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2294 | "dev": true 2295 | }, 2296 | "nanoid": { 2297 | "version": "3.3.7", 2298 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2299 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2300 | "dev": true 2301 | }, 2302 | "nth-check": { 2303 | "version": "2.1.1", 2304 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 2305 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 2306 | "dev": true, 2307 | "requires": { 2308 | "boolbase": "^1.0.0" 2309 | } 2310 | }, 2311 | "parse5": { 2312 | "version": "7.0.0", 2313 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", 2314 | "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", 2315 | "dev": true, 2316 | "requires": { 2317 | "entities": "^4.3.0" 2318 | } 2319 | }, 2320 | "parse5-htmlparser2-tree-adapter": { 2321 | "version": "7.0.0", 2322 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 2323 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 2324 | "dev": true, 2325 | "requires": { 2326 | "domhandler": "^5.0.2", 2327 | "parse5": "^7.0.0" 2328 | } 2329 | }, 2330 | "picocolors": { 2331 | "version": "1.1.1", 2332 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2333 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2334 | "dev": true 2335 | }, 2336 | "picomatch": { 2337 | "version": "2.3.1", 2338 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2339 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2340 | "dev": true 2341 | }, 2342 | "postcss": { 2343 | "version": "8.4.47", 2344 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 2345 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 2346 | "dev": true, 2347 | "requires": { 2348 | "nanoid": "^3.3.7", 2349 | "picocolors": "^1.1.0", 2350 | "source-map-js": "^1.2.1" 2351 | } 2352 | }, 2353 | "q": { 2354 | "version": "1.5.1", 2355 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 2356 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 2357 | "dev": true 2358 | }, 2359 | "queue-microtask": { 2360 | "version": "1.2.3", 2361 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2362 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2363 | "dev": true 2364 | }, 2365 | "react-refresh": { 2366 | "version": "0.13.0", 2367 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 2368 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 2369 | "dev": true 2370 | }, 2371 | "reusify": { 2372 | "version": "1.0.4", 2373 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2374 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2375 | "dev": true 2376 | }, 2377 | "rollup": { 2378 | "version": "2.78.1", 2379 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 2380 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 2381 | "dev": true, 2382 | "requires": { 2383 | "fsevents": "~2.3.2" 2384 | } 2385 | }, 2386 | "run-parallel": { 2387 | "version": "1.2.0", 2388 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2389 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2390 | "dev": true, 2391 | "requires": { 2392 | "queue-microtask": "^1.2.2" 2393 | } 2394 | }, 2395 | "rxjs": { 2396 | "version": "7.5.7", 2397 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", 2398 | "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", 2399 | "dev": true, 2400 | "requires": { 2401 | "tslib": "^2.1.0" 2402 | } 2403 | }, 2404 | "source-map-js": { 2405 | "version": "1.2.1", 2406 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2407 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2408 | "dev": true 2409 | }, 2410 | "sourcemap-codec": { 2411 | "version": "1.4.8", 2412 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 2413 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 2414 | "dev": true 2415 | }, 2416 | "stream-buffers": { 2417 | "version": "0.2.6", 2418 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz", 2419 | "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==", 2420 | "dev": true 2421 | }, 2422 | "to-regex-range": { 2423 | "version": "5.0.1", 2424 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2425 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2426 | "dev": true, 2427 | "requires": { 2428 | "is-number": "^7.0.0" 2429 | } 2430 | }, 2431 | "tslib": { 2432 | "version": "2.8.1", 2433 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2434 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2435 | "dev": true 2436 | }, 2437 | "typescript": { 2438 | "version": "4.8.2", 2439 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 2440 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 2441 | "dev": true 2442 | }, 2443 | "uberproto": { 2444 | "version": "1.2.0", 2445 | "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", 2446 | "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==", 2447 | "dev": true 2448 | }, 2449 | "universalify": { 2450 | "version": "2.0.0", 2451 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 2452 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 2453 | "dev": true 2454 | }, 2455 | "vite": { 2456 | "version": "5.4.10", 2457 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", 2458 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", 2459 | "dev": true, 2460 | "requires": { 2461 | "esbuild": "^0.21.3", 2462 | "fsevents": "~2.3.3", 2463 | "postcss": "^8.4.43", 2464 | "rollup": "^4.20.0" 2465 | }, 2466 | "dependencies": { 2467 | "rollup": { 2468 | "version": "4.24.3", 2469 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", 2470 | "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", 2471 | "dev": true, 2472 | "requires": { 2473 | "@rollup/rollup-android-arm-eabi": "4.24.3", 2474 | "@rollup/rollup-android-arm64": "4.24.3", 2475 | "@rollup/rollup-darwin-arm64": "4.24.3", 2476 | "@rollup/rollup-darwin-x64": "4.24.3", 2477 | "@rollup/rollup-freebsd-arm64": "4.24.3", 2478 | "@rollup/rollup-freebsd-x64": "4.24.3", 2479 | "@rollup/rollup-linux-arm-gnueabihf": "4.24.3", 2480 | "@rollup/rollup-linux-arm-musleabihf": "4.24.3", 2481 | "@rollup/rollup-linux-arm64-gnu": "4.24.3", 2482 | "@rollup/rollup-linux-arm64-musl": "4.24.3", 2483 | "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3", 2484 | "@rollup/rollup-linux-riscv64-gnu": "4.24.3", 2485 | "@rollup/rollup-linux-s390x-gnu": "4.24.3", 2486 | "@rollup/rollup-linux-x64-gnu": "4.24.3", 2487 | "@rollup/rollup-linux-x64-musl": "4.24.3", 2488 | "@rollup/rollup-win32-arm64-msvc": "4.24.3", 2489 | "@rollup/rollup-win32-ia32-msvc": "4.24.3", 2490 | "@rollup/rollup-win32-x64-msvc": "4.24.3", 2491 | "@types/estree": "1.0.6", 2492 | "fsevents": "~2.3.2" 2493 | } 2494 | } 2495 | } 2496 | } 2497 | } 2498 | } 2499 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-inspector", 3 | "private": true, 4 | "version": "1.2.4", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "@crxjs/vite-plugin": "2.0.0-beta.26", 13 | "@types/chrome": "^0.0.195", 14 | "typescript": "^4.6.4", 15 | "vite": "^5.4.10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Overlay.ts: -------------------------------------------------------------------------------- 1 | // This file was moved from https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/backend/views/Highlighter/Overlay.js 2 | type Rect = { 3 | bottom: number; 4 | height: number; 5 | left: number; 6 | right: number; 7 | top: number; 8 | width: number; 9 | }; 10 | 11 | type Box = { top: number; left: number; width: number; height: number }; 12 | 13 | function getOwnerWindow(node: HTMLElement): typeof window | null { 14 | if (!node.ownerDocument) { 15 | return null; 16 | } 17 | return node.ownerDocument.defaultView; 18 | } 19 | 20 | function getOwnerIframe(node: HTMLElement): HTMLIFrameElement | null { 21 | const nodeWindow = getOwnerWindow(node); 22 | if (nodeWindow) { 23 | return nodeWindow.frameElement as HTMLIFrameElement; 24 | } 25 | return null; 26 | } 27 | 28 | function mergeRectOffsets(rects: Array): Rect { 29 | return rects.reduce((previousRect, rect) => { 30 | if (previousRect == null) { 31 | return rect; 32 | } 33 | 34 | return { 35 | top: previousRect.top + rect.top, 36 | left: previousRect.left + rect.left, 37 | width: previousRect.width, 38 | height: previousRect.height, 39 | bottom: previousRect.bottom + rect.bottom, 40 | right: previousRect.right + rect.right, 41 | }; 42 | }); 43 | } 44 | 45 | function getBoundingClientRectWithBorderOffset(node: HTMLElement) { 46 | const dimensions = getElementDimensions(node); 47 | return mergeRectOffsets([ 48 | node.getBoundingClientRect(), 49 | { 50 | top: dimensions.borderTop, 51 | left: dimensions.borderLeft, 52 | bottom: dimensions.borderBottom, 53 | right: dimensions.borderRight, 54 | // This width and height won't get used by mergeRectOffsets (since this 55 | // is not the first rect in the array), but we set them so that this 56 | // object type checks as a ClientRect. 57 | width: 0, 58 | height: 0, 59 | }, 60 | ]); 61 | } 62 | 63 | function getNestedBoundingClientRect( 64 | node: HTMLElement, 65 | boundaryWindow: typeof window 66 | ): Rect { 67 | const ownerIframe = getOwnerIframe(node); 68 | if (ownerIframe && (ownerIframe as unknown) !== boundaryWindow) { 69 | const rects = [node.getBoundingClientRect()] as Array; 70 | let currentIframe: HTMLElement | null = ownerIframe; 71 | let onlyOneMore = false; 72 | while (currentIframe) { 73 | const rect = getBoundingClientRectWithBorderOffset(currentIframe); 74 | rects.push(rect); 75 | currentIframe = getOwnerIframe(currentIframe); 76 | 77 | if (onlyOneMore) { 78 | break; 79 | } 80 | // We don't want to calculate iframe offsets upwards beyond 81 | // the iframe containing the boundaryWindow, but we 82 | // need to calculate the offset relative to the boundaryWindow. 83 | if (currentIframe && getOwnerWindow(currentIframe) === boundaryWindow) { 84 | onlyOneMore = true; 85 | } 86 | } 87 | 88 | return mergeRectOffsets(rects); 89 | } else { 90 | return node.getBoundingClientRect(); 91 | } 92 | } 93 | 94 | function getElementDimensions(domElement: Element) { 95 | const calculatedStyle = window.getComputedStyle(domElement); 96 | return { 97 | borderLeft: parseInt(calculatedStyle.borderLeftWidth, 10), 98 | borderRight: parseInt(calculatedStyle.borderRightWidth, 10), 99 | borderTop: parseInt(calculatedStyle.borderTopWidth, 10), 100 | borderBottom: parseInt(calculatedStyle.borderBottomWidth, 10), 101 | marginLeft: parseInt(calculatedStyle.marginLeft, 10), 102 | marginRight: parseInt(calculatedStyle.marginRight, 10), 103 | marginTop: parseInt(calculatedStyle.marginTop, 10), 104 | marginBottom: parseInt(calculatedStyle.marginBottom, 10), 105 | paddingLeft: parseInt(calculatedStyle.paddingLeft, 10), 106 | paddingRight: parseInt(calculatedStyle.paddingRight, 10), 107 | paddingTop: parseInt(calculatedStyle.paddingTop, 10), 108 | paddingBottom: parseInt(calculatedStyle.paddingBottom, 10), 109 | }; 110 | } 111 | 112 | function findTipPos(dims: Box, bounds: Box, tipSize: Box) { 113 | const tipHeight = Math.max(tipSize.height, 20); 114 | const tipWidth = Math.max(tipSize.width, 60); 115 | const margin = 5; 116 | 117 | let top; 118 | if (dims.top + dims.height + tipHeight <= bounds.top + bounds.height) { 119 | if (dims.top + dims.height < bounds.top + 0) { 120 | top = bounds.top + margin; 121 | } else { 122 | top = dims.top + dims.height + margin; 123 | } 124 | } else if (dims.top - tipHeight <= bounds.top + bounds.height) { 125 | if (dims.top - tipHeight - margin < bounds.top + margin) { 126 | top = bounds.top + margin; 127 | } else { 128 | top = dims.top - tipHeight - margin; 129 | } 130 | } else { 131 | top = bounds.top + bounds.height - tipHeight - margin; 132 | } 133 | 134 | let left = dims.left + margin; 135 | if (dims.left < bounds.left) { 136 | left = bounds.left + margin; 137 | } 138 | if (dims.left + tipWidth > bounds.left + bounds.width) { 139 | left = bounds.left + bounds.width - tipWidth - margin; 140 | } 141 | 142 | return { 143 | style: { top: top + "px", left: left + "px" }, 144 | }; 145 | } 146 | 147 | function boxWrap(dims: any, what: string, node: HTMLElement) { 148 | assign(node.style, { 149 | borderTopWidth: dims[what + "Top"] + "px", 150 | borderLeftWidth: dims[what + "Left"] + "px", 151 | borderRightWidth: dims[what + "Right"] + "px", 152 | borderBottomWidth: dims[what + "Bottom"] + "px", 153 | borderStyle: "solid", 154 | }); 155 | } 156 | 157 | const overlayStyles = { 158 | background: "rgba(120, 170, 210, 0.7)", 159 | padding: "rgba(77, 200, 0, 0.3)", 160 | margin: "rgba(255, 155, 0, 0.3)", 161 | border: "rgba(255, 200, 50, 0.3)", 162 | }; 163 | 164 | const assign = Object.assign; 165 | 166 | // Note that the Overlay components are not affected by the active Theme, 167 | // because they highlight elements in the main Chrome window (outside of devtools). 168 | // The colors below were chosen to roughly match those used by Chrome devtools. 169 | 170 | class OverlayRect { 171 | node: HTMLElement; 172 | border: HTMLElement; 173 | padding: HTMLElement; 174 | content: HTMLElement; 175 | 176 | constructor(doc: Document, container: HTMLElement) { 177 | this.node = doc.createElement("div"); 178 | this.border = doc.createElement("div"); 179 | this.padding = doc.createElement("div"); 180 | this.content = doc.createElement("div"); 181 | 182 | this.border.style.borderColor = overlayStyles.border; 183 | this.padding.style.borderColor = overlayStyles.padding; 184 | this.content.style.backgroundColor = overlayStyles.background; 185 | 186 | assign(this.node.style, { 187 | borderColor: overlayStyles.margin, 188 | pointerEvents: "none", 189 | position: "fixed", 190 | }); 191 | 192 | this.node.style.zIndex = "10000000"; 193 | 194 | this.node.appendChild(this.border); 195 | this.border.appendChild(this.padding); 196 | this.padding.appendChild(this.content); 197 | container.appendChild(this.node); 198 | } 199 | 200 | remove() { 201 | if (this.node.parentNode) { 202 | this.node.parentNode.removeChild(this.node); 203 | } 204 | } 205 | 206 | update(box: Rect, dims: any) { 207 | boxWrap(dims, "margin", this.node); 208 | boxWrap(dims, "border", this.border); 209 | boxWrap(dims, "padding", this.padding); 210 | 211 | assign(this.content.style, { 212 | height: 213 | box.height - 214 | dims.borderTop - 215 | dims.borderBottom - 216 | dims.paddingTop - 217 | dims.paddingBottom + 218 | "px", 219 | width: 220 | box.width - 221 | dims.borderLeft - 222 | dims.borderRight - 223 | dims.paddingLeft - 224 | dims.paddingRight + 225 | "px", 226 | }); 227 | 228 | assign(this.node.style, { 229 | top: box.top - dims.marginTop + "px", 230 | left: box.left - dims.marginLeft + "px", 231 | }); 232 | } 233 | } 234 | 235 | class OverlayTip { 236 | tip: HTMLElement; 237 | nameSpan: HTMLElement; 238 | dimSpan: HTMLElement; 239 | 240 | constructor(doc: Document, container: HTMLElement) { 241 | this.tip = doc.createElement("div"); 242 | assign(this.tip.style, { 243 | display: "flex", 244 | flexFlow: "row nowrap", 245 | backgroundColor: "#333740", 246 | borderRadius: "2px", 247 | fontFamily: 248 | '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace', 249 | fontWeight: "bold", 250 | padding: "3px 5px", 251 | pointerEvents: "none", 252 | position: "fixed", 253 | fontSize: "12px", 254 | whiteSpace: "nowrap", 255 | }); 256 | 257 | this.nameSpan = doc.createElement("span"); 258 | this.tip.appendChild(this.nameSpan); 259 | assign(this.nameSpan.style, { 260 | color: "#ee78e6", 261 | borderRight: "1px solid #aaaaaa", 262 | paddingRight: "0.5rem", 263 | marginRight: "0.5rem", 264 | }); 265 | this.dimSpan = doc.createElement("span"); 266 | this.tip.appendChild(this.dimSpan); 267 | assign(this.dimSpan.style, { 268 | color: "#d7d7d7", 269 | }); 270 | 271 | this.tip.style.zIndex = "10000000"; 272 | container.appendChild(this.tip); 273 | } 274 | 275 | remove() { 276 | if (this.tip.parentNode) { 277 | this.tip.parentNode.removeChild(this.tip); 278 | } 279 | } 280 | 281 | updateText(name: string, width: number, height: number) { 282 | this.nameSpan.textContent = name; 283 | this.dimSpan.textContent = 284 | Math.round(width) + "px × " + Math.round(height) + "px"; 285 | } 286 | 287 | updatePosition(dims: Box, bounds: Box) { 288 | const tipRect = this.tip.getBoundingClientRect(); 289 | const tipPos = findTipPos(dims, bounds, { 290 | top: tipRect.top, 291 | left: tipRect.left, 292 | width: tipRect.width, 293 | height: tipRect.height, 294 | }); 295 | assign(this.tip.style, tipPos.style); 296 | } 297 | } 298 | 299 | export default class Overlay { 300 | window: typeof window; 301 | tipBoundsWindow: typeof window; 302 | container: HTMLElement; 303 | tip: OverlayTip; 304 | rects: Array; 305 | 306 | constructor() { 307 | // Find the root window, because overlays are positioned relative to it. 308 | const currentWindow = window.__REACT_DEVTOOLS_TARGET_WINDOW__ || window; 309 | this.window = currentWindow; 310 | 311 | // When opened in shells/dev, the tooltip should be bound by the app iframe, not by the topmost window. 312 | const tipBoundsWindow = window.__REACT_DEVTOOLS_TARGET_WINDOW__ || window; 313 | this.tipBoundsWindow = tipBoundsWindow; 314 | 315 | const doc = currentWindow.document; 316 | this.container = doc.createElement("div"); 317 | this.container.style.zIndex = "10000000"; 318 | 319 | this.tip = new OverlayTip(doc, this.container); 320 | this.rects = []; 321 | 322 | doc.body.appendChild(this.container); 323 | } 324 | 325 | remove() { 326 | this.tip.remove(); 327 | this.rects.forEach((rect) => { 328 | rect.remove(); 329 | }); 330 | this.rects.length = 0; 331 | if (this.container.parentNode) { 332 | this.container.parentNode.removeChild(this.container); 333 | } 334 | } 335 | 336 | inspect(nodes: Array, name: string) { 337 | // We can't get the size of text nodes or comment nodes. React as of v15 338 | // heavily uses comment nodes to delimit text. 339 | const elements = nodes.filter( 340 | (node) => node.nodeType === Node.ELEMENT_NODE 341 | ); 342 | 343 | while (this.rects.length > elements.length) { 344 | const rect = this.rects.pop(); 345 | rect?.remove(); 346 | } 347 | if (elements.length === 0) { 348 | return; 349 | } 350 | 351 | while (this.rects.length < elements.length) { 352 | this.rects.push(new OverlayRect(this.window.document, this.container)); 353 | } 354 | 355 | const outerBox = { 356 | top: Number.POSITIVE_INFINITY, 357 | right: Number.NEGATIVE_INFINITY, 358 | bottom: Number.NEGATIVE_INFINITY, 359 | left: Number.POSITIVE_INFINITY, 360 | }; 361 | elements.forEach((element, index) => { 362 | const box = getNestedBoundingClientRect(element, this.window); 363 | const dims = getElementDimensions(element); 364 | 365 | outerBox.top = Math.min(outerBox.top, box.top - dims.marginTop); 366 | outerBox.right = Math.max( 367 | outerBox.right, 368 | box.left + box.width + dims.marginRight 369 | ); 370 | outerBox.bottom = Math.max( 371 | outerBox.bottom, 372 | box.top + box.height + dims.marginBottom 373 | ); 374 | outerBox.left = Math.min(outerBox.left, box.left - dims.marginLeft); 375 | 376 | const rect = this.rects[index]; 377 | rect.update(box, dims); 378 | }); 379 | 380 | this.tip.updateText( 381 | name, 382 | outerBox.right - outerBox.left, 383 | outerBox.bottom - outerBox.top 384 | ); 385 | const tipBounds = getNestedBoundingClientRect( 386 | this.tipBoundsWindow.document.documentElement, 387 | this.window 388 | ); 389 | 390 | this.tip.updatePosition( 391 | { 392 | top: outerBox.top, 393 | left: outerBox.left, 394 | height: outerBox.bottom - outerBox.top, 395 | width: outerBox.right - outerBox.left, 396 | }, 397 | { 398 | top: tipBounds.top + this.tipBoundsWindow.scrollY, 399 | left: tipBounds.left + this.tipBoundsWindow.scrollX, 400 | height: this.tipBoundsWindow.innerHeight, 401 | width: this.tipBoundsWindow.innerWidth, 402 | } 403 | ); 404 | } 405 | } 406 | -------------------------------------------------------------------------------- /src/background.ts: -------------------------------------------------------------------------------- 1 | const getCurrentTab = async () => { 2 | const queryOptions = { active: true, currentWindow: true }; 3 | const [tab] = await chrome.tabs.query(queryOptions); 4 | return tab; 5 | }; 6 | 7 | const sendInspectSignal = async (msg: string, tabId?: number) => { 8 | const target = tabId || (await (await getCurrentTab()).id) || 0; 9 | chrome.tabs.sendMessage(target, msg); 10 | }; 11 | 12 | const reactInspectorMenuItemId = "react-inspector"; 13 | 14 | chrome.runtime.onInstalled.addListener(() => { 15 | chrome.contextMenus.create({ 16 | id: reactInspectorMenuItemId, 17 | title: "Inspect with React Inspector", 18 | contexts: ["all"], 19 | }); 20 | }); 21 | 22 | chrome.commands.onCommand.addListener((command) => { 23 | if (command === "inspect") { 24 | sendInspectSignal("inspect"); 25 | } 26 | }); 27 | 28 | chrome.contextMenus.onClicked.addListener((info, tab) => { 29 | if (info.menuItemId === reactInspectorMenuItemId) { 30 | sendInspectSignal("inspect", tab?.id); 31 | } 32 | }); 33 | 34 | chrome.action.onClicked.addListener((tab) => { 35 | sendInspectSignal("inspect", tab.id); 36 | }); 37 | 38 | export {}; 39 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_OPEN_IN_EDITOR_URL = 2 | "vscode://file/{path}:{line}:{column}"; 3 | 4 | export const WEBSTORM_DEFAULT_OPEN_URL = 5 | "http://localhost:63342/api/file/{path}:{line}:{column}"; 6 | -------------------------------------------------------------------------------- /src/content-main-world.ts: -------------------------------------------------------------------------------- 1 | import { 2 | checkDevtoolsGlobalHook, 3 | findFiberByHostInstance, 4 | getEditorLink, 5 | } from "./utils"; 6 | import Overlay from "./Overlay"; 7 | import { DEFAULT_OPEN_IN_EDITOR_URL } from "./constants"; 8 | 9 | let overlay: Overlay | null = null; 10 | let inspecting = false; 11 | let openInEditorUrl = DEFAULT_OPEN_IN_EDITOR_URL; 12 | const mousePos = { x: 0, y: 0 }; 13 | let openInEditorMethod = 'url'; 14 | 15 | const getInspectName = (element: HTMLElement) => { 16 | const fiber = findFiberByHostInstance(element); 17 | if (!fiber) return "Source code could not be identified."; 18 | const { fileName, columnNumber, lineNumber } = fiber._debugSource; 19 | const path = (fileName || "").split("/"); 20 | 21 | return `${path.at(-3) || ""}/${path.at(-2) || ""}/${path.at(-1)}:${ 22 | lineNumber || 0 23 | }:${columnNumber || 0}`; 24 | }; 25 | 26 | const startInspectorMode = () => { 27 | inspecting = true; 28 | if (!overlay) { 29 | overlay = new Overlay(); 30 | } 31 | const element = document.elementFromPoint( 32 | mousePos.x, 33 | mousePos.y 34 | ) as HTMLElement | null; 35 | if (element) { 36 | // highlight the initial point. 37 | overlay.inspect([element], getInspectName(element)); 38 | } 39 | 40 | window.addEventListener("pointerover", handleElementPointerOver, true); 41 | window.addEventListener("click", handleInspectorClick, true); 42 | }; 43 | 44 | const exitInspectorMode = () => { 45 | inspecting = false; 46 | if (overlay) { 47 | overlay.remove(); 48 | overlay = null; 49 | } 50 | window.removeEventListener("pointerover", handleElementPointerOver, true); 51 | window.removeEventListener("click", handleInspectorClick, true); 52 | }; 53 | 54 | const handleElementPointerOver = (e: PointerEvent) => { 55 | const target = e.target as HTMLElement | null; 56 | if (!target || !overlay) return; 57 | overlay.inspect([target], getInspectName(target)); 58 | }; 59 | 60 | const handleInspectorClick = async (e: MouseEvent) => { 61 | e.preventDefault(); 62 | exitInspectorMode(); 63 | const target = e.target as HTMLElement | null; 64 | if (!target) return; 65 | 66 | const fiber = findFiberByHostInstance(target); 67 | if (!fiber) { 68 | alert("This element cannot be opened in React Inspector."); 69 | return; 70 | } 71 | 72 | const tmpId = "_TMP"; 73 | document.getElementById(tmpId)?.removeAttribute("id"); 74 | target.id = tmpId; 75 | window.postMessage("inspected", "*"); 76 | 77 | const deepLink = getEditorLink(openInEditorUrl, fiber._debugSource) 78 | if(openInEditorMethod === 'fetch'){ 79 | fetch(deepLink); 80 | }else{ 81 | window.open(deepLink); 82 | } 83 | }; 84 | 85 | window.addEventListener("message", ({ data }) => { 86 | if (data !== "inspect" && data.type !== "options") return; 87 | 88 | if (data === "inspect") { 89 | if (!checkDevtoolsGlobalHook()) { 90 | alert(`This page is not available to use the React Inspector. 91 | Make sure React Developer Tools is installed and enabled.`); 92 | return; 93 | } 94 | if (inspecting) { 95 | exitInspectorMode(); 96 | } else { 97 | startInspectorMode(); 98 | } 99 | } 100 | 101 | if (data.type === "options" && data.openInEditorUrl) { 102 | openInEditorUrl = data.openInEditorUrl; 103 | openInEditorMethod = data.openInEditorMethod; 104 | } 105 | }); 106 | 107 | const handleInspectElement = (e: KeyboardEvent) => { 108 | if (e.key?.toLowerCase() === "escape") { 109 | e.preventDefault(); 110 | exitInspectorMode(); 111 | } 112 | }; 113 | 114 | window.addEventListener("keydown", handleInspectElement); 115 | 116 | window.addEventListener("mousemove", (e: MouseEvent) => { 117 | mousePos.x = e.clientX; 118 | mousePos.y = e.clientY; 119 | }); 120 | 121 | export {}; 122 | -------------------------------------------------------------------------------- /src/content.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import mainWorld from "./content-main-world?script&module"; 3 | import { DEFAULT_OPEN_IN_EDITOR_URL } from "./constants"; 4 | 5 | const script = document.createElement("script"); 6 | script.src = chrome.runtime.getURL(mainWorld); 7 | script.type = "module"; 8 | 9 | script.onload = () => { 10 | chrome.runtime.onMessage.addListener((request) => { 11 | if (request === "inspect") { 12 | window.postMessage(request, "*"); 13 | chrome.storage.sync.get( 14 | { openInEditorUrl: DEFAULT_OPEN_IN_EDITOR_URL, openInEditorMethod:'url' }, 15 | (items) => { 16 | window.postMessage({ type: "options", ...items }, "*"); 17 | } 18 | ); 19 | } 20 | }); 21 | }; 22 | 23 | window.addEventListener("message", ({ data }) => { 24 | if (data === "inspected") { 25 | const res = chrome.runtime.sendMessage(data); 26 | res.catch(() => {}); 27 | } 28 | }); 29 | 30 | document.head.append(script); 31 | -------------------------------------------------------------------------------- /src/devtools.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/devtools.ts: -------------------------------------------------------------------------------- 1 | const messageHandler = async (message: any) => { 2 | if (message === "inspected") { 3 | const inspectString = 4 | "inspect(document.getElementById('_TMP')) && document.getElementById('_TMP').removeAttribute('id')"; 5 | chrome.devtools.inspectedWindow.eval(inspectString); 6 | } 7 | }; 8 | 9 | chrome.runtime.onMessage.addListener(messageHandler); 10 | 11 | export {}; 12 | -------------------------------------------------------------------------------- /src/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 103 | 104 | 105 |
106 | logo 107 |

React Inspector Options

108 |
109 | 110 | 111 |
112 |
113 | 121 | 128 | 129 |
130 |
131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /src/options.ts: -------------------------------------------------------------------------------- 1 | import { DEFAULT_OPEN_IN_EDITOR_URL, WEBSTORM_DEFAULT_OPEN_URL } from "./constants"; 2 | 3 | const getElements = () => { 4 | const openInEditorUrl = document.getElementById( 5 | "open-in-editor-url" 6 | ) as HTMLInputElement; 7 | 8 | const openInEditorMethod = document.getElementById('open-in-editor-method') as HTMLSelectElement; 9 | 10 | return {openInEditorUrl,openInEditorMethod} 11 | } 12 | 13 | const initOptions = () => { 14 | 15 | const { openInEditorUrl, openInEditorMethod } = getElements(); 16 | 17 | chrome.storage.sync.get( 18 | { openInEditorUrl: DEFAULT_OPEN_IN_EDITOR_URL, openInEditorMethod:'url' }, 19 | (items) => { 20 | openInEditorUrl.value = items.openInEditorUrl; 21 | openInEditorMethod.value = items.openInEditorMethod; 22 | } 23 | ); 24 | }; 25 | 26 | const saveOptions = (feedbackMsg: string) => { 27 | const { openInEditorUrl, openInEditorMethod } = getElements(); 28 | 29 | chrome.storage.sync.set({ openInEditorUrl: openInEditorUrl.value, openInEditorMethod:openInEditorMethod.value }, () => { 30 | const status = document.getElementById("status")!; 31 | status.textContent = feedbackMsg; 32 | setTimeout(() => { 33 | status.textContent = ""; 34 | }, 1000); 35 | }); 36 | }; 37 | 38 | const applyInputValue = (uri:string, method:string) => { 39 | const { openInEditorUrl, openInEditorMethod } = getElements(); 40 | 41 | openInEditorUrl.value = uri; 42 | openInEditorMethod.value = method; 43 | } 44 | 45 | document.addEventListener("DOMContentLoaded", initOptions); 46 | document 47 | .getElementById("save")! 48 | .addEventListener("click", () => saveOptions("Options saved.")); 49 | document 50 | .getElementById("restore-default")! 51 | .addEventListener("click", () => applyInputValue(DEFAULT_OPEN_IN_EDITOR_URL, 'url')); 52 | document.getElementById('webstorm')! 53 | .addEventListener('click',() => { 54 | applyInputValue(WEBSTORM_DEFAULT_OPEN_URL, 'fetch') 55 | }) 56 | 57 | export {}; 58 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { 3 | __REACT_DEVTOOLS_GLOBAL_HOOK__: any; 4 | __REACT_DEVTOOLS_TARGET_WINDOW__: any; 5 | } 6 | } 7 | 8 | interface DebugSource { 9 | columnNumber?: number; 10 | fileName?: string; 11 | lineNumber?: number; 12 | } 13 | 14 | // TODO Refactoring needed ref react/packages/react-devtools-shared/src/backend/agent.js getBestMatchingRendererInterface 15 | export const checkDevtoolsGlobalHook = (): boolean => 16 | window.__REACT_DEVTOOLS_GLOBAL_HOOK__ && 17 | window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers && 18 | window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.size > 0 && 19 | window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.get(1); 20 | 21 | // TODO Refactoring needed ref react/packages/react-devtools-shared/src/backend/agent.js getBestMatchingRendererInterface 22 | const getDevtoolsGlobalHookRenderer = () => { 23 | if (!checkDevtoolsGlobalHook()) return null; 24 | return window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.get(1); 25 | }; 26 | 27 | export const findFiberByHostInstance = ( 28 | target: HTMLElement 29 | ): { _debugSource: DebugSource } | null => { 30 | if (!checkDevtoolsGlobalHook()) return null; 31 | 32 | const renderer = getDevtoolsGlobalHookRenderer(); 33 | if (!renderer) return null; 34 | 35 | const fiber = renderer.findFiberByHostInstance(target) || null; 36 | 37 | return fiber && fiber._debugSource ? fiber : null; 38 | }; 39 | 40 | export const getEditorLink = ( 41 | openInEditorUrl: string, 42 | debugSource: DebugSource 43 | ) => { 44 | const { fileName, columnNumber, lineNumber } = debugSource; 45 | return openInEditorUrl 46 | .replace("{path}", fileName || "") 47 | .replace("{line}", lineNumber ? lineNumber.toString() : "0") 48 | .replace("{column}", columnNumber ? columnNumber.toString() : "0"); 49 | }; 50 | 51 | export {}; 52 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ESNext", "DOM"], 7 | "moduleResolution": "Node", 8 | "strict": true, 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "esModuleInterop": true, 13 | "noEmit": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "noImplicitReturns": true, 17 | "skipLibCheck": true 18 | }, 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import { crx, defineManifest, ManifestV3Export } from "@crxjs/vite-plugin"; 3 | 4 | const manifest: ManifestV3Export = defineManifest({ 5 | manifest_version: 3, 6 | name: "React Inspector", 7 | description: 8 | "The Inspector launch with Ctrl+Shift+X (Command+Shift+X on Mac). You can detect and open the React component source code easily.", 9 | icons: { 10 | "16": "icon/icon16.png", 11 | "48": "icon/icon48.png", 12 | "128": "icon/icon128.png", 13 | }, 14 | action: { 15 | default_title: 16 | "React Inspector: Press Ctrl+Shift+X (Command+Shift+X on Mac)", 17 | }, 18 | version: "1.2.4", 19 | content_scripts: [{ js: ["src/content.ts"], matches: [""] }], 20 | devtools_page: "src/devtools.html", 21 | options_page: "src/options.html", 22 | background: { service_worker: "src/background.ts", type: "module" }, 23 | commands: { 24 | inspect: { 25 | suggested_key: { default: "Ctrl+Shift+X", mac: "Command+Shift+X" }, 26 | description: 'Inspect the page using the "React Inspector" extension.', 27 | }, 28 | }, 29 | permissions: ["activeTab", "contextMenus", "storage"], 30 | }); 31 | 32 | export default defineConfig({ 33 | server: { port: 54321 }, 34 | plugins: [crx({ manifest })], 35 | optimizeDeps: { 36 | entries: ["src/*.html"], 37 | }, 38 | }); 39 | --------------------------------------------------------------------------------