├── .changeset ├── README.md └── config.json ├── .eslintignore ├── .eslintrc ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── logo.svg ├── package.json ├── packages ├── core │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── Overlay.vue │ │ ├── compiler │ │ │ ├── index.ts │ │ │ └── template.ts │ │ ├── index.ts │ │ ├── load.js │ │ └── utils │ │ │ └── index.ts │ └── tsup.config.ts ├── playground │ ├── nuxt │ │ ├── .gitignore │ │ ├── .npmrc │ │ ├── App.vue │ │ ├── components │ │ │ └── Hi.vue │ │ ├── nuxt.config.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── vue2 │ │ ├── index.html │ │ ├── package.json │ │ ├── src │ │ │ ├── App.vue │ │ │ ├── Count.vue │ │ │ ├── Hi.vue │ │ │ ├── Welcome.tsx │ │ │ ├── main.ts │ │ │ ├── shim-tsx.d.ts │ │ │ └── shims-vue.d.ts │ │ ├── tsconfig.json │ │ ├── vite.config.ts │ │ └── yarn.lock │ └── vue3 │ │ ├── index.html │ │ ├── package.json │ │ ├── src │ │ ├── App.vue │ │ ├── ExternalComp.vue │ │ ├── Hi.vue │ │ ├── Welcome.tsx │ │ ├── index.css │ │ ├── main.ts │ │ └── shims-vue.d.ts │ │ └── vite.config.ts └── unplugin │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── scripts │ └── postbuild.ts │ ├── src │ ├── index.ts │ ├── nuxt.ts │ ├── types.ts │ └── vite.ts │ └── tsup.config.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── public ├── install-vscode-cli.png └── preview.gif └── tsconfig.json /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [ 11 | "playground-nuxt", 12 | "playground-vue2", 13 | "playground-vue3" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .output 4 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@antfu", 3 | "rules":{ 4 | "no-console":0, 5 | "prefer-const":0, 6 | "no-prototype-builtins":0, 7 | "vue/no-parsing-error": ["error", { 8 | "invalid-first-character-of-tag-name": false 9 | }] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [webfansplz] 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | pnpm-lock.yaml -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 webfansplz 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 | vite-plugin-vue-inspector 4 |

5 | 6 |

7 | NPM Version 8 | NPM Downloads 9 | License 10 |

11 | 12 |

13 | 14 |

15 | 16 | ## 📖 Introduction 17 | 18 | A vite plugin which provides the ability that to jump to the local IDE when you click the element of browser automatically. It supports Vue2 & 3 & SSR. 19 | 20 |

21 | vite-plugin-vue-inspector 22 |

23 | 24 | ## 📦 Installation 25 | 26 | ```bash 27 | 28 | # vite-plugin-vue-inspector 29 | 30 | pnpm install vite-plugin-vue-inspector -D 31 | 32 | # unplugin-vue-inspector 33 | 34 | pnpm install unplugin-vue-inspector -D 35 | 36 | ``` 37 | 38 | ## 🦄 Usage 39 | 40 | ### Configuration Vite 41 | 42 | ```ts 43 | // for Vue2 44 | 45 | import { defineConfig, } from 'vite' 46 | import { createVuePlugin, } from 'vite-plugin-vue2' 47 | 48 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 49 | 50 | export default defineConfig({ 51 | plugins: [ 52 | createVuePlugin(), 53 | Inspector({ 54 | vue: 2 55 | }), 56 | ], 57 | }) 58 | ``` 59 | 60 | ```ts 61 | // for Vue3 62 | 63 | import { defineConfig } from 'vite' 64 | import Vue from '@vitejs/plugin-vue' 65 | 66 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 67 | 68 | export default defineConfig({ 69 | plugins: [Vue(), Inspector()], 70 | }) 71 | ``` 72 | 73 | ```ts 74 | // for Nuxt3 75 | // nuxt.config.ts 76 | import { defineNuxtConfig } from 'nuxt/config' 77 | import Inspector from 'vite-plugin-vue-inspector' 78 | 79 | export default defineNuxtConfig({ 80 | modules: [ 81 | ['unplugin-vue-inspector/nuxt', { 82 | enabled: true, 83 | toggleButtonVisibility: 'always', 84 | }], 85 | ], 86 | }) 87 | ``` 88 | 89 | ### Options 90 | 91 | 92 | ```ts 93 | interface VitePluginInspectorOptions { 94 | /** 95 | * Vue version 96 | * @default 3 97 | */ 98 | vue?: 2 | 3 99 | 100 | /** 101 | * Default enable state 102 | * @default false 103 | */ 104 | enabled?: boolean 105 | 106 | /** 107 | * Define a combo key to toggle inspector 108 | * @default 'control-shift' on windows, 'meta-shift' on other os 109 | * 110 | * any number of modifiers `control` `shift` `alt` `meta` followed by zero or one regular key, separated by - 111 | * examples: control-shift, control-o, control-alt-s meta-x control-meta 112 | * Some keys have native behavior (e.g. alt-s opens history menu on firefox). 113 | * To avoid conflicts or accidentally typing into inputs, modifier only combinations are recommended. 114 | * You can also disable it by setting `false`. 115 | */ 116 | toggleComboKey?: string | false 117 | 118 | /** 119 | * Toggle button visibility 120 | * @default 'active' 121 | */ 122 | toggleButtonVisibility?: 'always' | 'active' | 'never' 123 | 124 | /** 125 | * Toggle button display position 126 | * @default top-right 127 | */ 128 | toggleButtonPos?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' 129 | 130 | /** 131 | * append an import to the module id ending with `appendTo` instead of adding a script into body 132 | * useful for frameworks that do not support transformIndexHtml hook (e.g. Nuxt3) 133 | * 134 | * WARNING: only set this if you know exactly what it does. 135 | */ 136 | appendTo?: string | RegExp 137 | 138 | /** 139 | * Customize openInEditor host (e.g. http://localhost:3000) 140 | * @default false 141 | * @deprecated This option is deprecated and removed in 5.0. The plugin now automatically detects the correct host. 142 | */ 143 | openInEditorHost?: string | false 144 | 145 | /** 146 | * lazy load inspector times (ms) 147 | * @default false 148 | */ 149 | lazyLoad?: number | false 150 | 151 | /** 152 | * disable inspector on editor open 153 | * @default false 154 | */ 155 | disableInspectorOnEditorOpen?: boolean 156 | 157 | /** 158 | * Hide information in VNode and produce clean html in DevTools 159 | * 160 | * Currently, it only works for Vue 3 161 | * 162 | * @default true 163 | */ 164 | cleanHtml?: boolean 165 | 166 | /** 167 | * Target editor when open in editor (v5.1.0+) 168 | * 169 | * @default code (Visual Studio Code) 170 | */ 171 | launchEditor?: 'appcode' | 'atom' | 'atom-beta' | 'brackets' | 'clion' | 'code' | 'code-insiders' | 'codium' | 'emacs' | 'idea' | 'notepad++' | 'pycharm' | 'phpstorm' | 'rubymine' | 'sublime' | 'vim' | 'visualstudio' | 'webstorm' | 'cursor' 172 | } 173 | ``` 174 | 175 | ### Example 176 | 177 | - [Vue2](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue2) 178 | - [Vue3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue3) 179 | - [Nuxt3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/nuxt) 180 | 181 | ## Supported editors 182 | 183 | | Value | Editor | Linux | Windows | OSX | 184 | |--------|------|:------:|:------:|:------:| 185 | | `appcode` | [AppCode](https://www.jetbrains.com/objc/) | | |✓| 186 | | `atom` | [Atom](https://atom.io/) |✓|✓|✓| 187 | | `atom-beta` | [Atom Beta](https://atom.io/beta) | | |✓| 188 | | `brackets` | [Brackets](http://brackets.io/) |✓|✓|✓| 189 | | `clion` | [Clion](https://www.jetbrains.com/clion/) | |✓|✓| 190 | | `code` | [Visual Studio Code](https://code.visualstudio.com/) |✓|✓|✓| 191 | | `code-insiders` | [Visual Studio Code Insiders](https://code.visualstudio.com/insiders/) |✓|✓|✓| 192 | | `codium` | [VSCodium](https://github.com/VSCodium/vscodium) |✓|✓|✓| 193 | | `emacs` | [Emacs](https://www.gnu.org/software/emacs/) |✓| | | 194 | | `idea` | [IDEA](https://www.jetbrains.com/idea/) |✓|✓|✓| 195 | | `notepad++` | [Notepad++](https://notepad-plus-plus.org/download/v7.5.4.html) | |✓| | 196 | | `pycharm` | [PyCharm](https://www.jetbrains.com/pycharm/) |✓|✓|✓| 197 | | `phpstorm` | [PhpStorm](https://www.jetbrains.com/phpstorm/) |✓|✓|✓| 198 | | `rubymine` | [RubyMine](https://www.jetbrains.com/ruby/) |✓|✓|✓| 199 | | `sublime` | [Sublime Text](https://www.sublimetext.com/) |✓|✓|✓| 200 | | `vim` | [Vim](http://www.vim.org/) |✓| | | 201 | | `visualstudio` | [Visual Studio](https://www.visualstudio.com/vs/) | | |✓| 202 | | `webstorm` | [WebStorm](https://www.jetbrains.com/webstorm/) |✓|✓|✓| 203 | | `cursor` | [Cursor](https://www.cursor.com/) |✓|✓|✓| 204 | 205 | ## 🔌 Configuration IDE / Editor 206 | 207 | **Starting from v5.1.0, We recommend using the `launchEditor` option configuration to specify the IDE** (Please ensure that the editor's environment variables are correctly configured beforehand.) 208 | 209 | It uses an **environment variable** named **`LAUNCH_EDITOR`** to specify an IDE application, but if you do not set this variable, it will try to open a common IDE that you have open or installed once it is certified. 210 | 211 | For example, if you want it always open VS Code when inspection clicked, set `export LAUNCH_EDITOR=code` in your shell. 212 | 213 | 214 | ### VS Code 215 | 216 | - install VS Code command line tools, [see the official docs](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line) 217 | ![install-vscode-cli](./public/install-vscode-cli.png) 218 | 219 | - set env to shell, like `.bashrc` or `.zshrc` 220 | 221 | ```bash 222 | export LAUNCH_EDITOR=code 223 | ``` 224 | 225 |
226 | 227 | 228 | ### VS Code with WSL (Windows) 229 | 230 | - add the configuration in the `settings.json` 231 | 232 | - restart the VS Code (All Windows should be closed to take effect) 233 | 234 | ```json 235 | { 236 | // other config... 237 | 238 | "terminal.integrated.env.linux": { 239 | "EDITOR": "code" 240 | } 241 | } 242 | ``` 243 | 244 | 245 | ### WebStorm 246 | 247 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 248 | 249 | ```bash 250 | export LAUNCH_EDITOR='/Applications/WebStorm.app/Contents/MacOS/webstorm' 251 | ``` 252 | 253 | **OR** 254 | 255 | - install WebStorm command line tools 256 | 257 | - then set env to shell, like `.bashrc` or `.zshrc` 258 | 259 | ```bash 260 | export LAUNCH_EDITOR=webstorm 261 | ``` 262 | 263 |
264 | 265 | ### PhpStorm 266 | 267 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 268 | 269 | ```bash 270 | export LAUNCH_EDITOR='/Applications/PhpStorm.app/Contents/MacOS/phpstorm' 271 | ``` 272 | 273 | **OR** 274 | 275 | - install PhpStorm command line tools 276 | 277 | - then set env to shell, like `.bashrc` or `.zshrc` 278 | 279 | ```bash 280 | export LAUNCH_EDITOR=phpstorm 281 | ``` 282 | 283 |
284 | 285 | ### Vim 286 | 287 | Yes! you can also use vim if you want, just set env to shell 288 | 289 | ```bash 290 | export LAUNCH_EDITOR=vim 291 | ``` 292 | 293 |
294 | 295 | ## 💡 Notice 296 | 297 | - **[BREAKING CHANGE] From v1.0, `enabled` option default value changed from `true` to `false` .** 298 | - It only work in develop mode . 299 | - It does not currently support `Template Engine (e.g. pug)` . 300 | 301 | ## 👨‍💻 Programmatic Usage 302 | 303 | You can also use control inspector programmatically, by accessing the `__VUE_INSPECTOR__` global variable. 304 | 305 | ```ts 306 | import type { VueInspectorClient } from 'vite-plugin-vue-inspector' 307 | 308 | const inspector: VueInspectorClient = window.__VUE_INSPECTOR__ 309 | 310 | if (inspector) { 311 | // enable inspector 312 | inspector.enable() 313 | // or 314 | inspector.disable() 315 | } 316 | ``` 317 | 318 | ## 🌸 Credits 319 | 320 | This project is inspired by [react-dev-inspector](https://github.com/zthxxx/react-dev-inspector) . 321 | 322 | Partially implementation is inspired by [vite-plugin-svelte-inspector](https://github.com/sveltejs/vite-plugin-svelte/tree/main/packages/vite-plugin-svelte/src/ui/inspector) . 323 | 324 | ## 🤖️ Analysis of Theory 325 | 326 | [Chinese] [点击页面元素,这个Vite插件帮我打开了Vue组件](https://juejin.cn/post/7077347158545924127) 327 | ## 📄 License 328 | 329 | [MIT LICENSE](./LICENSE) 330 | -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "author": "webfansplz", 4 | "license": "MIT", 5 | "homepage": "https://github.com/webfansplz/vite-plugin-vue-inspector#readme", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/webfansplz/vite-plugin-vue-inspector.git" 9 | }, 10 | "bugs": { 11 | "url": "https://github.com/webfansplz/vite-plugin-vue-inspector/issues" 12 | }, 13 | "scripts": { 14 | "play:nuxt": "pnpm run -r --filter=./packages/playground/nuxt dev", 15 | "play:vue3": "pnpm run -r --filter=./packages/playground/vue3 dev", 16 | "play:vue2": "pnpm run -r --filter=./packages/playground/vue2 dev", 17 | "lint": "eslint --fix --ext .js,.ts,.vue .", 18 | "dev": "pnpm run -r --filter=./packages/core dev", 19 | "build": "pnpm run -r --filter=./packages/{core,unplugin} build", 20 | "release": "pnpm build && changeset && changeset version && changeset publish" 21 | }, 22 | "devDependencies": { 23 | "@antfu/eslint-config": "^0.43.1", 24 | "@changesets/cli": "^2.26.2", 25 | "@types/node": "^20.8.0", 26 | "eslint": "^8.50.0", 27 | "esmo": "^0.17.0", 28 | "fs-extra": "^11.1.1", 29 | "nodemon": "^3.0.1", 30 | "tsup": "^7.2.0", 31 | "tsx": "^3.13.0", 32 | "typescript": "^5.2.2", 33 | "vite": "^5.4.11", 34 | "vite-plugin-inspect": "^0.7.40", 35 | "vue": "^3.3.4" 36 | }, 37 | "pnpm": { 38 | "packageExtensions": { 39 | "vue-template-compiler": { 40 | "peerDependencies": { 41 | "vue": "^2.6.14" 42 | } 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /packages/core/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # vite-plugin-vue-inspector 2 | 3 | ## 5.3.1 4 | 5 | ### Patch Changes 6 | 7 | - chore: support vite6 8 | 9 | ## 5.3.0 10 | 11 | ### Minor Changes 12 | 13 | - feat: cursor support 14 | 15 | ## 5.2.0 16 | 17 | ### Minor Changes 18 | 19 | - feat: inspect external component (#91) 20 | - feat: introduce reduceMotion option (#102) 21 | - chore: adjust the position of floating elements on the x-axis (#105) 22 | - feat: exclude template tag to support jsx-directive (#106) 23 | 24 | ## 5.1.3 25 | 26 | ### Patch Changes 27 | 28 | - fix: escaping special characters 29 | 30 | ## 5.1.2 31 | 32 | ### Patch Changes 33 | 34 | - fix: remove the available launch editors limit 35 | 36 | ## 5.1.1 37 | 38 | ### Patch Changes 39 | 40 | - feat: respect user `process.env.LAUNCH_EDITOR` setting (#93) 41 | 42 | - feat: add `onEnabled / onDisabled` callbacks (#94) 43 | 44 | ## 5.1.0 45 | 46 | ### Minor Changes 47 | 48 | - feat: introducing launchEditor option 49 | 50 | ## 5.0.1 51 | 52 | ### Patch Changes 53 | 54 | - fix: `openInEditor` types 55 | 56 | ## 5.0.0 57 | 58 | ### Major Changes 59 | 60 | - fix: open-in-editor base url, deprecated `openInEditorHost` option 61 | 62 | ## 4.0.2 63 | 64 | ### Patch Changes 65 | 66 | - feat: respect vite base path option 67 | 68 | ## 4.0.1 69 | 70 | ### Patch Changes 71 | 72 | - feat: support vite5 73 | 74 | ## 4.0.0 75 | 76 | ### Major Changes 77 | 78 | - feat!: hide data-v-inspector in html (#81) 79 | 80 | ## 3.7.2 81 | 82 | ### Patch Changes 83 | 84 | - perf: remove unnecessary dependencies (#80) 85 | 86 | ## 3.7.1 87 | 88 | ### Patch Changes 89 | 90 | - fix: respect `server.port` when setting custom host (#74) 91 | 92 | ## 3.7.0 93 | 94 | ### Minor Changes 95 | 96 | - feat: close overlay when resizing the window (#71) 97 | 98 | - feat: introducing `disableInspectorOnEditorOpen` option (#77) 99 | 100 | - feat: support `decorators` and `import-attributes` syntax (#79) 101 | 102 | ## 3.6.0 103 | 104 | ### Minor Changes 105 | 106 | - feat: introducing `lazyLoad` option 107 | 108 | ## 3.5.0 109 | 110 | ### Minor Changes 111 | 112 | - chore: release 113 | 114 | ## 3.4.2 115 | 116 | ### Patch Changes 117 | 118 | - fix: normalize path in `data-v-inspector` attribute 119 | 120 | ## 3.4.1 121 | 122 | ### Patch Changes 123 | 124 | - fix: inspector path and hide injected app in Vue devtools 125 | 126 | ## 3.4.0 127 | 128 | ### Minor Changes 129 | 130 | - fix: compactible with Nuxt 3.3 131 | 132 | ## 3.3.2 133 | 134 | ### Patch Changes 135 | 136 | - fix: jsx self-closing tags handle 137 | 138 | ## 3.3.1 139 | 140 | ### Patch Changes 141 | 142 | - fix: combo key name 143 | 144 | ## 3.3.0 145 | 146 | ### Minor Changes 147 | 148 | - feat: disable toggleComboKey option 149 | 150 | ## 3.2.2 151 | 152 | ### Patch Changes 153 | 154 | - feat: append attribute at the end 155 | 156 | ## 3.2.1 157 | 158 | ### Patch Changes 159 | 160 | - introduce `data-v-inspector-ignore` options 161 | 162 | ## 3.2.0 163 | 164 | ### Minor Changes 165 | 166 | - release 167 | 168 | ## 3.1.3 169 | 170 | ### Patch Changes 171 | 172 | - docs: readme 173 | 174 | ## 3.1.2 175 | 176 | ### Patch Changes 177 | 178 | - feat: unplugin package 179 | -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | vite-plugin-vue-inspector 4 |

5 | 6 |

7 | NPM Version 8 | NPM Downloads 9 | License 10 |

11 | 12 |

13 | 14 |

15 | 16 | ## 📖 Introduction 17 | 18 | A vite plugin which provides the ability that to jump to the local IDE when you click the element of browser automatically. It supports Vue2 & 3 & SSR. 19 | 20 |

21 | vite-plugin-vue-inspector 22 |

23 | 24 | ## 📦 Installation 25 | 26 | ```bash 27 | 28 | # vite-plugin-vue-inspector 29 | 30 | pnpm install vite-plugin-vue-inspector -D 31 | 32 | # unplugin-vue-inspector 33 | 34 | pnpm install unplugin-vue-inspector -D 35 | 36 | ``` 37 | 38 | ## 🦄 Usage 39 | 40 | ### Configuration Vite 41 | 42 | ```ts 43 | // for Vue2 44 | 45 | import { defineConfig, } from 'vite' 46 | import { createVuePlugin, } from 'vite-plugin-vue2' 47 | 48 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 49 | 50 | export default defineConfig({ 51 | plugins: [ 52 | createVuePlugin(), 53 | Inspector({ 54 | vue: 2 55 | }), 56 | ], 57 | }) 58 | ``` 59 | 60 | ```ts 61 | // for Vue3 62 | 63 | import { defineConfig } from 'vite' 64 | import Vue from '@vitejs/plugin-vue' 65 | 66 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 67 | 68 | export default defineConfig({ 69 | plugins: [Vue(), Inspector()], 70 | }) 71 | ``` 72 | 73 | ```ts 74 | // for Nuxt3 75 | // nuxt.config.ts 76 | import { defineNuxtConfig } from 'nuxt/config' 77 | import Inspector from 'vite-plugin-vue-inspector' 78 | 79 | export default defineNuxtConfig({ 80 | modules: [ 81 | ['unplugin-vue-inspector/nuxt', { 82 | enabled: true, 83 | toggleButtonVisibility: 'always', 84 | }], 85 | ], 86 | }) 87 | ``` 88 | 89 | ### Options 90 | 91 | 92 | ```ts 93 | interface VitePluginInspectorOptions { 94 | /** 95 | * Vue version 96 | * @default 3 97 | */ 98 | vue?: 2 | 3 99 | 100 | /** 101 | * Default enable state 102 | * @default false 103 | */ 104 | enabled?: boolean 105 | 106 | /** 107 | * Define a combo key to toggle inspector 108 | * @default 'control-shift' on windows, 'meta-shift' on other os 109 | * 110 | * any number of modifiers `control` `shift` `alt` `meta` followed by zero or one regular key, separated by - 111 | * examples: control-shift, control-o, control-alt-s meta-x control-meta 112 | * Some keys have native behavior (e.g. alt-s opens history menu on firefox). 113 | * To avoid conflicts or accidentally typing into inputs, modifier only combinations are recommended. 114 | * You can also disable it by setting `false`. 115 | */ 116 | toggleComboKey?: string | false 117 | 118 | /** 119 | * Toggle button visibility 120 | * @default 'active' 121 | */ 122 | toggleButtonVisibility?: 'always' | 'active' | 'never' 123 | 124 | /** 125 | * Toggle button display position 126 | * @default top-right 127 | */ 128 | toggleButtonPos?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' 129 | 130 | /** 131 | * append an import to the module id ending with `appendTo` instead of adding a script into body 132 | * useful for frameworks that do not support transformIndexHtml hook (e.g. Nuxt3) 133 | * 134 | * WARNING: only set this if you know exactly what it does. 135 | */ 136 | appendTo?: string | RegExp 137 | 138 | /** 139 | * Customize openInEditor host (e.g. http://localhost:3000) 140 | * @default false 141 | * @deprecated This option is deprecated and removed in 5.0. The plugin now automatically detects the correct host. 142 | */ 143 | openInEditorHost?: string | false 144 | 145 | /** 146 | * lazy load inspector times (ms) 147 | * @default false 148 | */ 149 | lazyLoad?: number | false 150 | 151 | /** 152 | * disable inspector on editor open 153 | * @default false 154 | */ 155 | disableInspectorOnEditorOpen?: boolean 156 | 157 | /** 158 | * Hide information in VNode and produce clean html in DevTools 159 | * 160 | * Currently, it only works for Vue 3 161 | * 162 | * @default true 163 | */ 164 | cleanHtml?: boolean 165 | 166 | /** 167 | * Target editor when open in editor (v5.1.0+) 168 | * 169 | * @default code (Visual Studio Code) 170 | */ 171 | launchEditor?: 'appcode' | 'atom' | 'atom-beta' | 'brackets' | 'clion' | 'code' | 'code-insiders' | 'codium' | 'emacs' | 'idea' | 'notepad++' | 'pycharm' | 'phpstorm' | 'rubymine' | 'sublime' | 'vim' | 'visualstudio' | 'webstorm' | 'cursor' 172 | } 173 | ``` 174 | 175 | ### Example 176 | 177 | - [Vue2](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue2) 178 | - [Vue3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue3) 179 | - [Nuxt3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/nuxt) 180 | 181 | ## Supported editors 182 | 183 | | Value | Editor | Linux | Windows | OSX | 184 | |--------|------|:------:|:------:|:------:| 185 | | `appcode` | [AppCode](https://www.jetbrains.com/objc/) | | |✓| 186 | | `atom` | [Atom](https://atom.io/) |✓|✓|✓| 187 | | `atom-beta` | [Atom Beta](https://atom.io/beta) | | |✓| 188 | | `brackets` | [Brackets](http://brackets.io/) |✓|✓|✓| 189 | | `clion` | [Clion](https://www.jetbrains.com/clion/) | |✓|✓| 190 | | `code` | [Visual Studio Code](https://code.visualstudio.com/) |✓|✓|✓| 191 | | `code-insiders` | [Visual Studio Code Insiders](https://code.visualstudio.com/insiders/) |✓|✓|✓| 192 | | `codium` | [VSCodium](https://github.com/VSCodium/vscodium) |✓|✓|✓| 193 | | `emacs` | [Emacs](https://www.gnu.org/software/emacs/) |✓| | | 194 | | `idea` | [IDEA](https://www.jetbrains.com/idea/) |✓|✓|✓| 195 | | `notepad++` | [Notepad++](https://notepad-plus-plus.org/download/v7.5.4.html) | |✓| | 196 | | `pycharm` | [PyCharm](https://www.jetbrains.com/pycharm/) |✓|✓|✓| 197 | | `phpstorm` | [PhpStorm](https://www.jetbrains.com/phpstorm/) |✓|✓|✓| 198 | | `rubymine` | [RubyMine](https://www.jetbrains.com/ruby/) |✓|✓|✓| 199 | | `sublime` | [Sublime Text](https://www.sublimetext.com/) |✓|✓|✓| 200 | | `vim` | [Vim](http://www.vim.org/) |✓| | | 201 | | `visualstudio` | [Visual Studio](https://www.visualstudio.com/vs/) | | |✓| 202 | | `webstorm` | [WebStorm](https://www.jetbrains.com/webstorm/) |✓|✓|✓| 203 | | `cursor` | [Cursor](https://www.cursor.com/) |✓|✓|✓| 204 | 205 | ## 🔌 Configuration IDE / Editor 206 | 207 | **Starting from v5.1.0, We recommend using the `launchEditor` option configuration to specify the IDE** (Please ensure that the editor's environment variables are correctly configured beforehand.) 208 | 209 | It uses an **environment variable** named **`LAUNCH_EDITOR`** to specify an IDE application, but if you do not set this variable, it will try to open a common IDE that you have open or installed once it is certified. 210 | 211 | For example, if you want it always open VS Code when inspection clicked, set `export LAUNCH_EDITOR=code` in your shell. 212 | 213 | 214 | ### VS Code 215 | 216 | - install VS Code command line tools, [see the official docs](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line) 217 | ![install-vscode-cli](./public/install-vscode-cli.png) 218 | 219 | - set env to shell, like `.bashrc` or `.zshrc` 220 | 221 | ```bash 222 | export LAUNCH_EDITOR=code 223 | ``` 224 | 225 |
226 | 227 | 228 | ### VS Code with WSL (Windows) 229 | 230 | - add the configuration in the `settings.json` 231 | 232 | - restart the VS Code (All Windows should be closed to take effect) 233 | 234 | ```json 235 | { 236 | // other config... 237 | 238 | "terminal.integrated.env.linux": { 239 | "EDITOR": "code" 240 | } 241 | } 242 | ``` 243 | 244 | 245 | ### WebStorm 246 | 247 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 248 | 249 | ```bash 250 | export LAUNCH_EDITOR='/Applications/WebStorm.app/Contents/MacOS/webstorm' 251 | ``` 252 | 253 | **OR** 254 | 255 | - install WebStorm command line tools 256 | 257 | - then set env to shell, like `.bashrc` or `.zshrc` 258 | 259 | ```bash 260 | export LAUNCH_EDITOR=webstorm 261 | ``` 262 | 263 |
264 | 265 | ### PhpStorm 266 | 267 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 268 | 269 | ```bash 270 | export LAUNCH_EDITOR='/Applications/PhpStorm.app/Contents/MacOS/phpstorm' 271 | ``` 272 | 273 | **OR** 274 | 275 | - install PhpStorm command line tools 276 | 277 | - then set env to shell, like `.bashrc` or `.zshrc` 278 | 279 | ```bash 280 | export LAUNCH_EDITOR=phpstorm 281 | ``` 282 | 283 |
284 | 285 | ### Vim 286 | 287 | Yes! you can also use vim if you want, just set env to shell 288 | 289 | ```bash 290 | export LAUNCH_EDITOR=vim 291 | ``` 292 | 293 |
294 | 295 | ## 💡 Notice 296 | 297 | - **[BREAKING CHANGE] From v1.0, `enabled` option default value changed from `true` to `false` .** 298 | - It only work in develop mode . 299 | - It does not currently support `Template Engine (e.g. pug)` . 300 | 301 | ## 👨‍💻 Programmatic Usage 302 | 303 | You can also use control inspector programmatically, by accessing the `__VUE_INSPECTOR__` global variable. 304 | 305 | ```ts 306 | import type { VueInspectorClient } from 'vite-plugin-vue-inspector' 307 | 308 | const inspector: VueInspectorClient = window.__VUE_INSPECTOR__ 309 | 310 | if (inspector) { 311 | // enable inspector 312 | inspector.enable() 313 | // or 314 | inspector.disable() 315 | } 316 | ``` 317 | 318 | ## 🌸 Credits 319 | 320 | This project is inspired by [react-dev-inspector](https://github.com/zthxxx/react-dev-inspector) . 321 | 322 | Partially implementation is inspired by [vite-plugin-svelte-inspector](https://github.com/sveltejs/vite-plugin-svelte/tree/main/packages/vite-plugin-svelte/src/ui/inspector) . 323 | 324 | ## 🤖️ Analysis of Theory 325 | 326 | [Chinese] [点击页面元素,这个Vite插件帮我打开了Vue组件](https://juejin.cn/post/7077347158545924127) 327 | ## 📄 License 328 | 329 | [MIT LICENSE](./LICENSE) 330 | -------------------------------------------------------------------------------- /packages/core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-plugin-vue-inspector", 3 | "version": "5.3.1", 4 | "description": "jump to local IDE source code while click the element of browser automatically.", 5 | "author": "webfansplz", 6 | "license": "MIT", 7 | "homepage": "https://github.com/webfansplz/vite-plugin-vue-inspector#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/webfansplz/vite-plugin-vue-inspector.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/webfansplz/vite-plugin-vue-inspector/issues" 14 | }, 15 | "keywords": [ 16 | "vue", 17 | "vite", 18 | "vscode", 19 | "vite-plugin", 20 | "inspector", 21 | "debug" 22 | ], 23 | "exports": { 24 | ".": { 25 | "types": "./dist/index.d.ts", 26 | "require": "./dist/index.cjs", 27 | "import": "./dist/index.mjs" 28 | }, 29 | "./src/*": "./src/*" 30 | }, 31 | "main": "./dist/index.cjs", 32 | "module": "./dist/index.mjs", 33 | "types": "./dist/index.d.ts", 34 | "files": [ 35 | "dist", 36 | "src/load.js", 37 | "src/Overlay.vue" 38 | ], 39 | "scripts": { 40 | "lint": "eslint --fix --ext .js,.ts,.vue .", 41 | "dev": "tsup --watch", 42 | "build": "tsup" 43 | }, 44 | "peerDependencies": { 45 | "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" 46 | }, 47 | "dependencies": { 48 | "@babel/core": "^7.23.0", 49 | "@babel/plugin-proposal-decorators": "^7.23.0", 50 | "@babel/plugin-syntax-import-attributes": "^7.22.5", 51 | "@babel/plugin-syntax-import-meta": "^7.10.4", 52 | "@babel/plugin-transform-typescript": "^7.22.15", 53 | "@vue/babel-plugin-jsx": "^1.1.5", 54 | "@vue/compiler-dom": "^3.3.4", 55 | "kolorist": "^1.8.0", 56 | "magic-string": "^0.30.4" 57 | }, 58 | "devDependencies": { 59 | "@types/babel__core": "^7.20.2", 60 | "unplugin": "^1.5.0" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /packages/core/src/Overlay.vue: -------------------------------------------------------------------------------- 1 | 266 | 267 | 333 | 334 | 401 | -------------------------------------------------------------------------------- /packages/core/src/compiler/index.ts: -------------------------------------------------------------------------------- 1 | export * from './template' 2 | -------------------------------------------------------------------------------- /packages/core/src/compiler/template.ts: -------------------------------------------------------------------------------- 1 | import path from 'node:path' 2 | import MagicString from 'magic-string' 3 | import { parse as vueParse, transform as vueTransform } from '@vue/compiler-dom' 4 | import { parse as babelParse, traverse as babelTraverse } from '@babel/core' 5 | import vueJsxPlugin from '@vue/babel-plugin-jsx' 6 | import typescriptPlugin from '@babel/plugin-transform-typescript' 7 | import importMeta from '@babel/plugin-syntax-import-meta' 8 | import decoratorsPlugin from '@babel/plugin-proposal-decorators' 9 | import importAttributesPlugin from '@babel/plugin-syntax-import-attributes' 10 | import { normalizePath } from 'vite' 11 | 12 | const EXCLUDE_TAG = ['template', 'script', 'style'] 13 | const KEY_DATA = 'data-v-inspector' 14 | 15 | interface CompileSFCTemplateOptions { 16 | code: string 17 | id: string 18 | type: 'template' | 'jsx' 19 | } 20 | export async function compileSFCTemplate( 21 | { code, id, type }: CompileSFCTemplateOptions, 22 | ) { 23 | const s = new MagicString(code) 24 | const relativePath = normalizePath(path.relative(process.cwd(), id)) 25 | const result = await new Promise((resolve) => { 26 | switch (type) { 27 | case 'template': { 28 | const ast = vueParse(code, { comments: true }) 29 | vueTransform(ast, { 30 | nodeTransforms: [ 31 | (node) => { 32 | if (node.type === 1) { 33 | if ((node.tagType === 0 || node.tagType === 1) && !EXCLUDE_TAG.includes(node.tag)) { 34 | if (node.loc.source.includes(KEY_DATA)) 35 | return 36 | 37 | const insertPosition = node.props.length ? Math.max(...node.props.map(i => i.loc.end.offset)) : node.loc.start.offset + node.tag.length + 1 38 | const { line, column } = node.loc.start 39 | 40 | const content = ` ${KEY_DATA}="${relativePath}:${line}:${column}"` 41 | 42 | s.prependLeft( 43 | insertPosition, 44 | content, 45 | ) 46 | } 47 | } 48 | }, 49 | ], 50 | }) 51 | 52 | break 53 | } 54 | 55 | case 'jsx': { 56 | const ast = babelParse(code, { 57 | babelrc: false, 58 | configFile: false, 59 | comments: true, 60 | plugins: [ 61 | importMeta, 62 | [vueJsxPlugin, {}], 63 | [ 64 | typescriptPlugin, 65 | { isTSX: true, allowExtensions: true }, 66 | ], 67 | [ 68 | decoratorsPlugin, 69 | { legacy: true }, 70 | ], 71 | [ 72 | importAttributesPlugin, 73 | { deprecatedAssertSyntax: true }, 74 | ], 75 | ], 76 | }) 77 | 78 | babelTraverse(ast, { 79 | enter({ node }) { 80 | if (node.type === 'JSXElement' && !EXCLUDE_TAG.includes(s.slice(node.openingElement.name.start, node.openingElement.name.end))) { 81 | if (node.openingElement.attributes.some(attr => attr.type !== 'JSXSpreadAttribute' && attr.name.name === KEY_DATA, 82 | )) 83 | return 84 | 85 | const insertPosition = node.openingElement.end - (node.openingElement.selfClosing ? 2 : 1) 86 | const { line, column } = node.loc.start 87 | 88 | const content = ` ${KEY_DATA}="${relativePath}:${line}:${column}"` 89 | 90 | s.prependLeft( 91 | insertPosition, 92 | content) 93 | } 94 | }, 95 | }) 96 | break 97 | } 98 | 99 | default: 100 | break 101 | } 102 | 103 | resolve(s.toString()) 104 | }) 105 | 106 | return result 107 | } 108 | -------------------------------------------------------------------------------- /packages/core/src/index.ts: -------------------------------------------------------------------------------- 1 | import path from 'node:path' 2 | import { fileURLToPath } from 'node:url' 3 | import fs from 'node:fs' 4 | import process from 'node:process' 5 | import { bold, dim, green, yellow } from 'kolorist' 6 | import { normalizePath } from 'vite' 7 | import type { PluginOption, ResolvedConfig } from 'vite' 8 | import MagicString from 'magic-string' 9 | import { compileSFCTemplate } from './compiler' 10 | import { idToFile, parseVueRequest } from './utils' 11 | 12 | export interface VueInspectorClient { 13 | enabled: boolean 14 | position: { 15 | x: number 16 | y: number 17 | } 18 | linkParams: { 19 | file: string 20 | line: number 21 | column: number 22 | } 23 | 24 | enable: () => void 25 | disable: () => void 26 | toggleEnabled: () => void 27 | onEnabled: () => void 28 | onDisabled: () => void 29 | 30 | openInEditor: (url: URL) => void 31 | onUpdated: () => void 32 | } 33 | 34 | export interface VitePluginInspectorOptions { 35 | /** 36 | * Vue version 37 | * @default 3 38 | */ 39 | vue?: 2 | 3 40 | 41 | /** 42 | * Default enable state 43 | * @default false 44 | */ 45 | enabled?: boolean 46 | 47 | /** 48 | * Define a combo key to toggle inspector 49 | * @default 'control-shift' on windows, 'meta-shift' on other os 50 | * 51 | * any number of modifiers `control` `shift` `alt` `meta` followed by zero or one regular key, separated by - 52 | * examples: control-shift, control-o, control-alt-s meta-x control-meta 53 | * Some keys have native behavior (e.g. alt-s opens history menu on firefox). 54 | * To avoid conflicts or accidentally typing into inputs, modifier only combinations are recommended. 55 | * You can also disable it by setting `false`. 56 | */ 57 | toggleComboKey?: string | false 58 | 59 | /** 60 | * Toggle button visibility 61 | * @default 'active' 62 | */ 63 | toggleButtonVisibility?: 'always' | 'active' | 'never' 64 | 65 | /** 66 | * Toggle button display position 67 | * @default top-right 68 | */ 69 | toggleButtonPos?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' 70 | 71 | /** 72 | * append an import to the module id ending with `appendTo` instead of adding a script into body 73 | * useful for frameworks that do not support transformIndexHtml hook (e.g. Nuxt3) 74 | * 75 | * WARNING: only set this if you know exactly what it does. 76 | */ 77 | appendTo?: string | RegExp 78 | 79 | /** 80 | * Customize openInEditor host (e.g. http://localhost:3000) 81 | * @default false 82 | * @deprecated This option is deprecated and removed in 5.0. The plugin now automatically detects the correct host. 83 | */ 84 | openInEditorHost?: string | false 85 | 86 | /** 87 | * lazy load inspector times (ms) 88 | * @default false 89 | */ 90 | lazyLoad?: number | false 91 | 92 | /** 93 | * disable inspector on editor open 94 | * @default false 95 | */ 96 | disableInspectorOnEditorOpen?: boolean 97 | 98 | /** 99 | * Hide information in VNode and produce clean html in DevTools 100 | * 101 | * Currently, it only works for Vue 3 102 | * 103 | * @default true 104 | */ 105 | cleanHtml?: boolean 106 | 107 | /** 108 | * Target editor when open in editor (v5.1.0+) 109 | * 110 | * @default process.env.LAUNCH_EDITOR ?? code (Visual Studio Code) 111 | */ 112 | launchEditor?: 'appcode' | 'atom' | 'atom-beta' | 'brackets' | 'clion' | 'code' | 'code-insiders' | 'codium' | 'emacs' | 'idea' | 'notepad++' | 'pycharm' | 'phpstorm' | 'rubymine' | 'sublime' | 'vim' | 'visualstudio' | 'webstorm' | 'rider' | 'cursor' | string 113 | 114 | /** 115 | * Disable animation/transition, will auto disable when `prefers-reduced-motion` is set 116 | * @default false 117 | */ 118 | reduceMotion?: boolean 119 | } 120 | 121 | const toggleComboKeysMap = { 122 | control: process.platform === 'darwin' ? 'Control(^)' : 'Ctrl(^)', 123 | meta: 'Command(⌘)', 124 | shift: 'Shift(⇧)', 125 | } 126 | 127 | function getInspectorPath() { 128 | const pluginPath = normalizePath(path.dirname(fileURLToPath(import.meta.url))) 129 | return pluginPath.replace(/\/dist$/, '/src') 130 | } 131 | 132 | export function normalizeComboKeyPrint(toggleComboKey: string) { 133 | return toggleComboKey.split('-').map(key => toggleComboKeysMap[key] || key[0].toUpperCase() + key.slice(1)).join(dim('+')) 134 | } 135 | 136 | export const DEFAULT_INSPECTOR_OPTIONS: VitePluginInspectorOptions = { 137 | vue: 3, 138 | enabled: false, 139 | toggleComboKey: process.platform === 'darwin' ? 'meta-shift' : 'control-shift', 140 | toggleButtonVisibility: 'active', 141 | toggleButtonPos: 'top-right', 142 | appendTo: '', 143 | lazyLoad: false, 144 | launchEditor: process.env.LAUNCH_EDITOR ?? 'code', 145 | reduceMotion: false, 146 | } as const 147 | 148 | function VitePluginInspector(options: VitePluginInspectorOptions = DEFAULT_INSPECTOR_OPTIONS): PluginOption { 149 | const inspectorPath = getInspectorPath() 150 | const normalizedOptions = { 151 | ...DEFAULT_INSPECTOR_OPTIONS, 152 | ...options, 153 | } 154 | let config: ResolvedConfig 155 | 156 | const { 157 | vue, 158 | appendTo, 159 | cleanHtml = vue === 3, // Only enabled for Vue 3 by default 160 | } = normalizedOptions 161 | 162 | if (normalizedOptions.launchEditor) 163 | process.env.LAUNCH_EDITOR = normalizedOptions.launchEditor 164 | 165 | return [ 166 | { 167 | name: 'vite-plugin-vue-inspector', 168 | enforce: 'pre', 169 | apply(_, { command }) { 170 | // apply only on serve and not for test 171 | return command === 'serve' && process.env.NODE_ENV !== 'test' 172 | }, 173 | async resolveId(importee: string) { 174 | if (importee.startsWith('virtual:vue-inspector-options')) { 175 | return importee 176 | } 177 | else if (importee.startsWith('virtual:vue-inspector-path:')) { 178 | const resolved = importee.replace('virtual:vue-inspector-path:', `${inspectorPath}/`) 179 | return resolved 180 | } 181 | }, 182 | 183 | async load(id) { 184 | if (id === 'virtual:vue-inspector-options') { 185 | return `export default ${JSON.stringify({ ...normalizedOptions, base: config.base })}` 186 | } 187 | else if (id.startsWith(inspectorPath)) { 188 | const { query } = parseVueRequest(id) 189 | if (query.type) 190 | return 191 | // read file ourselves to avoid getting shut out by vites fs.allow check 192 | const file = idToFile(id) 193 | if (fs.existsSync(file)) 194 | return await fs.promises.readFile(file, 'utf-8') 195 | else 196 | console.error(`failed to find file for vue-inspector: ${file}, referenced by id ${id}.`) 197 | } 198 | }, 199 | transform(code, id) { 200 | const { filename, query } = parseVueRequest(id) 201 | 202 | const isJsx = filename.endsWith('.jsx') || filename.endsWith('.tsx') || (filename.endsWith('.vue') && query.isJsx) 203 | const isTpl = filename.endsWith('.vue') && query.type !== 'style' && !query.raw 204 | 205 | if (isJsx || isTpl) 206 | return compileSFCTemplate({ code, id: filename, type: isJsx ? 'jsx' : 'template' }) 207 | 208 | if (!appendTo) 209 | return 210 | 211 | if ((typeof appendTo === 'string' && filename.endsWith(appendTo)) 212 | || (appendTo instanceof RegExp && appendTo.test(filename))) 213 | return { code: `${code}\nimport 'virtual:vue-inspector-path:load.js'` } 214 | }, 215 | configureServer(server) { 216 | const _printUrls = server.printUrls 217 | const { toggleComboKey } = normalizedOptions 218 | 219 | toggleComboKey && (server.printUrls = () => { 220 | const keys = normalizeComboKeyPrint(toggleComboKey) 221 | _printUrls() 222 | console.log(` ${green('➜')} ${bold('Vue Inspector')}: ${green(`Press ${yellow(keys)} in App to toggle the Inspector`)}\n`) 223 | }) 224 | }, 225 | transformIndexHtml(html) { 226 | if (appendTo) 227 | return 228 | return { 229 | html, 230 | tags: [ 231 | { 232 | tag: 'script', 233 | injectTo: 'head', 234 | attrs: { 235 | type: 'module', 236 | src: `${config.base || '/'}@id/virtual:vue-inspector-path:load.js`, 237 | }, 238 | }, 239 | ], 240 | } 241 | }, 242 | configResolved(resolvedConfig) { 243 | config = resolvedConfig 244 | }, 245 | }, 246 | { 247 | name: 'vite-plugin-vue-inspector:post', 248 | enforce: 'post', 249 | apply(_, { command }) { 250 | // apply only on serve and not for test 251 | return cleanHtml && vue === 3 && command === 'serve' && process.env.NODE_ENV !== 'test' 252 | }, 253 | transform(code) { 254 | if (code.includes('_interopVNode')) 255 | return 256 | if (!code.includes('data-v-inspector')) 257 | return 258 | 259 | const fn = new Set() 260 | const s = new MagicString(code) 261 | 262 | s.replace(/(createElementVNode|createVNode|createElementBlock|createBlock) as _\1,?/g, (_, name) => { 263 | fn.add(name) 264 | return '' 265 | }) 266 | 267 | if (!fn.size) 268 | return 269 | 270 | s.appendLeft(0, `/* Injection by vite-plugin-vue-inspector Start */ 271 | import { ${Array.from(fn.values()).map(i => `${i} as __${i}`).join(',')} } from 'vue' 272 | function _interopVNode(vnode) { 273 | if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { 274 | const data = vnode.props['data-v-inspector'] 275 | delete vnode.props['data-v-inspector'] 276 | Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) 277 | } 278 | return vnode 279 | } 280 | ${Array.from(fn.values()).map(i => `function _${i}(...args) { return _interopVNode(__${i}(...args)) }`).join('\n')} 281 | /* Injection by vite-plugin-vue-inspector End */ 282 | `) 283 | 284 | return { 285 | code: s.toString(), 286 | map: s.generateMap({ hires: 'boundary' }), 287 | } 288 | }, 289 | }, 290 | ] 291 | } 292 | export default VitePluginInspector 293 | -------------------------------------------------------------------------------- /packages/core/src/load.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable new-cap */ 2 | 3 | import * as Vue from 'vue' 4 | import App from 'virtual:vue-inspector-path:Overlay.vue' 5 | import inspectorOptions from 'virtual:vue-inspector-options' 6 | const CONTAINER_ID = 'vue-inspector-container' 7 | 8 | function createInspectorContainer() { 9 | if (document.getElementById(CONTAINER_ID) != null) 10 | throw new Error('vueInspectorContainer element already exists') 11 | 12 | const el = document.createElement('div') 13 | el.setAttribute('id', CONTAINER_ID) 14 | document.getElementsByTagName('body')[0].appendChild(el) 15 | return el 16 | } 17 | 18 | function load() { 19 | const isClient = typeof window !== 'undefined' 20 | if (!isClient) 21 | return 22 | createInspectorContainer() 23 | const { vue } = inspectorOptions 24 | // vue 2/3 compatibility 25 | vue === 3 26 | ? Vue.createApp({ 27 | render: () => Vue.h(App), 28 | devtools: { 29 | hide: true, 30 | }, 31 | }).mount(`#${CONTAINER_ID}`) 32 | : new Vue.default({ 33 | render: h => h(App), 34 | devtools: { 35 | hide: true, 36 | }, 37 | }).$mount(`#${CONTAINER_ID}`) 38 | } 39 | 40 | if (inspectorOptions.lazyLoad) 41 | setTimeout(load, inspectorOptions.lazyLoad) 42 | 43 | else 44 | load() 45 | -------------------------------------------------------------------------------- /packages/core/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export interface VueQuery { 2 | vue?: boolean 3 | src?: boolean 4 | type?: 'script' | 'template' | 'style' | 'custom' 5 | index?: number 6 | lang?: string 7 | raw?: boolean 8 | from?: string 9 | isJsx?: boolean 10 | } 11 | 12 | interface JSXIdentifier { 13 | type: 'JSXIdentifier' 14 | name: string 15 | } 16 | 17 | interface JSXMemberExpression { 18 | type: 'JSXMemberExpression' 19 | object: JSXMemberExpression | JSXIdentifier 20 | property: JSXIdentifier 21 | } 22 | 23 | export function parseVueRequest(id: string) { 24 | const [filename] = id.split('?', 2) 25 | const url = new URL(id, 'http://domain.inspector') 26 | const query = Object.fromEntries(url.searchParams.entries()) as VueQuery 27 | if (query.vue != null) 28 | query.vue = true 29 | 30 | if (query.src != null) 31 | query.src = true 32 | 33 | if (query.index != null) 34 | query.index = Number(query.index) 35 | 36 | if (query.raw != null) 37 | query.raw = true 38 | 39 | if (query.hasOwnProperty('lang.tsx') || query.hasOwnProperty('lang.jsx')) 40 | query.isJsx = true 41 | 42 | return { 43 | filename, 44 | query, 45 | } 46 | } 47 | 48 | export function parseJSXIdentifier(name: JSXIdentifier | JSXMemberExpression) { 49 | if (name.type === 'JSXIdentifier') 50 | return name.name 51 | 52 | else 53 | return `${parseJSXIdentifier(name.object)}.${parseJSXIdentifier(name.property)}` 54 | } 55 | 56 | const FS_PREFIX = '/@fs/' 57 | const IS_WINDOWS = process.platform === 'win32' 58 | const queryRE = /\?.*$/s 59 | const hashRE = /#.*$/s 60 | 61 | export function idToFile(id: string): string { 62 | // strip /@fs/ but keep leading / on non-windows 63 | if (id.startsWith(FS_PREFIX)) 64 | id = id = id.slice(IS_WINDOWS ? FS_PREFIX.length : FS_PREFIX.length - 1) 65 | 66 | // strip query and hash 67 | return id.replace(hashRE, '').replace(queryRE, '') 68 | } 69 | -------------------------------------------------------------------------------- /packages/core/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup' 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | format: ['esm', 'cjs'], 6 | dts: true, 7 | esbuildOptions(options) { 8 | if (options.format === 'cjs') 9 | options.outExtension = { '.js': '.cjs' } 10 | }, 11 | shims: true, 12 | entry: [ 13 | 'src/index.ts', 14 | ], 15 | }) 16 | -------------------------------------------------------------------------------- /packages/playground/nuxt/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log* 3 | .nuxt 4 | .nitro 5 | .cache 6 | .output 7 | .env -------------------------------------------------------------------------------- /packages/playground/nuxt/.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | auto-install-peers=true 3 | strict-peer-dependencies=false 4 | -------------------------------------------------------------------------------- /packages/playground/nuxt/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | 21 | 37 | -------------------------------------------------------------------------------- /packages/playground/nuxt/components/Hi.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 21 | -------------------------------------------------------------------------------- /packages/playground/nuxt/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from 'nuxt/config' 2 | 3 | export default defineNuxtConfig({ 4 | modules: [ 5 | ['unplugin-vue-inspector/nuxt', { 6 | enabled: true, 7 | toggleButtonVisibility: 'always', 8 | launchEditor: 'code', 9 | }], 10 | ], 11 | }) 12 | -------------------------------------------------------------------------------- /packages/playground/nuxt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground-nuxt", 3 | "private": true, 4 | "scripts": { 5 | "build": "nuxi build", 6 | "dev": "nuxi dev", 7 | "preview": "nuxi preview" 8 | }, 9 | "devDependencies": { 10 | "nuxt": "3.7.4", 11 | "unplugin-vue-inspector": "workspace:*", 12 | "vite-plugin-vue-inspector": "workspace:*" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/playground/nuxt/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.nuxt/tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /packages/playground/vue2/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/playground/vue2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground-vue2", 3 | "private": true, 4 | "scripts": { 5 | "dev": "vite dev", 6 | "build": "vite build" 7 | }, 8 | "dependencies": { 9 | "@vue/composition-api": "^1.7.2", 10 | "vue": "2.7.14", 11 | "vue-property-decorator": "^9.1.2", 12 | "vue-template-compiler": "2.7.14" 13 | }, 14 | "devDependencies": { 15 | "sass": "^1.68.0", 16 | "unplugin-vue-inspector": "workspace:*", 17 | "vite-plugin-vue-inspector": "workspace:*", 18 | "vite-plugin-vue2": "^1.9.3" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | 30 | 46 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/Count.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/Hi.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 33 | 34 | 40 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/Welcome.tsx: -------------------------------------------------------------------------------- 1 | // import { defineComponent } from "@vue/composition-api" 2 | 3 | // export default defineComponent({ 4 | // name: "Welcome", 5 | // setup() { 6 | // return () =>

Welcome to here 🚀 .

7 | // }, 8 | // }) 9 | 10 | import Vue from 'vue' 11 | import { Component } from 'vue-property-decorator' 12 | 13 | @Component 14 | export default class Welcome extends Vue { 15 | private count = 0 16 | 17 | private get message(): string { 18 | return `Count: ${this.count}` 19 | } 20 | 21 | private increment(): void { 22 | this.count++ 23 | } 24 | 25 | render() { 26 | return ( 27 |
28 |

{this.message}

29 | 30 |
31 | ) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/main.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueCompositionAPI from '@vue/composition-api' 3 | import App from './App.vue' 4 | 5 | Vue.use(VueCompositionAPI) 6 | 7 | new Vue({ 8 | render: h => h(App), 9 | }).$mount('#app') 10 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/shim-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import { VNode } from "vue" 2 | import { ComponentRenderProxy } from "@vue/composition-api" 3 | 4 | declare global { 5 | namespace JSX { 6 | interface Element extends VNode {} 7 | interface ElementClass extends ComponentRenderProxy {} 8 | interface ElementAttributesProperty { 9 | $props: any // specify the property name to use 10 | } 11 | interface IntrinsicElements { 12 | [elem: string]: any 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/playground/vue2/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.vue" { 2 | import Vue from "vue" 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /packages/playground/vue2/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "strict": true, 7 | "module": "ESNext", 8 | "moduleResolution": "Node", 9 | "jsx": "preserve", 10 | "experimentalDecorators": true 11 | }, 12 | "include": ["src"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/playground/vue2/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { createVuePlugin } from 'vite-plugin-vue2' 3 | import Inspector from 'unplugin-vue-inspector/vite' 4 | 5 | export default defineConfig({ 6 | plugins: [ 7 | createVuePlugin({ 8 | jsx: true, 9 | jsxOptions: { 10 | compositionAPI: true, 11 | }, 12 | }), 13 | Inspector({ 14 | vue: 2, 15 | toggleButtonVisibility: 'always', 16 | enabled: true, 17 | disableInspectorOnEditorOpen: true, 18 | }), 19 | ], 20 | }) 21 | -------------------------------------------------------------------------------- /packages/playground/vue2/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.2.0" 7 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" 8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.1.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@babel/code-frame@^7.18.6": 14 | version "7.18.6" 15 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 16 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 17 | dependencies: 18 | "@babel/highlight" "^7.18.6" 19 | 20 | "@babel/compat-data@^7.20.5": 21 | version "7.20.10" 22 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" 23 | integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== 24 | 25 | "@babel/core@^7.16.10", "@babel/core@^7.17.8": 26 | version "7.20.7" 27 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" 28 | integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== 29 | dependencies: 30 | "@ampproject/remapping" "^2.1.0" 31 | "@babel/code-frame" "^7.18.6" 32 | "@babel/generator" "^7.20.7" 33 | "@babel/helper-compilation-targets" "^7.20.7" 34 | "@babel/helper-module-transforms" "^7.20.7" 35 | "@babel/helpers" "^7.20.7" 36 | "@babel/parser" "^7.20.7" 37 | "@babel/template" "^7.20.7" 38 | "@babel/traverse" "^7.20.7" 39 | "@babel/types" "^7.20.7" 40 | convert-source-map "^1.7.0" 41 | debug "^4.1.0" 42 | gensync "^1.0.0-beta.2" 43 | json5 "^2.2.1" 44 | semver "^6.3.0" 45 | 46 | "@babel/generator@^7.20.7": 47 | version "7.20.7" 48 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" 49 | integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== 50 | dependencies: 51 | "@babel/types" "^7.20.7" 52 | "@jridgewell/gen-mapping" "^0.3.2" 53 | jsesc "^2.5.1" 54 | 55 | "@babel/helper-annotate-as-pure@^7.18.6": 56 | version "7.18.6" 57 | resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 58 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 59 | dependencies: 60 | "@babel/types" "^7.18.6" 61 | 62 | "@babel/helper-compilation-targets@^7.20.7": 63 | version "7.20.7" 64 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" 65 | integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== 66 | dependencies: 67 | "@babel/compat-data" "^7.20.5" 68 | "@babel/helper-validator-option" "^7.18.6" 69 | browserslist "^4.21.3" 70 | lru-cache "^5.1.1" 71 | semver "^6.3.0" 72 | 73 | "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.7": 74 | version "7.20.7" 75 | resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f" 76 | integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w== 77 | dependencies: 78 | "@babel/helper-annotate-as-pure" "^7.18.6" 79 | "@babel/helper-environment-visitor" "^7.18.9" 80 | "@babel/helper-function-name" "^7.19.0" 81 | "@babel/helper-member-expression-to-functions" "^7.20.7" 82 | "@babel/helper-optimise-call-expression" "^7.18.6" 83 | "@babel/helper-replace-supers" "^7.20.7" 84 | "@babel/helper-split-export-declaration" "^7.18.6" 85 | 86 | "@babel/helper-environment-visitor@^7.18.9": 87 | version "7.18.9" 88 | resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 89 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 90 | 91 | "@babel/helper-function-name@^7.19.0": 92 | version "7.19.0" 93 | resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" 94 | integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== 95 | dependencies: 96 | "@babel/template" "^7.18.10" 97 | "@babel/types" "^7.19.0" 98 | 99 | "@babel/helper-hoist-variables@^7.18.6": 100 | version "7.18.6" 101 | resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 102 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 103 | dependencies: 104 | "@babel/types" "^7.18.6" 105 | 106 | "@babel/helper-member-expression-to-functions@^7.20.7": 107 | version "7.20.7" 108 | resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" 109 | integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== 110 | dependencies: 111 | "@babel/types" "^7.20.7" 112 | 113 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.18.6": 114 | version "7.18.6" 115 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 116 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 117 | dependencies: 118 | "@babel/types" "^7.18.6" 119 | 120 | "@babel/helper-module-transforms@^7.20.7": 121 | version "7.20.11" 122 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" 123 | integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== 124 | dependencies: 125 | "@babel/helper-environment-visitor" "^7.18.9" 126 | "@babel/helper-module-imports" "^7.18.6" 127 | "@babel/helper-simple-access" "^7.20.2" 128 | "@babel/helper-split-export-declaration" "^7.18.6" 129 | "@babel/helper-validator-identifier" "^7.19.1" 130 | "@babel/template" "^7.20.7" 131 | "@babel/traverse" "^7.20.10" 132 | "@babel/types" "^7.20.7" 133 | 134 | "@babel/helper-optimise-call-expression@^7.18.6": 135 | version "7.18.6" 136 | resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" 137 | integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== 138 | dependencies: 139 | "@babel/types" "^7.18.6" 140 | 141 | "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": 142 | version "7.20.2" 143 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" 144 | integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== 145 | 146 | "@babel/helper-replace-supers@^7.20.7": 147 | version "7.20.7" 148 | resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" 149 | integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== 150 | dependencies: 151 | "@babel/helper-environment-visitor" "^7.18.9" 152 | "@babel/helper-member-expression-to-functions" "^7.20.7" 153 | "@babel/helper-optimise-call-expression" "^7.18.6" 154 | "@babel/template" "^7.20.7" 155 | "@babel/traverse" "^7.20.7" 156 | "@babel/types" "^7.20.7" 157 | 158 | "@babel/helper-simple-access@^7.20.2": 159 | version "7.20.2" 160 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" 161 | integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== 162 | dependencies: 163 | "@babel/types" "^7.20.2" 164 | 165 | "@babel/helper-split-export-declaration@^7.18.6": 166 | version "7.18.6" 167 | resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 168 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 169 | dependencies: 170 | "@babel/types" "^7.18.6" 171 | 172 | "@babel/helper-string-parser@^7.19.4": 173 | version "7.19.4" 174 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" 175 | integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== 176 | 177 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": 178 | version "7.19.1" 179 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 180 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 181 | 182 | "@babel/helper-validator-option@^7.18.6": 183 | version "7.18.6" 184 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 185 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 186 | 187 | "@babel/helpers@^7.20.7": 188 | version "7.20.7" 189 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" 190 | integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== 191 | dependencies: 192 | "@babel/template" "^7.20.7" 193 | "@babel/traverse" "^7.20.7" 194 | "@babel/types" "^7.20.7" 195 | 196 | "@babel/highlight@^7.18.6": 197 | version "7.18.6" 198 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 199 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 200 | dependencies: 201 | "@babel/helper-validator-identifier" "^7.18.6" 202 | chalk "^2.0.0" 203 | js-tokens "^4.0.0" 204 | 205 | "@babel/parser@^7.16.10", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7": 206 | version "7.20.7" 207 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" 208 | integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== 209 | 210 | "@babel/plugin-proposal-class-properties@^7.16.7": 211 | version "7.18.6" 212 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" 213 | integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== 214 | dependencies: 215 | "@babel/helper-create-class-features-plugin" "^7.18.6" 216 | "@babel/helper-plugin-utils" "^7.18.6" 217 | 218 | "@babel/plugin-proposal-decorators@^7.16.7": 219 | version "7.20.7" 220 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" 221 | integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== 222 | dependencies: 223 | "@babel/helper-create-class-features-plugin" "^7.20.7" 224 | "@babel/helper-plugin-utils" "^7.20.2" 225 | "@babel/helper-replace-supers" "^7.20.7" 226 | "@babel/helper-split-export-declaration" "^7.18.6" 227 | "@babel/plugin-syntax-decorators" "^7.19.0" 228 | 229 | "@babel/plugin-syntax-decorators@^7.19.0": 230 | version "7.19.0" 231 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" 232 | integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== 233 | dependencies: 234 | "@babel/helper-plugin-utils" "^7.19.0" 235 | 236 | "@babel/plugin-syntax-import-meta@^7.10.4": 237 | version "7.10.4" 238 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" 239 | integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== 240 | dependencies: 241 | "@babel/helper-plugin-utils" "^7.10.4" 242 | 243 | "@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": 244 | version "7.18.6" 245 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" 246 | integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 247 | dependencies: 248 | "@babel/helper-plugin-utils" "^7.18.6" 249 | 250 | "@babel/plugin-syntax-typescript@^7.20.0": 251 | version "7.20.0" 252 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" 253 | integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== 254 | dependencies: 255 | "@babel/helper-plugin-utils" "^7.19.0" 256 | 257 | "@babel/plugin-transform-typescript@^7.16.8": 258 | version "7.20.7" 259 | resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" 260 | integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== 261 | dependencies: 262 | "@babel/helper-create-class-features-plugin" "^7.20.7" 263 | "@babel/helper-plugin-utils" "^7.20.2" 264 | "@babel/plugin-syntax-typescript" "^7.20.0" 265 | 266 | "@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7": 267 | version "7.20.7" 268 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" 269 | integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== 270 | dependencies: 271 | "@babel/code-frame" "^7.18.6" 272 | "@babel/parser" "^7.20.7" 273 | "@babel/types" "^7.20.7" 274 | 275 | "@babel/traverse@^7.0.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.7": 276 | version "7.20.10" 277 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz#2bf98239597fcec12f842756f186a9dde6d09230" 278 | integrity sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg== 279 | dependencies: 280 | "@babel/code-frame" "^7.18.6" 281 | "@babel/generator" "^7.20.7" 282 | "@babel/helper-environment-visitor" "^7.18.9" 283 | "@babel/helper-function-name" "^7.19.0" 284 | "@babel/helper-hoist-variables" "^7.18.6" 285 | "@babel/helper-split-export-declaration" "^7.18.6" 286 | "@babel/parser" "^7.20.7" 287 | "@babel/types" "^7.20.7" 288 | debug "^4.1.0" 289 | globals "^11.1.0" 290 | 291 | "@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7": 292 | version "7.20.7" 293 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" 294 | integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== 295 | dependencies: 296 | "@babel/helper-string-parser" "^7.19.4" 297 | "@babel/helper-validator-identifier" "^7.19.1" 298 | to-fast-properties "^2.0.0" 299 | 300 | "@esbuild/android-arm64@0.16.13": 301 | version "0.16.13" 302 | resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.13.tgz#1fc9bfbff0bac558008b2ad7242db1c8024d8cfd" 303 | integrity sha512-r4xetsd1ez1NF9/9R2f9Q6AlxqiZLwUqo7ICOcvEVwopVkXUcspIjEbJk0EVTgT6Cp5+ymzGPT6YNV0ievx4yA== 304 | 305 | "@esbuild/android-arm@0.16.13": 306 | version "0.16.13" 307 | resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.13.tgz#df3317286eed68c727daf39c2d585625f9c2f170" 308 | integrity sha512-JmtqThupn9Yf+FzANE+GG73ASUkssnPwOsndUElhp23685QzRK+MO1UompOlBaXV9D5FTuYcPnw7p4mCq2YbZQ== 309 | 310 | "@esbuild/android-x64@0.16.13": 311 | version "0.16.13" 312 | resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.13.tgz#c34826c4bdc57c60cbfb8d5bbd2306a89225626a" 313 | integrity sha512-hKt1bFht/Vtp0xJ0ZVzFMnPy1y1ycmM3KNnp3zsyZfQmw7nhs2WLO4vxdR5YG+6RsHKCb2zbZ3VwlC0Tij0qyA== 314 | 315 | "@esbuild/darwin-arm64@0.16.13": 316 | version "0.16.13" 317 | resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz#0b80c8580c262ccfb1203053201cf19c6f7b4cdb" 318 | integrity sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww== 319 | 320 | "@esbuild/darwin-x64@0.16.13": 321 | version "0.16.13" 322 | resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.13.tgz#f1a6c9ea67d4eaaf4944e1cbceb800eabc6e7e74" 323 | integrity sha512-Agajik9SBGiKD7FPXE+ExW6x3MgA/dUdpZnXa9y1tyfE4lKQx+eQiknSdrBnWPeqa9wL0AOvkhghmYhpVkyqkA== 324 | 325 | "@esbuild/freebsd-arm64@0.16.13": 326 | version "0.16.13" 327 | resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.13.tgz#d1a45ac5c4a1be566c4eefbadbe5a967288ad338" 328 | integrity sha512-KxMO3/XihBcHM+xQUM6nQZO1SgQuOsd1DCnKF1a4SIf/i5VD45vrqN3k8ePgFrEbMi7m5JeGmvNqwJXinF0a4Q== 329 | 330 | "@esbuild/freebsd-x64@0.16.13": 331 | version "0.16.13" 332 | resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.13.tgz#ec64a31cabb08343bb4520a221324b40509dffc8" 333 | integrity sha512-Ez15oqV1vwvZ30cVLeBW14BsWq/fdWNQGMOxxqaSJVQVLqHhvgfQ7gxGDiN9tpJdeQhqJO+Q0r02/Tce5+USNg== 334 | 335 | "@esbuild/linux-arm64@0.16.13": 336 | version "0.16.13" 337 | resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.13.tgz#e8db3c3751b32ecf801751424eae43f6863a2ee7" 338 | integrity sha512-qi5n7KwcGViyJeZeQnu8fB6dC3Mlm5PGaqSv2HhQDDx/MPvVfQGNMcv7zcBL4qk3FkuWhGVwXkjQ76x7R0PWlA== 339 | 340 | "@esbuild/linux-arm@0.16.13": 341 | version "0.16.13" 342 | resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.13.tgz#ac0c8e9f3db8d418f588ae250e9c66ffdcf3cd82" 343 | integrity sha512-18dLd2L3mda+iFj6sswyBMSh2UwniamD9M4DwPv8VM+9apRFlQ5IGKxBdumnTuOI4NvwwAernmUseWhYQ9k+rg== 344 | 345 | "@esbuild/linux-ia32@0.16.13": 346 | version "0.16.13" 347 | resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.13.tgz#41ee9bd3b7161ab681fab6cb3990a3f5c08a9940" 348 | integrity sha512-2489Xad9sr+6GD7nB913fUqpCsSwVwgskkQTq4Or2mZntSPYPebyJm8l1YruHo7oqYMTGV6RiwGE4gRo3H+EPQ== 349 | 350 | "@esbuild/linux-loong64@0.16.13": 351 | version "0.16.13" 352 | resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.13.tgz#e4a832708e0b47078b91413edcfdb6af88c854a3" 353 | integrity sha512-x8KplRu9Y43Px8I9YS+sPBwQ+fw44Mvp2BPVADopKDWz+h3fcj1BvRU58kxb89WObmwKX9sWdtYzepL4Fmx03A== 354 | 355 | "@esbuild/linux-mips64el@0.16.13": 356 | version "0.16.13" 357 | resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.13.tgz#30d8571b71e0b8bf25fc5ef11422221ed23cdacc" 358 | integrity sha512-qhhdWph9FLwD9rVVC/nUf7k2U4NZIA6/mGx0B7+O6PFV0GjmPA2E3zDQ4NUjq9P26E0DeAZy9akH9dYcUBRU7A== 359 | 360 | "@esbuild/linux-ppc64@0.16.13": 361 | version "0.16.13" 362 | resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.13.tgz#32a3855d4b79ba1d2b63dab592cb9f0d4a9ba485" 363 | integrity sha512-cVWAPKsrRVxI1jCeJHnYSbE3BrEU+pZTZK2gfao9HRxuc+3m4+RLfs3EVEpGLmMKEcWfVCB9wZ3yNxnknutGKQ== 364 | 365 | "@esbuild/linux-riscv64@0.16.13": 366 | version "0.16.13" 367 | resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.13.tgz#6139202858da8202724d7079102614c269524f34" 368 | integrity sha512-Agb7dbRyZWnmPn5Vvf0eyqaEUqSsaIUwwyInu2EoFTaIDRp093QU2M5alUyOooMLkRbD1WvqQNwx08Z/g+SAcQ== 369 | 370 | "@esbuild/linux-s390x@0.16.13": 371 | version "0.16.13" 372 | resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.13.tgz#df3550a51e4155cde31486e01d8121f078e959ae" 373 | integrity sha512-AqRBIrc/+kl08ahliNG+EyU+j41wIzQfwBTKpi80cCDiYvYFPuXjvzZsD9muiu58Isj0RVni9VgC4xK/AnSW4g== 374 | 375 | "@esbuild/linux-x64@0.16.13": 376 | version "0.16.13" 377 | resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.13.tgz#deb7951829ea5930e0d88440aeb5df0756ebb2d0" 378 | integrity sha512-S4wn2BimuhPcoArRtVrdHUKIymCCZcYAXQE47kUiX4yrUrEX2/ifn5eKNbZ5c1jJKUlh1gC2ESIN+iw3wQax3g== 379 | 380 | "@esbuild/netbsd-x64@0.16.13": 381 | version "0.16.13" 382 | resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.13.tgz#8cba08074263862138cc5c63ad7f9640fe3faa69" 383 | integrity sha512-2c8JWgfUMlQHTdaR5X3xNMwqOyad8kgeCupuVkdm3QkUOzGREjlTETQsK6oHifocYzDCo9FeKcUwsK356SdR+g== 384 | 385 | "@esbuild/openbsd-x64@0.16.13": 386 | version "0.16.13" 387 | resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.13.tgz#4ae19ac63c665424d248ba5c577618dd7bbcebd5" 388 | integrity sha512-Bwh+PmKD/LK+xBjqIpnYnKYj0fIyQJ0YpRxsn0F+WfzvQ2OA+GKDlf8AHosiCns26Q4Dje388jQVwfOBZ1GaFw== 389 | 390 | "@esbuild/sunos-x64@0.16.13": 391 | version "0.16.13" 392 | resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.13.tgz#592caacab6b2c7669cd869b51f66dc354da03fc2" 393 | integrity sha512-8wwk6f9XGnhrF94/DBdFM4Xm1JeCyGTCj67r516VS9yvBVQf3Rar54L+XPVDs/oZOokwH+XsktrgkuTMAmjntg== 394 | 395 | "@esbuild/win32-arm64@0.16.13": 396 | version "0.16.13" 397 | resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.13.tgz#965ebbe889e4221962250c55facaa1e48130c162" 398 | integrity sha512-Jmwbp/5ArLCiRAHC33ODfcrlIcbP/exXkOEUVkADNJC4e/so2jm+i8IQFvVX/lA2GWvK3GdgcN0VFfp9YITAbg== 399 | 400 | "@esbuild/win32-ia32@0.16.13": 401 | version "0.16.13" 402 | resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.13.tgz#1b04965bcf340ba4879b452ac32df63216d4c87e" 403 | integrity sha512-AX6WjntGjhJHzrPSVvjMD7grxt41koHfAOx6lxLorrpDwwIKKPaGDASPZgvFIZHTbwhOtILW6vAXxYPDsKpDJA== 404 | 405 | "@esbuild/win32-x64@0.16.13": 406 | version "0.16.13" 407 | resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.13.tgz#0b0989cf0e7887cb0f3124e705cee68a694b96dd" 408 | integrity sha512-A+U4gM6OOkPS03UgVU08GTpAAAxPsP/8Z4FmneGo4TaVSD99bK9gVJXlqUEPMO/htFXEAht2O6pX4ErtLY5tVg== 409 | 410 | "@jridgewell/gen-mapping@^0.1.0": 411 | version "0.1.1" 412 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" 413 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 414 | dependencies: 415 | "@jridgewell/set-array" "^1.0.0" 416 | "@jridgewell/sourcemap-codec" "^1.4.10" 417 | 418 | "@jridgewell/gen-mapping@^0.3.2": 419 | version "0.3.2" 420 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 421 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 422 | dependencies: 423 | "@jridgewell/set-array" "^1.0.1" 424 | "@jridgewell/sourcemap-codec" "^1.4.10" 425 | "@jridgewell/trace-mapping" "^0.3.9" 426 | 427 | "@jridgewell/resolve-uri@3.1.0": 428 | version "3.1.0" 429 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 430 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 431 | 432 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 433 | version "1.1.2" 434 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 435 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 436 | 437 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": 438 | version "1.4.14" 439 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 440 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 441 | 442 | "@jridgewell/trace-mapping@^0.3.9": 443 | version "0.3.17" 444 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" 445 | integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== 446 | dependencies: 447 | "@jridgewell/resolve-uri" "3.1.0" 448 | "@jridgewell/sourcemap-codec" "1.4.14" 449 | 450 | "@rollup/pluginutils@^4.1.1": 451 | version "4.2.1" 452 | resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" 453 | integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== 454 | dependencies: 455 | estree-walker "^2.0.1" 456 | picomatch "^2.2.2" 457 | 458 | "@vue/babel-helper-vue-jsx-merge-props@^1.2.1", "@vue/babel-helper-vue-jsx-merge-props@^1.4.0": 459 | version "1.4.0" 460 | resolved "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2" 461 | integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== 462 | 463 | "@vue/babel-helper-vue-transform-on@^1.0.2": 464 | version "1.0.2" 465 | resolved "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" 466 | integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== 467 | 468 | "@vue/babel-plugin-jsx@^1.1.1": 469 | version "1.1.1" 470 | resolved "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1" 471 | integrity sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w== 472 | dependencies: 473 | "@babel/helper-module-imports" "^7.0.0" 474 | "@babel/plugin-syntax-jsx" "^7.0.0" 475 | "@babel/template" "^7.0.0" 476 | "@babel/traverse" "^7.0.0" 477 | "@babel/types" "^7.0.0" 478 | "@vue/babel-helper-vue-transform-on" "^1.0.2" 479 | camelcase "^6.0.0" 480 | html-tags "^3.1.0" 481 | svg-tags "^1.0.0" 482 | 483 | "@vue/babel-plugin-transform-vue-jsx@^1.4.0": 484 | version "1.4.0" 485 | resolved "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz#4d4b3d46a39ea62b7467dd6e26ce47f7ceafb2fe" 486 | integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== 487 | dependencies: 488 | "@babel/helper-module-imports" "^7.0.0" 489 | "@babel/plugin-syntax-jsx" "^7.2.0" 490 | "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" 491 | html-tags "^2.0.0" 492 | lodash.kebabcase "^4.1.1" 493 | svg-tags "^1.0.0" 494 | 495 | "@vue/babel-preset-jsx@^1.2.4": 496 | version "1.4.0" 497 | resolved "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz#f4914ba314235ab097bc4372ed67473c0780bfcc" 498 | integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== 499 | dependencies: 500 | "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" 501 | "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" 502 | "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" 503 | "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" 504 | "@vue/babel-sugar-functional-vue" "^1.4.0" 505 | "@vue/babel-sugar-inject-h" "^1.4.0" 506 | "@vue/babel-sugar-v-model" "^1.4.0" 507 | "@vue/babel-sugar-v-on" "^1.4.0" 508 | 509 | "@vue/babel-sugar-composition-api-inject-h@^1.4.0": 510 | version "1.4.0" 511 | resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz#187e1389f8871d89ece743bb50aed713be9d6c85" 512 | integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== 513 | dependencies: 514 | "@babel/plugin-syntax-jsx" "^7.2.0" 515 | 516 | "@vue/babel-sugar-composition-api-render-instance@^1.4.0": 517 | version "1.4.0" 518 | resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz#2c1607ae6dffdab47e785bc01fa45ba756e992c1" 519 | integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== 520 | dependencies: 521 | "@babel/plugin-syntax-jsx" "^7.2.0" 522 | 523 | "@vue/babel-sugar-functional-vue@^1.4.0": 524 | version "1.4.0" 525 | resolved "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz#60da31068567082287c7337c66ef4df04e0a1029" 526 | integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== 527 | dependencies: 528 | "@babel/plugin-syntax-jsx" "^7.2.0" 529 | 530 | "@vue/babel-sugar-inject-h@^1.4.0": 531 | version "1.4.0" 532 | resolved "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz#bf39aa6631fb1d0399b1c49b4c59e1c8899b4363" 533 | integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== 534 | dependencies: 535 | "@babel/plugin-syntax-jsx" "^7.2.0" 536 | 537 | "@vue/babel-sugar-v-model@^1.4.0": 538 | version "1.4.0" 539 | resolved "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz#a51d986609f430c4f70ada3a93cc560a2970f720" 540 | integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== 541 | dependencies: 542 | "@babel/plugin-syntax-jsx" "^7.2.0" 543 | "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" 544 | "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" 545 | camelcase "^5.0.0" 546 | html-tags "^2.0.0" 547 | svg-tags "^1.0.0" 548 | 549 | "@vue/babel-sugar-v-on@^1.4.0": 550 | version "1.4.0" 551 | resolved "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz#43b7106a9672d8cbeefc0eb8afe1d376edc6166e" 552 | integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== 553 | dependencies: 554 | "@babel/plugin-syntax-jsx" "^7.2.0" 555 | "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" 556 | camelcase "^5.0.0" 557 | 558 | "@vue/compiler-core@3.2.45": 559 | version "3.2.45" 560 | resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" 561 | integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== 562 | dependencies: 563 | "@babel/parser" "^7.16.4" 564 | "@vue/shared" "3.2.45" 565 | estree-walker "^2.0.2" 566 | source-map "^0.6.1" 567 | 568 | "@vue/compiler-dom@^3.2.31": 569 | version "3.2.45" 570 | resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" 571 | integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== 572 | dependencies: 573 | "@vue/compiler-core" "3.2.45" 574 | "@vue/shared" "3.2.45" 575 | 576 | "@vue/component-compiler-utils@^3.2.2": 577 | version "3.3.0" 578 | resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" 579 | integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== 580 | dependencies: 581 | consolidate "^0.15.1" 582 | hash-sum "^1.0.2" 583 | lru-cache "^4.1.2" 584 | merge-source-map "^1.1.0" 585 | postcss "^7.0.36" 586 | postcss-selector-parser "^6.0.2" 587 | source-map "~0.6.1" 588 | vue-template-es2015-compiler "^1.9.0" 589 | optionalDependencies: 590 | prettier "^1.18.2 || ^2.0.0" 591 | 592 | "@vue/composition-api@^1.4.9": 593 | version "1.7.1" 594 | resolved "https://registry.npmjs.org/@vue/composition-api/-/composition-api-1.7.1.tgz#aa6831be5a12817d93e89e247460c310dd7a3a32" 595 | integrity sha512-xDWoEtxGXhH9Ku3ROYX/rzhcpt4v31hpPU5zF3UeVC/qxA3dChmqU8zvTUYoKh3j7rzpNsoFOwqsWG7XPMlaFA== 596 | 597 | "@vue/shared@3.2.45": 598 | version "3.2.45" 599 | resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" 600 | integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== 601 | 602 | ansi-styles@^3.2.1: 603 | version "3.2.1" 604 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 605 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 606 | dependencies: 607 | color-convert "^1.9.0" 608 | 609 | ansi-styles@^4.1.0: 610 | version "4.3.0" 611 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 612 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 613 | dependencies: 614 | color-convert "^2.0.1" 615 | 616 | anymatch@~3.1.2: 617 | version "3.1.3" 618 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 619 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 620 | dependencies: 621 | normalize-path "^3.0.0" 622 | picomatch "^2.0.4" 623 | 624 | at-least-node@^1.0.0: 625 | version "1.0.0" 626 | resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 627 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 628 | 629 | binary-extensions@^2.0.0: 630 | version "2.2.0" 631 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 632 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 633 | 634 | bluebird@^3.1.1, bluebird@^3.7.2: 635 | version "3.7.2" 636 | resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 637 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 638 | 639 | braces@~3.0.2: 640 | version "3.0.2" 641 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 642 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 643 | dependencies: 644 | fill-range "^7.0.1" 645 | 646 | browserslist@^4.21.3: 647 | version "4.21.4" 648 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" 649 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 650 | dependencies: 651 | caniuse-lite "^1.0.30001400" 652 | electron-to-chromium "^1.4.251" 653 | node-releases "^2.0.6" 654 | update-browserslist-db "^1.0.9" 655 | 656 | builtins@^4.0.0: 657 | version "4.1.0" 658 | resolved "https://registry.npmjs.org/builtins/-/builtins-4.1.0.tgz#1edd016dd91ce771a1ed6fc3b2b71fb918953250" 659 | integrity sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w== 660 | dependencies: 661 | semver "^7.0.0" 662 | 663 | camelcase@^5.0.0: 664 | version "5.3.1" 665 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 666 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 667 | 668 | camelcase@^6.0.0: 669 | version "6.3.0" 670 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 671 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 672 | 673 | caniuse-lite@^1.0.30001400: 674 | version "1.0.30001441" 675 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" 676 | integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== 677 | 678 | chalk@4.1.2: 679 | version "4.1.2" 680 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 681 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 682 | dependencies: 683 | ansi-styles "^4.1.0" 684 | supports-color "^7.1.0" 685 | 686 | chalk@^2.0.0: 687 | version "2.4.2" 688 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 689 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 690 | dependencies: 691 | ansi-styles "^3.2.1" 692 | escape-string-regexp "^1.0.5" 693 | supports-color "^5.3.0" 694 | 695 | "chokidar@>=3.0.0 <4.0.0": 696 | version "3.5.3" 697 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 698 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 699 | dependencies: 700 | anymatch "~3.1.2" 701 | braces "~3.0.2" 702 | glob-parent "~5.1.2" 703 | is-binary-path "~2.1.0" 704 | is-glob "~4.0.1" 705 | normalize-path "~3.0.0" 706 | readdirp "~3.6.0" 707 | optionalDependencies: 708 | fsevents "~2.3.2" 709 | 710 | color-convert@^1.9.0: 711 | version "1.9.3" 712 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 713 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 714 | dependencies: 715 | color-name "1.1.3" 716 | 717 | color-convert@^2.0.1: 718 | version "2.0.1" 719 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 720 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 721 | dependencies: 722 | color-name "~1.1.4" 723 | 724 | color-name@1.1.3: 725 | version "1.1.3" 726 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 727 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 728 | 729 | color-name@~1.1.4: 730 | version "1.1.4" 731 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 732 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 733 | 734 | consolidate@^0.15.1: 735 | version "0.15.1" 736 | resolved "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" 737 | integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== 738 | dependencies: 739 | bluebird "^3.1.1" 740 | 741 | consolidate@^0.16.0: 742 | version "0.16.0" 743 | resolved "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" 744 | integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== 745 | dependencies: 746 | bluebird "^3.7.2" 747 | 748 | convert-source-map@^1.7.0: 749 | version "1.9.0" 750 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" 751 | integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== 752 | 753 | cross-spawn@^7.0.3: 754 | version "7.0.3" 755 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 756 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 757 | dependencies: 758 | path-key "^3.1.0" 759 | shebang-command "^2.0.0" 760 | which "^2.0.1" 761 | 762 | cssesc@^3.0.0: 763 | version "3.0.0" 764 | resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 765 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 766 | 767 | de-indent@^1.0.2: 768 | version "1.0.2" 769 | resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 770 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 771 | 772 | debug@^4.1.0, debug@^4.3.2, debug@^4.3.4: 773 | version "4.3.4" 774 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 775 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 776 | dependencies: 777 | ms "2.1.2" 778 | 779 | electron-to-chromium@^1.4.251: 780 | version "1.4.284" 781 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" 782 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== 783 | 784 | esbuild-node-loader@^0.6.5: 785 | version "0.6.5" 786 | resolved "https://registry.npmjs.org/esbuild-node-loader/-/esbuild-node-loader-0.6.5.tgz#c0aad436d01542150a8297b99dab71aa82add818" 787 | integrity sha512-uPP+dllWm38cFvDysdocutN3lfe5pTIbddAHp1ENyLzpHYqE2r+3Wo+pfg9X3p8DFWwzIisft5YkeBIthIcixw== 788 | dependencies: 789 | esbuild ">=0.13.12" 790 | 791 | esbuild-register@^3.3.2: 792 | version "3.4.2" 793 | resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz#1e39ee0a77e8f320a9790e68c64c3559620b9175" 794 | integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== 795 | dependencies: 796 | debug "^4.3.4" 797 | 798 | esbuild@>=0.13.0, esbuild@>=0.13.12: 799 | version "0.16.13" 800 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.16.13.tgz#83cd347c28221268bbfa0425db532d7d05f85b48" 801 | integrity sha512-oYwFdSEIoKM1oYzyem1osgKJAvg5447XF+05ava21fOtilyb2HeQQh26/74K4WeAk5dZmj/Mx10zUqUnI14jhA== 802 | optionalDependencies: 803 | "@esbuild/android-arm" "0.16.13" 804 | "@esbuild/android-arm64" "0.16.13" 805 | "@esbuild/android-x64" "0.16.13" 806 | "@esbuild/darwin-arm64" "0.16.13" 807 | "@esbuild/darwin-x64" "0.16.13" 808 | "@esbuild/freebsd-arm64" "0.16.13" 809 | "@esbuild/freebsd-x64" "0.16.13" 810 | "@esbuild/linux-arm" "0.16.13" 811 | "@esbuild/linux-arm64" "0.16.13" 812 | "@esbuild/linux-ia32" "0.16.13" 813 | "@esbuild/linux-loong64" "0.16.13" 814 | "@esbuild/linux-mips64el" "0.16.13" 815 | "@esbuild/linux-ppc64" "0.16.13" 816 | "@esbuild/linux-riscv64" "0.16.13" 817 | "@esbuild/linux-s390x" "0.16.13" 818 | "@esbuild/linux-x64" "0.16.13" 819 | "@esbuild/netbsd-x64" "0.16.13" 820 | "@esbuild/openbsd-x64" "0.16.13" 821 | "@esbuild/sunos-x64" "0.16.13" 822 | "@esbuild/win32-arm64" "0.16.13" 823 | "@esbuild/win32-ia32" "0.16.13" 824 | "@esbuild/win32-x64" "0.16.13" 825 | 826 | escalade@^3.1.1: 827 | version "3.1.1" 828 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 829 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 830 | 831 | escape-string-regexp@^1.0.5: 832 | version "1.0.5" 833 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 834 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 835 | 836 | esno@^0.14.1: 837 | version "0.14.1" 838 | resolved "https://registry.npmjs.org/esno/-/esno-0.14.1.tgz#b7557b3c70eda5ae0c3f0daa07739b8337526610" 839 | integrity sha512-yDFYw6dGUjCT1qKsdG7WOc/RzIh/qwxUEVZ+ohCltaxBxEFMNqeqbQL9xjRl6Yvdwrfc5OCjUA9JbFmuu/8BKg== 840 | dependencies: 841 | cross-spawn "^7.0.3" 842 | esbuild ">=0.13.0" 843 | esbuild-node-loader "^0.6.5" 844 | esbuild-register "^3.3.2" 845 | import-meta-resolve "^1.1.1" 846 | 847 | estree-walker@^2.0.1, estree-walker@^2.0.2: 848 | version "2.0.2" 849 | resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 850 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 851 | 852 | fill-range@^7.0.1: 853 | version "7.0.1" 854 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 855 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 856 | dependencies: 857 | to-regex-range "^5.0.1" 858 | 859 | fs-extra@^9.1.0: 860 | version "9.1.0" 861 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 862 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 863 | dependencies: 864 | at-least-node "^1.0.0" 865 | graceful-fs "^4.2.0" 866 | jsonfile "^6.0.1" 867 | universalify "^2.0.0" 868 | 869 | fsevents@~2.3.2: 870 | version "2.3.2" 871 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 872 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 873 | 874 | gensync@^1.0.0-beta.2: 875 | version "1.0.0-beta.2" 876 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 877 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 878 | 879 | glob-parent@~5.1.2: 880 | version "5.1.2" 881 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 882 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 883 | dependencies: 884 | is-glob "^4.0.1" 885 | 886 | globals@^11.1.0: 887 | version "11.12.0" 888 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 889 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 890 | 891 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 892 | version "4.2.10" 893 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 894 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 895 | 896 | has-flag@^3.0.0: 897 | version "3.0.0" 898 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 899 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 900 | 901 | has-flag@^4.0.0: 902 | version "4.0.0" 903 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 904 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 905 | 906 | hash-sum@^1.0.2: 907 | version "1.0.2" 908 | resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" 909 | integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== 910 | 911 | hash-sum@^2.0.0: 912 | version "2.0.0" 913 | resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" 914 | integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== 915 | 916 | he@^1.1.0: 917 | version "1.2.0" 918 | resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 919 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 920 | 921 | html-tags@^2.0.0: 922 | version "2.0.0" 923 | resolved "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" 924 | integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g== 925 | 926 | html-tags@^3.1.0: 927 | version "3.2.0" 928 | resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" 929 | integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== 930 | 931 | immutable@^4.0.0: 932 | version "4.2.1" 933 | resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz#8a4025691018c560a40c67e43d698f816edc44d4" 934 | integrity sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ== 935 | 936 | import-meta-resolve@^1.1.1: 937 | version "1.1.1" 938 | resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz#244fd542fd1fae73550d4f8b3cde3bba1d7b2b18" 939 | integrity sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A== 940 | dependencies: 941 | builtins "^4.0.0" 942 | 943 | is-binary-path@~2.1.0: 944 | version "2.1.0" 945 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 946 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 947 | dependencies: 948 | binary-extensions "^2.0.0" 949 | 950 | is-extglob@^2.1.1: 951 | version "2.1.1" 952 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 953 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 954 | 955 | is-glob@^4.0.1, is-glob@~4.0.1: 956 | version "4.0.3" 957 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 958 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 959 | dependencies: 960 | is-extglob "^2.1.1" 961 | 962 | is-number@^7.0.0: 963 | version "7.0.0" 964 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 965 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 966 | 967 | isexe@^2.0.0: 968 | version "2.0.0" 969 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 970 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 971 | 972 | js-tokens@^4.0.0: 973 | version "4.0.0" 974 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 975 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 976 | 977 | jsesc@^2.5.1: 978 | version "2.5.2" 979 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 980 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 981 | 982 | json5@^2.2.1: 983 | version "2.2.3" 984 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 985 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 986 | 987 | jsonfile@^6.0.1: 988 | version "6.1.0" 989 | resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 990 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 991 | dependencies: 992 | universalify "^2.0.0" 993 | optionalDependencies: 994 | graceful-fs "^4.1.6" 995 | 996 | kolorist@^1.5.1: 997 | version "1.6.0" 998 | resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.6.0.tgz#f43ac794305b30032a5bedcae7799d0f91d2ff36" 999 | integrity sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ== 1000 | 1001 | lodash.kebabcase@^4.1.1: 1002 | version "4.1.1" 1003 | resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 1004 | integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== 1005 | 1006 | lru-cache@^4.1.2: 1007 | version "4.1.5" 1008 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1009 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1010 | dependencies: 1011 | pseudomap "^1.0.2" 1012 | yallist "^2.1.2" 1013 | 1014 | lru-cache@^5.1.1: 1015 | version "5.1.1" 1016 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1017 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1018 | dependencies: 1019 | yallist "^3.0.2" 1020 | 1021 | lru-cache@^6.0.0: 1022 | version "6.0.0" 1023 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1024 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1025 | dependencies: 1026 | yallist "^4.0.0" 1027 | 1028 | magic-string@^0.25.7: 1029 | version "0.25.9" 1030 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 1031 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 1032 | dependencies: 1033 | sourcemap-codec "^1.4.8" 1034 | 1035 | magic-string@^0.26.1: 1036 | version "0.26.7" 1037 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" 1038 | integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== 1039 | dependencies: 1040 | sourcemap-codec "^1.4.8" 1041 | 1042 | merge-source-map@^1.1.0: 1043 | version "1.1.0" 1044 | resolved "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" 1045 | integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== 1046 | dependencies: 1047 | source-map "^0.6.1" 1048 | 1049 | ms@2.1.2: 1050 | version "2.1.2" 1051 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1052 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1053 | 1054 | node-releases@^2.0.6: 1055 | version "2.0.8" 1056 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" 1057 | integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== 1058 | 1059 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1060 | version "3.0.0" 1061 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1062 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1063 | 1064 | path-key@^3.1.0: 1065 | version "3.1.1" 1066 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1067 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1068 | 1069 | picocolors@^0.2.1: 1070 | version "0.2.1" 1071 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" 1072 | integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== 1073 | 1074 | picocolors@^1.0.0: 1075 | version "1.0.0" 1076 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1077 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1078 | 1079 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: 1080 | version "2.3.1" 1081 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1082 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1083 | 1084 | postcss-selector-parser@^6.0.2: 1085 | version "6.0.11" 1086 | resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" 1087 | integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== 1088 | dependencies: 1089 | cssesc "^3.0.0" 1090 | util-deprecate "^1.0.2" 1091 | 1092 | postcss@^7.0.36: 1093 | version "7.0.39" 1094 | resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" 1095 | integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== 1096 | dependencies: 1097 | picocolors "^0.2.1" 1098 | source-map "^0.6.1" 1099 | 1100 | "prettier@^1.18.2 || ^2.0.0", prettier@^2.4.1: 1101 | version "2.8.1" 1102 | resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" 1103 | integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== 1104 | 1105 | pseudomap@^1.0.2: 1106 | version "1.0.2" 1107 | resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1108 | integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== 1109 | 1110 | querystring@^0.2.1: 1111 | version "0.2.1" 1112 | resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" 1113 | integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== 1114 | 1115 | readdirp@~3.6.0: 1116 | version "3.6.0" 1117 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1118 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1119 | dependencies: 1120 | picomatch "^2.2.1" 1121 | 1122 | rollup@^2.58.0: 1123 | version "2.79.1" 1124 | resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" 1125 | integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== 1126 | optionalDependencies: 1127 | fsevents "~2.3.2" 1128 | 1129 | sass@^1.49.9: 1130 | version "1.57.1" 1131 | resolved "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" 1132 | integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== 1133 | dependencies: 1134 | chokidar ">=3.0.0 <4.0.0" 1135 | immutable "^4.0.0" 1136 | source-map-js ">=0.6.2 <2.0.0" 1137 | 1138 | semver@^6.3.0: 1139 | version "6.3.0" 1140 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1141 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1142 | 1143 | semver@^7.0.0: 1144 | version "7.3.8" 1145 | resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 1146 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 1147 | dependencies: 1148 | lru-cache "^6.0.0" 1149 | 1150 | shebang-command@^2.0.0: 1151 | version "2.0.0" 1152 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1153 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1154 | dependencies: 1155 | shebang-regex "^3.0.0" 1156 | 1157 | shebang-regex@^3.0.0: 1158 | version "3.0.0" 1159 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1160 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1161 | 1162 | shell-quote@^1.7.3: 1163 | version "1.7.4" 1164 | resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" 1165 | integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== 1166 | 1167 | slash@^3.0.0: 1168 | version "3.0.0" 1169 | resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1170 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1171 | 1172 | "source-map-js@>=0.6.2 <2.0.0": 1173 | version "1.0.2" 1174 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1175 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1176 | 1177 | source-map@^0.6.1, source-map@~0.6.1: 1178 | version "0.6.1" 1179 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1180 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1181 | 1182 | source-map@^0.7.3: 1183 | version "0.7.4" 1184 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" 1185 | integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== 1186 | 1187 | sourcemap-codec@^1.4.8: 1188 | version "1.4.8" 1189 | resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1190 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1191 | 1192 | supports-color@^5.3.0: 1193 | version "5.5.0" 1194 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1195 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1196 | dependencies: 1197 | has-flag "^3.0.0" 1198 | 1199 | supports-color@^7.1.0: 1200 | version "7.2.0" 1201 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1202 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1203 | dependencies: 1204 | has-flag "^4.0.0" 1205 | 1206 | svg-tags@^1.0.0: 1207 | version "1.0.0" 1208 | resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" 1209 | integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== 1210 | 1211 | to-fast-properties@^2.0.0: 1212 | version "2.0.0" 1213 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1214 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1215 | 1216 | to-regex-range@^5.0.1: 1217 | version "5.0.1" 1218 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1219 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1220 | dependencies: 1221 | is-number "^7.0.0" 1222 | 1223 | universalify@^2.0.0: 1224 | version "2.0.0" 1225 | resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 1226 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 1227 | 1228 | update-browserslist-db@^1.0.9: 1229 | version "1.0.10" 1230 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" 1231 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== 1232 | dependencies: 1233 | escalade "^3.1.1" 1234 | picocolors "^1.0.0" 1235 | 1236 | util-deprecate@^1.0.2: 1237 | version "1.0.2" 1238 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1239 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1240 | 1241 | "vite-plugin-vue-inspector@workspace:*": 1242 | version "2.0.4" 1243 | resolved "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-2.0.4.tgz#32b9b77266903fbe9f8d8651efd6fb40f6ebdfc1" 1244 | integrity sha512-Hl2ptAOoP5I/w9O0U8/SqOt+fmkuPpj1jBt1/tHCyU5ByEezRksY5yqAxeg+a0CTe0Cb8VAQ1s881p62gOCvEw== 1245 | dependencies: 1246 | "@babel/core" "^7.17.8" 1247 | "@babel/plugin-syntax-import-meta" "^7.10.4" 1248 | "@babel/plugin-transform-typescript" "^7.16.8" 1249 | "@vue/babel-plugin-jsx" "^1.1.1" 1250 | "@vue/compiler-dom" "^3.2.31" 1251 | chalk "4.1.2" 1252 | esno "^0.14.1" 1253 | kolorist "^1.5.1" 1254 | magic-string "^0.26.1" 1255 | shell-quote "^1.7.3" 1256 | 1257 | vite-plugin-vue2@^1.9.3: 1258 | version "1.9.3" 1259 | resolved "https://registry.npmjs.org/vite-plugin-vue2/-/vite-plugin-vue2-1.9.3.tgz#a73363e70d7fe6e420a52890ca650d3d270245f5" 1260 | integrity sha512-0KhHSEeht0VHJtt4Z2cJ9bWBq4dP3HoXpapqAHV+f+cUa6KywYdOd+z6sSGLpuGjN8F9YinrFIo8dfVmMOpc8Q== 1261 | dependencies: 1262 | "@babel/core" "^7.16.10" 1263 | "@babel/parser" "^7.16.10" 1264 | "@babel/plugin-proposal-class-properties" "^7.16.7" 1265 | "@babel/plugin-proposal-decorators" "^7.16.7" 1266 | "@babel/plugin-transform-typescript" "^7.16.8" 1267 | "@rollup/pluginutils" "^4.1.1" 1268 | "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" 1269 | "@vue/babel-preset-jsx" "^1.2.4" 1270 | "@vue/component-compiler-utils" "^3.2.2" 1271 | consolidate "^0.16.0" 1272 | debug "^4.3.2" 1273 | fs-extra "^9.1.0" 1274 | hash-sum "^2.0.0" 1275 | magic-string "^0.25.7" 1276 | prettier "^2.4.1" 1277 | querystring "^0.2.1" 1278 | rollup "^2.58.0" 1279 | slash "^3.0.0" 1280 | source-map "^0.7.3" 1281 | vue-template-es2015-compiler "^1.9.1" 1282 | 1283 | vue-template-compiler@2.6.14: 1284 | version "2.6.14" 1285 | resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" 1286 | integrity sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g== 1287 | dependencies: 1288 | de-indent "^1.0.2" 1289 | he "^1.1.0" 1290 | 1291 | vue-template-es2015-compiler@^1.9.0, vue-template-es2015-compiler@^1.9.1: 1292 | version "1.9.1" 1293 | resolved "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" 1294 | integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== 1295 | 1296 | vue@2.6.14: 1297 | version "2.6.14" 1298 | resolved "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" 1299 | integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== 1300 | 1301 | which@^2.0.1: 1302 | version "2.0.2" 1303 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1304 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1305 | dependencies: 1306 | isexe "^2.0.0" 1307 | 1308 | yallist@^2.1.2: 1309 | version "2.1.2" 1310 | resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1311 | integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== 1312 | 1313 | yallist@^3.0.2: 1314 | version "3.1.1" 1315 | resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1316 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1317 | 1318 | yallist@^4.0.0: 1319 | version "4.0.0" 1320 | resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1321 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1322 | -------------------------------------------------------------------------------- /packages/playground/vue3/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/playground/vue3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground-vue3", 3 | "private": true, 4 | "scripts": { 5 | "dev": "nodemon -w ../../packages/core/dist --exec \"vite dev\"", 6 | "build": "vite build" 7 | }, 8 | "dependencies": { 9 | "vue": "^3.3.4" 10 | }, 11 | "devDependencies": { 12 | "@vitejs/plugin-vue": "^4.3.4", 13 | "@vitejs/plugin-vue-jsx": "^3.0.2", 14 | "@vue/compiler-sfc": "^3.3.4", 15 | "sass": "^1.68.0", 16 | "vite-plugin-vue-inspector": "workspace:*" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/App.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 30 | 31 | 47 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/ExternalComp.vue: -------------------------------------------------------------------------------- 1 | 2 | 30 | 31 | 37 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/Hi.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 21 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/Welcome.tsx: -------------------------------------------------------------------------------- 1 | import { defineComponent } from 'vue' 2 | 3 | export default defineComponent({ 4 | name: 'Welcome', 5 | setup() { 6 | const text = 'Welcome to here 🚀 .' 7 | return () => ( 8 |

9 | {text} 10 | 11 |

12 | ) 13 | }, 14 | }) 15 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/index.css: -------------------------------------------------------------------------------- 1 | #app { 2 | width: 100vw; 3 | height: 100vh; 4 | font-family: Avenir, Helvetica, Arial, sans-serif; 5 | -webkit-font-smoothing: antialiased; 6 | -moz-osx-font-smoothing: grayscale; 7 | text-align: center; 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | } 12 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import './index.css' 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /packages/playground/vue3/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.vue" { 2 | import { defineComponent } from "vue" 3 | const Component: ReturnType 4 | export default Component 5 | } 6 | -------------------------------------------------------------------------------- /packages/playground/vue3/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import Vue from '@vitejs/plugin-vue' 3 | import VueJsx from '@vitejs/plugin-vue-jsx' 4 | import Inspector from 'vite-plugin-vue-inspector' 5 | import Inspect from 'vite-plugin-inspect' 6 | 7 | export default defineConfig({ 8 | plugins: [ 9 | Vue(), 10 | VueJsx(), 11 | Inspector({ 12 | enabled: true, 13 | toggleButtonVisibility: 'always', 14 | launchEditor: 'cursor', 15 | }), 16 | Inspect(), 17 | ], 18 | }) 19 | -------------------------------------------------------------------------------- /packages/unplugin/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # unplugin-vue-inspector 2 | 3 | ## 2.3.1 4 | 5 | ### Patch Changes 6 | 7 | - chore: support vite6 8 | - Updated dependencies 9 | - vite-plugin-vue-inspector@5.3.1 10 | 11 | ## 2.3.0 12 | 13 | ### Minor Changes 14 | 15 | - feat: cursor support 16 | 17 | ### Patch Changes 18 | 19 | - Updated dependencies 20 | - vite-plugin-vue-inspector@5.3.0 21 | 22 | ## 2.2.0 23 | 24 | ### Minor Changes 25 | 26 | - feat: inspect external component (#91) 27 | - feat: introduce reduceMotion option (#102) 28 | - chore: adjust the position of floating elements on the x-axis (#105) 29 | - feat: exclude template tag to support jsx-directive (#106) 30 | 31 | ### Patch Changes 32 | 33 | - Updated dependencies 34 | - vite-plugin-vue-inspector@5.2.0 35 | 36 | ## 2.1.3 37 | 38 | ### Patch Changes 39 | 40 | - fix: escaping special characters 41 | - Updated dependencies 42 | - vite-plugin-vue-inspector@5.1.3 43 | 44 | ## 2.1.2 45 | 46 | ### Patch Changes 47 | 48 | - fix: remove the available launch editors limit 49 | - Updated dependencies 50 | - vite-plugin-vue-inspector@5.1.2 51 | 52 | ## 2.1.1 53 | 54 | ### Patch Changes 55 | 56 | - feat: respect user `process.env.LAUNCH_EDITOR` setting (#93) 57 | 58 | - feat: add `onEnabled / onDisabled` callbacks (#94) 59 | 60 | ## 2.1.0 61 | 62 | ### Minor Changes 63 | 64 | - feat: introducing launchEditor option 65 | 66 | ### Patch Changes 67 | 68 | - Updated dependencies 69 | - vite-plugin-vue-inspector@5.1.0 70 | 71 | ## 2.0.1 72 | 73 | ### Patch Changes 74 | 75 | - fix: `openInEditor` types 76 | - Updated dependencies 77 | - vite-plugin-vue-inspector@5.0.1 78 | 79 | ## 2.0.0 80 | 81 | ### Major Changes 82 | 83 | - fix: open-in-editor base url, deprecated `openInEditorHost` option 84 | 85 | ### Patch Changes 86 | 87 | - Updated dependencies 88 | - vite-plugin-vue-inspector@5.0.0 89 | 90 | ## 1.0.2 91 | 92 | ### Patch Changes 93 | 94 | - feat: respect vite base path option 95 | - Updated dependencies 96 | - vite-plugin-vue-inspector@4.0.2 97 | 98 | ## 1.0.1 99 | 100 | ### Patch Changes 101 | 102 | - feat: support vite5 103 | - Updated dependencies 104 | - vite-plugin-vue-inspector@4.0.1 105 | 106 | ## 1.0.0 107 | 108 | ### Major Changes 109 | 110 | - feat!: hide data-v-inspector in html (#81) 111 | 112 | ### Patch Changes 113 | 114 | - Updated dependencies 115 | - vite-plugin-vue-inspector@4.0.0 116 | 117 | ## 0.5.2 118 | 119 | ### Patch Changes 120 | 121 | - perf: remove unnecessary dependencies (#80) 122 | - Updated dependencies 123 | - vite-plugin-vue-inspector@3.7.2 124 | 125 | ## 0.5.1 126 | 127 | ### Patch Changes 128 | 129 | - fix: respect `server.port` when setting custom host (#74) 130 | - Updated dependencies 131 | - vite-plugin-vue-inspector@3.7.1 132 | 133 | ## 0.5.0 134 | 135 | ### Minor Changes 136 | 137 | - feat: close overlay when resizing the window (#71) 138 | 139 | - feat: introducing `disableInspectorOnEditorOpen` option (#77) 140 | 141 | - feat: support `decorators` and `import-attributes` syntax (#79) 142 | 143 | ### Patch Changes 144 | 145 | - Updated dependencies 146 | - vite-plugin-vue-inspector@3.7.0 147 | 148 | ## 0.4.0 149 | 150 | ### Minor Changes 151 | 152 | - feat: introducing `lazyLoad` option 153 | 154 | ### Patch Changes 155 | 156 | - Updated dependencies 157 | - vite-plugin-vue-inspector@3.6.0 158 | 159 | ## 0.3.0 160 | 161 | ### Minor Changes 162 | 163 | - chore: release 164 | 165 | ### Patch Changes 166 | 167 | - Updated dependencies 168 | - vite-plugin-vue-inspector@3.5.0 169 | 170 | ## 0.2.5 171 | 172 | ### Patch Changes 173 | 174 | - fix: normalize path in `data-v-inspector` attribute 175 | - Updated dependencies 176 | - vite-plugin-vue-inspector@3.4.2 177 | 178 | ## 0.2.4 179 | 180 | ### Patch Changes 181 | 182 | - fix: inspector path and hide injected app in Vue devtools 183 | - Updated dependencies 184 | - vite-plugin-vue-inspector@3.4.1 185 | 186 | ## 0.2.3 187 | 188 | ### Patch Changes 189 | 190 | - fix: compactible with Nuxt 3.3 191 | - Updated dependencies 192 | - vite-plugin-vue-inspector@3.4.0 193 | 194 | ## 0.2.2 195 | 196 | ### Patch Changes 197 | 198 | - fix: jsx self-closing tags handle 199 | - Updated dependencies 200 | - vite-plugin-vue-inspector@3.3.2 201 | 202 | ## 0.2.1 203 | 204 | ### Patch Changes 205 | 206 | - fix: combo key name 207 | - Updated dependencies 208 | - vite-plugin-vue-inspector@3.3.1 209 | 210 | ## 0.2.0 211 | 212 | ### Minor Changes 213 | 214 | - feat: disable toggleComboKey option 215 | 216 | ### Patch Changes 217 | 218 | - Updated dependencies 219 | - vite-plugin-vue-inspector@3.3.0 220 | 221 | ## 0.1.2 222 | 223 | ### Patch Changes 224 | 225 | - feat: append attribute at the end 226 | - Updated dependencies 227 | - vite-plugin-vue-inspector@3.2.2 228 | 229 | ## 0.1.1 230 | 231 | ### Patch Changes 232 | 233 | - introduce `data-v-inspector-ignore` options 234 | - Updated dependencies 235 | - vite-plugin-vue-inspector@3.2.1 236 | 237 | ## 0.1.0 238 | 239 | ### Minor Changes 240 | 241 | - release 242 | 243 | ### Patch Changes 244 | 245 | - Updated dependencies 246 | - vite-plugin-vue-inspector@3.2.0 247 | 248 | ## 0.0.4 249 | 250 | ### Patch Changes 251 | 252 | - docs: readme 253 | - Updated dependencies 254 | - vite-plugin-vue-inspector@3.1.3 255 | 256 | ## 0.0.3 257 | 258 | ### Patch Changes 259 | 260 | - chore: add missing metadata 261 | 262 | ## 0.0.2 263 | 264 | ### Patch Changes 265 | 266 | - feat: unplugin package 267 | - Updated dependencies 268 | - vite-plugin-vue-inspector@3.1.2 269 | -------------------------------------------------------------------------------- /packages/unplugin/README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | vite-plugin-vue-inspector 4 |

