├── .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 |
2 | I'm a component!
3 |
4 | With some text
5 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------