├── .eslintignore ├── .gitignore ├── README.md ├── esbuild.js ├── package.json ├── pnpm-lock.yaml ├── rollup.config.js ├── src ├── SomeComponent.vue ├── data.ts ├── devtools.ts ├── global.d.ts └── index.ts └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Example Vue 3 plugin with devtools integration 2 | 3 | Usage in app: 4 | 5 | ```js 6 | import { createApp } from 'vue' 7 | import App from './App.vue' 8 | import MyAwesomePlugin from 'my-awesome-plugin' 9 | 10 | const app = createApp(App) 11 | app.use(MyAwesomePlugin) 12 | app.mount('#app') 13 | ``` 14 | -------------------------------------------------------------------------------- /esbuild.js: -------------------------------------------------------------------------------- 1 | const esbuild = require('esbuild') 2 | const vue = require('esbuild-plugin-vue').default 3 | 4 | const pkgName = 'my-plugin' 5 | 6 | /** @type {import('esbuild').BuildOptions} */ 7 | const commonOptions = { 8 | entryPoints: ['./src/index.ts'], 9 | bundle: true, 10 | sourcemap: true, 11 | external: [ 12 | 'vue', 13 | // Add libraries to exclude from bundling for browser builds 14 | ], 15 | target: 'es6', // Change to the targets you want 16 | plugins: [ 17 | vue() 18 | ] 19 | } 20 | 21 | // ESM Bundler 22 | esbuild.build({ 23 | ...commonOptions, 24 | outfile: `dist/${pkgName}.esm-bundler.js`, 25 | format: 'esm', 26 | platform: 'node', 27 | external: [ 28 | // Mark all dependencies as external 29 | ...Object.keys(require('./package.json').dependencies), 30 | ...Object.keys(require('./package.json').peerDependencies), 31 | ], 32 | }) 33 | 34 | // Browser dev 35 | esbuild.build({ 36 | ...commonOptions, 37 | outfile: `dist/${pkgName}.browser.js`, 38 | format: 'iife', 39 | platform: 'browser', 40 | define: { 41 | 'process.env.NODE_ENV': JSON.stringify('development'), 42 | '__VUE_PROD_DEVTOOLS__': JSON.stringify(process.env.__VUE_PROD_DEVTOOLS__ || false), 43 | }, 44 | }) 45 | 46 | // Browser prod 47 | esbuild.build({ 48 | ...commonOptions, 49 | outfile: `dist/${pkgName}.browser.min.js`, 50 | format: 'iife', 51 | platform: 'browser', 52 | define: { 53 | 'process.env.NODE_ENV': JSON.stringify('production'), 54 | '__VUE_PROD_DEVTOOLS__': JSON.stringify(process.env.__VUE_PROD_DEVTOOLS__ || false), 55 | }, 56 | minify: true, 57 | }) 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-plugin", 3 | "version": "0.0.0", 4 | "description": "A demo Vue 3 plugin with devtools integration", 5 | "author": { 6 | "name": "Guillaume Chau", 7 | "email": "guillaume.b.chau@gmail.com" 8 | }, 9 | "main": "dist/my-plugin.cjs.js", 10 | "module": "dist/my-plugin.esm-bundler.js", 11 | "unpkg": "dist/my-plugin.global.js", 12 | "jsdelivr": "dist/my-plugin.global.js", 13 | "types": "dist/index.d.ts", 14 | "exports": { 15 | ".": { 16 | "require": "./dist/my-plugin.cjs.js", 17 | "browser": "./dist/my-plugin.esm-browser.js", 18 | "import": "./dist/my-plugin.esm-bundler.js", 19 | "module": "./dist/my-plugin.esm-bundler.js" 20 | }, 21 | "./package.json": "./package.json" 22 | }, 23 | "sideEffects": false, 24 | "scripts": { 25 | "dev": "tsc --watch -d", 26 | "build:esbuild": "rimraf dist && tsc -d --emitDeclarationOnly && node ./esbuild.js", 27 | "build:rollup": "rimraf dist && rollup -c rollup.config.js" 28 | }, 29 | "dependencies": { 30 | "@vue/devtools-api": "^6.0.0-beta.14" 31 | }, 32 | "peerDependencies": { 33 | "vue": "^3.0.5" 34 | }, 35 | "devDependencies": { 36 | "@rollup/plugin-commonjs": "^19.0.0", 37 | "@rollup/plugin-node-resolve": "^13.0.0", 38 | "@rollup/plugin-replace": "^2.4.2", 39 | "@types/node": "^14.14.22", 40 | "@vue/compiler-sfc": "^3.1.2", 41 | "esbuild": "^0.12.9", 42 | "esbuild-plugin-vue": "^0.1.2", 43 | "pascalcase": "^1.0.0", 44 | "rimraf": "^3.0.2", 45 | "rollup": "^2.52.3", 46 | "rollup-plugin-terser": "^7.0.2", 47 | "rollup-plugin-typescript2": "^0.30.0", 48 | "rollup-plugin-vue": "^6.0.0", 49 | "typescript": "^4.1.3", 50 | "vue": "^3.0.5" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@rollup/plugin-commonjs': ^19.0.0 5 | '@rollup/plugin-node-resolve': ^13.0.0 6 | '@rollup/plugin-replace': ^2.4.2 7 | '@types/node': ^14.14.22 8 | '@vue/compiler-sfc': ^3.1.2 9 | '@vue/devtools-api': ^6.0.0-beta.14 10 | esbuild: ^0.12.9 11 | esbuild-plugin-vue: ^0.1.2 12 | pascalcase: ^1.0.0 13 | rimraf: ^3.0.2 14 | rollup: ^2.52.3 15 | rollup-plugin-terser: ^7.0.2 16 | rollup-plugin-typescript2: ^0.30.0 17 | rollup-plugin-vue: ^6.0.0 18 | typescript: ^4.1.3 19 | vue: ^3.0.5 20 | 21 | dependencies: 22 | '@vue/devtools-api': 6.0.0-beta.21.1 23 | 24 | devDependencies: 25 | '@rollup/plugin-commonjs': 19.0.2_rollup@2.67.0 26 | '@rollup/plugin-node-resolve': 13.1.3_rollup@2.67.0 27 | '@rollup/plugin-replace': 2.4.2_rollup@2.67.0 28 | '@types/node': 14.18.10 29 | '@vue/compiler-sfc': 3.2.29 30 | esbuild: 0.12.29 31 | esbuild-plugin-vue: 0.1.3_esbuild@0.12.29 32 | pascalcase: 1.0.0 33 | rimraf: 3.0.2 34 | rollup: 2.67.0 35 | rollup-plugin-terser: 7.0.2_rollup@2.67.0 36 | rollup-plugin-typescript2: 0.30.0_rollup@2.67.0+typescript@4.5.5 37 | rollup-plugin-vue: 6.0.0_@vue+compiler-sfc@3.2.29 38 | typescript: 4.5.5 39 | vue: 3.2.29 40 | 41 | packages: 42 | 43 | /@babel/code-frame/7.16.7: 44 | resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} 45 | engines: {node: '>=6.9.0'} 46 | dependencies: 47 | '@babel/highlight': 7.16.10 48 | dev: true 49 | 50 | /@babel/helper-validator-identifier/7.16.7: 51 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 52 | engines: {node: '>=6.9.0'} 53 | dev: true 54 | 55 | /@babel/highlight/7.16.10: 56 | resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} 57 | engines: {node: '>=6.9.0'} 58 | dependencies: 59 | '@babel/helper-validator-identifier': 7.16.7 60 | chalk: 2.4.2 61 | js-tokens: 4.0.0 62 | dev: true 63 | 64 | /@babel/parser/7.17.0: 65 | resolution: {integrity: sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==} 66 | engines: {node: '>=6.0.0'} 67 | hasBin: true 68 | dev: true 69 | 70 | /@rollup/plugin-commonjs/19.0.2_rollup@2.67.0: 71 | resolution: {integrity: sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA==} 72 | engines: {node: '>= 8.0.0'} 73 | peerDependencies: 74 | rollup: ^2.38.3 75 | dependencies: 76 | '@rollup/pluginutils': 3.1.0_rollup@2.67.0 77 | commondir: 1.0.1 78 | estree-walker: 2.0.2 79 | glob: 7.2.0 80 | is-reference: 1.2.1 81 | magic-string: 0.25.7 82 | resolve: 1.22.0 83 | rollup: 2.67.0 84 | dev: true 85 | 86 | /@rollup/plugin-node-resolve/13.1.3_rollup@2.67.0: 87 | resolution: {integrity: sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==} 88 | engines: {node: '>= 10.0.0'} 89 | peerDependencies: 90 | rollup: ^2.42.0 91 | dependencies: 92 | '@rollup/pluginutils': 3.1.0_rollup@2.67.0 93 | '@types/resolve': 1.17.1 94 | builtin-modules: 3.2.0 95 | deepmerge: 4.2.2 96 | is-module: 1.0.0 97 | resolve: 1.22.0 98 | rollup: 2.67.0 99 | dev: true 100 | 101 | /@rollup/plugin-replace/2.4.2_rollup@2.67.0: 102 | resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} 103 | peerDependencies: 104 | rollup: ^1.20.0 || ^2.0.0 105 | dependencies: 106 | '@rollup/pluginutils': 3.1.0_rollup@2.67.0 107 | magic-string: 0.25.7 108 | rollup: 2.67.0 109 | dev: true 110 | 111 | /@rollup/pluginutils/3.1.0_rollup@2.67.0: 112 | resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} 113 | engines: {node: '>= 8.0.0'} 114 | peerDependencies: 115 | rollup: ^1.20.0||^2.0.0 116 | dependencies: 117 | '@types/estree': 0.0.39 118 | estree-walker: 1.0.1 119 | picomatch: 2.3.1 120 | rollup: 2.67.0 121 | dev: true 122 | 123 | /@rollup/pluginutils/4.1.2: 124 | resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} 125 | engines: {node: '>= 8.0.0'} 126 | dependencies: 127 | estree-walker: 2.0.2 128 | picomatch: 2.3.1 129 | dev: true 130 | 131 | /@types/estree/0.0.39: 132 | resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} 133 | dev: true 134 | 135 | /@types/estree/0.0.51: 136 | resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} 137 | dev: true 138 | 139 | /@types/node/14.18.10: 140 | resolution: {integrity: sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==} 141 | dev: true 142 | 143 | /@types/resolve/1.17.1: 144 | resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} 145 | dependencies: 146 | '@types/node': 14.18.10 147 | dev: true 148 | 149 | /@vue/compiler-core/3.2.29: 150 | resolution: {integrity: sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw==} 151 | dependencies: 152 | '@babel/parser': 7.17.0 153 | '@vue/shared': 3.2.29 154 | estree-walker: 2.0.2 155 | source-map: 0.6.1 156 | dev: true 157 | 158 | /@vue/compiler-dom/3.2.29: 159 | resolution: {integrity: sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ==} 160 | dependencies: 161 | '@vue/compiler-core': 3.2.29 162 | '@vue/shared': 3.2.29 163 | dev: true 164 | 165 | /@vue/compiler-sfc/3.2.29: 166 | resolution: {integrity: sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g==} 167 | dependencies: 168 | '@babel/parser': 7.17.0 169 | '@vue/compiler-core': 3.2.29 170 | '@vue/compiler-dom': 3.2.29 171 | '@vue/compiler-ssr': 3.2.29 172 | '@vue/reactivity-transform': 3.2.29 173 | '@vue/shared': 3.2.29 174 | estree-walker: 2.0.2 175 | magic-string: 0.25.7 176 | postcss: 8.4.6 177 | source-map: 0.6.1 178 | dev: true 179 | 180 | /@vue/compiler-ssr/3.2.29: 181 | resolution: {integrity: sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA==} 182 | dependencies: 183 | '@vue/compiler-dom': 3.2.29 184 | '@vue/shared': 3.2.29 185 | dev: true 186 | 187 | /@vue/devtools-api/6.0.0-beta.21.1: 188 | resolution: {integrity: sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==} 189 | dev: false 190 | 191 | /@vue/reactivity-transform/3.2.29: 192 | resolution: {integrity: sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA==} 193 | dependencies: 194 | '@babel/parser': 7.17.0 195 | '@vue/compiler-core': 3.2.29 196 | '@vue/shared': 3.2.29 197 | estree-walker: 2.0.2 198 | magic-string: 0.25.7 199 | dev: true 200 | 201 | /@vue/reactivity/3.2.29: 202 | resolution: {integrity: sha512-Ryhb6Gy62YolKXH1gv42pEqwx7zs3n8gacRVZICSgjQz8Qr8QeCcFygBKYfJm3o1SccR7U+bVBQDWZGOyG1k4g==} 203 | dependencies: 204 | '@vue/shared': 3.2.29 205 | dev: true 206 | 207 | /@vue/runtime-core/3.2.29: 208 | resolution: {integrity: sha512-VMvQuLdzoTGmCwIKTKVwKmIL0qcODIqe74JtK1pVr5lnaE0l25hopodmPag3RcnIcIXe+Ye3B2olRCn7fTCgig==} 209 | dependencies: 210 | '@vue/reactivity': 3.2.29 211 | '@vue/shared': 3.2.29 212 | dev: true 213 | 214 | /@vue/runtime-dom/3.2.29: 215 | resolution: {integrity: sha512-YJgLQLwr+SQyORzTsBQLL5TT/5UiV83tEotqjL7F9aFDIQdFBTCwpkCFvX9jqwHoyi9sJqM9XtTrMcc8z/OjPA==} 216 | dependencies: 217 | '@vue/runtime-core': 3.2.29 218 | '@vue/shared': 3.2.29 219 | csstype: 2.6.19 220 | dev: true 221 | 222 | /@vue/server-renderer/3.2.29_vue@3.2.29: 223 | resolution: {integrity: sha512-lpiYx7ciV7rWfJ0tPkoSOlLmwqBZ9FTmQm33S+T4g0j1fO/LmhJ9b9Ctl1o5xvIFVDk9QkSUWANZn7H2pXuxVw==} 224 | peerDependencies: 225 | vue: 3.2.29 226 | dependencies: 227 | '@vue/compiler-ssr': 3.2.29 228 | '@vue/shared': 3.2.29 229 | vue: 3.2.29 230 | dev: true 231 | 232 | /@vue/shared/3.2.29: 233 | resolution: {integrity: sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw==} 234 | dev: true 235 | 236 | /ansi-styles/3.2.1: 237 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 238 | engines: {node: '>=4'} 239 | dependencies: 240 | color-convert: 1.9.3 241 | dev: true 242 | 243 | /balanced-match/1.0.2: 244 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 245 | dev: true 246 | 247 | /brace-expansion/1.1.11: 248 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 249 | dependencies: 250 | balanced-match: 1.0.2 251 | concat-map: 0.0.1 252 | dev: true 253 | 254 | /buffer-from/1.1.2: 255 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 256 | dev: true 257 | 258 | /builtin-modules/3.2.0: 259 | resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} 260 | engines: {node: '>=6'} 261 | dev: true 262 | 263 | /chalk/2.4.2: 264 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 265 | engines: {node: '>=4'} 266 | dependencies: 267 | ansi-styles: 3.2.1 268 | escape-string-regexp: 1.0.5 269 | supports-color: 5.5.0 270 | dev: true 271 | 272 | /color-convert/1.9.3: 273 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 274 | dependencies: 275 | color-name: 1.1.3 276 | dev: true 277 | 278 | /color-name/1.1.3: 279 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 280 | dev: true 281 | 282 | /commander/2.20.3: 283 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 284 | dev: true 285 | 286 | /commondir/1.0.1: 287 | resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} 288 | dev: true 289 | 290 | /concat-map/0.0.1: 291 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 292 | dev: true 293 | 294 | /csstype/2.6.19: 295 | resolution: {integrity: sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==} 296 | dev: true 297 | 298 | /debug/4.3.3: 299 | resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 300 | engines: {node: '>=6.0'} 301 | peerDependencies: 302 | supports-color: '*' 303 | peerDependenciesMeta: 304 | supports-color: 305 | optional: true 306 | dependencies: 307 | ms: 2.1.2 308 | dev: true 309 | 310 | /deepmerge/4.2.2: 311 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 312 | engines: {node: '>=0.10.0'} 313 | dev: true 314 | 315 | /esbuild-plugin-vue/0.1.3_esbuild@0.12.29: 316 | resolution: {integrity: sha512-arLFKqlks4yKRJV2PTXRq+KzpV2lNSn1S56BX2fJnTNpiF86pkNcwncynkPXHiCBmm22pgyAB8XsskUv9G3x/Q==} 317 | peerDependencies: 318 | esbuild: '>=0.11 <=1' 319 | dependencies: 320 | esbuild: 0.12.29 321 | hash-sum: 2.0.0 322 | dev: true 323 | 324 | /esbuild/0.12.29: 325 | resolution: {integrity: sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==} 326 | hasBin: true 327 | requiresBuild: true 328 | dev: true 329 | 330 | /escape-string-regexp/1.0.5: 331 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 332 | engines: {node: '>=0.8.0'} 333 | dev: true 334 | 335 | /estree-walker/0.6.1: 336 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 337 | dev: true 338 | 339 | /estree-walker/1.0.1: 340 | resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} 341 | dev: true 342 | 343 | /estree-walker/2.0.2: 344 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 345 | dev: true 346 | 347 | /find-cache-dir/3.3.2: 348 | resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} 349 | engines: {node: '>=8'} 350 | dependencies: 351 | commondir: 1.0.1 352 | make-dir: 3.1.0 353 | pkg-dir: 4.2.0 354 | dev: true 355 | 356 | /find-up/4.1.0: 357 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 358 | engines: {node: '>=8'} 359 | dependencies: 360 | locate-path: 5.0.0 361 | path-exists: 4.0.0 362 | dev: true 363 | 364 | /fs-extra/8.1.0: 365 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 366 | engines: {node: '>=6 <7 || >=8'} 367 | dependencies: 368 | graceful-fs: 4.2.9 369 | jsonfile: 4.0.0 370 | universalify: 0.1.2 371 | dev: true 372 | 373 | /fs.realpath/1.0.0: 374 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 375 | dev: true 376 | 377 | /fsevents/2.3.2: 378 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 379 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 380 | os: [darwin] 381 | requiresBuild: true 382 | dev: true 383 | optional: true 384 | 385 | /function-bind/1.1.1: 386 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 387 | dev: true 388 | 389 | /glob/7.2.0: 390 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 391 | dependencies: 392 | fs.realpath: 1.0.0 393 | inflight: 1.0.6 394 | inherits: 2.0.4 395 | minimatch: 3.0.4 396 | once: 1.4.0 397 | path-is-absolute: 1.0.1 398 | dev: true 399 | 400 | /graceful-fs/4.2.9: 401 | resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} 402 | dev: true 403 | 404 | /has-flag/3.0.0: 405 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 406 | engines: {node: '>=4'} 407 | dev: true 408 | 409 | /has-flag/4.0.0: 410 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 411 | engines: {node: '>=8'} 412 | dev: true 413 | 414 | /has/1.0.3: 415 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 416 | engines: {node: '>= 0.4.0'} 417 | dependencies: 418 | function-bind: 1.1.1 419 | dev: true 420 | 421 | /hash-sum/2.0.0: 422 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} 423 | dev: true 424 | 425 | /inflight/1.0.6: 426 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 427 | dependencies: 428 | once: 1.4.0 429 | wrappy: 1.0.2 430 | dev: true 431 | 432 | /inherits/2.0.4: 433 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 434 | dev: true 435 | 436 | /is-core-module/2.8.1: 437 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 438 | dependencies: 439 | has: 1.0.3 440 | dev: true 441 | 442 | /is-module/1.0.0: 443 | resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} 444 | dev: true 445 | 446 | /is-reference/1.2.1: 447 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 448 | dependencies: 449 | '@types/estree': 0.0.51 450 | dev: true 451 | 452 | /jest-worker/26.6.2: 453 | resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} 454 | engines: {node: '>= 10.13.0'} 455 | dependencies: 456 | '@types/node': 14.18.10 457 | merge-stream: 2.0.0 458 | supports-color: 7.2.0 459 | dev: true 460 | 461 | /js-tokens/4.0.0: 462 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 463 | dev: true 464 | 465 | /jsonfile/4.0.0: 466 | resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} 467 | optionalDependencies: 468 | graceful-fs: 4.2.9 469 | dev: true 470 | 471 | /locate-path/5.0.0: 472 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 473 | engines: {node: '>=8'} 474 | dependencies: 475 | p-locate: 4.1.0 476 | dev: true 477 | 478 | /magic-string/0.25.7: 479 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 480 | dependencies: 481 | sourcemap-codec: 1.4.8 482 | dev: true 483 | 484 | /make-dir/3.1.0: 485 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 486 | engines: {node: '>=8'} 487 | dependencies: 488 | semver: 6.3.0 489 | dev: true 490 | 491 | /merge-stream/2.0.0: 492 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 493 | dev: true 494 | 495 | /minimatch/3.0.4: 496 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 497 | dependencies: 498 | brace-expansion: 1.1.11 499 | dev: true 500 | 501 | /ms/2.1.2: 502 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 503 | dev: true 504 | 505 | /nanoid/3.2.0: 506 | resolution: {integrity: sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==} 507 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 508 | hasBin: true 509 | dev: true 510 | 511 | /once/1.4.0: 512 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 513 | dependencies: 514 | wrappy: 1.0.2 515 | dev: true 516 | 517 | /p-limit/2.3.0: 518 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 519 | engines: {node: '>=6'} 520 | dependencies: 521 | p-try: 2.2.0 522 | dev: true 523 | 524 | /p-locate/4.1.0: 525 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 526 | engines: {node: '>=8'} 527 | dependencies: 528 | p-limit: 2.3.0 529 | dev: true 530 | 531 | /p-try/2.2.0: 532 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 533 | engines: {node: '>=6'} 534 | dev: true 535 | 536 | /pascalcase/1.0.0: 537 | resolution: {integrity: sha512-BSExi0rRnCHReJys6NocaK+cfTXNinAegfWBvr0JD3hiaEG7Nuc7r0CIdOJunXrs8gU/sbHQ9dxVAtiVQisjmg==} 538 | engines: {node: '>=8'} 539 | dev: true 540 | 541 | /path-exists/4.0.0: 542 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 543 | engines: {node: '>=8'} 544 | dev: true 545 | 546 | /path-is-absolute/1.0.1: 547 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 548 | engines: {node: '>=0.10.0'} 549 | dev: true 550 | 551 | /path-parse/1.0.7: 552 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 553 | dev: true 554 | 555 | /picocolors/1.0.0: 556 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 557 | dev: true 558 | 559 | /picomatch/2.3.1: 560 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 561 | engines: {node: '>=8.6'} 562 | dev: true 563 | 564 | /pkg-dir/4.2.0: 565 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 566 | engines: {node: '>=8'} 567 | dependencies: 568 | find-up: 4.1.0 569 | dev: true 570 | 571 | /postcss/8.4.6: 572 | resolution: {integrity: sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==} 573 | engines: {node: ^10 || ^12 || >=14} 574 | dependencies: 575 | nanoid: 3.2.0 576 | picocolors: 1.0.0 577 | source-map-js: 1.0.2 578 | dev: true 579 | 580 | /randombytes/2.1.0: 581 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 582 | dependencies: 583 | safe-buffer: 5.2.1 584 | dev: true 585 | 586 | /resolve/1.20.0: 587 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 588 | dependencies: 589 | is-core-module: 2.8.1 590 | path-parse: 1.0.7 591 | dev: true 592 | 593 | /resolve/1.22.0: 594 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 595 | hasBin: true 596 | dependencies: 597 | is-core-module: 2.8.1 598 | path-parse: 1.0.7 599 | supports-preserve-symlinks-flag: 1.0.0 600 | dev: true 601 | 602 | /rimraf/3.0.2: 603 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 604 | hasBin: true 605 | dependencies: 606 | glob: 7.2.0 607 | dev: true 608 | 609 | /rollup-plugin-terser/7.0.2_rollup@2.67.0: 610 | resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} 611 | peerDependencies: 612 | rollup: ^2.0.0 613 | dependencies: 614 | '@babel/code-frame': 7.16.7 615 | jest-worker: 26.6.2 616 | rollup: 2.67.0 617 | serialize-javascript: 4.0.0 618 | terser: 5.10.0 619 | transitivePeerDependencies: 620 | - acorn 621 | dev: true 622 | 623 | /rollup-plugin-typescript2/0.30.0_rollup@2.67.0+typescript@4.5.5: 624 | resolution: {integrity: sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==} 625 | peerDependencies: 626 | rollup: '>=1.26.3' 627 | typescript: '>=2.4.0' 628 | dependencies: 629 | '@rollup/pluginutils': 4.1.2 630 | find-cache-dir: 3.3.2 631 | fs-extra: 8.1.0 632 | resolve: 1.20.0 633 | rollup: 2.67.0 634 | tslib: 2.1.0 635 | typescript: 4.5.5 636 | dev: true 637 | 638 | /rollup-plugin-vue/6.0.0_@vue+compiler-sfc@3.2.29: 639 | resolution: {integrity: sha512-oVvUd84d5u73M2HYM3XsMDLtZRIA/tw2U0dmHlXU2UWP5JARYHzh/U9vcxaN/x/9MrepY7VH3pHFeOhrWpxs/Q==} 640 | peerDependencies: 641 | '@vue/compiler-sfc': '*' 642 | dependencies: 643 | '@vue/compiler-sfc': 3.2.29 644 | debug: 4.3.3 645 | hash-sum: 2.0.0 646 | rollup-pluginutils: 2.8.2 647 | transitivePeerDependencies: 648 | - supports-color 649 | dev: true 650 | 651 | /rollup-pluginutils/2.8.2: 652 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 653 | dependencies: 654 | estree-walker: 0.6.1 655 | dev: true 656 | 657 | /rollup/2.67.0: 658 | resolution: {integrity: sha512-W83AaERwvDiHwHEF/dfAfS3z1Be5wf7n+pO3ZAO5IQadCT2lBTr7WQ2MwZZe+nodbD+n3HtC4OCOAdsOPPcKZQ==} 659 | engines: {node: '>=10.0.0'} 660 | hasBin: true 661 | optionalDependencies: 662 | fsevents: 2.3.2 663 | dev: true 664 | 665 | /safe-buffer/5.2.1: 666 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 667 | dev: true 668 | 669 | /semver/6.3.0: 670 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 671 | hasBin: true 672 | dev: true 673 | 674 | /serialize-javascript/4.0.0: 675 | resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} 676 | dependencies: 677 | randombytes: 2.1.0 678 | dev: true 679 | 680 | /source-map-js/1.0.2: 681 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 682 | engines: {node: '>=0.10.0'} 683 | dev: true 684 | 685 | /source-map-support/0.5.21: 686 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 687 | dependencies: 688 | buffer-from: 1.1.2 689 | source-map: 0.6.1 690 | dev: true 691 | 692 | /source-map/0.6.1: 693 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 694 | engines: {node: '>=0.10.0'} 695 | dev: true 696 | 697 | /source-map/0.7.3: 698 | resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} 699 | engines: {node: '>= 8'} 700 | dev: true 701 | 702 | /sourcemap-codec/1.4.8: 703 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 704 | dev: true 705 | 706 | /supports-color/5.5.0: 707 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 708 | engines: {node: '>=4'} 709 | dependencies: 710 | has-flag: 3.0.0 711 | dev: true 712 | 713 | /supports-color/7.2.0: 714 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 715 | engines: {node: '>=8'} 716 | dependencies: 717 | has-flag: 4.0.0 718 | dev: true 719 | 720 | /supports-preserve-symlinks-flag/1.0.0: 721 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 722 | engines: {node: '>= 0.4'} 723 | dev: true 724 | 725 | /terser/5.10.0: 726 | resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==} 727 | engines: {node: '>=10'} 728 | hasBin: true 729 | peerDependencies: 730 | acorn: ^8.5.0 731 | peerDependenciesMeta: 732 | acorn: 733 | optional: true 734 | dependencies: 735 | commander: 2.20.3 736 | source-map: 0.7.3 737 | source-map-support: 0.5.21 738 | dev: true 739 | 740 | /tslib/2.1.0: 741 | resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} 742 | dev: true 743 | 744 | /typescript/4.5.5: 745 | resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} 746 | engines: {node: '>=4.2.0'} 747 | hasBin: true 748 | dev: true 749 | 750 | /universalify/0.1.2: 751 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 752 | engines: {node: '>= 4.0.0'} 753 | dev: true 754 | 755 | /vue/3.2.29: 756 | resolution: {integrity: sha512-cFIwr7LkbtCRanjNvh6r7wp2yUxfxeM2yPpDQpAfaaLIGZSrUmLbNiSze9nhBJt5MrZ68Iqt0O5scwAMEVxF+Q==} 757 | dependencies: 758 | '@vue/compiler-dom': 3.2.29 759 | '@vue/compiler-sfc': 3.2.29 760 | '@vue/runtime-dom': 3.2.29 761 | '@vue/server-renderer': 3.2.29_vue@3.2.29 762 | '@vue/shared': 3.2.29 763 | dev: true 764 | 765 | /wrappy/1.0.2: 766 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 767 | dev: true 768 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import vuePlugin from 'rollup-plugin-vue' 3 | import ts from 'rollup-plugin-typescript2' 4 | import replace from '@rollup/plugin-replace' 5 | import resolve from '@rollup/plugin-node-resolve' 6 | import commonjs from '@rollup/plugin-commonjs' 7 | import pascalcase from 'pascalcase' 8 | 9 | const pkg = require('./package.json') 10 | const name = pkg.name 11 | 12 | function getAuthors(pkg) { 13 | const { contributors, author } = pkg 14 | 15 | const authors = new Set() 16 | if (contributors && contributors) 17 | contributors.forEach((contributor) => { 18 | authors.add(contributor.name) 19 | }) 20 | if (author) authors.add(author.name) 21 | 22 | return Array.from(authors).join(', ') 23 | } 24 | 25 | const banner = `/*! 26 | * ${pkg.name} v${pkg.version} 27 | * (c) ${new Date().getFullYear()} ${getAuthors(pkg)} 28 | * @license MIT 29 | */` 30 | 31 | // ensure TS checks only once for each build 32 | let hasTSChecked = false 33 | 34 | const outputConfigs = { 35 | // each file name has the format: `dist/${name}.${format}.js` 36 | // format being a key of this object 37 | 'esm-bundler': { 38 | file: pkg.module, 39 | format: `es`, 40 | }, 41 | cjs: { 42 | file: pkg.main, 43 | format: `cjs`, 44 | }, 45 | global: { 46 | file: pkg.unpkg, 47 | format: `iife`, 48 | }, 49 | esm: { 50 | file: pkg.module.replace('bundler', 'browser'), 51 | format: `es`, 52 | }, 53 | } 54 | 55 | const allFormats = Object.keys(outputConfigs) 56 | const packageFormats = allFormats 57 | const packageConfigs = packageFormats.map((format) => 58 | createConfig(format, outputConfigs[format]) 59 | ) 60 | 61 | // only add the production ready if we are bundling the options 62 | packageFormats.forEach((format) => { 63 | if (format === 'cjs') { 64 | packageConfigs.push(createProductionConfig(format)) 65 | } else if (format === 'global') { 66 | packageConfigs.push(createMinifiedConfig(format)) 67 | } 68 | }) 69 | 70 | export default packageConfigs 71 | 72 | function createConfig(format, output, plugins = []) { 73 | if (!output) { 74 | console.log(`invalid format: "${format}"`) 75 | process.exit(1) 76 | } 77 | 78 | output.sourcemap = !!process.env.SOURCE_MAP 79 | output.banner = banner 80 | output.externalLiveBindings = false 81 | output.globals = { vue: 'Vue', '@vue/composition-api': 'vueCompositionApi' } 82 | 83 | const isProductionBuild = /\.prod\.js$/.test(output.file) 84 | const isGlobalBuild = format === 'global' 85 | const isRawESMBuild = format === 'esm' 86 | const isNodeBuild = format === 'cjs' 87 | const isBundlerESMBuild = /esm-bundler/.test(format) 88 | 89 | if (isGlobalBuild) output.name = pascalcase(pkg.name) 90 | 91 | const shouldEmitDeclarations = !hasTSChecked 92 | 93 | const tsPlugin = ts({ 94 | check: !hasTSChecked, 95 | tsconfig: path.resolve(__dirname, 'tsconfig.json'), 96 | cacheRoot: path.resolve(__dirname, 'node_modules/.rts2_cache'), 97 | tsconfigOverride: { 98 | compilerOptions: { 99 | sourceMap: output.sourcemap, 100 | declaration: shouldEmitDeclarations, 101 | declarationMap: shouldEmitDeclarations, 102 | }, 103 | exclude: ['__tests__', 'test-dts'], 104 | }, 105 | }) 106 | // we only need to check TS and generate declarations once for each build. 107 | // it also seems to run into weird issues when checking multiple times 108 | // during a single build. 109 | hasTSChecked = true 110 | 111 | const external = ['vue', '@vue/composition-api'] 112 | if (!isGlobalBuild) { 113 | external.push('@vue/devtools-api') 114 | } 115 | 116 | const nodePlugins = [resolve(), commonjs()] 117 | 118 | return { 119 | input: `src/index.ts`, 120 | // Global and Browser ESM builds inlines everything so that they can be 121 | // used alone. 122 | external, 123 | plugins: [ 124 | vuePlugin(), 125 | tsPlugin, 126 | createReplacePlugin( 127 | isProductionBuild, 128 | isBundlerESMBuild 129 | ), 130 | ...nodePlugins, 131 | ...plugins, 132 | ], 133 | output, 134 | } 135 | } 136 | 137 | function createReplacePlugin( 138 | isProduction, 139 | isBundlerESMBuild 140 | ) { 141 | const replacements = { 142 | 'process.env.NODE_ENV': isBundlerESMBuild 143 | ? // preserve to be handled by bundlers 144 | `process.env.NODE_ENV` 145 | : // hard coded dev/prod builds 146 | JSON.stringify(isProduction ? 'production' : 'development'), 147 | __VUE_PROD_DEVTOOLS__: isBundlerESMBuild 148 | ? `__VUE_PROD_DEVTOOLS__` 149 | : 'false', 150 | } 151 | // allow inline overrides like 152 | //__RUNTIME_COMPILE__=true yarn build 153 | Object.keys(replacements).forEach((key) => { 154 | if (key in process.env) { 155 | replacements[key] = process.env[key] 156 | } 157 | }) 158 | return replace({ 159 | preventAssignment: true, 160 | values: replacements, 161 | }) 162 | } 163 | 164 | function createProductionConfig(format) { 165 | return createConfig(format, { 166 | file: `dist/${name}.${format}.prod.js`, 167 | format: outputConfigs[format].format, 168 | }) 169 | } 170 | 171 | function createMinifiedConfig(format) { 172 | const { terser } = require('rollup-plugin-terser') 173 | return createConfig( 174 | format, 175 | { 176 | file: `dist/${name}.${format}.prod.js`, 177 | format: outputConfigs[format].format, 178 | }, 179 | [ 180 | terser({ 181 | module: /^esm/.test(format), 182 | compress: { 183 | ecma: 2015, 184 | pure_getters: true, 185 | }, 186 | }), 187 | ] 188 | ) 189 | } 190 | -------------------------------------------------------------------------------- /src/SomeComponent.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/data.ts: -------------------------------------------------------------------------------- 1 | export interface MyPluginData { 2 | message: string, 3 | counter: number 4 | } 5 | -------------------------------------------------------------------------------- /src/devtools.ts: -------------------------------------------------------------------------------- 1 | import { setupDevtoolsPlugin, DevtoolsPluginApi } from '@vue/devtools-api' 2 | import { App } from 'vue' 3 | import { MyPluginData } from './data' 4 | 5 | export function setupDevtools (app: App, data: MyPluginData) { 6 | const stateType = 'My Awesome Plugin state' 7 | const inspectorId = 'my-awesome-plugin' 8 | const timelineLayerId = 'my-awesome-plugin' 9 | 10 | let devtoolsApi: DevtoolsPluginApi<{}> 11 | 12 | let trackId = 0 13 | 14 | const devtools = { 15 | trackStart: (label: string) => { 16 | const groupId = 'track' + trackId++ 17 | 18 | devtoolsApi.addTimelineEvent({ 19 | layerId: timelineLayerId, 20 | event: { 21 | time: Date.now(), 22 | data: { 23 | label 24 | }, 25 | title: label, 26 | groupId 27 | } 28 | }) 29 | 30 | return () => { 31 | devtoolsApi.addTimelineEvent({ 32 | layerId: timelineLayerId, 33 | event: { 34 | time: Date.now(), 35 | data: { 36 | label, 37 | done: true 38 | }, 39 | title: label, 40 | groupId 41 | } 42 | }) 43 | } 44 | } 45 | } 46 | 47 | setupDevtoolsPlugin({ 48 | id: 'my-awesome-devtools-plugin', 49 | label: 'My Awesome Plugin', 50 | packageName: 'my-awesome-plugin', 51 | homepage: 'https://vuejs.org', 52 | componentStateTypes: [ 53 | stateType 54 | ], 55 | app 56 | }, api => { 57 | devtoolsApi = api 58 | 59 | api.on.inspectComponent((payload, context) => { 60 | payload.instanceData.state.push({ 61 | type: stateType, 62 | key: '$hello', 63 | value: data.message, 64 | editable: false 65 | }) 66 | 67 | payload.instanceData.state.push({ 68 | type: stateType, 69 | key: 'time counter', 70 | value: data.counter, 71 | editable: false 72 | }) 73 | }) 74 | 75 | setInterval(() => { 76 | api.notifyComponentUpdate() 77 | }, 5000) 78 | 79 | api.on.visitComponentTree((payload, context) => { 80 | const node = payload.treeNode 81 | if (payload.componentInstance.type.meow) { 82 | node.tags.push({ 83 | label: 'meow', 84 | textColor: 0x000000, 85 | backgroundColor: 0xff984f 86 | }) 87 | } 88 | }) 89 | 90 | api.addInspector({ 91 | id: inspectorId, 92 | label: 'Awesome!', 93 | icon: 'pets', 94 | }) 95 | 96 | api.on.getInspectorTree((payload, context) => { 97 | if (payload.inspectorId === inspectorId) { 98 | payload.rootNodes = [ 99 | { 100 | id: 'root', 101 | label: 'Awesome root', 102 | children: [ 103 | { 104 | id: 'child-1', 105 | label: 'Child 1', 106 | tags: [ 107 | { 108 | label: 'awesome', 109 | textColor: 0xffffff, 110 | backgroundColor: 0x000000 111 | } 112 | ] 113 | }, 114 | { 115 | id: 'child-2', 116 | label: 'Child 2' 117 | } 118 | ] 119 | }, 120 | { 121 | id: 'root2', 122 | label: 'Amazing root' 123 | } 124 | ] 125 | } 126 | }) 127 | 128 | api.on.getInspectorState((payload, context) => { 129 | if (payload.inspectorId === inspectorId) { 130 | if (payload.nodeId === 'child-1') { 131 | payload.state = { 132 | 'my section': [ 133 | { 134 | key: 'cat', 135 | value: 'meow', 136 | editable: false, 137 | } 138 | ] 139 | } 140 | } else if (payload.nodeId === 'child-2') { 141 | payload.state = { 142 | 'my section': [ 143 | { 144 | key: 'dog', 145 | value: 'waf', 146 | editable: false, 147 | } 148 | ] 149 | } 150 | } 151 | } 152 | }) 153 | 154 | api.addTimelineLayer({ 155 | id: timelineLayerId, 156 | color: 0xff984f, 157 | label: 'Awesome!' 158 | }) 159 | 160 | // window.addEventListener('click', event => { 161 | // api.addTimelineEvent({ 162 | // layerId: timelineLayerId, 163 | // event: { 164 | // time: Date.now(), 165 | // data: { 166 | // mouseX: event.clientX, 167 | // mouseY: event.clientY 168 | // } 169 | // } 170 | // }) 171 | // }) 172 | window.addEventListener('click', event => { 173 | const groupId = 'group-1' 174 | 175 | devtoolsApi.addTimelineEvent({ 176 | layerId: timelineLayerId, 177 | event: { 178 | time: Date.now(), 179 | data: { 180 | label: 'group test' 181 | }, 182 | title: 'group test', 183 | groupId 184 | } 185 | }) 186 | 187 | devtoolsApi.addTimelineEvent({ 188 | layerId: timelineLayerId, 189 | event: { 190 | time: Date.now() + 10, 191 | data: { 192 | label: 'group test (event 2)', 193 | }, 194 | title: 'group test', 195 | groupId 196 | } 197 | }) 198 | 199 | devtoolsApi.addTimelineEvent({ 200 | layerId: timelineLayerId, 201 | event: { 202 | time: Date.now() + 20, 203 | data: { 204 | label: 'group test (event 3)', 205 | }, 206 | title: 'group test', 207 | groupId 208 | } 209 | }) 210 | }) 211 | }) 212 | 213 | return devtools 214 | } -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import type { DefineComponent } from 'vue' 3 | const component: DefineComponent<{}, {}, any> 4 | export default component 5 | } 6 | 7 | declare const __VUE_PROD_DEVTOOLS__: boolean 8 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { reactive, App } from 'vue' 2 | import SomeComponent from './SomeComponent.vue' 3 | import { setupDevtools } from './devtools' 4 | import { MyPluginData } from './data' 5 | 6 | // Our plugin 7 | 8 | export default { 9 | install (app: App, options = {}) { 10 | const data = reactive({ 11 | message: 'hello', 12 | counter: 0 13 | }) 14 | 15 | let devtools: ReturnType 16 | 17 | app.mixin({ 18 | computed: { 19 | $hello () { 20 | return data.message 21 | } 22 | }, 23 | 24 | methods: { 25 | $doSomething () { 26 | const trackEnd = devtools ? devtools.trackStart('$doSomething') : null 27 | return new Promise(resolve => { 28 | setTimeout(() => { 29 | console.log('done') 30 | if (trackEnd) trackEnd() 31 | resolve('done') 32 | }, 1000) 33 | }) 34 | } 35 | } 36 | }) 37 | 38 | app.component('SomeComponent', SomeComponent) 39 | 40 | setInterval(() => { 41 | data.counter += 5 42 | }, 5000) 43 | 44 | if (process.env.NODE_ENV === 'development' || __VUE_PROD_DEVTOOLS__) { 45 | devtools = setupDevtools(app, data) 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/global.d.ts", 4 | "src/**/*.ts", 5 | "__tests__/**/*.ts" 6 | ], 7 | "compilerOptions": { 8 | "outDir": "dist", 9 | "sourceMap": false, 10 | 11 | "target": "esnext", 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "allowJs": false, 15 | "skipLibCheck": true, 16 | 17 | "noUnusedLocals": true, 18 | "strictNullChecks": true, 19 | "noImplicitAny": true, 20 | "noImplicitThis": true, 21 | "noImplicitReturns": false, 22 | "strict": true, 23 | "isolatedModules": true, 24 | 25 | "experimentalDecorators": true, 26 | "resolveJsonModule": true, 27 | "esModuleInterop": true, 28 | "removeComments": false, 29 | "jsx": "preserve", 30 | "lib": [ 31 | "esnext", 32 | "dom" 33 | ], 34 | "types": [ 35 | "node" 36 | ] 37 | } 38 | } 39 | --------------------------------------------------------------------------------