├── .gitignore ├── LICENSE ├── README.md ├── manifest.json ├── package.json ├── pnpm-lock.yaml ├── previews ├── state-tree.png ├── trB4Y367wB.mp4 └── wGKfh4fLqD.mp4 ├── src ├── content.ts └── ui │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── pnpm-lock.yaml │ ├── postcss.config.js │ ├── src │ ├── app.module.css │ ├── app.tsx │ ├── components │ │ ├── NavBar.module.css │ │ ├── NavBar.tsx │ │ ├── NodeTreeView.tsx │ │ ├── ObjectTree.module.css │ │ ├── ObjectTree.tsx │ │ ├── ResizeBox.module.css │ │ └── ResizeBox.tsx │ ├── errors │ │ └── 404.tsx │ ├── index.css │ ├── index.tsx │ ├── pages │ │ ├── about.tsx │ │ ├── index.module.css │ │ ├── index.tsx │ │ ├── inspect.module.css │ │ └── inspect.tsx │ ├── routes.ts │ ├── stores │ │ ├── GlobalHistory.ts │ │ ├── Nodes.ts │ │ ├── SelectedNode.ts │ │ ├── SelectedTreeView.ts │ │ └── TabID.ts │ └── utils │ │ ├── ResolvedStack.ts │ │ ├── deepFreeze.ts │ │ ├── get.ts │ │ ├── set.ts │ │ ├── symbolJoin.ts │ │ └── walkTree.ts │ ├── tsconfig.json │ └── vite.config.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 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Kyza 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## ⚠️ The `master` branch of the repo will remain unchanged until the end of SolidHack voting! 4 | 5 | ## ⚠️ If you would like to see the current progress of this project, please view the [`dev` branch](https://github.com/CompendiumDevTools/devtools/tree/dev). 6 | 7 | ## ⚠️ This project is a work in progress and might not be usable at the current time. 8 | 9 | A framework-agnostic devtools extension made for SolidHack. 10 | 11 | ## Features 12 | 13 | - [x] Fast rendering of large datasets. 14 | - [x] Live updating. 15 | - [x] Per-page functionality. 16 | - [ ] Readable and collapsible node tree view. 17 | - [x] Readable and collapsible state tree view. 18 | - [x] Extensible and fast serializing of any type with flexible display options. 19 | - [x] Globally tracked history. 20 | - [x] State-scoped tracked history. 21 | - [ ] State stacktrace viewer. 22 | - [ ] State diff viewer. 23 | - [ ] State-scoped code executor. 24 | 25 | ## Previews 26 | 27 | The following is an old video of the UI since the UI is still being built. 28 | 29 | https://user-images.githubusercontent.com/40003440/162802430-4fa480a4-e6b4-445e-b475-53a6832be6cf.mp4 30 | 31 | The state tree displayed in the video now looks like this: 32 | 33 | ![State Tree](./previews/state-tree.png) 34 | 35 | In the next video, the Solid connector is being used on a basic page to observe changes in the components and signals and send them to the currently unfinished devtools panel. 36 | 37 | https://user-images.githubusercontent.com/40003440/162839893-3d234efa-8242-475e-939a-5fdd60dadb21.mp4 38 | 39 | ## How It Works 40 | 41 | First of all, it's of course not possible for Compendium DevTools to work with *every* framework. It's designed to be as flexible as possible, but some frameworks might simply be impossible to connect to because of how they work. 42 | 43 | "Nodes" are the term for any piece of data that can be tracked by the devtools. This could be UI components, stores (like `useState` from React or `createSignal` from Solid), or any other data you wish. As long as you connect them to the devtools, they will appear in the devtools and be tracked like anything else. 44 | 45 | Because such a wide range of data is possible, the devtools is designed to be extensible and flexible in how the data can be displayed. You can set custom names and colors for everything to make it easier to find what you're looking for. 46 | 47 | Nodes are displayed in the devtools as a tree. Each node has static options (such as the ID, and tracking options) and dynamic data (such as the state, name, and children). 48 | 49 | Whenever a node is updated, the devtools will save the current dynamic data of all nodes into a global history which can be seeked through, as well as the individual history of each node, and update the node tree accordingly. You will be able to see exactly how many times your nodes are updating, when, why, and what the current state is. 50 | 51 | ## Building From Source 52 | 53 | Currently there are only instrcutions to run the dev environment from source. 54 | 55 | ```bash 56 | pnpm i 57 | pnpm run dev 58 | cd ./src/ui 59 | pnpm i 60 | cd ../.. 61 | pnpm run dev-ui 62 | # Copy the manifest.json into the ./dist directory. 63 | ``` 64 | 65 | Next you can either run a blank test environment with `web-ext` or import the extension to your browser. 66 | 67 | If you want to do the former, just run this command: 68 | 69 | ```bash 70 | pnpm run dev-start 71 | ``` 72 | 73 | If you do the latter, you need to enable developer mode in the browser's extension page before you can import it. 74 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Compendium DevTools", 3 | "description": "A framework-agnostic devtools extension.", 4 | "version": "1.0.0", 5 | "manifest_version": 3, 6 | "devtools_page": "ui/index.html", 7 | "permissions": ["scripting", "tabs"], 8 | "host_permissions": ["*://*/*"], 9 | "content_scripts": [ 10 | { 11 | "matches": [""], 12 | "js": ["content.js"], 13 | "run_at": "document_start" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "compendium-devtools", 3 | "version": "0.0.0", 4 | "description": "A framework-agnostic devtools extension made for SolidHack.", 5 | "info": "Why should everything need to build a devtools extension? Compendium-Devtools's goal is to save framework developers and their users time.", 6 | "main": "index.js", 7 | "scripts": { 8 | "dev": "vite build --watch", 9 | "dev-ui": "cd src/ui && npm run build -- -w", 10 | "dev-start": "cd dist && web-ext run --target=chromium --chromium-binary=\"C:/Program Files/Vivaldi/Application/vivaldi.exe\"" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/CompendiumDevTools/devtools.git" 15 | }, 16 | "keywords": [ 17 | "solidhack", 18 | "best_ecosystem", 19 | "devtools", 20 | "store", 21 | "state", 22 | "extension", 23 | "inspector" 24 | ], 25 | "author": "Kyza", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/CompendiumDevTools/devtools/issues" 29 | }, 30 | "homepage": "https://github.com/CompendiumDevTools/devtools#readme", 31 | "devDependencies": { 32 | "@types/chrome": "^0.0.178", 33 | "@types/node": "^17.0.21", 34 | "solid-js": "^1.3.13", 35 | "typescript": "^4.6.2", 36 | "vite": "^2.8.6" 37 | }, 38 | "dependencies": { 39 | "@solid-primitives/resize-observer": "^1.0.5", 40 | "solid-app-router": "^0.3.1" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@solid-primitives/resize-observer': ^1.0.5 5 | '@types/chrome': ^0.0.178 6 | '@types/node': ^17.0.21 7 | solid-app-router: ^0.3.1 8 | solid-js: ^1.3.13 9 | typescript: ^4.6.2 10 | vite: ^2.8.6 11 | 12 | dependencies: 13 | '@solid-primitives/resize-observer': 1.0.5_solid-js@1.3.13 14 | solid-app-router: 0.3.1_solid-js@1.3.13 15 | 16 | devDependencies: 17 | '@types/chrome': 0.0.178 18 | '@types/node': 17.0.21 19 | solid-js: 1.3.13 20 | typescript: 4.6.2 21 | vite: 2.8.6 22 | 23 | packages: 24 | 25 | /@solid-primitives/resize-observer/1.0.5_solid-js@1.3.13: 26 | resolution: {integrity: sha512-/SwRnu7C2TuesBYFtoIgjt1N9zHbRodv2ybbrQzffRqQkzIiawBp5RH/3GDG2/HAMkpXqJEiqiafjKMtu0gL9Q==} 27 | peerDependencies: 28 | solid-js: ^1.3.0 29 | dependencies: 30 | solid-js: 1.3.13 31 | dev: false 32 | 33 | /@types/chrome/0.0.178: 34 | resolution: {integrity: sha512-U+G5YG2pH0qvLrYVJ9aT5VbPXYR3fAFyCuRBRAA14Pv7GrkFzDJuXPspgdeLYaKzGEp4rymUkuqUOuFz18LI1g==} 35 | dependencies: 36 | '@types/filesystem': 0.0.32 37 | '@types/har-format': 1.2.8 38 | dev: true 39 | 40 | /@types/filesystem/0.0.32: 41 | resolution: {integrity: sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==} 42 | dependencies: 43 | '@types/filewriter': 0.0.29 44 | dev: true 45 | 46 | /@types/filewriter/0.0.29: 47 | resolution: {integrity: sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==} 48 | dev: true 49 | 50 | /@types/har-format/1.2.8: 51 | resolution: {integrity: sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==} 52 | dev: true 53 | 54 | /@types/node/17.0.21: 55 | resolution: {integrity: sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==} 56 | dev: true 57 | 58 | /esbuild-android-64/0.14.27: 59 | resolution: {integrity: sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ==} 60 | engines: {node: '>=12'} 61 | cpu: [x64] 62 | os: [android] 63 | requiresBuild: true 64 | dev: true 65 | optional: true 66 | 67 | /esbuild-android-arm64/0.14.27: 68 | resolution: {integrity: sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ==} 69 | engines: {node: '>=12'} 70 | cpu: [arm64] 71 | os: [android] 72 | requiresBuild: true 73 | dev: true 74 | optional: true 75 | 76 | /esbuild-darwin-64/0.14.27: 77 | resolution: {integrity: sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g==} 78 | engines: {node: '>=12'} 79 | cpu: [x64] 80 | os: [darwin] 81 | requiresBuild: true 82 | dev: true 83 | optional: true 84 | 85 | /esbuild-darwin-arm64/0.14.27: 86 | resolution: {integrity: sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ==} 87 | engines: {node: '>=12'} 88 | cpu: [arm64] 89 | os: [darwin] 90 | requiresBuild: true 91 | dev: true 92 | optional: true 93 | 94 | /esbuild-freebsd-64/0.14.27: 95 | resolution: {integrity: sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA==} 96 | engines: {node: '>=12'} 97 | cpu: [x64] 98 | os: [freebsd] 99 | requiresBuild: true 100 | dev: true 101 | optional: true 102 | 103 | /esbuild-freebsd-arm64/0.14.27: 104 | resolution: {integrity: sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA==} 105 | engines: {node: '>=12'} 106 | cpu: [arm64] 107 | os: [freebsd] 108 | requiresBuild: true 109 | dev: true 110 | optional: true 111 | 112 | /esbuild-linux-32/0.14.27: 113 | resolution: {integrity: sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw==} 114 | engines: {node: '>=12'} 115 | cpu: [ia32] 116 | os: [linux] 117 | requiresBuild: true 118 | dev: true 119 | optional: true 120 | 121 | /esbuild-linux-64/0.14.27: 122 | resolution: {integrity: sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg==} 123 | engines: {node: '>=12'} 124 | cpu: [x64] 125 | os: [linux] 126 | requiresBuild: true 127 | dev: true 128 | optional: true 129 | 130 | /esbuild-linux-arm/0.14.27: 131 | resolution: {integrity: sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw==} 132 | engines: {node: '>=12'} 133 | cpu: [arm] 134 | os: [linux] 135 | requiresBuild: true 136 | dev: true 137 | optional: true 138 | 139 | /esbuild-linux-arm64/0.14.27: 140 | resolution: {integrity: sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ==} 141 | engines: {node: '>=12'} 142 | cpu: [arm64] 143 | os: [linux] 144 | requiresBuild: true 145 | dev: true 146 | optional: true 147 | 148 | /esbuild-linux-mips64le/0.14.27: 149 | resolution: {integrity: sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A==} 150 | engines: {node: '>=12'} 151 | cpu: [mips64el] 152 | os: [linux] 153 | requiresBuild: true 154 | dev: true 155 | optional: true 156 | 157 | /esbuild-linux-ppc64le/0.14.27: 158 | resolution: {integrity: sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA==} 159 | engines: {node: '>=12'} 160 | cpu: [ppc64] 161 | os: [linux] 162 | requiresBuild: true 163 | dev: true 164 | optional: true 165 | 166 | /esbuild-linux-riscv64/0.14.27: 167 | resolution: {integrity: sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg==} 168 | engines: {node: '>=12'} 169 | cpu: [riscv64] 170 | os: [linux] 171 | requiresBuild: true 172 | dev: true 173 | optional: true 174 | 175 | /esbuild-linux-s390x/0.14.27: 176 | resolution: {integrity: sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg==} 177 | engines: {node: '>=12'} 178 | cpu: [s390x] 179 | os: [linux] 180 | requiresBuild: true 181 | dev: true 182 | optional: true 183 | 184 | /esbuild-netbsd-64/0.14.27: 185 | resolution: {integrity: sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q==} 186 | engines: {node: '>=12'} 187 | cpu: [x64] 188 | os: [netbsd] 189 | requiresBuild: true 190 | dev: true 191 | optional: true 192 | 193 | /esbuild-openbsd-64/0.14.27: 194 | resolution: {integrity: sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw==} 195 | engines: {node: '>=12'} 196 | cpu: [x64] 197 | os: [openbsd] 198 | requiresBuild: true 199 | dev: true 200 | optional: true 201 | 202 | /esbuild-sunos-64/0.14.27: 203 | resolution: {integrity: sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg==} 204 | engines: {node: '>=12'} 205 | cpu: [x64] 206 | os: [sunos] 207 | requiresBuild: true 208 | dev: true 209 | optional: true 210 | 211 | /esbuild-windows-32/0.14.27: 212 | resolution: {integrity: sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw==} 213 | engines: {node: '>=12'} 214 | cpu: [ia32] 215 | os: [win32] 216 | requiresBuild: true 217 | dev: true 218 | optional: true 219 | 220 | /esbuild-windows-64/0.14.27: 221 | resolution: {integrity: sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg==} 222 | engines: {node: '>=12'} 223 | cpu: [x64] 224 | os: [win32] 225 | requiresBuild: true 226 | dev: true 227 | optional: true 228 | 229 | /esbuild-windows-arm64/0.14.27: 230 | resolution: {integrity: sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg==} 231 | engines: {node: '>=12'} 232 | cpu: [arm64] 233 | os: [win32] 234 | requiresBuild: true 235 | dev: true 236 | optional: true 237 | 238 | /esbuild/0.14.27: 239 | resolution: {integrity: sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q==} 240 | engines: {node: '>=12'} 241 | hasBin: true 242 | requiresBuild: true 243 | optionalDependencies: 244 | esbuild-android-64: 0.14.27 245 | esbuild-android-arm64: 0.14.27 246 | esbuild-darwin-64: 0.14.27 247 | esbuild-darwin-arm64: 0.14.27 248 | esbuild-freebsd-64: 0.14.27 249 | esbuild-freebsd-arm64: 0.14.27 250 | esbuild-linux-32: 0.14.27 251 | esbuild-linux-64: 0.14.27 252 | esbuild-linux-arm: 0.14.27 253 | esbuild-linux-arm64: 0.14.27 254 | esbuild-linux-mips64le: 0.14.27 255 | esbuild-linux-ppc64le: 0.14.27 256 | esbuild-linux-riscv64: 0.14.27 257 | esbuild-linux-s390x: 0.14.27 258 | esbuild-netbsd-64: 0.14.27 259 | esbuild-openbsd-64: 0.14.27 260 | esbuild-sunos-64: 0.14.27 261 | esbuild-windows-32: 0.14.27 262 | esbuild-windows-64: 0.14.27 263 | esbuild-windows-arm64: 0.14.27 264 | dev: true 265 | 266 | /fsevents/2.3.2: 267 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 268 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 269 | os: [darwin] 270 | requiresBuild: true 271 | dev: true 272 | optional: true 273 | 274 | /function-bind/1.1.1: 275 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 276 | dev: true 277 | 278 | /has/1.0.3: 279 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 280 | engines: {node: '>= 0.4.0'} 281 | dependencies: 282 | function-bind: 1.1.1 283 | dev: true 284 | 285 | /is-core-module/2.8.1: 286 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 287 | dependencies: 288 | has: 1.0.3 289 | dev: true 290 | 291 | /nanoid/3.3.1: 292 | resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} 293 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 294 | hasBin: true 295 | dev: true 296 | 297 | /path-parse/1.0.7: 298 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 299 | dev: true 300 | 301 | /picocolors/1.0.0: 302 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 303 | dev: true 304 | 305 | /postcss/8.4.12: 306 | resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} 307 | engines: {node: ^10 || ^12 || >=14} 308 | dependencies: 309 | nanoid: 3.3.1 310 | picocolors: 1.0.0 311 | source-map-js: 1.0.2 312 | dev: true 313 | 314 | /resolve/1.22.0: 315 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 316 | hasBin: true 317 | dependencies: 318 | is-core-module: 2.8.1 319 | path-parse: 1.0.7 320 | supports-preserve-symlinks-flag: 1.0.0 321 | dev: true 322 | 323 | /rollup/2.70.1: 324 | resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} 325 | engines: {node: '>=10.0.0'} 326 | hasBin: true 327 | optionalDependencies: 328 | fsevents: 2.3.2 329 | dev: true 330 | 331 | /solid-app-router/0.3.1_solid-js@1.3.13: 332 | resolution: {integrity: sha512-GpDu8tpEWG8azP02PEJ0tUb3g0euWJ9rJoHNUs8qMf3/jW4P3zVBF+E5vOFRcGNkqXiSLvniawCwV5V344fHtQ==} 333 | peerDependencies: 334 | solid-js: ^1.3.5 335 | dependencies: 336 | solid-js: 1.3.13 337 | dev: false 338 | 339 | /solid-js/1.3.13: 340 | resolution: {integrity: sha512-1EBEIW9u2yqT5QNjFdvz/tMAoKsDdaRA2Jbgykd2Dt13Ia0D4mV+BFvPkOaseSyu7DsMKS23+ZZofV8BVKmpuQ==} 341 | dev: true 342 | 343 | /source-map-js/1.0.2: 344 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 345 | engines: {node: '>=0.10.0'} 346 | dev: true 347 | 348 | /supports-preserve-symlinks-flag/1.0.0: 349 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 350 | engines: {node: '>= 0.4'} 351 | dev: true 352 | 353 | /typescript/4.6.2: 354 | resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} 355 | engines: {node: '>=4.2.0'} 356 | hasBin: true 357 | dev: true 358 | 359 | /vite/2.8.6: 360 | resolution: {integrity: sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==} 361 | engines: {node: '>=12.2.0'} 362 | hasBin: true 363 | peerDependencies: 364 | less: '*' 365 | sass: '*' 366 | stylus: '*' 367 | peerDependenciesMeta: 368 | less: 369 | optional: true 370 | sass: 371 | optional: true 372 | stylus: 373 | optional: true 374 | dependencies: 375 | esbuild: 0.14.27 376 | postcss: 8.4.12 377 | resolve: 1.22.0 378 | rollup: 2.70.1 379 | optionalDependencies: 380 | fsevents: 2.3.2 381 | dev: true 382 | -------------------------------------------------------------------------------- /previews/state-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CompendiumDevTools/devtools/f729bc25f6905a5de019bedccd1cc6555504cadb/previews/state-tree.png -------------------------------------------------------------------------------- /previews/trB4Y367wB.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CompendiumDevTools/devtools/f729bc25f6905a5de019bedccd1cc6555504cadb/previews/trB4Y367wB.mp4 -------------------------------------------------------------------------------- /previews/wGKfh4fLqD.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CompendiumDevTools/devtools/f729bc25f6905a5de019bedccd1cc6555504cadb/previews/wGKfh4fLqD.mp4 -------------------------------------------------------------------------------- /src/content.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // Listen to the messages from the actual page and send them to the devtools panel. 4 | window.addEventListener("message", function windowListener(event) { 5 | // Only accept messages from the same frame 6 | if (event.source !== window) { 7 | return; 8 | } 9 | 10 | const message = event.data; 11 | 12 | // Only accept messages that we know are ours 13 | if (typeof message !== "object" || message === null || message.source !== "compendium-devtools-extension") { 14 | return; 15 | } 16 | 17 | if (message.type === "PROBE") { 18 | event.source.postMessage({ type: "PROBE_RETURN", source: "compendium-devtools-extension" }, event.origin); 19 | } 20 | 21 | message.options ??= {}; 22 | message.options.serialize ??= true; 23 | 24 | chrome.runtime.sendMessage(message); 25 | }); 26 | -------------------------------------------------------------------------------- /src/ui/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /src/ui/README.md: -------------------------------------------------------------------------------- 1 | ## Usage 2 | 3 | Those templates dependencies are maintained via [pnpm](https://pnpm.io) via `pnpm up -Lri`. 4 | 5 | This is the reason you see a `pnpm-lock.yaml`. That being said, any package manager will work. This file can be safely be removed once you clone a template. 6 | 7 | ```bash 8 | $ npm install # or pnpm install or yarn install 9 | ``` 10 | 11 | ## Exploring the template 12 | 13 | This template's goal is to showcase the routing features of Solid. 14 | It also showcase how the router and Suspense work together to parallelize data fetching tied to a route via the `.data.ts` pattern. 15 | 16 | You can learn more about it on the [`solid-app-router` repository](https://github.com/solidjs/solid-app-router) 17 | 18 | ### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) 19 | 20 | ## Available Scripts 21 | 22 | In the project directory, you can run: 23 | 24 | ### `npm dev` or `npm start` 25 | 26 | Runs the app in the development mode.
27 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 28 | 29 | The page will reload if you make edits.
30 | 31 | ### `npm run build` 32 | 33 | Builds the app for production to the `dist` folder.
34 | It correctly bundles Solid in production mode and optimizes the build for the best performance. 35 | 36 | The build is minified and the filenames include the hashes.
37 | Your app is ready to be deployed! 38 | 39 | ## Deployment 40 | 41 | You can deploy the `dist` folder to any static host provider (netlify, surge, now, etc.) 42 | -------------------------------------------------------------------------------- /src/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Nests DevTools 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nests-devtools", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "dev": "vite build --watch", 7 | "build": "vite build", 8 | "serve": "vite preview" 9 | }, 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@types/chrome": "^0.0.178", 13 | "@types/node": "^17.0.22", 14 | "autoprefixer": "^10.4.4", 15 | "postcss": "^8.4.12", 16 | "postcss-nested": "^5.0.6", 17 | "postcss-preset-env": "^7.4.3", 18 | "vite": "^2.8.6", 19 | "vite-plugin-solid": "^2.2.6", 20 | "vite-plugin-windicss": "^1.8.3" 21 | }, 22 | "dependencies": { 23 | "@minht11/solid-virtual-container": "^0.2.1", 24 | "@solid-primitives/resize-observer": "^1.0.5", 25 | "solid-app-router": "^0.3.1", 26 | "solid-js": "^1.3.13", 27 | "solid-windowed": "^0.10.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/ui/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@minht11/solid-virtual-container': ^0.2.1 5 | '@solid-primitives/resize-observer': ^1.0.5 6 | '@types/chrome': ^0.0.178 7 | '@types/node': ^17.0.22 8 | autoprefixer: ^10.4.4 9 | postcss: ^8.4.12 10 | postcss-nested: ^5.0.6 11 | postcss-preset-env: ^7.4.3 12 | solid-app-router: ^0.3.1 13 | solid-js: ^1.3.13 14 | solid-windowed: ^0.10.0 15 | vite: ^2.8.6 16 | vite-plugin-solid: ^2.2.6 17 | vite-plugin-windicss: ^1.8.3 18 | 19 | dependencies: 20 | '@minht11/solid-virtual-container': 0.2.1_solid-js@1.3.13 21 | '@solid-primitives/resize-observer': 1.0.5_solid-js@1.3.13 22 | solid-app-router: 0.3.1_solid-js@1.3.13 23 | solid-js: 1.3.13 24 | solid-windowed: 0.10.0 25 | 26 | devDependencies: 27 | '@types/chrome': 0.0.178 28 | '@types/node': 17.0.22 29 | autoprefixer: 10.4.4_postcss@8.4.12 30 | postcss: 8.4.12 31 | postcss-nested: 5.0.6_postcss@8.4.12 32 | postcss-preset-env: 7.4.3_postcss@8.4.12 33 | vite: 2.8.6 34 | vite-plugin-solid: 2.2.6 35 | vite-plugin-windicss: 1.8.3_vite@2.8.6 36 | 37 | packages: 38 | 39 | /@ampproject/remapping/2.1.2: 40 | resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} 41 | engines: {node: '>=6.0.0'} 42 | dependencies: 43 | '@jridgewell/trace-mapping': 0.3.4 44 | dev: true 45 | 46 | /@antfu/utils/0.5.0: 47 | resolution: {integrity: sha512-MrAQ/MrPSxbh1bBrmwJjORfJymw4IqSHFBXqvxaga3ZdDM+/zokYF8DjyJpSjY2QmpmgQrajDUBJOWrYeARfzA==} 48 | dev: true 49 | 50 | /@babel/code-frame/7.16.7: 51 | resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} 52 | engines: {node: '>=6.9.0'} 53 | dependencies: 54 | '@babel/highlight': 7.16.10 55 | dev: true 56 | 57 | /@babel/compat-data/7.17.7: 58 | resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} 59 | engines: {node: '>=6.9.0'} 60 | dev: true 61 | 62 | /@babel/core/7.17.8: 63 | resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} 64 | engines: {node: '>=6.9.0'} 65 | dependencies: 66 | '@ampproject/remapping': 2.1.2 67 | '@babel/code-frame': 7.16.7 68 | '@babel/generator': 7.17.7 69 | '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.8 70 | '@babel/helper-module-transforms': 7.17.7 71 | '@babel/helpers': 7.17.8 72 | '@babel/parser': 7.17.8 73 | '@babel/template': 7.16.7 74 | '@babel/traverse': 7.17.3 75 | '@babel/types': 7.17.0 76 | convert-source-map: 1.8.0 77 | debug: 4.3.4 78 | gensync: 1.0.0-beta.2 79 | json5: 2.2.1 80 | semver: 6.3.0 81 | transitivePeerDependencies: 82 | - supports-color 83 | dev: true 84 | 85 | /@babel/generator/7.17.7: 86 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 87 | engines: {node: '>=6.9.0'} 88 | dependencies: 89 | '@babel/types': 7.17.0 90 | jsesc: 2.5.2 91 | source-map: 0.5.7 92 | dev: true 93 | 94 | /@babel/helper-annotate-as-pure/7.16.7: 95 | resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} 96 | engines: {node: '>=6.9.0'} 97 | dependencies: 98 | '@babel/types': 7.17.0 99 | dev: true 100 | 101 | /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: 102 | resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} 103 | engines: {node: '>=6.9.0'} 104 | peerDependencies: 105 | '@babel/core': ^7.0.0 106 | dependencies: 107 | '@babel/compat-data': 7.17.7 108 | '@babel/core': 7.17.8 109 | '@babel/helper-validator-option': 7.16.7 110 | browserslist: 4.20.2 111 | semver: 6.3.0 112 | dev: true 113 | 114 | /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: 115 | resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} 116 | engines: {node: '>=6.9.0'} 117 | peerDependencies: 118 | '@babel/core': ^7.0.0 119 | dependencies: 120 | '@babel/core': 7.17.8 121 | '@babel/helper-annotate-as-pure': 7.16.7 122 | '@babel/helper-environment-visitor': 7.16.7 123 | '@babel/helper-function-name': 7.16.7 124 | '@babel/helper-member-expression-to-functions': 7.17.7 125 | '@babel/helper-optimise-call-expression': 7.16.7 126 | '@babel/helper-replace-supers': 7.16.7 127 | '@babel/helper-split-export-declaration': 7.16.7 128 | transitivePeerDependencies: 129 | - supports-color 130 | dev: true 131 | 132 | /@babel/helper-environment-visitor/7.16.7: 133 | resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} 134 | engines: {node: '>=6.9.0'} 135 | dependencies: 136 | '@babel/types': 7.17.0 137 | dev: true 138 | 139 | /@babel/helper-function-name/7.16.7: 140 | resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} 141 | engines: {node: '>=6.9.0'} 142 | dependencies: 143 | '@babel/helper-get-function-arity': 7.16.7 144 | '@babel/template': 7.16.7 145 | '@babel/types': 7.17.0 146 | dev: true 147 | 148 | /@babel/helper-get-function-arity/7.16.7: 149 | resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} 150 | engines: {node: '>=6.9.0'} 151 | dependencies: 152 | '@babel/types': 7.17.0 153 | dev: true 154 | 155 | /@babel/helper-hoist-variables/7.16.7: 156 | resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} 157 | engines: {node: '>=6.9.0'} 158 | dependencies: 159 | '@babel/types': 7.17.0 160 | dev: true 161 | 162 | /@babel/helper-member-expression-to-functions/7.17.7: 163 | resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} 164 | engines: {node: '>=6.9.0'} 165 | dependencies: 166 | '@babel/types': 7.17.0 167 | dev: true 168 | 169 | /@babel/helper-module-imports/7.16.0: 170 | resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} 171 | engines: {node: '>=6.9.0'} 172 | dependencies: 173 | '@babel/types': 7.17.0 174 | dev: true 175 | 176 | /@babel/helper-module-imports/7.16.7: 177 | resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} 178 | engines: {node: '>=6.9.0'} 179 | dependencies: 180 | '@babel/types': 7.17.0 181 | dev: true 182 | 183 | /@babel/helper-module-transforms/7.17.7: 184 | resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} 185 | engines: {node: '>=6.9.0'} 186 | dependencies: 187 | '@babel/helper-environment-visitor': 7.16.7 188 | '@babel/helper-module-imports': 7.16.7 189 | '@babel/helper-simple-access': 7.17.7 190 | '@babel/helper-split-export-declaration': 7.16.7 191 | '@babel/helper-validator-identifier': 7.16.7 192 | '@babel/template': 7.16.7 193 | '@babel/traverse': 7.17.3 194 | '@babel/types': 7.17.0 195 | transitivePeerDependencies: 196 | - supports-color 197 | dev: true 198 | 199 | /@babel/helper-optimise-call-expression/7.16.7: 200 | resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} 201 | engines: {node: '>=6.9.0'} 202 | dependencies: 203 | '@babel/types': 7.17.0 204 | dev: true 205 | 206 | /@babel/helper-plugin-utils/7.16.7: 207 | resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} 208 | engines: {node: '>=6.9.0'} 209 | dev: true 210 | 211 | /@babel/helper-replace-supers/7.16.7: 212 | resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} 213 | engines: {node: '>=6.9.0'} 214 | dependencies: 215 | '@babel/helper-environment-visitor': 7.16.7 216 | '@babel/helper-member-expression-to-functions': 7.17.7 217 | '@babel/helper-optimise-call-expression': 7.16.7 218 | '@babel/traverse': 7.17.3 219 | '@babel/types': 7.17.0 220 | transitivePeerDependencies: 221 | - supports-color 222 | dev: true 223 | 224 | /@babel/helper-simple-access/7.17.7: 225 | resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} 226 | engines: {node: '>=6.9.0'} 227 | dependencies: 228 | '@babel/types': 7.17.0 229 | dev: true 230 | 231 | /@babel/helper-split-export-declaration/7.16.7: 232 | resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} 233 | engines: {node: '>=6.9.0'} 234 | dependencies: 235 | '@babel/types': 7.17.0 236 | dev: true 237 | 238 | /@babel/helper-validator-identifier/7.16.7: 239 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 240 | engines: {node: '>=6.9.0'} 241 | dev: true 242 | 243 | /@babel/helper-validator-option/7.16.7: 244 | resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} 245 | engines: {node: '>=6.9.0'} 246 | dev: true 247 | 248 | /@babel/helpers/7.17.8: 249 | resolution: {integrity: sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==} 250 | engines: {node: '>=6.9.0'} 251 | dependencies: 252 | '@babel/template': 7.16.7 253 | '@babel/traverse': 7.17.3 254 | '@babel/types': 7.17.0 255 | transitivePeerDependencies: 256 | - supports-color 257 | dev: true 258 | 259 | /@babel/highlight/7.16.10: 260 | resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} 261 | engines: {node: '>=6.9.0'} 262 | dependencies: 263 | '@babel/helper-validator-identifier': 7.16.7 264 | chalk: 2.4.2 265 | js-tokens: 4.0.0 266 | dev: true 267 | 268 | /@babel/parser/7.17.8: 269 | resolution: {integrity: sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==} 270 | engines: {node: '>=6.0.0'} 271 | hasBin: true 272 | dev: true 273 | 274 | /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.17.8: 275 | resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} 276 | engines: {node: '>=6.9.0'} 277 | peerDependencies: 278 | '@babel/core': ^7.0.0-0 279 | dependencies: 280 | '@babel/core': 7.17.8 281 | '@babel/helper-plugin-utils': 7.16.7 282 | dev: true 283 | 284 | /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.8: 285 | resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} 286 | engines: {node: '>=6.9.0'} 287 | peerDependencies: 288 | '@babel/core': ^7.0.0-0 289 | dependencies: 290 | '@babel/core': 7.17.8 291 | '@babel/helper-plugin-utils': 7.16.7 292 | dev: true 293 | 294 | /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.17.8: 295 | resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} 296 | engines: {node: '>=6.9.0'} 297 | peerDependencies: 298 | '@babel/core': ^7.0.0-0 299 | dependencies: 300 | '@babel/core': 7.17.8 301 | '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.17.8 302 | '@babel/helper-plugin-utils': 7.16.7 303 | '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.8 304 | transitivePeerDependencies: 305 | - supports-color 306 | dev: true 307 | 308 | /@babel/preset-typescript/7.16.7_@babel+core@7.17.8: 309 | resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} 310 | engines: {node: '>=6.9.0'} 311 | peerDependencies: 312 | '@babel/core': ^7.0.0-0 313 | dependencies: 314 | '@babel/core': 7.17.8 315 | '@babel/helper-plugin-utils': 7.16.7 316 | '@babel/helper-validator-option': 7.16.7 317 | '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.17.8 318 | transitivePeerDependencies: 319 | - supports-color 320 | dev: true 321 | 322 | /@babel/template/7.16.7: 323 | resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} 324 | engines: {node: '>=6.9.0'} 325 | dependencies: 326 | '@babel/code-frame': 7.16.7 327 | '@babel/parser': 7.17.8 328 | '@babel/types': 7.17.0 329 | dev: true 330 | 331 | /@babel/traverse/7.17.3: 332 | resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} 333 | engines: {node: '>=6.9.0'} 334 | dependencies: 335 | '@babel/code-frame': 7.16.7 336 | '@babel/generator': 7.17.7 337 | '@babel/helper-environment-visitor': 7.16.7 338 | '@babel/helper-function-name': 7.16.7 339 | '@babel/helper-hoist-variables': 7.16.7 340 | '@babel/helper-split-export-declaration': 7.16.7 341 | '@babel/parser': 7.17.8 342 | '@babel/types': 7.17.0 343 | debug: 4.3.4 344 | globals: 11.12.0 345 | transitivePeerDependencies: 346 | - supports-color 347 | dev: true 348 | 349 | /@babel/types/7.17.0: 350 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 351 | engines: {node: '>=6.9.0'} 352 | dependencies: 353 | '@babel/helper-validator-identifier': 7.16.7 354 | to-fast-properties: 2.0.0 355 | dev: true 356 | 357 | /@csstools/postcss-color-function/1.0.3_postcss@8.4.12: 358 | resolution: {integrity: sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==} 359 | engines: {node: ^12 || ^14 || >=16} 360 | peerDependencies: 361 | postcss: ^8.4 362 | dependencies: 363 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 364 | postcss: 8.4.12 365 | postcss-value-parser: 4.2.0 366 | dev: true 367 | 368 | /@csstools/postcss-font-format-keywords/1.0.0_postcss@8.4.12: 369 | resolution: {integrity: sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==} 370 | engines: {node: ^12 || ^14 || >=16} 371 | peerDependencies: 372 | postcss: ^8.3 373 | dependencies: 374 | postcss: 8.4.12 375 | postcss-value-parser: 4.2.0 376 | dev: true 377 | 378 | /@csstools/postcss-hwb-function/1.0.0_postcss@8.4.12: 379 | resolution: {integrity: sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==} 380 | engines: {node: ^12 || ^14 || >=16} 381 | peerDependencies: 382 | postcss: ^8.3 383 | dependencies: 384 | postcss: 8.4.12 385 | postcss-value-parser: 4.2.0 386 | dev: true 387 | 388 | /@csstools/postcss-ic-unit/1.0.0_postcss@8.4.12: 389 | resolution: {integrity: sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==} 390 | engines: {node: ^12 || ^14 || >=16} 391 | peerDependencies: 392 | postcss: ^8.3 393 | dependencies: 394 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 395 | postcss: 8.4.12 396 | postcss-value-parser: 4.2.0 397 | dev: true 398 | 399 | /@csstools/postcss-is-pseudo-class/2.0.1_postcss@8.4.12: 400 | resolution: {integrity: sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==} 401 | engines: {node: ^12 || ^14 || >=16} 402 | peerDependencies: 403 | postcss: ^8.4 404 | dependencies: 405 | postcss: 8.4.12 406 | postcss-selector-parser: 6.0.9 407 | dev: true 408 | 409 | /@csstools/postcss-normalize-display-values/1.0.0_postcss@8.4.12: 410 | resolution: {integrity: sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==} 411 | engines: {node: ^12 || ^14 || >=16} 412 | peerDependencies: 413 | postcss: ^8.3 414 | dependencies: 415 | postcss: 8.4.12 416 | postcss-value-parser: 4.2.0 417 | dev: true 418 | 419 | /@csstools/postcss-oklab-function/1.0.2_postcss@8.4.12: 420 | resolution: {integrity: sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==} 421 | engines: {node: ^12 || ^14 || >=16} 422 | peerDependencies: 423 | postcss: ^8.4 424 | dependencies: 425 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 426 | postcss: 8.4.12 427 | postcss-value-parser: 4.2.0 428 | dev: true 429 | 430 | /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.12: 431 | resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} 432 | engines: {node: ^12 || ^14 || >=16} 433 | peerDependencies: 434 | postcss: ^8.3 435 | dependencies: 436 | postcss: 8.4.12 437 | postcss-value-parser: 4.2.0 438 | dev: true 439 | 440 | /@jridgewell/resolve-uri/3.0.5: 441 | resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} 442 | engines: {node: '>=6.0.0'} 443 | dev: true 444 | 445 | /@jridgewell/sourcemap-codec/1.4.11: 446 | resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} 447 | dev: true 448 | 449 | /@jridgewell/trace-mapping/0.3.4: 450 | resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} 451 | dependencies: 452 | '@jridgewell/resolve-uri': 3.0.5 453 | '@jridgewell/sourcemap-codec': 1.4.11 454 | dev: true 455 | 456 | /@minht11/solid-virtual-container/0.2.1_solid-js@1.3.13: 457 | resolution: {integrity: sha512-HvQWx1uE5NWwx9WsN4waFtmyOjhZKMA/3vBf+j3zGsRfi556LCUk4oOmqZcOvIB5nEpHezvuZ8oUlwxigdO3Xg==} 458 | peerDependencies: 459 | solid-js: '>= 1.0.0' 460 | dependencies: 461 | solid-js: 1.3.13 462 | dev: false 463 | 464 | /@nodelib/fs.scandir/2.1.5: 465 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 466 | engines: {node: '>= 8'} 467 | dependencies: 468 | '@nodelib/fs.stat': 2.0.5 469 | run-parallel: 1.2.0 470 | dev: true 471 | 472 | /@nodelib/fs.stat/2.0.5: 473 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 474 | engines: {node: '>= 8'} 475 | dev: true 476 | 477 | /@nodelib/fs.walk/1.2.8: 478 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 479 | engines: {node: '>= 8'} 480 | dependencies: 481 | '@nodelib/fs.scandir': 2.1.5 482 | fastq: 1.13.0 483 | dev: true 484 | 485 | /@solid-primitives/resize-observer/1.0.5_solid-js@1.3.13: 486 | resolution: {integrity: sha512-/SwRnu7C2TuesBYFtoIgjt1N9zHbRodv2ybbrQzffRqQkzIiawBp5RH/3GDG2/HAMkpXqJEiqiafjKMtu0gL9Q==} 487 | peerDependencies: 488 | solid-js: ^1.3.0 489 | dependencies: 490 | solid-js: 1.3.13 491 | dev: false 492 | 493 | /@types/chrome/0.0.178: 494 | resolution: {integrity: sha512-U+G5YG2pH0qvLrYVJ9aT5VbPXYR3fAFyCuRBRAA14Pv7GrkFzDJuXPspgdeLYaKzGEp4rymUkuqUOuFz18LI1g==} 495 | dependencies: 496 | '@types/filesystem': 0.0.32 497 | '@types/har-format': 1.2.8 498 | dev: true 499 | 500 | /@types/filesystem/0.0.32: 501 | resolution: {integrity: sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==} 502 | dependencies: 503 | '@types/filewriter': 0.0.29 504 | dev: true 505 | 506 | /@types/filewriter/0.0.29: 507 | resolution: {integrity: sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==} 508 | dev: true 509 | 510 | /@types/har-format/1.2.8: 511 | resolution: {integrity: sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==} 512 | dev: true 513 | 514 | /@types/node/17.0.22: 515 | resolution: {integrity: sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==} 516 | dev: true 517 | 518 | /@windicss/config/1.8.3: 519 | resolution: {integrity: sha512-1fvfZhRD7WfV/Xh6uIAYKIdbQWrwEgSdkFlHiLPzMDS44KjwNZILDzLAz9Y2W5H2K4MLGgGMnzGS89ECyjc0Ww==} 520 | dependencies: 521 | debug: 4.3.4 522 | jiti: 1.13.0 523 | windicss: 3.5.1 524 | transitivePeerDependencies: 525 | - supports-color 526 | dev: true 527 | 528 | /@windicss/plugin-utils/1.8.3: 529 | resolution: {integrity: sha512-emlMeDt73uNV1ZofLTDogcxqL9aZ5uIRYkjeHlrWiaDozFbX6Jc+a6eRo9Ieaar3JUryl6AnecTPHAiFDl4IXg==} 530 | dependencies: 531 | '@antfu/utils': 0.5.0 532 | '@windicss/config': 1.8.3 533 | debug: 4.3.4 534 | fast-glob: 3.2.11 535 | magic-string: 0.25.9 536 | micromatch: 4.0.4 537 | windicss: 3.5.1 538 | transitivePeerDependencies: 539 | - supports-color 540 | dev: true 541 | 542 | /ansi-styles/3.2.1: 543 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 544 | engines: {node: '>=4'} 545 | dependencies: 546 | color-convert: 1.9.3 547 | dev: true 548 | 549 | /autoprefixer/10.4.4_postcss@8.4.12: 550 | resolution: {integrity: sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==} 551 | engines: {node: ^10 || ^12 || >=14} 552 | hasBin: true 553 | peerDependencies: 554 | postcss: ^8.1.0 555 | dependencies: 556 | browserslist: 4.20.2 557 | caniuse-lite: 1.0.30001319 558 | fraction.js: 4.2.0 559 | normalize-range: 0.1.2 560 | picocolors: 1.0.0 561 | postcss: 8.4.12 562 | postcss-value-parser: 4.2.0 563 | dev: true 564 | 565 | /babel-plugin-jsx-dom-expressions/0.32.11_@babel+core@7.17.8: 566 | resolution: {integrity: sha512-hytqY33SGW6B3obSLt8K5X510UwtNkTktCCWgwba+QOOV0CowDFiqeL+0ru895FLacFaYANHFTu1y76dg3GVtw==} 567 | dependencies: 568 | '@babel/helper-module-imports': 7.16.0 569 | '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.17.8 570 | '@babel/types': 7.17.0 571 | html-entities: 2.3.2 572 | transitivePeerDependencies: 573 | - '@babel/core' 574 | dev: true 575 | 576 | /babel-preset-solid/1.3.13_@babel+core@7.17.8: 577 | resolution: {integrity: sha512-MZnmsceI9yiHlwwFCSALTJhadk2eea/+2UP4ec4jkPZFR+XRKTLoIwRkrBh7uLtvHF+3lHGyUaXtZukOmmUwhA==} 578 | dependencies: 579 | babel-plugin-jsx-dom-expressions: 0.32.11_@babel+core@7.17.8 580 | transitivePeerDependencies: 581 | - '@babel/core' 582 | dev: true 583 | 584 | /balanced-match/1.0.2: 585 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 586 | dev: true 587 | 588 | /braces/3.0.2: 589 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 590 | engines: {node: '>=8'} 591 | dependencies: 592 | fill-range: 7.0.1 593 | dev: true 594 | 595 | /browserslist/4.20.2: 596 | resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} 597 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 598 | hasBin: true 599 | dependencies: 600 | caniuse-lite: 1.0.30001319 601 | electron-to-chromium: 1.4.88 602 | escalade: 3.1.1 603 | node-releases: 2.0.2 604 | picocolors: 1.0.0 605 | dev: true 606 | 607 | /caniuse-lite/1.0.30001319: 608 | resolution: {integrity: sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==} 609 | dev: true 610 | 611 | /chalk/2.4.2: 612 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 613 | engines: {node: '>=4'} 614 | dependencies: 615 | ansi-styles: 3.2.1 616 | escape-string-regexp: 1.0.5 617 | supports-color: 5.5.0 618 | dev: true 619 | 620 | /color-convert/1.9.3: 621 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 622 | dependencies: 623 | color-name: 1.1.3 624 | dev: true 625 | 626 | /color-name/1.1.3: 627 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 628 | dev: true 629 | 630 | /convert-source-map/1.8.0: 631 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 632 | dependencies: 633 | safe-buffer: 5.1.2 634 | dev: true 635 | 636 | /css-blank-pseudo/3.0.3_postcss@8.4.12: 637 | resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} 638 | engines: {node: ^12 || ^14 || >=16} 639 | hasBin: true 640 | peerDependencies: 641 | postcss: ^8.4 642 | dependencies: 643 | postcss: 8.4.12 644 | postcss-selector-parser: 6.0.9 645 | dev: true 646 | 647 | /css-has-pseudo/3.0.4_postcss@8.4.12: 648 | resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} 649 | engines: {node: ^12 || ^14 || >=16} 650 | hasBin: true 651 | peerDependencies: 652 | postcss: ^8.4 653 | dependencies: 654 | postcss: 8.4.12 655 | postcss-selector-parser: 6.0.9 656 | dev: true 657 | 658 | /css-prefers-color-scheme/6.0.3_postcss@8.4.12: 659 | resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} 660 | engines: {node: ^12 || ^14 || >=16} 661 | hasBin: true 662 | peerDependencies: 663 | postcss: ^8.4 664 | dependencies: 665 | postcss: 8.4.12 666 | dev: true 667 | 668 | /cssdb/6.5.0: 669 | resolution: {integrity: sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==} 670 | dev: true 671 | 672 | /cssesc/3.0.0: 673 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 674 | engines: {node: '>=4'} 675 | hasBin: true 676 | dev: true 677 | 678 | /debug/4.3.4: 679 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 680 | engines: {node: '>=6.0'} 681 | peerDependencies: 682 | supports-color: '*' 683 | peerDependenciesMeta: 684 | supports-color: 685 | optional: true 686 | dependencies: 687 | ms: 2.1.2 688 | dev: true 689 | 690 | /electron-to-chromium/1.4.88: 691 | resolution: {integrity: sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==} 692 | dev: true 693 | 694 | /esbuild-android-64/0.14.27: 695 | resolution: {integrity: sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ==} 696 | engines: {node: '>=12'} 697 | cpu: [x64] 698 | os: [android] 699 | requiresBuild: true 700 | dev: true 701 | optional: true 702 | 703 | /esbuild-android-arm64/0.14.27: 704 | resolution: {integrity: sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ==} 705 | engines: {node: '>=12'} 706 | cpu: [arm64] 707 | os: [android] 708 | requiresBuild: true 709 | dev: true 710 | optional: true 711 | 712 | /esbuild-darwin-64/0.14.27: 713 | resolution: {integrity: sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g==} 714 | engines: {node: '>=12'} 715 | cpu: [x64] 716 | os: [darwin] 717 | requiresBuild: true 718 | dev: true 719 | optional: true 720 | 721 | /esbuild-darwin-arm64/0.14.27: 722 | resolution: {integrity: sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ==} 723 | engines: {node: '>=12'} 724 | cpu: [arm64] 725 | os: [darwin] 726 | requiresBuild: true 727 | dev: true 728 | optional: true 729 | 730 | /esbuild-freebsd-64/0.14.27: 731 | resolution: {integrity: sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA==} 732 | engines: {node: '>=12'} 733 | cpu: [x64] 734 | os: [freebsd] 735 | requiresBuild: true 736 | dev: true 737 | optional: true 738 | 739 | /esbuild-freebsd-arm64/0.14.27: 740 | resolution: {integrity: sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA==} 741 | engines: {node: '>=12'} 742 | cpu: [arm64] 743 | os: [freebsd] 744 | requiresBuild: true 745 | dev: true 746 | optional: true 747 | 748 | /esbuild-linux-32/0.14.27: 749 | resolution: {integrity: sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw==} 750 | engines: {node: '>=12'} 751 | cpu: [ia32] 752 | os: [linux] 753 | requiresBuild: true 754 | dev: true 755 | optional: true 756 | 757 | /esbuild-linux-64/0.14.27: 758 | resolution: {integrity: sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg==} 759 | engines: {node: '>=12'} 760 | cpu: [x64] 761 | os: [linux] 762 | requiresBuild: true 763 | dev: true 764 | optional: true 765 | 766 | /esbuild-linux-arm/0.14.27: 767 | resolution: {integrity: sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw==} 768 | engines: {node: '>=12'} 769 | cpu: [arm] 770 | os: [linux] 771 | requiresBuild: true 772 | dev: true 773 | optional: true 774 | 775 | /esbuild-linux-arm64/0.14.27: 776 | resolution: {integrity: sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ==} 777 | engines: {node: '>=12'} 778 | cpu: [arm64] 779 | os: [linux] 780 | requiresBuild: true 781 | dev: true 782 | optional: true 783 | 784 | /esbuild-linux-mips64le/0.14.27: 785 | resolution: {integrity: sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A==} 786 | engines: {node: '>=12'} 787 | cpu: [mips64el] 788 | os: [linux] 789 | requiresBuild: true 790 | dev: true 791 | optional: true 792 | 793 | /esbuild-linux-ppc64le/0.14.27: 794 | resolution: {integrity: sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA==} 795 | engines: {node: '>=12'} 796 | cpu: [ppc64] 797 | os: [linux] 798 | requiresBuild: true 799 | dev: true 800 | optional: true 801 | 802 | /esbuild-linux-riscv64/0.14.27: 803 | resolution: {integrity: sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg==} 804 | engines: {node: '>=12'} 805 | cpu: [riscv64] 806 | os: [linux] 807 | requiresBuild: true 808 | dev: true 809 | optional: true 810 | 811 | /esbuild-linux-s390x/0.14.27: 812 | resolution: {integrity: sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg==} 813 | engines: {node: '>=12'} 814 | cpu: [s390x] 815 | os: [linux] 816 | requiresBuild: true 817 | dev: true 818 | optional: true 819 | 820 | /esbuild-netbsd-64/0.14.27: 821 | resolution: {integrity: sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q==} 822 | engines: {node: '>=12'} 823 | cpu: [x64] 824 | os: [netbsd] 825 | requiresBuild: true 826 | dev: true 827 | optional: true 828 | 829 | /esbuild-openbsd-64/0.14.27: 830 | resolution: {integrity: sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw==} 831 | engines: {node: '>=12'} 832 | cpu: [x64] 833 | os: [openbsd] 834 | requiresBuild: true 835 | dev: true 836 | optional: true 837 | 838 | /esbuild-sunos-64/0.14.27: 839 | resolution: {integrity: sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg==} 840 | engines: {node: '>=12'} 841 | cpu: [x64] 842 | os: [sunos] 843 | requiresBuild: true 844 | dev: true 845 | optional: true 846 | 847 | /esbuild-windows-32/0.14.27: 848 | resolution: {integrity: sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw==} 849 | engines: {node: '>=12'} 850 | cpu: [ia32] 851 | os: [win32] 852 | requiresBuild: true 853 | dev: true 854 | optional: true 855 | 856 | /esbuild-windows-64/0.14.27: 857 | resolution: {integrity: sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg==} 858 | engines: {node: '>=12'} 859 | cpu: [x64] 860 | os: [win32] 861 | requiresBuild: true 862 | dev: true 863 | optional: true 864 | 865 | /esbuild-windows-arm64/0.14.27: 866 | resolution: {integrity: sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg==} 867 | engines: {node: '>=12'} 868 | cpu: [arm64] 869 | os: [win32] 870 | requiresBuild: true 871 | dev: true 872 | optional: true 873 | 874 | /esbuild/0.14.27: 875 | resolution: {integrity: sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q==} 876 | engines: {node: '>=12'} 877 | hasBin: true 878 | requiresBuild: true 879 | optionalDependencies: 880 | esbuild-android-64: 0.14.27 881 | esbuild-android-arm64: 0.14.27 882 | esbuild-darwin-64: 0.14.27 883 | esbuild-darwin-arm64: 0.14.27 884 | esbuild-freebsd-64: 0.14.27 885 | esbuild-freebsd-arm64: 0.14.27 886 | esbuild-linux-32: 0.14.27 887 | esbuild-linux-64: 0.14.27 888 | esbuild-linux-arm: 0.14.27 889 | esbuild-linux-arm64: 0.14.27 890 | esbuild-linux-mips64le: 0.14.27 891 | esbuild-linux-ppc64le: 0.14.27 892 | esbuild-linux-riscv64: 0.14.27 893 | esbuild-linux-s390x: 0.14.27 894 | esbuild-netbsd-64: 0.14.27 895 | esbuild-openbsd-64: 0.14.27 896 | esbuild-sunos-64: 0.14.27 897 | esbuild-windows-32: 0.14.27 898 | esbuild-windows-64: 0.14.27 899 | esbuild-windows-arm64: 0.14.27 900 | dev: true 901 | 902 | /escalade/3.1.1: 903 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 904 | engines: {node: '>=6'} 905 | dev: true 906 | 907 | /escape-string-regexp/1.0.5: 908 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 909 | engines: {node: '>=0.8.0'} 910 | dev: true 911 | 912 | /fast-glob/3.2.11: 913 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 914 | engines: {node: '>=8.6.0'} 915 | dependencies: 916 | '@nodelib/fs.stat': 2.0.5 917 | '@nodelib/fs.walk': 1.2.8 918 | glob-parent: 5.1.2 919 | merge2: 1.4.1 920 | micromatch: 4.0.4 921 | dev: true 922 | 923 | /fastq/1.13.0: 924 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 925 | dependencies: 926 | reusify: 1.0.4 927 | dev: true 928 | 929 | /fill-range/7.0.1: 930 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 931 | engines: {node: '>=8'} 932 | dependencies: 933 | to-regex-range: 5.0.1 934 | dev: true 935 | 936 | /fraction.js/4.2.0: 937 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 938 | dev: true 939 | 940 | /fsevents/2.3.2: 941 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 942 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 943 | os: [darwin] 944 | requiresBuild: true 945 | dev: true 946 | optional: true 947 | 948 | /function-bind/1.1.1: 949 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 950 | dev: true 951 | 952 | /gensync/1.0.0-beta.2: 953 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 954 | engines: {node: '>=6.9.0'} 955 | dev: true 956 | 957 | /glob-parent/5.1.2: 958 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 959 | engines: {node: '>= 6'} 960 | dependencies: 961 | is-glob: 4.0.3 962 | dev: true 963 | 964 | /globals/11.12.0: 965 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 966 | engines: {node: '>=4'} 967 | dev: true 968 | 969 | /has-flag/3.0.0: 970 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 971 | engines: {node: '>=4'} 972 | dev: true 973 | 974 | /has/1.0.3: 975 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 976 | engines: {node: '>= 0.4.0'} 977 | dependencies: 978 | function-bind: 1.1.1 979 | dev: true 980 | 981 | /html-entities/2.3.2: 982 | resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==} 983 | dev: true 984 | 985 | /is-core-module/2.8.1: 986 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 987 | dependencies: 988 | has: 1.0.3 989 | dev: true 990 | 991 | /is-extglob/2.1.1: 992 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 993 | engines: {node: '>=0.10.0'} 994 | dev: true 995 | 996 | /is-glob/4.0.3: 997 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 998 | engines: {node: '>=0.10.0'} 999 | dependencies: 1000 | is-extglob: 2.1.1 1001 | dev: true 1002 | 1003 | /is-number/7.0.0: 1004 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1005 | engines: {node: '>=0.12.0'} 1006 | dev: true 1007 | 1008 | /is-what/4.1.7: 1009 | resolution: {integrity: sha512-DBVOQNiPKnGMxRMLIYSwERAS5MVY1B7xYiGnpgctsOFvVDz9f9PFXXxMcTOHuoqYp4NK9qFYQaIC1NRRxLMpBQ==} 1010 | engines: {node: '>=12.13'} 1011 | dev: true 1012 | 1013 | /jiti/1.13.0: 1014 | resolution: {integrity: sha512-/n9mNxZj/HDSrincJ6RP+L+yXbpnB8FybySBa+IjIaoH9FIxBbrbRT5XUbe8R7zuVM2AQqNMNDDqz0bzx3znOQ==} 1015 | hasBin: true 1016 | dev: true 1017 | 1018 | /js-tokens/4.0.0: 1019 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1020 | dev: true 1021 | 1022 | /jsesc/2.5.2: 1023 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1024 | engines: {node: '>=4'} 1025 | hasBin: true 1026 | dev: true 1027 | 1028 | /json5/2.2.1: 1029 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} 1030 | engines: {node: '>=6'} 1031 | hasBin: true 1032 | dev: true 1033 | 1034 | /kolorist/1.5.1: 1035 | resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} 1036 | dev: true 1037 | 1038 | /magic-string/0.25.9: 1039 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1040 | dependencies: 1041 | sourcemap-codec: 1.4.8 1042 | dev: true 1043 | 1044 | /merge-anything/5.0.2: 1045 | resolution: {integrity: sha512-POPQBWkBC0vxdgzRJ2Mkj4+2NTKbvkHo93ih+jGDhNMLzIw+rYKjO7949hOQM2X7DxMHH1uoUkwWFLIzImw7gA==} 1046 | engines: {node: '>=12.13'} 1047 | dependencies: 1048 | is-what: 4.1.7 1049 | ts-toolbelt: 9.6.0 1050 | dev: true 1051 | 1052 | /merge2/1.4.1: 1053 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1054 | engines: {node: '>= 8'} 1055 | dev: true 1056 | 1057 | /micromatch/4.0.4: 1058 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 1059 | engines: {node: '>=8.6'} 1060 | dependencies: 1061 | braces: 3.0.2 1062 | picomatch: 2.3.1 1063 | dev: true 1064 | 1065 | /ms/2.1.2: 1066 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1067 | dev: true 1068 | 1069 | /nanoid/3.3.1: 1070 | resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} 1071 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1072 | hasBin: true 1073 | dev: true 1074 | 1075 | /node-releases/2.0.2: 1076 | resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} 1077 | dev: true 1078 | 1079 | /normalize-range/0.1.2: 1080 | resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} 1081 | engines: {node: '>=0.10.0'} 1082 | dev: true 1083 | 1084 | /path-parse/1.0.7: 1085 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1086 | dev: true 1087 | 1088 | /picocolors/1.0.0: 1089 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1090 | dev: true 1091 | 1092 | /picomatch/2.3.1: 1093 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1094 | engines: {node: '>=8.6'} 1095 | dev: true 1096 | 1097 | /postcss-attribute-case-insensitive/5.0.0_postcss@8.4.12: 1098 | resolution: {integrity: sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==} 1099 | peerDependencies: 1100 | postcss: ^8.0.2 1101 | dependencies: 1102 | postcss: 8.4.12 1103 | postcss-selector-parser: 6.0.9 1104 | dev: true 1105 | 1106 | /postcss-clamp/4.1.0_postcss@8.4.12: 1107 | resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} 1108 | engines: {node: '>=7.6.0'} 1109 | peerDependencies: 1110 | postcss: ^8.4.6 1111 | dependencies: 1112 | postcss: 8.4.12 1113 | postcss-value-parser: 4.2.0 1114 | dev: true 1115 | 1116 | /postcss-color-functional-notation/4.2.2_postcss@8.4.12: 1117 | resolution: {integrity: sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==} 1118 | engines: {node: ^12 || ^14 || >=16} 1119 | peerDependencies: 1120 | postcss: ^8.4 1121 | dependencies: 1122 | postcss: 8.4.12 1123 | postcss-value-parser: 4.2.0 1124 | dev: true 1125 | 1126 | /postcss-color-hex-alpha/8.0.3_postcss@8.4.12: 1127 | resolution: {integrity: sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==} 1128 | engines: {node: ^12 || ^14 || >=16} 1129 | peerDependencies: 1130 | postcss: ^8.4 1131 | dependencies: 1132 | postcss: 8.4.12 1133 | postcss-value-parser: 4.2.0 1134 | dev: true 1135 | 1136 | /postcss-color-rebeccapurple/7.0.2_postcss@8.4.12: 1137 | resolution: {integrity: sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==} 1138 | engines: {node: ^12 || ^14 || >=16} 1139 | peerDependencies: 1140 | postcss: ^8.3 1141 | dependencies: 1142 | postcss: 8.4.12 1143 | postcss-value-parser: 4.2.0 1144 | dev: true 1145 | 1146 | /postcss-custom-media/8.0.0_postcss@8.4.12: 1147 | resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} 1148 | engines: {node: '>=10.0.0'} 1149 | peerDependencies: 1150 | postcss: ^8.1.0 1151 | dependencies: 1152 | postcss: 8.4.12 1153 | dev: true 1154 | 1155 | /postcss-custom-properties/12.1.5_postcss@8.4.12: 1156 | resolution: {integrity: sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==} 1157 | engines: {node: ^12 || ^14 || >=16} 1158 | peerDependencies: 1159 | postcss: ^8.4 1160 | dependencies: 1161 | postcss: 8.4.12 1162 | postcss-value-parser: 4.2.0 1163 | dev: true 1164 | 1165 | /postcss-custom-selectors/6.0.0_postcss@8.4.12: 1166 | resolution: {integrity: sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==} 1167 | engines: {node: '>=10.0.0'} 1168 | peerDependencies: 1169 | postcss: ^8.1.2 1170 | dependencies: 1171 | postcss: 8.4.12 1172 | postcss-selector-parser: 6.0.9 1173 | dev: true 1174 | 1175 | /postcss-dir-pseudo-class/6.0.4_postcss@8.4.12: 1176 | resolution: {integrity: sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==} 1177 | engines: {node: ^12 || ^14 || >=16} 1178 | peerDependencies: 1179 | postcss: ^8.4 1180 | dependencies: 1181 | postcss: 8.4.12 1182 | postcss-selector-parser: 6.0.9 1183 | dev: true 1184 | 1185 | /postcss-double-position-gradients/3.1.1_postcss@8.4.12: 1186 | resolution: {integrity: sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==} 1187 | engines: {node: ^12 || ^14 || >=16} 1188 | peerDependencies: 1189 | postcss: ^8.4 1190 | dependencies: 1191 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 1192 | postcss: 8.4.12 1193 | postcss-value-parser: 4.2.0 1194 | dev: true 1195 | 1196 | /postcss-env-function/4.0.6_postcss@8.4.12: 1197 | resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} 1198 | engines: {node: ^12 || ^14 || >=16} 1199 | peerDependencies: 1200 | postcss: ^8.4 1201 | dependencies: 1202 | postcss: 8.4.12 1203 | postcss-value-parser: 4.2.0 1204 | dev: true 1205 | 1206 | /postcss-focus-visible/6.0.4_postcss@8.4.12: 1207 | resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} 1208 | engines: {node: ^12 || ^14 || >=16} 1209 | peerDependencies: 1210 | postcss: ^8.4 1211 | dependencies: 1212 | postcss: 8.4.12 1213 | postcss-selector-parser: 6.0.9 1214 | dev: true 1215 | 1216 | /postcss-focus-within/5.0.4_postcss@8.4.12: 1217 | resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} 1218 | engines: {node: ^12 || ^14 || >=16} 1219 | peerDependencies: 1220 | postcss: ^8.4 1221 | dependencies: 1222 | postcss: 8.4.12 1223 | postcss-selector-parser: 6.0.9 1224 | dev: true 1225 | 1226 | /postcss-font-variant/5.0.0_postcss@8.4.12: 1227 | resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} 1228 | peerDependencies: 1229 | postcss: ^8.1.0 1230 | dependencies: 1231 | postcss: 8.4.12 1232 | dev: true 1233 | 1234 | /postcss-gap-properties/3.0.3_postcss@8.4.12: 1235 | resolution: {integrity: sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==} 1236 | engines: {node: ^12 || ^14 || >=16} 1237 | peerDependencies: 1238 | postcss: ^8.4 1239 | dependencies: 1240 | postcss: 8.4.12 1241 | dev: true 1242 | 1243 | /postcss-image-set-function/4.0.6_postcss@8.4.12: 1244 | resolution: {integrity: sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==} 1245 | engines: {node: ^12 || ^14 || >=16} 1246 | peerDependencies: 1247 | postcss: ^8.4 1248 | dependencies: 1249 | postcss: 8.4.12 1250 | postcss-value-parser: 4.2.0 1251 | dev: true 1252 | 1253 | /postcss-initial/4.0.1_postcss@8.4.12: 1254 | resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} 1255 | peerDependencies: 1256 | postcss: ^8.0.0 1257 | dependencies: 1258 | postcss: 8.4.12 1259 | dev: true 1260 | 1261 | /postcss-lab-function/4.1.2_postcss@8.4.12: 1262 | resolution: {integrity: sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==} 1263 | engines: {node: ^12 || ^14 || >=16} 1264 | peerDependencies: 1265 | postcss: ^8.4 1266 | dependencies: 1267 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 1268 | postcss: 8.4.12 1269 | postcss-value-parser: 4.2.0 1270 | dev: true 1271 | 1272 | /postcss-logical/5.0.4_postcss@8.4.12: 1273 | resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} 1274 | engines: {node: ^12 || ^14 || >=16} 1275 | peerDependencies: 1276 | postcss: ^8.4 1277 | dependencies: 1278 | postcss: 8.4.12 1279 | dev: true 1280 | 1281 | /postcss-media-minmax/5.0.0_postcss@8.4.12: 1282 | resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} 1283 | engines: {node: '>=10.0.0'} 1284 | peerDependencies: 1285 | postcss: ^8.1.0 1286 | dependencies: 1287 | postcss: 8.4.12 1288 | dev: true 1289 | 1290 | /postcss-nested/5.0.6_postcss@8.4.12: 1291 | resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} 1292 | engines: {node: '>=12.0'} 1293 | peerDependencies: 1294 | postcss: ^8.2.14 1295 | dependencies: 1296 | postcss: 8.4.12 1297 | postcss-selector-parser: 6.0.9 1298 | dev: true 1299 | 1300 | /postcss-nesting/10.1.3_postcss@8.4.12: 1301 | resolution: {integrity: sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==} 1302 | engines: {node: ^12 || ^14 || >=16} 1303 | peerDependencies: 1304 | postcss: ^8.4 1305 | dependencies: 1306 | postcss: 8.4.12 1307 | postcss-selector-parser: 6.0.9 1308 | dev: true 1309 | 1310 | /postcss-opacity-percentage/1.1.2: 1311 | resolution: {integrity: sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==} 1312 | engines: {node: ^12 || ^14 || >=16} 1313 | dev: true 1314 | 1315 | /postcss-overflow-shorthand/3.0.3_postcss@8.4.12: 1316 | resolution: {integrity: sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==} 1317 | engines: {node: ^12 || ^14 || >=16} 1318 | peerDependencies: 1319 | postcss: ^8.4 1320 | dependencies: 1321 | postcss: 8.4.12 1322 | dev: true 1323 | 1324 | /postcss-page-break/3.0.4_postcss@8.4.12: 1325 | resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} 1326 | peerDependencies: 1327 | postcss: ^8 1328 | dependencies: 1329 | postcss: 8.4.12 1330 | dev: true 1331 | 1332 | /postcss-place/7.0.4_postcss@8.4.12: 1333 | resolution: {integrity: sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==} 1334 | engines: {node: ^12 || ^14 || >=16} 1335 | peerDependencies: 1336 | postcss: ^8.4 1337 | dependencies: 1338 | postcss: 8.4.12 1339 | postcss-value-parser: 4.2.0 1340 | dev: true 1341 | 1342 | /postcss-preset-env/7.4.3_postcss@8.4.12: 1343 | resolution: {integrity: sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==} 1344 | engines: {node: ^12 || ^14 || >=16} 1345 | peerDependencies: 1346 | postcss: ^8.4 1347 | dependencies: 1348 | '@csstools/postcss-color-function': 1.0.3_postcss@8.4.12 1349 | '@csstools/postcss-font-format-keywords': 1.0.0_postcss@8.4.12 1350 | '@csstools/postcss-hwb-function': 1.0.0_postcss@8.4.12 1351 | '@csstools/postcss-ic-unit': 1.0.0_postcss@8.4.12 1352 | '@csstools/postcss-is-pseudo-class': 2.0.1_postcss@8.4.12 1353 | '@csstools/postcss-normalize-display-values': 1.0.0_postcss@8.4.12 1354 | '@csstools/postcss-oklab-function': 1.0.2_postcss@8.4.12 1355 | '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 1356 | autoprefixer: 10.4.4_postcss@8.4.12 1357 | browserslist: 4.20.2 1358 | css-blank-pseudo: 3.0.3_postcss@8.4.12 1359 | css-has-pseudo: 3.0.4_postcss@8.4.12 1360 | css-prefers-color-scheme: 6.0.3_postcss@8.4.12 1361 | cssdb: 6.5.0 1362 | postcss: 8.4.12 1363 | postcss-attribute-case-insensitive: 5.0.0_postcss@8.4.12 1364 | postcss-clamp: 4.1.0_postcss@8.4.12 1365 | postcss-color-functional-notation: 4.2.2_postcss@8.4.12 1366 | postcss-color-hex-alpha: 8.0.3_postcss@8.4.12 1367 | postcss-color-rebeccapurple: 7.0.2_postcss@8.4.12 1368 | postcss-custom-media: 8.0.0_postcss@8.4.12 1369 | postcss-custom-properties: 12.1.5_postcss@8.4.12 1370 | postcss-custom-selectors: 6.0.0_postcss@8.4.12 1371 | postcss-dir-pseudo-class: 6.0.4_postcss@8.4.12 1372 | postcss-double-position-gradients: 3.1.1_postcss@8.4.12 1373 | postcss-env-function: 4.0.6_postcss@8.4.12 1374 | postcss-focus-visible: 6.0.4_postcss@8.4.12 1375 | postcss-focus-within: 5.0.4_postcss@8.4.12 1376 | postcss-font-variant: 5.0.0_postcss@8.4.12 1377 | postcss-gap-properties: 3.0.3_postcss@8.4.12 1378 | postcss-image-set-function: 4.0.6_postcss@8.4.12 1379 | postcss-initial: 4.0.1_postcss@8.4.12 1380 | postcss-lab-function: 4.1.2_postcss@8.4.12 1381 | postcss-logical: 5.0.4_postcss@8.4.12 1382 | postcss-media-minmax: 5.0.0_postcss@8.4.12 1383 | postcss-nesting: 10.1.3_postcss@8.4.12 1384 | postcss-opacity-percentage: 1.1.2 1385 | postcss-overflow-shorthand: 3.0.3_postcss@8.4.12 1386 | postcss-page-break: 3.0.4_postcss@8.4.12 1387 | postcss-place: 7.0.4_postcss@8.4.12 1388 | postcss-pseudo-class-any-link: 7.1.1_postcss@8.4.12 1389 | postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.12 1390 | postcss-selector-not: 5.0.0_postcss@8.4.12 1391 | postcss-value-parser: 4.2.0 1392 | dev: true 1393 | 1394 | /postcss-pseudo-class-any-link/7.1.1_postcss@8.4.12: 1395 | resolution: {integrity: sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==} 1396 | engines: {node: ^12 || ^14 || >=16} 1397 | peerDependencies: 1398 | postcss: ^8.4 1399 | dependencies: 1400 | postcss: 8.4.12 1401 | postcss-selector-parser: 6.0.9 1402 | dev: true 1403 | 1404 | /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.12: 1405 | resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} 1406 | peerDependencies: 1407 | postcss: ^8.0.3 1408 | dependencies: 1409 | postcss: 8.4.12 1410 | dev: true 1411 | 1412 | /postcss-selector-not/5.0.0_postcss@8.4.12: 1413 | resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} 1414 | peerDependencies: 1415 | postcss: ^8.1.0 1416 | dependencies: 1417 | balanced-match: 1.0.2 1418 | postcss: 8.4.12 1419 | dev: true 1420 | 1421 | /postcss-selector-parser/6.0.9: 1422 | resolution: {integrity: sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==} 1423 | engines: {node: '>=4'} 1424 | dependencies: 1425 | cssesc: 3.0.0 1426 | util-deprecate: 1.0.2 1427 | dev: true 1428 | 1429 | /postcss-value-parser/4.2.0: 1430 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1431 | dev: true 1432 | 1433 | /postcss/8.4.12: 1434 | resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} 1435 | engines: {node: ^10 || ^12 || >=14} 1436 | dependencies: 1437 | nanoid: 3.3.1 1438 | picocolors: 1.0.0 1439 | source-map-js: 1.0.2 1440 | dev: true 1441 | 1442 | /queue-microtask/1.2.3: 1443 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1444 | dev: true 1445 | 1446 | /resolve/1.22.0: 1447 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 1448 | hasBin: true 1449 | dependencies: 1450 | is-core-module: 2.8.1 1451 | path-parse: 1.0.7 1452 | supports-preserve-symlinks-flag: 1.0.0 1453 | dev: true 1454 | 1455 | /reusify/1.0.4: 1456 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1457 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1458 | dev: true 1459 | 1460 | /rollup/2.70.1: 1461 | resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} 1462 | engines: {node: '>=10.0.0'} 1463 | hasBin: true 1464 | optionalDependencies: 1465 | fsevents: 2.3.2 1466 | dev: true 1467 | 1468 | /run-parallel/1.2.0: 1469 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1470 | dependencies: 1471 | queue-microtask: 1.2.3 1472 | dev: true 1473 | 1474 | /safe-buffer/5.1.2: 1475 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1476 | dev: true 1477 | 1478 | /semver/6.3.0: 1479 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1480 | hasBin: true 1481 | dev: true 1482 | 1483 | /solid-app-router/0.3.1_solid-js@1.3.13: 1484 | resolution: {integrity: sha512-GpDu8tpEWG8azP02PEJ0tUb3g0euWJ9rJoHNUs8qMf3/jW4P3zVBF+E5vOFRcGNkqXiSLvniawCwV5V344fHtQ==} 1485 | peerDependencies: 1486 | solid-js: ^1.3.5 1487 | dependencies: 1488 | solid-js: 1.3.13 1489 | dev: false 1490 | 1491 | /solid-js/1.3.13: 1492 | resolution: {integrity: sha512-1EBEIW9u2yqT5QNjFdvz/tMAoKsDdaRA2Jbgykd2Dt13Ia0D4mV+BFvPkOaseSyu7DsMKS23+ZZofV8BVKmpuQ==} 1493 | 1494 | /solid-refresh/0.4.0_solid-js@1.3.13: 1495 | resolution: {integrity: sha512-5XCUz845n/sHPzKK2i2G2EeV61tAmzv6SqzqhXcPaYhrgzVy7nKTQaBpKK8InKrriq9Z2JFF/mguIU00t/73xw==} 1496 | peerDependencies: 1497 | solid-js: ^1.3.0 1498 | dependencies: 1499 | '@babel/generator': 7.17.7 1500 | '@babel/helper-module-imports': 7.16.7 1501 | '@babel/types': 7.17.0 1502 | solid-js: 1.3.13 1503 | dev: true 1504 | 1505 | /solid-windowed/0.10.0: 1506 | resolution: {integrity: sha512-7apXCMcZFcjz3Pc/qrZ2tGr9okKhK3qLp1qHq9N2goW6VrnUWOgioXBo77s45r9yRbXVv3W+Glw9I+BHPFg2Ww==} 1507 | dev: false 1508 | 1509 | /source-map-js/1.0.2: 1510 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1511 | engines: {node: '>=0.10.0'} 1512 | dev: true 1513 | 1514 | /source-map/0.5.7: 1515 | resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} 1516 | engines: {node: '>=0.10.0'} 1517 | dev: true 1518 | 1519 | /sourcemap-codec/1.4.8: 1520 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1521 | dev: true 1522 | 1523 | /supports-color/5.5.0: 1524 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1525 | engines: {node: '>=4'} 1526 | dependencies: 1527 | has-flag: 3.0.0 1528 | dev: true 1529 | 1530 | /supports-preserve-symlinks-flag/1.0.0: 1531 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1532 | engines: {node: '>= 0.4'} 1533 | dev: true 1534 | 1535 | /to-fast-properties/2.0.0: 1536 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1537 | engines: {node: '>=4'} 1538 | dev: true 1539 | 1540 | /to-regex-range/5.0.1: 1541 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1542 | engines: {node: '>=8.0'} 1543 | dependencies: 1544 | is-number: 7.0.0 1545 | dev: true 1546 | 1547 | /ts-toolbelt/9.6.0: 1548 | resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} 1549 | dev: true 1550 | 1551 | /util-deprecate/1.0.2: 1552 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1553 | dev: true 1554 | 1555 | /vite-plugin-solid/2.2.6: 1556 | resolution: {integrity: sha512-J1RnmqkZZJSNYDW7vZj0giKKHLWGr9tS/gxR70WDSTYfhyXrgukbZdIfSEFbtrsg8ZiQ2t2zXcvkWoeefenqKw==} 1557 | dependencies: 1558 | '@babel/core': 7.17.8 1559 | '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 1560 | babel-preset-solid: 1.3.13_@babel+core@7.17.8 1561 | merge-anything: 5.0.2 1562 | solid-js: 1.3.13 1563 | solid-refresh: 0.4.0_solid-js@1.3.13 1564 | vite: 2.8.6 1565 | transitivePeerDependencies: 1566 | - less 1567 | - sass 1568 | - stylus 1569 | - supports-color 1570 | dev: true 1571 | 1572 | /vite-plugin-windicss/1.8.3_vite@2.8.6: 1573 | resolution: {integrity: sha512-RIw2GD6H6cKNE8wZXVOBs4L1uTicVS0FaAkeqXvy1oyuXLC4SXmvnzEuoK0+qFuWJjW0ECNwE8eU+ZZhzNQKUg==} 1574 | peerDependencies: 1575 | vite: ^2.0.1 1576 | dependencies: 1577 | '@windicss/plugin-utils': 1.8.3 1578 | debug: 4.3.4 1579 | kolorist: 1.5.1 1580 | vite: 2.8.6 1581 | windicss: 3.5.1 1582 | transitivePeerDependencies: 1583 | - supports-color 1584 | dev: true 1585 | 1586 | /vite/2.8.6: 1587 | resolution: {integrity: sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==} 1588 | engines: {node: '>=12.2.0'} 1589 | hasBin: true 1590 | peerDependencies: 1591 | less: '*' 1592 | sass: '*' 1593 | stylus: '*' 1594 | peerDependenciesMeta: 1595 | less: 1596 | optional: true 1597 | sass: 1598 | optional: true 1599 | stylus: 1600 | optional: true 1601 | dependencies: 1602 | esbuild: 0.14.27 1603 | postcss: 8.4.12 1604 | resolve: 1.22.0 1605 | rollup: 2.70.1 1606 | optionalDependencies: 1607 | fsevents: 2.3.2 1608 | dev: true 1609 | 1610 | /windicss/3.5.1: 1611 | resolution: {integrity: sha512-E1hYZATcZFci/XhGS0sJAMRxULjnK+glNukE78Ku7xeb3jxgMY55fFOdIrav+GjQCsgR+IZxPq9/DwmO6eyc4Q==} 1612 | engines: {node: '>= 12'} 1613 | hasBin: true 1614 | dev: true 1615 | -------------------------------------------------------------------------------- /src/ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require("autoprefixer"), 4 | require("postcss-nested"), 5 | require("postcss-preset-env"), 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /src/ui/src/app.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | flex: 1 1 auto; 3 | overflow: auto; 4 | } 5 | -------------------------------------------------------------------------------- /src/ui/src/app.tsx: -------------------------------------------------------------------------------- 1 | import type { Component } from "solid-js"; 2 | import { Link, useRoutes, useLocation } from "solid-app-router"; 3 | 4 | import { routes } from "./routes"; 5 | 6 | import styles from "./app.module.css"; 7 | import NavBar, { NavBarLink } from "./components/NavBar"; 8 | 9 | const App: Component = () => { 10 | const location = useLocation(); 11 | const Route = useRoutes(routes); 12 | 13 | return ( 14 | <> 15 | 16 | 17 | Select 18 | 19 | Inspect 20 | About 21 | 22 | 23 |
24 | 25 |
26 | 27 | ); 28 | }; 29 | 30 | export default App; 31 | -------------------------------------------------------------------------------- /src/ui/src/components/NavBar.module.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | background-color: var(--background-color-light); 4 | border-bottom: 1px solid var(--accent-color); 5 | padding: 0.6em; 6 | padding-top: 0.3em; 7 | padding-bottom: 0.3em; 8 | gap: 0.6em; 9 | 10 | .link { 11 | display: grid; 12 | align-items: center; 13 | text-decoration: none; 14 | 15 | &.selected { 16 | text-decoration: underline; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/ui/src/components/NavBar.tsx: -------------------------------------------------------------------------------- 1 | import { Link, useLocation } from "solid-app-router"; 2 | import { Component, For, JSX, JSXElement } from "solid-js"; 3 | 4 | import styles from "./NavBar.module.css"; 5 | 6 | type ManualHeading = { 7 | onClick: ( 8 | event: MouseEvent & { 9 | currentTarget: HTMLAnchorElement; 10 | target: Element; 11 | } 12 | ) => void; 13 | selected: boolean; 14 | }; 15 | 16 | type AutomaticHeading = { 17 | path: string; 18 | exact?: boolean; 19 | }; 20 | 21 | function isAutomatic(obj: any): obj is AutomaticHeading { 22 | return obj.path !== undefined; 23 | } 24 | 25 | export const NavBarLink: Component = ( 26 | props 27 | ) => { 28 | const location = useLocation(); 29 | if (isAutomatic(props)) { 30 | return ( 31 | 40 | {props.children} 41 | 42 | ); 43 | } 44 | return ( 45 | (e.preventDefault(), props.onClick(e))} 51 | href="" 52 | > 53 | {props.children} 54 | 55 | ); 56 | }; 57 | 58 | const NavBar: Component = (props) => { 59 | return ; 60 | }; 61 | 62 | export default NavBar; 63 | -------------------------------------------------------------------------------- /src/ui/src/components/NodeTreeView.tsx: -------------------------------------------------------------------------------- 1 | import { Component, For } from "solid-js"; 2 | import ResizeBox from "./ResizeBox"; 3 | import { Node, NodeCollection, NodeID, NodePoint } from "../stores/Nodes"; 4 | 5 | import GlobalHistory from "../stores/GlobalHistory"; 6 | import Nodes from "../stores/Nodes"; 7 | 8 | const NodeTreeView: Component<{ 9 | globalHistoryIndex: number; 10 | }> = (props) => { 11 | if (props.globalHistoryIndex < 0) { 12 | return "Waiting for nodes to be registered..."; 13 | } 14 | 15 | const globalNodePoints = () => { 16 | let availableGlobalNodePoints: { [id: NodeID]: NodePoint } = {}; 17 | for (const [nodeID, nodeIndex] of Object.entries( 18 | GlobalHistory[props.globalHistoryIndex] 19 | )) { 20 | availableGlobalNodePoints[nodeID] = Nodes[nodeID].history[nodeIndex]; 21 | } 22 | return availableGlobalNodePoints; 23 | }; 24 | 25 | const rootNodes: () => NodePoint[] = () => { 26 | const confirmedChildren = new Set(); 27 | const rootNodes = []; 28 | 29 | for (const nodePoint of Object.values(globalNodePoints)) { 30 | for (const childID of nodePoint.children) { 31 | confirmedChildren.add(childID); 32 | } 33 | } 34 | 35 | for (const nodeID of Object.keys(Nodes)) { 36 | if (!confirmedChildren.has(nodeID)) { 37 | rootNodes.push(globalNodePoints()[nodeID]); 38 | } 39 | } 40 | 41 | return rootNodes; 42 | }; 43 | 44 | return ; 45 | }; 46 | 47 | export default NodeTreeView; 48 | 49 | export const NodeTree: Component<{ nodes: NodePoint[] }> = (props) => { 50 | return ( 51 | <> 52 | {(node) => } 53 | 54 | ); 55 | }; 56 | 57 | export const NodeTreeItem: Component<{ node: NodePoint }> = (props) => { 58 | const currentName = () => props.node.name; 59 | return ( 60 | 61 | {typeof currentName() === "string" 62 | ? currentName() 63 | : // @ts-ignore 64 | currentName().open} 65 | 66 | ); 67 | }; 68 | 69 | export const NodeInspector: Component<{ node: NodePoint }> = (props) => { 70 | return
NodeInspector
; 71 | }; 72 | -------------------------------------------------------------------------------- /src/ui/src/components/ObjectTree.module.css: -------------------------------------------------------------------------------- 1 | .treeBase { 2 | font-family: monospace; 3 | } 4 | 5 | .indent { 6 | padding-left: calc(1em - 1px); 7 | margin-left: 1px; 8 | border-left: 1px dashed var(--text-color-dim); 9 | } 10 | 11 | .expandable { 12 | cursor: pointer; 13 | } 14 | 15 | .treeKey { 16 | } 17 | 18 | .key, 19 | .typeName { 20 | color: var(--text-color-dim); 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/src/components/ObjectTree.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Accessor, 3 | Component, 4 | createEffect, 5 | createMemo, 6 | createSignal, 7 | For, 8 | Index, 9 | JSX, 10 | Match, 11 | Switch, 12 | untrack, 13 | } from "solid-js"; 14 | import { createStore } from "solid-js/store"; 15 | import get from "../utils/get"; 16 | import set from "../utils/set"; 17 | import symbolJoin from "../utils/symbolJoin"; 18 | import walkTree from "../utils/walkTree"; 19 | 20 | import styles from "./ObjectTree.module.css"; 21 | 22 | type TreeLevelData = { 23 | [id: string]: { 24 | [key: string]: { 25 | expanded: Accessor; 26 | setExpanded: (expanded: boolean) => void; 27 | }; 28 | }; 29 | }; 30 | 31 | const levelData: TreeLevelData = {}; 32 | 33 | export const TreeIndent: Component<{ 34 | color?: string; 35 | }> = (props) => { 36 | return ( 37 |
38 | {props.children} 39 |
40 | ); 41 | }; 42 | 43 | export const TreeItemKey: Component<{ 44 | root: boolean; 45 | key: string; 46 | onMouseDown?: JSX.DOMAttributes["onMouseDown"]; 47 | }> = (props) => { 48 | return ( 49 | <> 50 | {!props.root ? ( 51 | <> 52 | 53 | {props.key} 54 | {": "} 55 | 56 | 57 | ) : null} 58 | 59 | ); 60 | }; 61 | 62 | export const TreeItemPrimitive: Component<{ 63 | root: boolean; 64 | key: string; 65 | value: any; 66 | }> = (props) => { 67 | return ( 68 | <> 69 | 70 | 73 | 74 | {props.value.toString()} 75 | 76 | 77 | } 78 | > 79 | {/* STRING */} 80 | 81 | {`"${props.value}"`} 84 | 85 | 86 | {/* DATE */} 87 | 88 | 89 | {props.value.toISOString()} 90 | 91 | 92 | 93 | 94 | ); 95 | }; 96 | 97 | export const TreeItemObject: Component<{ 98 | id: string; 99 | path: string[]; 100 | value: any; 101 | root: boolean; 102 | }> = (props) => { 103 | const key = () => props.path[props.path.length - 1]; 104 | const stringPath = () => props.path.join("."); 105 | 106 | // Get or create the level data for this item's path. 107 | let expanded, setExpanded; 108 | if (Array.isArray(props.value) || typeof props.value === "object") { 109 | levelData[props.id] ??= {}; 110 | if (levelData[props.id][stringPath()] == null) { 111 | const [e, sE] = createSignal(props.root); 112 | levelData[props.id][stringPath()] = { 113 | expanded: e, 114 | setExpanded: sE, 115 | }; 116 | expanded = e; 117 | setExpanded = sE; 118 | } else { 119 | expanded = levelData[props.id][stringPath()].expanded; 120 | setExpanded = levelData[props.id][stringPath()].setExpanded; 121 | } 122 | } 123 | 124 | const serializedData = () => props.value?.$$SERIALIZED_TYPE$$; 125 | 126 | const toggleExpanded = (e) => { 127 | if (e.button === 0) { 128 | setExpanded(!expanded()); 129 | } 130 | }; 131 | 132 | return ( 133 | <> 134 | 135 | {/* SERIALIZED PRIMITIVE */} 136 | 139 | 140 | 141 | {serializedData().value} 142 | 143 | 144 | 145 | {/* SERIALIZED ARRAY-LIKE */} 146 | 147 | 148 | 149 | 150 | {`${serializedData().type} `}{" "} 151 | 152 | {`[${!expanded() ? "...]" : ""}`} 153 | 154 | {expanded() ? ( 155 | <> 156 | 157 | 163 | 164 | 165 | {"]"} 166 | 167 | 168 | ) : null} 169 | 170 | 171 | {/* SERIALIZED OBJECT-LIKE */} 172 | 175 | 176 | 177 | 178 | {`${serializedData().type} `}{" "} 179 | 180 | {`{${!expanded() ? "...}" : ""}`} 181 | 182 | {expanded() ? ( 183 | <> 184 | 185 | 191 | 192 | 193 | {"}"} 194 | 195 | 196 | ) : null} 197 | 198 | 199 | {/* ARRAY */} 200 | 201 | 202 | 203 | 204 | {`(${props.value.length.toLocaleString()}) `} 205 | 206 | {`[${!expanded() ? "...]" : ""}`} 207 | 208 | {expanded() ? ( 209 | <> 210 | 211 | 217 | 218 | 219 | {"]"} 220 | 221 | 222 | ) : null} 223 | 224 | 225 | {/* THIS SHOULD BE LAST */} 226 | {/* OBJECT */} 227 | 228 | 229 | 230 | 231 | {`(${Object.keys(props.value).length.toLocaleString()}) `} 232 | 233 | {`{${!expanded() ? "...}" : ""}`} 234 | 235 | {expanded() ? ( 236 | <> 237 | 238 | 244 | 245 | 246 | {"}"} 247 | 248 | 249 | ) : null} 250 | 251 | 252 | 253 | ); 254 | }; 255 | 256 | export const TreeItem: Component<{ 257 | id: string; 258 | path: string[]; 259 | value: any; 260 | root: boolean; 261 | }> = (props) => { 262 | const key = () => props.path[props.path.length - 1]; 263 | 264 | return ( 265 | <> 266 | {typeof props.value !== "object" ? ( 267 | 268 | ) : ( 269 | 275 | )} 276 | 277 | ); 278 | }; 279 | 280 | // const TreeBase: Component = (props) => {}; 281 | // export default TreeBase; 282 | 283 | const TreeLevel: Component<{ 284 | id: string; 285 | object: object | any[]; 286 | path?: string[]; 287 | root?: boolean; 288 | }> = (props) => { 289 | const path = createMemo(() => 290 | props.root ? ["this", ...(props.path ?? [])] : props.path 291 | ); 292 | const isArray = () => Array.isArray(props.object); 293 | const nodes = createMemo(() => 294 | Array.isArray(props.object) ? props.object : Object.entries(props.object) 295 | ); 296 | 297 | return ( 298 |
299 | {props.root ? ( 300 | 306 | ) : ( 307 | Were you expecting something? 311 | } 312 | > 313 | {(item, i) => { 314 | return ( 315 |
316 | 322 |
323 | ); 324 | }} 325 |
326 | )} 327 |
328 | ); 329 | }; 330 | export default TreeLevel; 331 | -------------------------------------------------------------------------------- /src/ui/src/components/ResizeBox.module.css: -------------------------------------------------------------------------------- 1 | .resizeBox { 2 | display: grid; 3 | } 4 | 5 | .resizeBoxChild { 6 | width: 100%; 7 | height: 100%; 8 | display: grid; 9 | } 10 | 11 | .resizeBar { 12 | background-color: var(--accent-color); 13 | } 14 | -------------------------------------------------------------------------------- /src/ui/src/components/ResizeBox.tsx: -------------------------------------------------------------------------------- 1 | import createResizeObserver from "@solid-primitives/resize-observer"; 2 | import { createEffect, createMemo, createSignal, For, onCleanup, onMount } from "solid-js"; 3 | 4 | import styles from "./ResizeBox.module.css"; 5 | 6 | export default function ResizeBox(props) { 7 | let resizeBox: HTMLDivElement; 8 | let resizeBar: HTMLDivElement; 9 | 10 | const direction: () => string = () => props.direction; 11 | const vertical = () => direction() === "vertical"; 12 | const [isDragging, setIsDragging] = createSignal(false); 13 | const [boxSize, setBoxSize] = createSignal(0); 14 | 15 | onMount(() => { 16 | setBoxSize((vertical() ? resizeBox.clientHeight : resizeBox.clientWidth) / 2); 17 | createResizeObserver({ 18 | refs: [resizeBox], 19 | onResize: (size) => { 20 | setBoxSize(Math.min(boxSize(), (vertical() ? size.height : size.width) - 8)); 21 | }, 22 | }); 23 | }); 24 | 25 | const stopDragging = () => { 26 | setIsDragging(false); 27 | }; 28 | const drag = (e) => { 29 | if (!isDragging()) return; 30 | 31 | // TODO: Handle 3 or more elements properly. 32 | const offset = vertical() ? resizeBox.offsetTop : resizeBox.offsetLeft; 33 | const newSize = (vertical() ? e.clientY : e.clientX) - offset - (vertical() ? resizeBar.clientHeight : resizeBar.clientWidth); 34 | 35 | setBoxSize(newSize); 36 | }; 37 | 38 | document.body.addEventListener("mouseup", stopDragging); 39 | document.body.addEventListener("mousemove", drag); 40 | onCleanup(() => { 41 | document.body.removeEventListener("mouseup", stopDragging); 42 | document.body.removeEventListener("mousemove", drag); 43 | }); 44 | 45 | return ( 46 |
55 |
{props.children[0]}
56 |
{ 63 | setIsDragging(true); 64 | }} 65 | /> 66 |
{props.children[1]}
67 |
68 | ); 69 | } 70 | -------------------------------------------------------------------------------- /src/ui/src/errors/404.tsx: -------------------------------------------------------------------------------- 1 | export default function NotFound() { 2 | return ( 3 |
4 |

How did you get here?

5 |

You just 404'd DevTools.

6 |
7 | ); 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-color: #202124; 3 | --background-color-light: #292a2d; 4 | --text-color: #cfd0d0; 5 | --text-color-dim: rgb(154, 160, 166); 6 | --accent-color: #494c50; 7 | --accent-color-25: #494c503f; 8 | --accent-color-50: #494c507f; 9 | --accent-color-75: #494c50bf; 10 | } 11 | 12 | a { 13 | color: inherit; 14 | } 15 | * { 16 | position: relative; 17 | user-select: none; 18 | -webkit-user-drag: none; 19 | } 20 | 21 | html, 22 | body, 23 | #root { 24 | height: 100vh; 25 | background-color: var(--background-color); 26 | color: var(--text-color); 27 | font-size: 14px; 28 | overflow: hidden; 29 | margin: 0; 30 | } 31 | 32 | body { 33 | display: grid; 34 | grid-template-rows: auto; 35 | grid-template-columns: auto; 36 | } 37 | 38 | #root { 39 | display: flex; 40 | flex-direction: column; 41 | } 42 | 43 | ::-webkit-scrollbar { 44 | cursor: pointer; 45 | width: 8px; 46 | background-color: var(--background-color); 47 | } 48 | ::-webkit-scrollbar-button { 49 | display: none; 50 | } 51 | ::-webkit-scrollbar-thumb { 52 | border-radius: 3px; 53 | background-color: var(--accent-color-25); 54 | } 55 | ::-webkit-scrollbar-thumb:hover { 56 | background-color: var(--accent-color-50); 57 | } 58 | ::-webkit-scrollbar-thumb:active { 59 | background-color: var(--accent-color-75); 60 | } 61 | -------------------------------------------------------------------------------- /src/ui/src/index.tsx: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { render } from "solid-js/web"; 4 | import { Router } from "solid-app-router"; 5 | import App from "./app"; 6 | 7 | import "./index.css"; 8 | 9 | import Nodes, { NodeID, NodeOptions, NodePoint } from "./stores/Nodes"; 10 | // import deepFreeze from "./utils/"; 11 | import { selectedStore, setSelectedStore } from "./stores/SelectedNode"; 12 | import ResolvedStack from "./utils/ResolvedStack"; 13 | import GlobalHistory from "./stores/GlobalHistory"; 14 | 15 | // Fix wrong starting URL. 16 | window.history.replaceState({}, "", "/"); 17 | 18 | type BaseNodeRequest = { 19 | source: string; 20 | }; 21 | 22 | type RegisterNodeRequest = BaseNodeRequest & { 23 | type: "REGISTER_NODE"; 24 | options: NodeOptions; 25 | point: NodePoint; 26 | }; 27 | 28 | type UpdateNodeRequest = BaseNodeRequest & { 29 | type: "UPDATE_NODE"; 30 | point: NodePoint; 31 | id: NodeID; 32 | }; 33 | 34 | type UnregisterNodeRequest = BaseNodeRequest & { 35 | type: "UNREGISTER_NODE"; 36 | id: NodeID; 37 | }; 38 | 39 | type ResetRequest = BaseNodeRequest & { type: "RESET" }; 40 | 41 | type AnyRequest = 42 | | RegisterNodeRequest 43 | | UpdateNodeRequest 44 | | UnregisterNodeRequest 45 | | ResetRequest; 46 | 47 | // Create the devtools panel. 48 | chrome.devtools.panels.create( 49 | "Compendium", 50 | null, 51 | "/ui/index.html", 52 | function (panel) { 53 | const tabID = chrome.devtools.inspectedWindow.tabId; 54 | 55 | chrome.runtime.onMessage.addListener(function ( 56 | request: AnyRequest, 57 | sender, 58 | sendResponse 59 | ) { 60 | if ( 61 | sender.tab.id === tabID && 62 | request.source === "compendium-devtools-extension" 63 | ) { 64 | switch (request.type) { 65 | case "RESET": 66 | window.location.reload(); 67 | return; 68 | case "REGISTER_NODE": 69 | // This is *really* for resetting stores when they are recreated. 70 | // So... Reset the history. 71 | 72 | console.log("Registering node", request); 73 | 74 | // Set up the node in the Nodes store. 75 | Nodes[request.options.id] = { 76 | ...request.options, 77 | history: [request.point], 78 | }; 79 | 80 | // Get all the nodes that currently exist and add them to the global history. 81 | GlobalHistory.push({ 82 | ...GlobalHistory[GlobalHistory.length - 1], 83 | [request.options.id]: 0, 84 | }); 85 | return; 86 | case "UPDATE_NODE": 87 | console.log("Updating node", request); 88 | Nodes[request.id].history.push(request.point); 89 | 90 | // Add one to the history index in the global history. 91 | const currentHistory = GlobalHistory[GlobalHistory.length - 1]; 92 | GlobalHistory.push({ 93 | ...currentHistory, 94 | [request.id]: currentHistory.id + 1, 95 | }); 96 | 97 | return; 98 | case "UNREGISTER_NODE": 99 | console.log("Unregistering node", request); 100 | // Remove the node from the global history ONLY. 101 | // The node should be kept in the Nodes store because it can be referenced by previous points in the global history. 102 | // TODO: Optimze this, I'm rushing. 103 | GlobalHistory.push( 104 | Object.fromEntries( 105 | Object.entries(GlobalHistory[GlobalHistory.length - 1]).filter( 106 | ([id]) => id !== request.id 107 | ) 108 | ) 109 | ); 110 | 111 | return; 112 | } 113 | } 114 | }); 115 | } 116 | ); 117 | 118 | render( 119 | () => ( 120 | 121 | 122 | 123 | ), 124 | document.getElementById("root") as HTMLElement 125 | ); 126 | -------------------------------------------------------------------------------- /src/ui/src/pages/about.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createEffect, createMemo, For, Index, Suspense } from "solid-js"; 2 | import { Link, useData } from "solid-app-router"; 3 | 4 | import pkg from "../../package.json"; 5 | 6 | const dependencies = () => Object.entries(pkg.dependencies); 7 | 8 | export default function AboutPanel() { 9 | return ( 10 |
11 |

About

12 | 13 |

14 | 15 | Compendium DevTools 16 | {" "} 17 | is an inspector for anything you want to connect. 18 |

19 | 20 |

Dependencies

21 | 22 | 23 | {(dep) => { 24 | const name = createMemo(() => dep[0]); 25 | const version = createMemo(() => dep[1].slice(1)); 26 | return ( 27 |

28 | 29 | {name()} 30 | {" "} 31 | 32 | v{version()} 33 | 34 |

35 | ); 36 | }} 37 |
38 |
39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /src/ui/src/pages/index.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CompendiumDevTools/devtools/f729bc25f6905a5de019bedccd1cc6555504cadb/src/ui/src/pages/index.module.css -------------------------------------------------------------------------------- /src/ui/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { useNavigate } from "solid-app-router"; 2 | import { createEffect, createMemo, For } from "solid-js"; 3 | import NodeTreeView from "../components/NodeTreeView"; 4 | import ResizeBox from "../components/ResizeBox"; 5 | import GlobalHistory from "../stores/GlobalHistory"; 6 | 7 | import stores from "../stores/Nodes"; 8 | import { selectedStore, setSelectedStore } from "../stores/SelectedNode"; 9 | 10 | export default function SelectPanel() { 11 | const navigate = useNavigate(); 12 | 13 | createEffect(() => { 14 | console.log(GlobalHistory.length); 15 | }); 16 | 17 | return ( 18 | <> 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/ui/src/pages/inspect.module.css: -------------------------------------------------------------------------------- 1 | .inspectPanel { 2 | display: grid; 3 | height: 100%; 4 | } 5 | 6 | .inspectHistory { 7 | overflow-y: auto; 8 | display: flex; 9 | flex-direction: column; 10 | flex-grow: 1; 11 | gap: 6px; 12 | padding: 6px; 13 | } 14 | 15 | .inspectHistoryButton { 16 | cursor: pointer; 17 | background-color: var(--accent-color-25); 18 | 19 | transition-duration: 0.2s; 20 | transition-property: background-color; 21 | 22 | padding: 3px; 23 | border-radius: 6px; 24 | 25 | /* border-bottom: 1px solid var(--accent-color); */ 26 | &:last-of-type { 27 | border-bottom: none; 28 | } 29 | 30 | &:hover { 31 | background-color: var(--accent-color-50); 32 | } 33 | &.selected { 34 | background-color: var(--accent-color-75); 35 | } 36 | } 37 | 38 | .inspectPoint { 39 | display: flex; 40 | flex-direction: column; 41 | overflow-y: hidden; 42 | .inspectPointContent { 43 | padding: 6px; 44 | flex: 1 1 auto; 45 | overflow-y: auto; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/ui/src/pages/inspect.tsx: -------------------------------------------------------------------------------- 1 | import { Link } from "solid-app-router"; 2 | import { 3 | Component, 4 | createMemo, 5 | createSignal, 6 | For, 7 | Match, 8 | Switch, 9 | } from "solid-js"; 10 | 11 | import stores from "../stores/Nodes"; 12 | import { selectedStore } from "../stores/SelectedNode"; 13 | import { 14 | selectedTreeView, 15 | setSelectedTreeView, 16 | } from "../stores/SelectedTreeView"; 17 | 18 | import styles from "./inspect.module.css"; 19 | import ResizeBox from "../components/ResizeBox"; 20 | import Tree from "../components/ObjectTree"; 21 | import NavBar, { NavBarLink } from "../components/NavBar"; 22 | 23 | const InspectPage: Component = () => { 24 | return null; 25 | 26 | /* 27 | const [selectedHistoryPoint, setSelectedHistoryPoint] = createSignal(null); 28 | 29 | const selectedStoreData = () => stores[selectedStore()]; 30 | const selectedStoreHistory = () => selectedStoreData()?.history; 31 | 32 | const selectedHistoryPointData = () => 33 | (selectedStore() != null 34 | ? selectedStoreHistory()[selectedHistoryPoint()] 35 | : selectedStoreHistory()[selectedStoreData().history.length - 1] 36 | )?.data; 37 | 38 | let scroller; 39 | 40 | return ( 41 | <> 42 | {selectedStore() == null ? ( 43 |

44 | Select a store to inspect it. 45 |

46 | ) : ( 47 | 53 |
54 | 55 | {(node, i) => ( 56 | { 63 | if (e.button === 0) { 64 | if (selectedHistoryPoint() === i()) { 65 | setSelectedHistoryPoint(null); 66 | } else { 67 | setSelectedHistoryPoint(i()); 68 | } 69 | } 70 | }} 71 | value={node.name} 72 | /> 73 | )} 74 | 75 |
76 |
77 | 78 | { 80 | setSelectedTreeView("tree"); 81 | }} 82 | selected={selectedTreeView() === "tree"} 83 | > 84 | Tree 85 | 86 | { 88 | setSelectedTreeView("diff"); 89 | }} 90 | selected={selectedTreeView() === "diff"} 91 | > 92 | Diff 93 | 94 | { 96 | setSelectedTreeView("actions"); 97 | }} 98 | selected={selectedTreeView() === "actions"} 99 | > 100 | Actions 101 | 102 | 103 |
104 | 105 | 106 | 111 | 112 | lol 113 | 114 | 115 | 116 | 117 |
118 |
119 |
120 | )} 121 | 122 | ); 123 | */ 124 | }; 125 | 126 | export default InspectPage; 127 | 128 | const Actions: Component = (props) => { 129 | return ""; 130 | }; 131 | -------------------------------------------------------------------------------- /src/ui/src/routes.ts: -------------------------------------------------------------------------------- 1 | import { lazy } from "solid-js"; 2 | import type { RouteDefinition } from "solid-app-router"; 3 | 4 | import SelectPanel from "./pages/index"; 5 | import InspectPage from "./pages/inspect"; 6 | import AboutPanel from "./pages/about"; 7 | import NotFound from "./errors/404"; 8 | 9 | export const routes: RouteDefinition[] = [ 10 | { 11 | path: "/", 12 | component: SelectPanel, 13 | }, 14 | { 15 | path: "/inspect", 16 | component: InspectPage, 17 | }, 18 | { 19 | path: "/about", 20 | component: AboutPanel, 21 | }, 22 | { 23 | path: "**", 24 | component: NotFound, 25 | }, 26 | ]; 27 | -------------------------------------------------------------------------------- /src/ui/src/stores/GlobalHistory.ts: -------------------------------------------------------------------------------- 1 | // Points in time for the Node's data. 2 | 3 | import { createMutable } from "solid-js/store"; 4 | import { NodeID } from "./Nodes"; 5 | 6 | // Each history entry is an ID and the index of the point in history it was at when this entry was created. 7 | export type GlobalHistory = { 8 | [id: NodeID]: number; 9 | }[]; 10 | 11 | export default createMutable([]); 12 | -------------------------------------------------------------------------------- /src/ui/src/stores/Nodes.ts: -------------------------------------------------------------------------------- 1 | import { createSignal } from "solid-js"; 2 | import { createMutable, createStore } from "solid-js/store"; 3 | 4 | export type NodeID = string; 5 | 6 | // Points in time for the Node's data. 7 | // Added to the history on update. 8 | export type NodePoint = { 9 | name: 10 | | string 11 | | { 12 | open: string; 13 | close: string; 14 | }; 15 | display: boolean; 16 | children: NodeID[]; 17 | 18 | time: Date; 19 | callstack: NodeJS.CallSite[]; 20 | 21 | state: any; 22 | }; 23 | 24 | // Settings that never change. 25 | // Added on register. 26 | export type NodeOptions = { 27 | id: NodeID; 28 | serialize: boolean; 29 | trackHistory: boolean; 30 | actions: Function[]; 31 | }; 32 | 33 | export type Node = NodeOptions & { 34 | history: NodePoint[]; 35 | }; 36 | 37 | export type NodeCollection = { 38 | [id: string]: Node; 39 | }; 40 | 41 | export default createMutable({}); 42 | -------------------------------------------------------------------------------- /src/ui/src/stores/SelectedNode.ts: -------------------------------------------------------------------------------- 1 | import { createSignal } from "solid-js"; 2 | 3 | const [selectedStore, setSelectedStore] = createSignal( 4 | null 5 | ); 6 | 7 | export { selectedStore, setSelectedStore }; 8 | -------------------------------------------------------------------------------- /src/ui/src/stores/SelectedTreeView.ts: -------------------------------------------------------------------------------- 1 | import { createSignal } from "solid-js"; 2 | 3 | const [selectedTreeView, setSelectedTreeView] = createSignal("tree"); 4 | 5 | export { selectedTreeView, setSelectedTreeView }; 6 | -------------------------------------------------------------------------------- /src/ui/src/stores/TabID.ts: -------------------------------------------------------------------------------- 1 | import { createSignal } from "solid-js"; 2 | 3 | export default createSignal(null); 4 | -------------------------------------------------------------------------------- /src/ui/src/utils/ResolvedStack.ts: -------------------------------------------------------------------------------- 1 | type ResolvedStack = { 2 | columnNumber: NodeJS.CallSite["getColumnNumber"]; 3 | fileName: NodeJS.CallSite["getFileName"]; 4 | functionName: NodeJS.CallSite["getFunctionName"]; 5 | lineNumber: NodeJS.CallSite["getLineNumber"]; 6 | }; 7 | 8 | export default ResolvedStack; 9 | -------------------------------------------------------------------------------- /src/ui/src/utils/deepFreeze.ts: -------------------------------------------------------------------------------- 1 | export default function deepFreeze(object: Type): Type { 2 | const keys = Object.keys(object); 3 | for (let i = 0; i < keys.length; i++) { 4 | let value = object[keys[i]]; 5 | if (value !== null && typeof value === "object") { 6 | deepFreeze(value); 7 | } 8 | } 9 | return Object.freeze(object); 10 | } 11 | -------------------------------------------------------------------------------- /src/ui/src/utils/get.ts: -------------------------------------------------------------------------------- 1 | export default function get(obj: Type, path: PropertyKey[]): Type { 2 | let current = obj; 3 | for (let i = 0; i < path.length; i++) { 4 | if (current[path[i]] == null) return undefined; 5 | current = current[path[i]]; 6 | } 7 | return current; 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/src/utils/set.ts: -------------------------------------------------------------------------------- 1 | export default function set( 2 | obj: Type, 3 | path: PropertyKey[], 4 | value: any 5 | ): Type { 6 | let current = obj; 7 | for (let i = 0; i < path.length - 1; i++) { 8 | if (current[path[i]] == null) current[path[i]] = {}; 9 | current = current[path[i]]; 10 | } 11 | // Reflect.set(current as any, path[path.length - 1], value, receiver); 12 | current[path[path.length - 1]] = value; 13 | return obj; 14 | } 15 | -------------------------------------------------------------------------------- /src/ui/src/utils/symbolJoin.ts: -------------------------------------------------------------------------------- 1 | export default function symbolJoin( 2 | array: PropertyKey[], 3 | joiner: PropertyKey 4 | ): string { 5 | if (array.length === 1) return array[0].toString(); 6 | let result = ""; 7 | for (let i = 0; i < array.length; i++) { 8 | result += `${i === 0 ? "" : joiner.toString()}${array[i].toString()}`; 9 | } 10 | return result; 11 | } 12 | -------------------------------------------------------------------------------- /src/ui/src/utils/walkTree.ts: -------------------------------------------------------------------------------- 1 | export default function walkTree( 2 | obj: object, 3 | callback: (node: any, path: PropertyKey[]) => boolean | void 4 | ) { 5 | const walk = (value: any, path: PropertyKey[]) => { 6 | const result = callback(value, [...path]); 7 | // Require explicit false return to stop walking. 8 | if (result === false) return; 9 | if (Array.isArray(value)) { 10 | for (let i = 0; i < value.length; i++) { 11 | walk(value[i], [...path, i]); 12 | } 13 | } else if (typeof value === "object" && value !== null) { 14 | for (const key of Reflect.ownKeys(value)) { 15 | walk(value[key], [...path, key]); 16 | } 17 | } 18 | }; 19 | walk(obj, []); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "allowSyntheticDefaultImports": true, 7 | "esModuleInterop": true, 8 | "jsx": "preserve", 9 | "jsxImportSource": "solid-js", 10 | "types": ["vite/client"], 11 | "resolveJsonModule": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import solidPlugin from "vite-plugin-solid"; 3 | 4 | export default defineConfig({ 5 | plugins: [solidPlugin()], 6 | build: { 7 | outDir: "../../dist/ui", 8 | target: "esnext", 9 | polyfillDynamicImport: false, 10 | }, 11 | base: "./", 12 | }); 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "CommonJS", 5 | "moduleResolution": "Node", 6 | "esModuleInterop": true, 7 | "allowSyntheticDefaultImports": true, 8 | "noUnusedParameters": true, 9 | "noUnusedLocals": true, 10 | "removeComments": true, 11 | "downlevelIteration": true 12 | }, 13 | "include": ["src/content.ts", "src/utils"], 14 | "exclude": ["node_modules", "src/ui", "vite.config.ts"] 15 | } 16 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | export default defineConfig({ 4 | build: { 5 | outDir: "./dist", 6 | target: "ESNext", 7 | polyfillDynamicImport: false, 8 | lib: { 9 | entry: "src/content.ts", 10 | formats: ["cjs"], 11 | fileName: () => "content.js", 12 | }, 13 | }, 14 | base: "./", 15 | }); 16 | --------------------------------------------------------------------------------