5 | 6 |

7 | NPM Version 8 | NPM Downloads 9 | License 10 |

11 | 12 |

13 | 14 |

15 | 16 | ## 📖 Introduction 17 | 18 | A vite plugin which provides the ability that to jump to the local IDE when you click the element of browser automatically. It supports Vue2 & 3 & SSR. 19 | 20 |

21 | vite-plugin-vue-inspector 22 |

23 | 24 | ## 📦 Installation 25 | 26 | ```bash 27 | 28 | # vite-plugin-vue-inspector 29 | 30 | pnpm install vite-plugin-vue-inspector -D 31 | 32 | # unplugin-vue-inspector 33 | 34 | pnpm install unplugin-vue-inspector -D 35 | 36 | ``` 37 | 38 | ## 🦄 Usage 39 | 40 | ### Configuration Vite 41 | 42 | ```ts 43 | // for Vue2 44 | 45 | import { defineConfig, } from 'vite' 46 | import { createVuePlugin, } from 'vite-plugin-vue2' 47 | 48 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 49 | 50 | export default defineConfig({ 51 | plugins: [ 52 | createVuePlugin(), 53 | Inspector({ 54 | vue: 2 55 | }), 56 | ], 57 | }) 58 | ``` 59 | 60 | ```ts 61 | // for Vue3 62 | 63 | import { defineConfig } from 'vite' 64 | import Vue from '@vitejs/plugin-vue' 65 | 66 | import Inspector from 'unplugin-vue-inspector/vite' // OR vite-plugin-vue-inspector 67 | 68 | export default defineConfig({ 69 | plugins: [Vue(), Inspector()], 70 | }) 71 | ``` 72 | 73 | ```ts 74 | // for Nuxt3 75 | // nuxt.config.ts 76 | import { defineNuxtConfig } from 'nuxt/config' 77 | import Inspector from 'vite-plugin-vue-inspector' 78 | 79 | export default defineNuxtConfig({ 80 | modules: [ 81 | ['unplugin-vue-inspector/nuxt', { 82 | enabled: true, 83 | toggleButtonVisibility: 'always', 84 | }], 85 | ], 86 | }) 87 | ``` 88 | 89 | ### Options 90 | 91 | 92 | ```ts 93 | interface VitePluginInspectorOptions { 94 | /** 95 | * Vue version 96 | * @default 3 97 | */ 98 | vue?: 2 | 3 99 | 100 | /** 101 | * Default enable state 102 | * @default false 103 | */ 104 | enabled?: boolean 105 | 106 | /** 107 | * Define a combo key to toggle inspector 108 | * @default 'control-shift' on windows, 'meta-shift' on other os 109 | * 110 | * any number of modifiers `control` `shift` `alt` `meta` followed by zero or one regular key, separated by - 111 | * examples: control-shift, control-o, control-alt-s meta-x control-meta 112 | * Some keys have native behavior (e.g. alt-s opens history menu on firefox). 113 | * To avoid conflicts or accidentally typing into inputs, modifier only combinations are recommended. 114 | * You can also disable it by setting `false`. 115 | */ 116 | toggleComboKey?: string | false 117 | 118 | /** 119 | * Toggle button visibility 120 | * @default 'active' 121 | */ 122 | toggleButtonVisibility?: 'always' | 'active' | 'never' 123 | 124 | /** 125 | * Toggle button display position 126 | * @default top-right 127 | */ 128 | toggleButtonPos?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' 129 | 130 | /** 131 | * append an import to the module id ending with `appendTo` instead of adding a script into body 132 | * useful for frameworks that do not support transformIndexHtml hook (e.g. Nuxt3) 133 | * 134 | * WARNING: only set this if you know exactly what it does. 135 | */ 136 | appendTo?: string | RegExp 137 | 138 | /** 139 | * Customize openInEditor host (e.g. http://localhost:3000) 140 | * @default false 141 | * @deprecated This option is deprecated and removed in 5.0. The plugin now automatically detects the correct host. 142 | */ 143 | openInEditorHost?: string | false 144 | 145 | /** 146 | * lazy load inspector times (ms) 147 | * @default false 148 | */ 149 | lazyLoad?: number | false 150 | 151 | /** 152 | * disable inspector on editor open 153 | * @default false 154 | */ 155 | disableInspectorOnEditorOpen?: boolean 156 | 157 | /** 158 | * Hide information in VNode and produce clean html in DevTools 159 | * 160 | * Currently, it only works for Vue 3 161 | * 162 | * @default true 163 | */ 164 | cleanHtml?: boolean 165 | 166 | /** 167 | * Target editor when open in editor (v2.1.0+) 168 | * 169 | * @default code (Visual Studio Code) 170 | */ 171 | launchEditor?: 'appcode' | 'atom' | 'atom-beta' | 'brackets' | 'clion' | 'code' | 'code-insiders' | 'codium' | 'emacs' | 'idea' | 'notepad++' | 'pycharm' | 'phpstorm' | 'rubymine' | 'sublime' | 'vim' | 'visualstudio' | 'webstorm' | 'cursor' 172 | } 173 | ``` 174 | 175 | ### Example 176 | 177 | - [Vue2](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue2) 178 | - [Vue3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/vue3) 179 | - [Nuxt3](https://github.com/webfansplz/vite-plugin-vue-inspector/tree/main/packages/playground/nuxt) 180 | 181 | ## Supported editors 182 | 183 | | Value | Editor | Linux | Windows | OSX | 184 | |--------|------|:------:|:------:|:------:| 185 | | `appcode` | [AppCode](https://www.jetbrains.com/objc/) | | |✓| 186 | | `atom` | [Atom](https://atom.io/) |✓|✓|✓| 187 | | `atom-beta` | [Atom Beta](https://atom.io/beta) | | |✓| 188 | | `brackets` | [Brackets](http://brackets.io/) |✓|✓|✓| 189 | | `clion` | [Clion](https://www.jetbrains.com/clion/) | |✓|✓| 190 | | `code` | [Visual Studio Code](https://code.visualstudio.com/) |✓|✓|✓| 191 | | `code-insiders` | [Visual Studio Code Insiders](https://code.visualstudio.com/insiders/) |✓|✓|✓| 192 | | `codium` | [VSCodium](https://github.com/VSCodium/vscodium) |✓|✓|✓| 193 | | `emacs` | [Emacs](https://www.gnu.org/software/emacs/) |✓| | | 194 | | `idea` | [IDEA](https://www.jetbrains.com/idea/) |✓|✓|✓| 195 | | `notepad++` | [Notepad++](https://notepad-plus-plus.org/download/v7.5.4.html) | |✓| | 196 | | `pycharm` | [PyCharm](https://www.jetbrains.com/pycharm/) |✓|✓|✓| 197 | | `phpstorm` | [PhpStorm](https://www.jetbrains.com/phpstorm/) |✓|✓|✓| 198 | | `rubymine` | [RubyMine](https://www.jetbrains.com/ruby/) |✓|✓|✓| 199 | | `sublime` | [Sublime Text](https://www.sublimetext.com/) |✓|✓|✓| 200 | | `vim` | [Vim](http://www.vim.org/) |✓| | | 201 | | `visualstudio` | [Visual Studio](https://www.visualstudio.com/vs/) | | |✓| 202 | | `webstorm` | [WebStorm](https://www.jetbrains.com/webstorm/) |✓|✓|✓| 203 | | `cursor` | [Cursor](https://www.cursor.com/) |✓|✓|✓| 204 | 205 | 206 | ## 🔌 Configuration IDE / Editor 207 | 208 | **Starting from v2.1.0, We recommend using the `launchEditor` option configuration to specify the IDE** (Please ensure that the editor's environment variables are correctly configured beforehand.) 209 | 210 | It uses an **environment variable** named **`LAUNCH_EDITOR`** to specify an IDE application, but if you do not set this variable, it will try to open a common IDE that you have open or installed once it is certified. 211 | 212 | For example, if you want it always open VS Code when inspection clicked, set `export LAUNCH_EDITOR=code` in your shell. 213 | 214 | 215 | ### VS Code 216 | 217 | - install VS Code command line tools, [see the official docs](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line) 218 | ![install-vscode-cli](./public/install-vscode-cli.png) 219 | 220 | - set env to shell, like `.bashrc` or `.zshrc` 221 | 222 | ```bash 223 | export LAUNCH_EDITOR=code 224 | ``` 225 | 226 |
227 | 228 | 229 | ### VS Code with WSL (Windows) 230 | 231 | - add the configuration in the `settings.json` 232 | 233 | - restart the VS Code (All Windows should be closed to take effect) 234 | 235 | ```json 236 | { 237 | // other config... 238 | 239 | "terminal.integrated.env.linux": { 240 | "EDITOR": "code" 241 | } 242 | } 243 | ``` 244 | 245 | 246 | ### WebStorm 247 | 248 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 249 | 250 | ```bash 251 | export LAUNCH_EDITOR='/Applications/WebStorm.app/Contents/MacOS/webstorm' 252 | ``` 253 | 254 | **OR** 255 | 256 | - install WebStorm command line tools 257 | 258 | - then set env to shell, like `.bashrc` or `.zshrc` 259 | 260 | ```bash 261 | export LAUNCH_EDITOR=webstorm 262 | ``` 263 | 264 |
265 | 266 | ### PhpStorm 267 | 268 | - just set env with an absolute path to shell, like `.bashrc` or `.zshrc` (only MacOS) 269 | 270 | ```bash 271 | export LAUNCH_EDITOR='/Applications/PhpStorm.app/Contents/MacOS/phpstorm' 272 | ``` 273 | 274 | **OR** 275 | 276 | - install PhpStorm command line tools 277 | 278 | - then set env to shell, like `.bashrc` or `.zshrc` 279 | 280 | ```bash 281 | export LAUNCH_EDITOR=phpstorm 282 | ``` 283 | 284 |
285 | 286 | ### Vim 287 | 288 | Yes! you can also use vim if you want, just set env to shell 289 | 290 | ```bash 291 | export LAUNCH_EDITOR=vim 292 | ``` 293 | 294 |
295 | 296 | ## 💡 Notice 297 | 298 | - **[BREAKING CHANGE] From v1.0, `enabled` option default value changed from `true` to `false` .** 299 | - It only work in develop mode . 300 | - It does not currently support `Template Engine (e.g. pug)` . 301 | 302 | ## 👨‍💻 Programmatic Usage 303 | 304 | You can also use control inspector programmatically, by accessing the `__VUE_INSPECTOR__` global variable. 305 | 306 | ```ts 307 | import type { VueInspectorClient } from 'vite-plugin-vue-inspector' 308 | 309 | const inspector: VueInspectorClient = window.__VUE_INSPECTOR__ 310 | 311 | if (inspector) { 312 | // enable inspector 313 | inspector.enable() 314 | // or 315 | inspector.disable() 316 | } 317 | ``` 318 | 319 | ## 🌸 Credits 320 | 321 | This project is inspired by [react-dev-inspector](https://github.com/zthxxx/react-dev-inspector) . 322 | 323 | Partially implementation is inspired by [vite-plugin-svelte-inspector](https://github.com/sveltejs/vite-plugin-svelte/tree/main/packages/vite-plugin-svelte/src/ui/inspector) . 324 | 325 | ## 🤖️ Analysis of Theory 326 | 327 | [Chinese] [点击页面元素,这个Vite插件帮我打开了Vue组件](https://juejin.cn/post/7077347158545924127) 328 | ## 📄 License 329 | 330 | [MIT LICENSE](./LICENSE) 331 | -------------------------------------------------------------------------------- /packages/unplugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unplugin-vue-inspector", 3 | "version": "2.3.1", 4 | "description": "jump to local IDE source code while click the element of browser automatically.", 5 | "author": "webfansplz", 6 | "license": "MIT", 7 | "homepage": "https://github.com/webfansplz/vite-plugin-vue-inspector#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/webfansplz/vite-plugin-vue-inspector.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/webfansplz/vite-plugin-vue-inspector/issues" 14 | }, 15 | "keywords": [ 16 | "vue", 17 | "vite", 18 | "vscode", 19 | "unplugin", 20 | "inspector", 21 | "debug" 22 | ], 23 | "exports": { 24 | ".": { 25 | "types": "./dist/index.d.ts", 26 | "require": "./dist/index.js", 27 | "import": "./dist/index.mjs" 28 | }, 29 | "./vite": { 30 | "types": "./dist/vite.d.ts", 31 | "require": "./dist/vite.js", 32 | "import": "./dist/vite.mjs" 33 | }, 34 | "./nuxt": { 35 | "types": "./dist/nuxt.d.ts", 36 | "require": "./dist/nuxt.js", 37 | "import": "./dist/nuxt.mjs" 38 | }, 39 | "./types": { 40 | "types": "./dist/types.d.ts", 41 | "require": "./dist/types.cjs", 42 | "import": "./dist/types.js" 43 | } 44 | }, 45 | "main": "dist/index.js", 46 | "module": "dist/index.mjs", 47 | "types": "index.d.ts", 48 | "typesVersions": { 49 | "*": { 50 | "*": [ 51 | "./dist/*" 52 | ] 53 | } 54 | }, 55 | "files": [ 56 | "dist" 57 | ], 58 | "scripts": { 59 | "build": "tsup", 60 | "build:fix": "tsx scripts/postbuild.ts" 61 | }, 62 | "dependencies": { 63 | "kolorist": "^1.8.0", 64 | "unplugin": "^1.5.0", 65 | "vite-plugin-vue-inspector": "workspace:*" 66 | }, 67 | "devDependencies": { 68 | "chalk": "^5.3.0", 69 | "fast-glob": "^3.3.1" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /packages/unplugin/scripts/postbuild.ts: -------------------------------------------------------------------------------- 1 | import { basename, dirname, resolve } from 'path' 2 | import { promises as fs } from 'fs' 3 | import { fileURLToPath } from 'url' 4 | import fg from 'fast-glob' 5 | import chalk from 'chalk' 6 | 7 | async function run() { 8 | // fix cjs exports 9 | const files = await fg('*.cjs', { 10 | ignore: ['chunk-*'], 11 | absolute: true, 12 | cwd: resolve(dirname(fileURLToPath(import.meta.url)), '../dist'), 13 | }) 14 | for (const file of files) { 15 | console.log(chalk.cyan.inverse(' POST '), `Fix ${basename(file)}`) 16 | let code = await fs.readFile(file, 'utf8') 17 | code = code.replace('exports.default =', 'module.exports =') 18 | code += 'exports.default = module.exports;' 19 | await fs.writeFile(file, code) 20 | } 21 | } 22 | 23 | run() 24 | -------------------------------------------------------------------------------- /packages/unplugin/src/index.ts: -------------------------------------------------------------------------------- 1 | import { createUnplugin } from 'unplugin' 2 | import VitePluginInspector from 'vite-plugin-vue-inspector' 3 | import type { Options } from './types' 4 | 5 | export default createUnplugin((options) => { 6 | const plugins = VitePluginInspector(options) as any 7 | return [ 8 | { 9 | name: 'unplugin-vue-inspector', 10 | vite: plugins[0], 11 | }, 12 | { 13 | name: 'unplugin-vue-inspector:post', 14 | vite: plugins[1], 15 | }, 16 | ] 17 | }) 18 | -------------------------------------------------------------------------------- /packages/unplugin/src/nuxt.ts: -------------------------------------------------------------------------------- 1 | import { green, yellow } from 'kolorist' 2 | import { DEFAULT_INSPECTOR_OPTIONS, normalizeComboKeyPrint } from 'vite-plugin-vue-inspector' 3 | import type { Options } from './types' 4 | import unplugin from '.' 5 | 6 | export default (options: Options, nuxt: any) => { 7 | nuxt.hook('vite:extendConfig', async (config: any) => { 8 | config.plugins = config.plugins || [] 9 | config.plugins.push(...unplugin.vite({ 10 | appendTo: /\/entry\.m?js$/, 11 | ...options, 12 | })) 13 | }) 14 | let printed = false 15 | nuxt.hook('vite:serverCreated', () => { 16 | const normalizedOptions = { ...DEFAULT_INSPECTOR_OPTIONS, ...options } 17 | const { toggleComboKey } = normalizedOptions 18 | if (printed || !toggleComboKey) 19 | return 20 | const keys = normalizeComboKeyPrint(toggleComboKey) 21 | console.log(` ${'> Vue Inspector'}: ${green(`Press ${yellow(keys)} in App to toggle the Inspector`)}\n`) 22 | printed = true 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /packages/unplugin/src/types.ts: -------------------------------------------------------------------------------- 1 | import type { VitePluginInspectorOptions } from 'vite-plugin-vue-inspector' 2 | export interface Options extends VitePluginInspectorOptions { 3 | } 4 | -------------------------------------------------------------------------------- /packages/unplugin/src/vite.ts: -------------------------------------------------------------------------------- 1 | import unplugin from '.' 2 | 3 | export default unplugin.vite 4 | -------------------------------------------------------------------------------- /packages/unplugin/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import type { Options } from 'tsup' 2 | 3 | export default { 4 | entryPoints: [ 5 | 'src/*.ts', 6 | ], 7 | clean: true, 8 | format: ['cjs', 'esm'], 9 | dts: true, 10 | shims: true, 11 | onSuccess: 'npm run build:fix', 12 | } 13 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/**/*' 3 | 4 | -------------------------------------------------------------------------------- /public/install-vscode-cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webfansplz/vite-plugin-vue-inspector/d02c0569aaf4623b2f5391b4739b1188941f82af/public/install-vscode-cli.png -------------------------------------------------------------------------------- /public/preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webfansplz/vite-plugin-vue-inspector/d02c0569aaf4623b2f5391b4739b1188941f82af/public/preview.gif -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "preserve", 4 | "target": "esnext", 5 | "module": "esnext", 6 | "esModuleInterop": true, 7 | "moduleResolution": "node", 8 | "resolveJsonModule": true, 9 | "allowJs": true 10 | } 11 | } 12 | --------------------------------------------------------------------------------