├── .gitignore
├── LICENSE
├── README.md
├── examples
├── commits.html
├── components.html
├── grid.html
├── markdown.html
├── svg.html
├── todomvc.html
└── tree.html
├── index.html
├── package.json
├── pnpm-lock.yaml
├── scripts
└── release.js
├── src
├── app.ts
├── block.ts
├── context.ts
├── directives
│ ├── bind.ts
│ ├── effect.ts
│ ├── for.ts
│ ├── html.ts
│ ├── if.ts
│ ├── index.ts
│ ├── model.ts
│ ├── on.ts
│ ├── ref.ts
│ ├── show.ts
│ └── text.ts
├── eval.ts
├── index.ts
├── scheduler.ts
├── utils.ts
└── walk.ts
├── tests
├── bind.html
├── cloak.html
├── component.html
├── custom-delimiters.html
├── effect.html
├── for.html
├── html.html
├── if.html
├── model.html
├── multi-mount.html
├── on.html
├── once.html
├── pre.html
├── reactive.html
├── ref.html
├── scope.html
├── show.html
└── text.html
├── tsconfig.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | TODOs.md
2 | node_modules
3 | dist
4 | explorations
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2021-present, Yuxi (Evan) You
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
13 | all 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
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # pico-vue
2 |
3 | `pico-vue` is a fork of `petite-vue`, which is an alternative distribution of [Vue](https://vuejs.org) optimized for [progressive enhancement](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). It provides the same template syntax and reactivity mental model as standard Vue. However, it is specifically optimized for "sprinkling" a small amount of interactions on an existing HTML page rendered by a server framework. See more details on [how it differs from standard Vue](#comparison-with-standard-vue).
4 |
5 | - Only ~6kb
6 | - Vue-compatible template syntax
7 | - DOM-based, mutates in place
8 | - Driven by `@vue/reactivity`
9 |
10 | ## Status
11 |
12 | - `petite-vue` it's not mantained anymore, hence we will provide bug fixes and handle feature requests. Feel free to open issue or PR.
13 | - this fork is focused on web components, but we will provide new generic features too
14 |
15 |
16 | ## Usage
17 |
18 | `pico-vue` can be used without a build step. Simply load it from a CDN:
19 |
20 | ```html
21 |
22 |
23 |
24 |
25 | {{ count }}
26 | inc
27 |
28 |
29 |
30 |
36 | ```
37 |
38 | - Use `v-scope` to mark regions on the page that should be controlled by `pico-vue`.
39 | - The `defer` attribute makes the script execute after HTML content is parsed.
40 | - The `init` attribute tells `pico-vue` to automatically query and initialize all elements that have `v-scope` on the page.
41 |
42 | ### Manual Init
43 |
44 | If you don't want the auto init, remove the `init` attribute and move the scripts to end of ``:
45 |
46 | ```html
47 |
48 |
51 | ```
52 |
53 | Or, use the ES module build:
54 |
55 | ```html
56 |
60 | ```
61 |
62 | ### Production CDN URLs
63 |
64 | The short CDN URL is meant for prototyping. For production usage, use a fully resolved CDN URL to avoid resolving and redirect cost:
65 |
66 | - Global build: `https://unpkg.com/pico-vue@1.0.3/dist/pico-vue.iife.js`
67 | - exposes `PetiteVue` global, supports auto init
68 | - ESM build: `https://unpkg.com/pico-vue@1.0.3/dist/pico-vue.es.js`
69 | - Must be used with `
92 |
93 |
94 |
95 |
{{ count }}
96 |
{{ plusOne }}
97 |
increment
98 |
99 | ```
100 |
101 | Note `v-scope` doesn't need to have a value here and simply serves as a hint for `pico-vue` to process the element.
102 |
103 | ### Explicit Mount Target
104 |
105 | You can specify a mount target (selector or element) to limit `pico-vue` to only that region of the page:
106 |
107 | ```js
108 | createApp().mount('#only-this-div')
109 | ```
110 |
111 | This also means you can have multiple `pico-vue` apps to control different regions on the same page:
112 |
113 | ```js
114 | createApp({
115 | // root scope for app one
116 | }).mount('#app1')
117 |
118 | createApp({
119 | // root scope for app two
120 | }).mount('#app2')
121 | ```
122 |
123 | ### Components
124 |
125 | The concept of "Components" are different in `pico-vue`, as it is much more bare-bones.
126 |
127 | First, reusable scope logic can be created with functions:
128 |
129 | ```html
130 |
149 |
150 |
151 |
{{ count }}
152 |
increment
153 |
154 |
155 |
156 |
{{ count }}
157 |
increment
158 |
159 | ```
160 |
161 | ### Components with Template
162 |
163 | If you also want to reuse a piece of template, you can provide a special `$template` key on a scope object. The value can be the template string, or an ID selector to a `` element:
164 |
165 | ```html
166 |
183 |
184 |
185 | My count is {{ count }}
186 | ++
187 |
188 |
189 |
190 |
191 |
192 | ```
193 |
194 | The `` approach is recommended over inline strings because it is more efficient to clone from a native template element.
195 |
196 | ### Lifecycle Events
197 |
198 | You can listen to the special `vue:mounted` and `vue:unmounted` lifecycle events for each element:
199 |
200 | ```html
201 |
206 | ```
207 |
208 | ### globals
209 |
210 | #### `$el`
211 |
212 | represent the current element
213 |
214 | #### `$root`
215 |
216 | represent the element of `v-scope`
217 |
218 | ### directives
219 |
220 | #### `v-text`
221 |
222 | #### `v-bind`
223 |
224 | #### `v-effect`
225 |
226 | Use `v-effect` to execute **reactive** inline statements:
227 |
228 | ```html
229 |
233 | ```
234 |
235 | The effect uses `count` which is a reactive data source, so it will re-run whenever `count` changes.
236 |
237 | Another example of replacing the `todo-focus` directive found in the original Vue TodoMVC example:
238 |
239 | ```html
240 |
241 | ```
242 |
243 | #### `v-if`
244 |
245 | #### `v-show`
246 |
247 | #### `v-for`
248 |
249 | ```html
250 |
251 |
252 |
253 |
254 |
{{ value }}
255 |
256 |
{{ key }}: {{ value }}
257 |
258 |
259 |
add
260 |
261 | ```
262 |
263 | #### `v-model`
264 |
265 | #### `v-on`
266 |
267 | #### `v-cloak`
268 |
269 | avoid flash rendreng which happen until `petite-vue` loaded, after it load it will remove these directives
270 |
271 | >This directive is only needed in no-build-step setups
272 |
273 | ``` html
274 |
279 |
280 |
281 | {{ message }}
282 |
283 | ```
284 |
285 | ### Global State Management
286 |
287 | You can use the `reactive` method (re-exported from `@vue/reactivity`) to create global state singletons:
288 |
289 | ```html
290 |
308 |
309 |
310 |
Global {{ store.count }}
311 |
increment
312 |
313 |
Local {{ localCount }}
314 |
increment
315 |
316 | ```
317 |
318 | Use `watchEffect` to re-run a function every time its dependencies changes.
319 |
320 | ```js
321 |
322 | import { watchEffect, reactive } from 'https://unpkg.com/pico-vue?module'
323 |
324 | const store = reactive({
325 | count: 0,
326 | })
327 |
328 | watchEffect( () => console.log(store.count))
329 |
330 | store.count++
331 |
332 | ```
333 |
334 | ### Custom Directives
335 |
336 | Custom directives are also supported but with a different interface:
337 |
338 | ```js
339 | const myDirective = (ctx) => {
340 | // the element the directive is on
341 | ctx.el
342 | // the raw value expression
343 | // e.g. v-my-dir="x" then this would be "x"
344 | ctx.exp
345 | // v-my-dir:foo -> "foo"
346 | ctx.arg
347 | // v-my-dir.mod -> { mod: true }
348 | ctx.modifiers
349 | // evaluate the expression and get its value
350 | ctx.get()
351 | // evaluate arbitrary expression in current scope
352 | ctx.get(`${ctx.exp} + 10`)
353 |
354 | // run reactive effect
355 | ctx.effect(() => {
356 | // this will re-run every time the get() value changes
357 | console.log(ctx.get())
358 | })
359 |
360 | return () => {
361 | // cleanup if the element is unmounted
362 | }
363 | }
364 |
365 | // register the directive
366 | createApp().directive('my-dir', myDirective).mount()
367 | ```
368 |
369 | This is how `v-html` is implemented:
370 |
371 | ```js
372 | const html = ({ el, get, effect }) => {
373 | effect(() => {
374 | el.innerHTML = get()
375 | })
376 | }
377 | ```
378 |
379 | ### Custom Delimiters
380 |
381 | You can use custom delimiters by passing `$delimiters` to your root scope. This is useful when working alongside a server-side templating language that also uses mustaches:
382 |
383 | ```js
384 | createApp({
385 | $delimiters: ['${', '}']
386 | }).mount()
387 | ```
388 |
389 | ### Use Plugins
390 |
391 | You can write custome directive then distrbute it as a package, then add it to create vue, like:
392 |
393 | ```html
394 |
395 | increase
396 |
397 |
398 |
403 | ```
404 |
405 | A plugin code similar to vue plugins code:
406 |
407 | ```js
408 | // inside log.js plugin file
409 | export default {
410 | install: (app, options) => {
411 | app.directive('log', ({exp}) => {
412 | console.log(exp)
413 | })
414 | }
415 | }
416 | ```
417 |
418 | ## Examples
419 |
420 | Check out the [examples directory](https://github.com/ws-rush/pico-vue/tree/main/examples).
421 |
422 | ## Features
423 |
424 | ### `pico-vue`/`petite-vue` only
425 |
426 | - `v-scope`
427 | - `v-effect`
428 | - `@vue:mounted` & `@vue:unmounted` events
429 | - `$root` refers to the component root element
430 |
431 | ### Different Behavior from `petite-vue`
432 |
433 | - In expressions, `$el` points to the current element the directive is bound to (instead of component root element which accessed by `$root`)
434 | - `createApp()` accepts global state instead of a component
435 | - Components are simplified into object-returning functions
436 | - Custom directives have a different interface
437 | - exported `watchEffect`
438 |
439 | ### Vue Compatible
440 |
441 | - `{{ }}` text bindings (configurable with custom delimiters)
442 | - `v-bind` (including `:` shorthand and class/style special handling)
443 | - `v-on` (including `@` shorthand and all modifiers)
444 | - `v-model` (all input types + non-string `:value` bindings)
445 | - `v-if` / `v-else` / `v-else-if`
446 | - `v-for`
447 | - `v-show`
448 | - `v-html`
449 | - `v-text`
450 | - `v-pre`
451 | - `v-once`
452 | - `v-cloak`
453 | - `reactive()`
454 | - `nextTick()`
455 | - Template refs
456 |
457 | ### Not Supported
458 |
459 | Some features are dropped because they have a relatively low utility/size ratio in the context of progressive enhancement. If you need these features, you should probably just use standard Vue.
460 |
461 | - `ref()`, `computed()` etc.
462 | - Render functions (`pico-vue` has no virtual DOM)
463 | - Reactivity for Collection Types (Map, Set, etc., removed for smaller size)
464 | - Transition, KeepAlive, Teleport, Suspense
465 | - `v-for` deep destructure
466 | - `v-on="object"`
467 | - `v-is` & ``
468 | - `v-bind:style` auto-prefixing
469 |
470 | ## Comparison with standard Vue
471 |
472 | The point of `petite-vue` is not just about being small. It's about using the optimal implementation for the intended use case (progressive enhancement).
473 |
474 | Standard Vue can be used with or without a build step. When using a build setup (e.g. with Single-File Components), we pre-compile all the templates so there's no template processing to be done at runtime. And thanks to tree-shaking, we can ship optional features in standard Vue that doesn't bloat your bundle size when not used. This is the optimal usage of standard Vue, but since it involves a build setup, it is better suited when building SPAs or apps with relatively heavy interactions.
475 |
476 | When using standard Vue without a build step and mounting to in-DOM templates, it is much less optimal because:
477 |
478 | - We have to ship the Vue template compiler to the browser (13kb extra size)
479 | - The compiler will have to retrieve the template string from already instantiated DOM
480 | - The compiler then compiles the string into a JavaScript render function
481 | - Vue then replaces existing DOM templates with new DOM generated from the render function.
482 |
483 | `petite-vue` avoids all this overhead by walking the existing DOM and attaching fine-grained reactive effects to the elements directly. The DOM _is_ the template. This means `petite-vue` is much more efficient in progressive enhancement scenarios.
484 |
485 | This is also how Vue 1 worked. The trade-off here is that this approach is coupled to the DOM and thus not suitable for platform agnostic rendering or JavaScript SSR. We also lose the ability to work with render functions for advanced abstractions. However as you can probably tell, these capabilities are rarely needed in the context of progressive enhancement.
486 |
487 | ## Comparison with Alpine
488 |
489 | `petite-vue` is indeed addressing a similar scope to [Alpine](https://alpinejs.dev), but aims to be (1) even more minimal and (2) more Vue-compatible.
490 |
491 | - `petite-vue` is around half the size of Alpine.
492 |
493 | - `petite-vue` has no transition system (maybe this can be an opt-in plugin).
494 |
495 | - Although Alpine largely resembles Vue's design, there are various cases where the behavior is different from Vue itself. It may also diverge more from Vue in the future. This is good because Alpine shouldn't have to restrict its design to strictly follow Vue - it should have the freedom to develop in a direction that makes sense for its goals.
496 |
497 | In comparison, `petite-vue` will try to align with standard Vue behavior whenever possible so that there is less friction moving to standard Vue if needed. It's intended to be **part of the Vue ecosystem** to cover the progressive enhancement use case where standard Vue is less optimized for nowadays.
498 |
499 | ## Security and CSP
500 |
501 | `petite-vue` evaluates JavaScript expressions in the templates. This means **if** `petite-vue` is mounted on a region of the DOM that contains non-sanitized HTML from user data, it may lead to XSS attacks. **If your page renders user-submitted HTML, you should prefer initializing `petite-vue` using [explicit mount target](#explicit-mount-target) so that it only processes parts that are controlled by you**. You can also sanitize any user-submitted HTML for the `v-scope` attribute.
502 |
503 | `petite-vue` evaluates the expressions using `new Function()`, which may be prohibited in strict CSP settings. There is no plan to provide a CSP build because it involves shipping an expression parser which defeats the purpose of being lightweight. If you have strict CSP requirements, you should probably use standard Vue and pre-compile the templates.
504 |
505 | ## License
506 |
507 | MIT
508 |
--------------------------------------------------------------------------------
/examples/commits.html:
--------------------------------------------------------------------------------
1 |
29 |
30 |
31 |
Latest Vue.js Commits
32 |
33 |
40 | {{ branch }}
41 |
42 |
vuejs/vue@{{ currentBranch }}
43 |
58 |
59 |
60 |
76 |
--------------------------------------------------------------------------------
/examples/components.html:
--------------------------------------------------------------------------------
1 |
25 |
26 |
--------------------------------------------------------------------------------
/examples/grid.html:
--------------------------------------------------------------------------------
1 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
62 | {{ capitalize(key) }}
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | {{entry[key]}}
71 |
72 |
73 |
74 |
No matches found.
75 |
76 |
77 |
139 |
--------------------------------------------------------------------------------
/examples/markdown.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
17 |
21 |
22 |
61 |
--------------------------------------------------------------------------------
/examples/svg.html:
--------------------------------------------------------------------------------
1 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | {{ label }}
71 |
72 |
73 |
74 |
75 | {{stat.label}}
76 |
77 | {{stat.value}}
78 | X
79 |
80 |
84 |
{{ stats }}
85 |
86 |
87 |
120 |
--------------------------------------------------------------------------------
/examples/todomvc.html:
--------------------------------------------------------------------------------
1 |
5 |
10 |
11 |
135 |
136 |
213 |
--------------------------------------------------------------------------------
/examples/tree.html:
--------------------------------------------------------------------------------
1 |
60 |
61 |
62 |
63 | {{ model.name }}
64 | [{{open ? '-' : '+'}}]
65 |
66 |
70 |
71 |
72 | Double click an item to turn it into a folder.
73 |
76 |
77 |
89 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 | Examples
2 |
10 |
11 | Tests
12 |
30 |
31 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pico-vue",
3 | "version": "1.0.5",
4 | "description": "petite-vue fork with plugins support",
5 | "main": "dist/pico-vue.umd.js",
6 | "unpkg": "dist/pico-vue.iife.js",
7 | "jsdelivr": "dist/pico-vue.iife.js",
8 | "module": "./dist/pico-vue.es.js",
9 | "exports": {
10 | ".": {
11 | "import": "./dist/pico-vue.es.js",
12 | "require": "./dist/pico-vue.umd.js"
13 | }
14 | },
15 | "types": "./dist/types/index.d.ts",
16 | "scripts": {
17 | "dev": "vite",
18 | "build": "vite build && tsc --emitDeclarationOnly && mv dist/src dist/types",
19 | "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
20 | "release": "node scripts/release.js"
21 | },
22 | "repository": {
23 | "type": "git",
24 | "url": "git+https://github.com/ws-rush/pico-vue.git"
25 | },
26 | "keywords": [
27 | "vue"
28 | ],
29 | "author": "Evan You",
30 | "license": "MIT",
31 | "bugs": {
32 | "url": "https://github.com/ws-rush/pico-vue/discussions"
33 | },
34 | "homepage": "https://github.com/ws-rush/pico-vue#readme",
35 | "devDependencies": {
36 | "@types/node": "^20.14.2",
37 | "@vue/reactivity": "3.2.45",
38 | "@vue/shared": "3.2.45",
39 | "chalk": "^4.1.1",
40 | "conventional-changelog-cli": "^2.1.1",
41 | "enquirer": "^2.3.6",
42 | "execa": "^5.0.0",
43 | "prettier": "^2.3.0",
44 | "semver": "^7.3.5",
45 | "terser": "^5.31.1",
46 | "typescript": "^5.4.5",
47 | "vite": "^5.2.13"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | devDependencies:
11 | '@types/node':
12 | specifier: ^20.14.2
13 | version: 20.14.2
14 | '@vue/reactivity':
15 | specifier: 3.2.45
16 | version: 3.2.45
17 | '@vue/shared':
18 | specifier: 3.2.45
19 | version: 3.2.45
20 | chalk:
21 | specifier: ^4.1.1
22 | version: 4.1.2
23 | conventional-changelog-cli:
24 | specifier: ^2.1.1
25 | version: 2.2.2
26 | enquirer:
27 | specifier: ^2.3.6
28 | version: 2.4.1
29 | execa:
30 | specifier: ^5.0.0
31 | version: 5.1.1
32 | prettier:
33 | specifier: ^2.3.0
34 | version: 2.8.8
35 | semver:
36 | specifier: ^7.3.5
37 | version: 7.6.2
38 | terser:
39 | specifier: ^5.31.1
40 | version: 5.31.1
41 | typescript:
42 | specifier: ^5.4.5
43 | version: 5.4.5
44 | vite:
45 | specifier: ^5.2.13
46 | version: 5.2.13(@types/node@20.14.2)(terser@5.31.1)
47 |
48 | packages:
49 |
50 | '@babel/code-frame@7.24.6':
51 | resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==}
52 | engines: {node: '>=6.9.0'}
53 |
54 | '@babel/helper-validator-identifier@7.24.6':
55 | resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==}
56 | engines: {node: '>=6.9.0'}
57 |
58 | '@babel/highlight@7.24.6':
59 | resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==}
60 | engines: {node: '>=6.9.0'}
61 |
62 | '@esbuild/aix-ppc64@0.20.2':
63 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
64 | engines: {node: '>=12'}
65 | cpu: [ppc64]
66 | os: [aix]
67 |
68 | '@esbuild/android-arm64@0.20.2':
69 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
70 | engines: {node: '>=12'}
71 | cpu: [arm64]
72 | os: [android]
73 |
74 | '@esbuild/android-arm@0.20.2':
75 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
76 | engines: {node: '>=12'}
77 | cpu: [arm]
78 | os: [android]
79 |
80 | '@esbuild/android-x64@0.20.2':
81 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
82 | engines: {node: '>=12'}
83 | cpu: [x64]
84 | os: [android]
85 |
86 | '@esbuild/darwin-arm64@0.20.2':
87 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
88 | engines: {node: '>=12'}
89 | cpu: [arm64]
90 | os: [darwin]
91 |
92 | '@esbuild/darwin-x64@0.20.2':
93 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
94 | engines: {node: '>=12'}
95 | cpu: [x64]
96 | os: [darwin]
97 |
98 | '@esbuild/freebsd-arm64@0.20.2':
99 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
100 | engines: {node: '>=12'}
101 | cpu: [arm64]
102 | os: [freebsd]
103 |
104 | '@esbuild/freebsd-x64@0.20.2':
105 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
106 | engines: {node: '>=12'}
107 | cpu: [x64]
108 | os: [freebsd]
109 |
110 | '@esbuild/linux-arm64@0.20.2':
111 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
112 | engines: {node: '>=12'}
113 | cpu: [arm64]
114 | os: [linux]
115 |
116 | '@esbuild/linux-arm@0.20.2':
117 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
118 | engines: {node: '>=12'}
119 | cpu: [arm]
120 | os: [linux]
121 |
122 | '@esbuild/linux-ia32@0.20.2':
123 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
124 | engines: {node: '>=12'}
125 | cpu: [ia32]
126 | os: [linux]
127 |
128 | '@esbuild/linux-loong64@0.20.2':
129 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
130 | engines: {node: '>=12'}
131 | cpu: [loong64]
132 | os: [linux]
133 |
134 | '@esbuild/linux-mips64el@0.20.2':
135 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
136 | engines: {node: '>=12'}
137 | cpu: [mips64el]
138 | os: [linux]
139 |
140 | '@esbuild/linux-ppc64@0.20.2':
141 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
142 | engines: {node: '>=12'}
143 | cpu: [ppc64]
144 | os: [linux]
145 |
146 | '@esbuild/linux-riscv64@0.20.2':
147 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
148 | engines: {node: '>=12'}
149 | cpu: [riscv64]
150 | os: [linux]
151 |
152 | '@esbuild/linux-s390x@0.20.2':
153 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
154 | engines: {node: '>=12'}
155 | cpu: [s390x]
156 | os: [linux]
157 |
158 | '@esbuild/linux-x64@0.20.2':
159 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
160 | engines: {node: '>=12'}
161 | cpu: [x64]
162 | os: [linux]
163 |
164 | '@esbuild/netbsd-x64@0.20.2':
165 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
166 | engines: {node: '>=12'}
167 | cpu: [x64]
168 | os: [netbsd]
169 |
170 | '@esbuild/openbsd-x64@0.20.2':
171 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
172 | engines: {node: '>=12'}
173 | cpu: [x64]
174 | os: [openbsd]
175 |
176 | '@esbuild/sunos-x64@0.20.2':
177 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
178 | engines: {node: '>=12'}
179 | cpu: [x64]
180 | os: [sunos]
181 |
182 | '@esbuild/win32-arm64@0.20.2':
183 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
184 | engines: {node: '>=12'}
185 | cpu: [arm64]
186 | os: [win32]
187 |
188 | '@esbuild/win32-ia32@0.20.2':
189 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
190 | engines: {node: '>=12'}
191 | cpu: [ia32]
192 | os: [win32]
193 |
194 | '@esbuild/win32-x64@0.20.2':
195 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
196 | engines: {node: '>=12'}
197 | cpu: [x64]
198 | os: [win32]
199 |
200 | '@hutson/parse-repository-url@3.0.2':
201 | resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==}
202 | engines: {node: '>=6.9.0'}
203 |
204 | '@jridgewell/gen-mapping@0.3.5':
205 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
206 | engines: {node: '>=6.0.0'}
207 |
208 | '@jridgewell/resolve-uri@3.1.2':
209 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
210 | engines: {node: '>=6.0.0'}
211 |
212 | '@jridgewell/set-array@1.2.1':
213 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
214 | engines: {node: '>=6.0.0'}
215 |
216 | '@jridgewell/source-map@0.3.6':
217 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
218 |
219 | '@jridgewell/sourcemap-codec@1.4.15':
220 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
221 |
222 | '@jridgewell/trace-mapping@0.3.25':
223 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
224 |
225 | '@rollup/rollup-android-arm-eabi@4.18.0':
226 | resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==}
227 | cpu: [arm]
228 | os: [android]
229 |
230 | '@rollup/rollup-android-arm64@4.18.0':
231 | resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
232 | cpu: [arm64]
233 | os: [android]
234 |
235 | '@rollup/rollup-darwin-arm64@4.18.0':
236 | resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
237 | cpu: [arm64]
238 | os: [darwin]
239 |
240 | '@rollup/rollup-darwin-x64@4.18.0':
241 | resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
242 | cpu: [x64]
243 | os: [darwin]
244 |
245 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
246 | resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
247 | cpu: [arm]
248 | os: [linux]
249 |
250 | '@rollup/rollup-linux-arm-musleabihf@4.18.0':
251 | resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
252 | cpu: [arm]
253 | os: [linux]
254 |
255 | '@rollup/rollup-linux-arm64-gnu@4.18.0':
256 | resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
257 | cpu: [arm64]
258 | os: [linux]
259 |
260 | '@rollup/rollup-linux-arm64-musl@4.18.0':
261 | resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
262 | cpu: [arm64]
263 | os: [linux]
264 |
265 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
266 | resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
267 | cpu: [ppc64]
268 | os: [linux]
269 |
270 | '@rollup/rollup-linux-riscv64-gnu@4.18.0':
271 | resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
272 | cpu: [riscv64]
273 | os: [linux]
274 |
275 | '@rollup/rollup-linux-s390x-gnu@4.18.0':
276 | resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
277 | cpu: [s390x]
278 | os: [linux]
279 |
280 | '@rollup/rollup-linux-x64-gnu@4.18.0':
281 | resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
282 | cpu: [x64]
283 | os: [linux]
284 |
285 | '@rollup/rollup-linux-x64-musl@4.18.0':
286 | resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
287 | cpu: [x64]
288 | os: [linux]
289 |
290 | '@rollup/rollup-win32-arm64-msvc@4.18.0':
291 | resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
292 | cpu: [arm64]
293 | os: [win32]
294 |
295 | '@rollup/rollup-win32-ia32-msvc@4.18.0':
296 | resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
297 | cpu: [ia32]
298 | os: [win32]
299 |
300 | '@rollup/rollup-win32-x64-msvc@4.18.0':
301 | resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
302 | cpu: [x64]
303 | os: [win32]
304 |
305 | '@types/estree@1.0.5':
306 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
307 |
308 | '@types/minimist@1.2.5':
309 | resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
310 |
311 | '@types/node@20.14.2':
312 | resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==}
313 |
314 | '@types/normalize-package-data@2.4.4':
315 | resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
316 |
317 | '@vue/reactivity@3.2.45':
318 | resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==}
319 |
320 | '@vue/shared@3.2.45':
321 | resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
322 |
323 | JSONStream@1.3.5:
324 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
325 | hasBin: true
326 |
327 | acorn@8.11.3:
328 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
329 | engines: {node: '>=0.4.0'}
330 | hasBin: true
331 |
332 | add-stream@1.0.0:
333 | resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==}
334 |
335 | ansi-colors@4.1.3:
336 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
337 | engines: {node: '>=6'}
338 |
339 | ansi-regex@5.0.1:
340 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
341 | engines: {node: '>=8'}
342 |
343 | ansi-styles@3.2.1:
344 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
345 | engines: {node: '>=4'}
346 |
347 | ansi-styles@4.3.0:
348 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
349 | engines: {node: '>=8'}
350 |
351 | array-ify@1.0.0:
352 | resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
353 |
354 | arrify@1.0.1:
355 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
356 | engines: {node: '>=0.10.0'}
357 |
358 | buffer-from@1.1.2:
359 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
360 |
361 | camelcase-keys@6.2.2:
362 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
363 | engines: {node: '>=8'}
364 |
365 | camelcase@5.3.1:
366 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
367 | engines: {node: '>=6'}
368 |
369 | chalk@2.4.2:
370 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
371 | engines: {node: '>=4'}
372 |
373 | chalk@4.1.2:
374 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
375 | engines: {node: '>=10'}
376 |
377 | cliui@7.0.4:
378 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
379 |
380 | color-convert@1.9.3:
381 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
382 |
383 | color-convert@2.0.1:
384 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
385 | engines: {node: '>=7.0.0'}
386 |
387 | color-name@1.1.3:
388 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
389 |
390 | color-name@1.1.4:
391 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
392 |
393 | commander@2.20.3:
394 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
395 |
396 | compare-func@2.0.0:
397 | resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
398 |
399 | conventional-changelog-angular@5.0.13:
400 | resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==}
401 | engines: {node: '>=10'}
402 |
403 | conventional-changelog-atom@2.0.8:
404 | resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==}
405 | engines: {node: '>=10'}
406 |
407 | conventional-changelog-cli@2.2.2:
408 | resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==}
409 | engines: {node: '>=10'}
410 | hasBin: true
411 |
412 | conventional-changelog-codemirror@2.0.8:
413 | resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==}
414 | engines: {node: '>=10'}
415 |
416 | conventional-changelog-conventionalcommits@4.6.3:
417 | resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==}
418 | engines: {node: '>=10'}
419 |
420 | conventional-changelog-core@4.2.4:
421 | resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==}
422 | engines: {node: '>=10'}
423 |
424 | conventional-changelog-ember@2.0.9:
425 | resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==}
426 | engines: {node: '>=10'}
427 |
428 | conventional-changelog-eslint@3.0.9:
429 | resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==}
430 | engines: {node: '>=10'}
431 |
432 | conventional-changelog-express@2.0.6:
433 | resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==}
434 | engines: {node: '>=10'}
435 |
436 | conventional-changelog-jquery@3.0.11:
437 | resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==}
438 | engines: {node: '>=10'}
439 |
440 | conventional-changelog-jshint@2.0.9:
441 | resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==}
442 | engines: {node: '>=10'}
443 |
444 | conventional-changelog-preset-loader@2.3.4:
445 | resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==}
446 | engines: {node: '>=10'}
447 |
448 | conventional-changelog-writer@5.0.1:
449 | resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==}
450 | engines: {node: '>=10'}
451 | hasBin: true
452 |
453 | conventional-changelog@3.1.25:
454 | resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==}
455 | engines: {node: '>=10'}
456 |
457 | conventional-commits-filter@2.0.7:
458 | resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==}
459 | engines: {node: '>=10'}
460 |
461 | conventional-commits-parser@3.2.4:
462 | resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==}
463 | engines: {node: '>=10'}
464 | hasBin: true
465 |
466 | core-util-is@1.0.3:
467 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
468 |
469 | cross-spawn@7.0.3:
470 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
471 | engines: {node: '>= 8'}
472 |
473 | dargs@7.0.0:
474 | resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
475 | engines: {node: '>=8'}
476 |
477 | dateformat@3.0.3:
478 | resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==}
479 |
480 | decamelize-keys@1.1.1:
481 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
482 | engines: {node: '>=0.10.0'}
483 |
484 | decamelize@1.2.0:
485 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
486 | engines: {node: '>=0.10.0'}
487 |
488 | dot-prop@5.3.0:
489 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
490 | engines: {node: '>=8'}
491 |
492 | emoji-regex@8.0.0:
493 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
494 |
495 | enquirer@2.4.1:
496 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
497 | engines: {node: '>=8.6'}
498 |
499 | error-ex@1.3.2:
500 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
501 |
502 | esbuild@0.20.2:
503 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
504 | engines: {node: '>=12'}
505 | hasBin: true
506 |
507 | escalade@3.1.2:
508 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
509 | engines: {node: '>=6'}
510 |
511 | escape-string-regexp@1.0.5:
512 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
513 | engines: {node: '>=0.8.0'}
514 |
515 | execa@5.1.1:
516 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
517 | engines: {node: '>=10'}
518 |
519 | find-up@2.1.0:
520 | resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==}
521 | engines: {node: '>=4'}
522 |
523 | find-up@4.1.0:
524 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
525 | engines: {node: '>=8'}
526 |
527 | fsevents@2.3.3:
528 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
529 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
530 | os: [darwin]
531 |
532 | function-bind@1.1.2:
533 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
534 |
535 | get-caller-file@2.0.5:
536 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
537 | engines: {node: 6.* || 8.* || >= 10.*}
538 |
539 | get-pkg-repo@4.2.1:
540 | resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==}
541 | engines: {node: '>=6.9.0'}
542 | hasBin: true
543 |
544 | get-stream@6.0.1:
545 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
546 | engines: {node: '>=10'}
547 |
548 | git-raw-commits@2.0.11:
549 | resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
550 | engines: {node: '>=10'}
551 | hasBin: true
552 |
553 | git-remote-origin-url@2.0.0:
554 | resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==}
555 | engines: {node: '>=4'}
556 |
557 | git-semver-tags@4.1.1:
558 | resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==}
559 | engines: {node: '>=10'}
560 | hasBin: true
561 |
562 | gitconfiglocal@1.0.0:
563 | resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==}
564 |
565 | graceful-fs@4.2.11:
566 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
567 |
568 | handlebars@4.7.8:
569 | resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
570 | engines: {node: '>=0.4.7'}
571 | hasBin: true
572 |
573 | hard-rejection@2.1.0:
574 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
575 | engines: {node: '>=6'}
576 |
577 | has-flag@3.0.0:
578 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
579 | engines: {node: '>=4'}
580 |
581 | has-flag@4.0.0:
582 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
583 | engines: {node: '>=8'}
584 |
585 | hasown@2.0.2:
586 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
587 | engines: {node: '>= 0.4'}
588 |
589 | hosted-git-info@2.8.9:
590 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
591 |
592 | hosted-git-info@4.1.0:
593 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
594 | engines: {node: '>=10'}
595 |
596 | human-signals@2.1.0:
597 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
598 | engines: {node: '>=10.17.0'}
599 |
600 | indent-string@4.0.0:
601 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
602 | engines: {node: '>=8'}
603 |
604 | inherits@2.0.4:
605 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
606 |
607 | ini@1.3.8:
608 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
609 |
610 | is-arrayish@0.2.1:
611 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
612 |
613 | is-core-module@2.13.1:
614 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
615 |
616 | is-fullwidth-code-point@3.0.0:
617 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
618 | engines: {node: '>=8'}
619 |
620 | is-obj@2.0.0:
621 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
622 | engines: {node: '>=8'}
623 |
624 | is-plain-obj@1.1.0:
625 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
626 | engines: {node: '>=0.10.0'}
627 |
628 | is-stream@2.0.1:
629 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
630 | engines: {node: '>=8'}
631 |
632 | is-text-path@1.0.1:
633 | resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==}
634 | engines: {node: '>=0.10.0'}
635 |
636 | isarray@1.0.0:
637 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
638 |
639 | isexe@2.0.0:
640 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
641 |
642 | js-tokens@4.0.0:
643 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
644 |
645 | json-parse-better-errors@1.0.2:
646 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
647 |
648 | json-parse-even-better-errors@2.3.1:
649 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
650 |
651 | json-stringify-safe@5.0.1:
652 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
653 |
654 | jsonparse@1.3.1:
655 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
656 | engines: {'0': node >= 0.2.0}
657 |
658 | kind-of@6.0.3:
659 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
660 | engines: {node: '>=0.10.0'}
661 |
662 | lines-and-columns@1.2.4:
663 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
664 |
665 | load-json-file@4.0.0:
666 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
667 | engines: {node: '>=4'}
668 |
669 | locate-path@2.0.0:
670 | resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
671 | engines: {node: '>=4'}
672 |
673 | locate-path@5.0.0:
674 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
675 | engines: {node: '>=8'}
676 |
677 | lodash.ismatch@4.4.0:
678 | resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==}
679 |
680 | lodash@4.17.21:
681 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
682 |
683 | lru-cache@6.0.0:
684 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
685 | engines: {node: '>=10'}
686 |
687 | map-obj@1.0.1:
688 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
689 | engines: {node: '>=0.10.0'}
690 |
691 | map-obj@4.3.0:
692 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
693 | engines: {node: '>=8'}
694 |
695 | meow@8.1.2:
696 | resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
697 | engines: {node: '>=10'}
698 |
699 | merge-stream@2.0.0:
700 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
701 |
702 | mimic-fn@2.1.0:
703 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
704 | engines: {node: '>=6'}
705 |
706 | min-indent@1.0.1:
707 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
708 | engines: {node: '>=4'}
709 |
710 | minimist-options@4.1.0:
711 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
712 | engines: {node: '>= 6'}
713 |
714 | minimist@1.2.8:
715 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
716 |
717 | modify-values@1.0.1:
718 | resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==}
719 | engines: {node: '>=0.10.0'}
720 |
721 | nanoid@3.3.7:
722 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
723 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
724 | hasBin: true
725 |
726 | neo-async@2.6.2:
727 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
728 |
729 | normalize-package-data@2.5.0:
730 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
731 |
732 | normalize-package-data@3.0.3:
733 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
734 | engines: {node: '>=10'}
735 |
736 | npm-run-path@4.0.1:
737 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
738 | engines: {node: '>=8'}
739 |
740 | onetime@5.1.2:
741 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
742 | engines: {node: '>=6'}
743 |
744 | p-limit@1.3.0:
745 | resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
746 | engines: {node: '>=4'}
747 |
748 | p-limit@2.3.0:
749 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
750 | engines: {node: '>=6'}
751 |
752 | p-locate@2.0.0:
753 | resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==}
754 | engines: {node: '>=4'}
755 |
756 | p-locate@4.1.0:
757 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
758 | engines: {node: '>=8'}
759 |
760 | p-try@1.0.0:
761 | resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==}
762 | engines: {node: '>=4'}
763 |
764 | p-try@2.2.0:
765 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
766 | engines: {node: '>=6'}
767 |
768 | parse-json@4.0.0:
769 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
770 | engines: {node: '>=4'}
771 |
772 | parse-json@5.2.0:
773 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
774 | engines: {node: '>=8'}
775 |
776 | path-exists@3.0.0:
777 | resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
778 | engines: {node: '>=4'}
779 |
780 | path-exists@4.0.0:
781 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
782 | engines: {node: '>=8'}
783 |
784 | path-key@3.1.1:
785 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
786 | engines: {node: '>=8'}
787 |
788 | path-parse@1.0.7:
789 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
790 |
791 | path-type@3.0.0:
792 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
793 | engines: {node: '>=4'}
794 |
795 | picocolors@1.0.1:
796 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
797 |
798 | pify@2.3.0:
799 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
800 | engines: {node: '>=0.10.0'}
801 |
802 | pify@3.0.0:
803 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
804 | engines: {node: '>=4'}
805 |
806 | postcss@8.4.38:
807 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
808 | engines: {node: ^10 || ^12 || >=14}
809 |
810 | prettier@2.8.8:
811 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
812 | engines: {node: '>=10.13.0'}
813 | hasBin: true
814 |
815 | process-nextick-args@2.0.1:
816 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
817 |
818 | q@1.5.1:
819 | resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==}
820 | engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
821 |
822 | quick-lru@4.0.1:
823 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
824 | engines: {node: '>=8'}
825 |
826 | read-pkg-up@3.0.0:
827 | resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==}
828 | engines: {node: '>=4'}
829 |
830 | read-pkg-up@7.0.1:
831 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
832 | engines: {node: '>=8'}
833 |
834 | read-pkg@3.0.0:
835 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
836 | engines: {node: '>=4'}
837 |
838 | read-pkg@5.2.0:
839 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
840 | engines: {node: '>=8'}
841 |
842 | readable-stream@2.3.8:
843 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
844 |
845 | readable-stream@3.6.2:
846 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
847 | engines: {node: '>= 6'}
848 |
849 | redent@3.0.0:
850 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
851 | engines: {node: '>=8'}
852 |
853 | require-directory@2.1.1:
854 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
855 | engines: {node: '>=0.10.0'}
856 |
857 | resolve@1.22.8:
858 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
859 | hasBin: true
860 |
861 | rollup@4.18.0:
862 | resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==}
863 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
864 | hasBin: true
865 |
866 | safe-buffer@5.1.2:
867 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
868 |
869 | safe-buffer@5.2.1:
870 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
871 |
872 | semver@5.7.2:
873 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
874 | hasBin: true
875 |
876 | semver@6.3.1:
877 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
878 | hasBin: true
879 |
880 | semver@7.6.2:
881 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
882 | engines: {node: '>=10'}
883 | hasBin: true
884 |
885 | shebang-command@2.0.0:
886 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
887 | engines: {node: '>=8'}
888 |
889 | shebang-regex@3.0.0:
890 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
891 | engines: {node: '>=8'}
892 |
893 | signal-exit@3.0.7:
894 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
895 |
896 | source-map-js@1.2.0:
897 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
898 | engines: {node: '>=0.10.0'}
899 |
900 | source-map-support@0.5.21:
901 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
902 |
903 | source-map@0.6.1:
904 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
905 | engines: {node: '>=0.10.0'}
906 |
907 | spdx-correct@3.2.0:
908 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
909 |
910 | spdx-exceptions@2.5.0:
911 | resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
912 |
913 | spdx-expression-parse@3.0.1:
914 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
915 |
916 | spdx-license-ids@3.0.18:
917 | resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
918 |
919 | split2@3.2.2:
920 | resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
921 |
922 | split@1.0.1:
923 | resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==}
924 |
925 | string-width@4.2.3:
926 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
927 | engines: {node: '>=8'}
928 |
929 | string_decoder@1.1.1:
930 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
931 |
932 | string_decoder@1.3.0:
933 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
934 |
935 | strip-ansi@6.0.1:
936 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
937 | engines: {node: '>=8'}
938 |
939 | strip-bom@3.0.0:
940 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
941 | engines: {node: '>=4'}
942 |
943 | strip-final-newline@2.0.0:
944 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
945 | engines: {node: '>=6'}
946 |
947 | strip-indent@3.0.0:
948 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
949 | engines: {node: '>=8'}
950 |
951 | supports-color@5.5.0:
952 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
953 | engines: {node: '>=4'}
954 |
955 | supports-color@7.2.0:
956 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
957 | engines: {node: '>=8'}
958 |
959 | supports-preserve-symlinks-flag@1.0.0:
960 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
961 | engines: {node: '>= 0.4'}
962 |
963 | temp-dir@2.0.0:
964 | resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
965 | engines: {node: '>=8'}
966 |
967 | tempfile@3.0.0:
968 | resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==}
969 | engines: {node: '>=8'}
970 |
971 | terser@5.31.1:
972 | resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==}
973 | engines: {node: '>=10'}
974 | hasBin: true
975 |
976 | text-extensions@1.9.0:
977 | resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
978 | engines: {node: '>=0.10'}
979 |
980 | through2@2.0.5:
981 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
982 |
983 | through2@4.0.2:
984 | resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
985 |
986 | through@2.3.8:
987 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
988 |
989 | trim-newlines@3.0.1:
990 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
991 | engines: {node: '>=8'}
992 |
993 | type-fest@0.18.1:
994 | resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
995 | engines: {node: '>=10'}
996 |
997 | type-fest@0.6.0:
998 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
999 | engines: {node: '>=8'}
1000 |
1001 | type-fest@0.8.1:
1002 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
1003 | engines: {node: '>=8'}
1004 |
1005 | typescript@5.4.5:
1006 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
1007 | engines: {node: '>=14.17'}
1008 | hasBin: true
1009 |
1010 | uglify-js@3.17.4:
1011 | resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
1012 | engines: {node: '>=0.8.0'}
1013 | hasBin: true
1014 |
1015 | undici-types@5.26.5:
1016 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
1017 |
1018 | util-deprecate@1.0.2:
1019 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1020 |
1021 | uuid@3.4.0:
1022 | resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
1023 | deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
1024 | hasBin: true
1025 |
1026 | validate-npm-package-license@3.0.4:
1027 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
1028 |
1029 | vite@5.2.13:
1030 | resolution: {integrity: sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==}
1031 | engines: {node: ^18.0.0 || >=20.0.0}
1032 | hasBin: true
1033 | peerDependencies:
1034 | '@types/node': ^18.0.0 || >=20.0.0
1035 | less: '*'
1036 | lightningcss: ^1.21.0
1037 | sass: '*'
1038 | stylus: '*'
1039 | sugarss: '*'
1040 | terser: ^5.4.0
1041 | peerDependenciesMeta:
1042 | '@types/node':
1043 | optional: true
1044 | less:
1045 | optional: true
1046 | lightningcss:
1047 | optional: true
1048 | sass:
1049 | optional: true
1050 | stylus:
1051 | optional: true
1052 | sugarss:
1053 | optional: true
1054 | terser:
1055 | optional: true
1056 |
1057 | which@2.0.2:
1058 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1059 | engines: {node: '>= 8'}
1060 | hasBin: true
1061 |
1062 | wordwrap@1.0.0:
1063 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
1064 |
1065 | wrap-ansi@7.0.0:
1066 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1067 | engines: {node: '>=10'}
1068 |
1069 | xtend@4.0.2:
1070 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1071 | engines: {node: '>=0.4'}
1072 |
1073 | y18n@5.0.8:
1074 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
1075 | engines: {node: '>=10'}
1076 |
1077 | yallist@4.0.0:
1078 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
1079 |
1080 | yargs-parser@20.2.9:
1081 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
1082 | engines: {node: '>=10'}
1083 |
1084 | yargs@16.2.0:
1085 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
1086 | engines: {node: '>=10'}
1087 |
1088 | snapshots:
1089 |
1090 | '@babel/code-frame@7.24.6':
1091 | dependencies:
1092 | '@babel/highlight': 7.24.6
1093 | picocolors: 1.0.1
1094 |
1095 | '@babel/helper-validator-identifier@7.24.6': {}
1096 |
1097 | '@babel/highlight@7.24.6':
1098 | dependencies:
1099 | '@babel/helper-validator-identifier': 7.24.6
1100 | chalk: 2.4.2
1101 | js-tokens: 4.0.0
1102 | picocolors: 1.0.1
1103 |
1104 | '@esbuild/aix-ppc64@0.20.2':
1105 | optional: true
1106 |
1107 | '@esbuild/android-arm64@0.20.2':
1108 | optional: true
1109 |
1110 | '@esbuild/android-arm@0.20.2':
1111 | optional: true
1112 |
1113 | '@esbuild/android-x64@0.20.2':
1114 | optional: true
1115 |
1116 | '@esbuild/darwin-arm64@0.20.2':
1117 | optional: true
1118 |
1119 | '@esbuild/darwin-x64@0.20.2':
1120 | optional: true
1121 |
1122 | '@esbuild/freebsd-arm64@0.20.2':
1123 | optional: true
1124 |
1125 | '@esbuild/freebsd-x64@0.20.2':
1126 | optional: true
1127 |
1128 | '@esbuild/linux-arm64@0.20.2':
1129 | optional: true
1130 |
1131 | '@esbuild/linux-arm@0.20.2':
1132 | optional: true
1133 |
1134 | '@esbuild/linux-ia32@0.20.2':
1135 | optional: true
1136 |
1137 | '@esbuild/linux-loong64@0.20.2':
1138 | optional: true
1139 |
1140 | '@esbuild/linux-mips64el@0.20.2':
1141 | optional: true
1142 |
1143 | '@esbuild/linux-ppc64@0.20.2':
1144 | optional: true
1145 |
1146 | '@esbuild/linux-riscv64@0.20.2':
1147 | optional: true
1148 |
1149 | '@esbuild/linux-s390x@0.20.2':
1150 | optional: true
1151 |
1152 | '@esbuild/linux-x64@0.20.2':
1153 | optional: true
1154 |
1155 | '@esbuild/netbsd-x64@0.20.2':
1156 | optional: true
1157 |
1158 | '@esbuild/openbsd-x64@0.20.2':
1159 | optional: true
1160 |
1161 | '@esbuild/sunos-x64@0.20.2':
1162 | optional: true
1163 |
1164 | '@esbuild/win32-arm64@0.20.2':
1165 | optional: true
1166 |
1167 | '@esbuild/win32-ia32@0.20.2':
1168 | optional: true
1169 |
1170 | '@esbuild/win32-x64@0.20.2':
1171 | optional: true
1172 |
1173 | '@hutson/parse-repository-url@3.0.2': {}
1174 |
1175 | '@jridgewell/gen-mapping@0.3.5':
1176 | dependencies:
1177 | '@jridgewell/set-array': 1.2.1
1178 | '@jridgewell/sourcemap-codec': 1.4.15
1179 | '@jridgewell/trace-mapping': 0.3.25
1180 |
1181 | '@jridgewell/resolve-uri@3.1.2': {}
1182 |
1183 | '@jridgewell/set-array@1.2.1': {}
1184 |
1185 | '@jridgewell/source-map@0.3.6':
1186 | dependencies:
1187 | '@jridgewell/gen-mapping': 0.3.5
1188 | '@jridgewell/trace-mapping': 0.3.25
1189 |
1190 | '@jridgewell/sourcemap-codec@1.4.15': {}
1191 |
1192 | '@jridgewell/trace-mapping@0.3.25':
1193 | dependencies:
1194 | '@jridgewell/resolve-uri': 3.1.2
1195 | '@jridgewell/sourcemap-codec': 1.4.15
1196 |
1197 | '@rollup/rollup-android-arm-eabi@4.18.0':
1198 | optional: true
1199 |
1200 | '@rollup/rollup-android-arm64@4.18.0':
1201 | optional: true
1202 |
1203 | '@rollup/rollup-darwin-arm64@4.18.0':
1204 | optional: true
1205 |
1206 | '@rollup/rollup-darwin-x64@4.18.0':
1207 | optional: true
1208 |
1209 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
1210 | optional: true
1211 |
1212 | '@rollup/rollup-linux-arm-musleabihf@4.18.0':
1213 | optional: true
1214 |
1215 | '@rollup/rollup-linux-arm64-gnu@4.18.0':
1216 | optional: true
1217 |
1218 | '@rollup/rollup-linux-arm64-musl@4.18.0':
1219 | optional: true
1220 |
1221 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
1222 | optional: true
1223 |
1224 | '@rollup/rollup-linux-riscv64-gnu@4.18.0':
1225 | optional: true
1226 |
1227 | '@rollup/rollup-linux-s390x-gnu@4.18.0':
1228 | optional: true
1229 |
1230 | '@rollup/rollup-linux-x64-gnu@4.18.0':
1231 | optional: true
1232 |
1233 | '@rollup/rollup-linux-x64-musl@4.18.0':
1234 | optional: true
1235 |
1236 | '@rollup/rollup-win32-arm64-msvc@4.18.0':
1237 | optional: true
1238 |
1239 | '@rollup/rollup-win32-ia32-msvc@4.18.0':
1240 | optional: true
1241 |
1242 | '@rollup/rollup-win32-x64-msvc@4.18.0':
1243 | optional: true
1244 |
1245 | '@types/estree@1.0.5': {}
1246 |
1247 | '@types/minimist@1.2.5': {}
1248 |
1249 | '@types/node@20.14.2':
1250 | dependencies:
1251 | undici-types: 5.26.5
1252 |
1253 | '@types/normalize-package-data@2.4.4': {}
1254 |
1255 | '@vue/reactivity@3.2.45':
1256 | dependencies:
1257 | '@vue/shared': 3.2.45
1258 |
1259 | '@vue/shared@3.2.45': {}
1260 |
1261 | JSONStream@1.3.5:
1262 | dependencies:
1263 | jsonparse: 1.3.1
1264 | through: 2.3.8
1265 |
1266 | acorn@8.11.3: {}
1267 |
1268 | add-stream@1.0.0: {}
1269 |
1270 | ansi-colors@4.1.3: {}
1271 |
1272 | ansi-regex@5.0.1: {}
1273 |
1274 | ansi-styles@3.2.1:
1275 | dependencies:
1276 | color-convert: 1.9.3
1277 |
1278 | ansi-styles@4.3.0:
1279 | dependencies:
1280 | color-convert: 2.0.1
1281 |
1282 | array-ify@1.0.0: {}
1283 |
1284 | arrify@1.0.1: {}
1285 |
1286 | buffer-from@1.1.2: {}
1287 |
1288 | camelcase-keys@6.2.2:
1289 | dependencies:
1290 | camelcase: 5.3.1
1291 | map-obj: 4.3.0
1292 | quick-lru: 4.0.1
1293 |
1294 | camelcase@5.3.1: {}
1295 |
1296 | chalk@2.4.2:
1297 | dependencies:
1298 | ansi-styles: 3.2.1
1299 | escape-string-regexp: 1.0.5
1300 | supports-color: 5.5.0
1301 |
1302 | chalk@4.1.2:
1303 | dependencies:
1304 | ansi-styles: 4.3.0
1305 | supports-color: 7.2.0
1306 |
1307 | cliui@7.0.4:
1308 | dependencies:
1309 | string-width: 4.2.3
1310 | strip-ansi: 6.0.1
1311 | wrap-ansi: 7.0.0
1312 |
1313 | color-convert@1.9.3:
1314 | dependencies:
1315 | color-name: 1.1.3
1316 |
1317 | color-convert@2.0.1:
1318 | dependencies:
1319 | color-name: 1.1.4
1320 |
1321 | color-name@1.1.3: {}
1322 |
1323 | color-name@1.1.4: {}
1324 |
1325 | commander@2.20.3: {}
1326 |
1327 | compare-func@2.0.0:
1328 | dependencies:
1329 | array-ify: 1.0.0
1330 | dot-prop: 5.3.0
1331 |
1332 | conventional-changelog-angular@5.0.13:
1333 | dependencies:
1334 | compare-func: 2.0.0
1335 | q: 1.5.1
1336 |
1337 | conventional-changelog-atom@2.0.8:
1338 | dependencies:
1339 | q: 1.5.1
1340 |
1341 | conventional-changelog-cli@2.2.2:
1342 | dependencies:
1343 | add-stream: 1.0.0
1344 | conventional-changelog: 3.1.25
1345 | lodash: 4.17.21
1346 | meow: 8.1.2
1347 | tempfile: 3.0.0
1348 |
1349 | conventional-changelog-codemirror@2.0.8:
1350 | dependencies:
1351 | q: 1.5.1
1352 |
1353 | conventional-changelog-conventionalcommits@4.6.3:
1354 | dependencies:
1355 | compare-func: 2.0.0
1356 | lodash: 4.17.21
1357 | q: 1.5.1
1358 |
1359 | conventional-changelog-core@4.2.4:
1360 | dependencies:
1361 | add-stream: 1.0.0
1362 | conventional-changelog-writer: 5.0.1
1363 | conventional-commits-parser: 3.2.4
1364 | dateformat: 3.0.3
1365 | get-pkg-repo: 4.2.1
1366 | git-raw-commits: 2.0.11
1367 | git-remote-origin-url: 2.0.0
1368 | git-semver-tags: 4.1.1
1369 | lodash: 4.17.21
1370 | normalize-package-data: 3.0.3
1371 | q: 1.5.1
1372 | read-pkg: 3.0.0
1373 | read-pkg-up: 3.0.0
1374 | through2: 4.0.2
1375 |
1376 | conventional-changelog-ember@2.0.9:
1377 | dependencies:
1378 | q: 1.5.1
1379 |
1380 | conventional-changelog-eslint@3.0.9:
1381 | dependencies:
1382 | q: 1.5.1
1383 |
1384 | conventional-changelog-express@2.0.6:
1385 | dependencies:
1386 | q: 1.5.1
1387 |
1388 | conventional-changelog-jquery@3.0.11:
1389 | dependencies:
1390 | q: 1.5.1
1391 |
1392 | conventional-changelog-jshint@2.0.9:
1393 | dependencies:
1394 | compare-func: 2.0.0
1395 | q: 1.5.1
1396 |
1397 | conventional-changelog-preset-loader@2.3.4: {}
1398 |
1399 | conventional-changelog-writer@5.0.1:
1400 | dependencies:
1401 | conventional-commits-filter: 2.0.7
1402 | dateformat: 3.0.3
1403 | handlebars: 4.7.8
1404 | json-stringify-safe: 5.0.1
1405 | lodash: 4.17.21
1406 | meow: 8.1.2
1407 | semver: 6.3.1
1408 | split: 1.0.1
1409 | through2: 4.0.2
1410 |
1411 | conventional-changelog@3.1.25:
1412 | dependencies:
1413 | conventional-changelog-angular: 5.0.13
1414 | conventional-changelog-atom: 2.0.8
1415 | conventional-changelog-codemirror: 2.0.8
1416 | conventional-changelog-conventionalcommits: 4.6.3
1417 | conventional-changelog-core: 4.2.4
1418 | conventional-changelog-ember: 2.0.9
1419 | conventional-changelog-eslint: 3.0.9
1420 | conventional-changelog-express: 2.0.6
1421 | conventional-changelog-jquery: 3.0.11
1422 | conventional-changelog-jshint: 2.0.9
1423 | conventional-changelog-preset-loader: 2.3.4
1424 |
1425 | conventional-commits-filter@2.0.7:
1426 | dependencies:
1427 | lodash.ismatch: 4.4.0
1428 | modify-values: 1.0.1
1429 |
1430 | conventional-commits-parser@3.2.4:
1431 | dependencies:
1432 | JSONStream: 1.3.5
1433 | is-text-path: 1.0.1
1434 | lodash: 4.17.21
1435 | meow: 8.1.2
1436 | split2: 3.2.2
1437 | through2: 4.0.2
1438 |
1439 | core-util-is@1.0.3: {}
1440 |
1441 | cross-spawn@7.0.3:
1442 | dependencies:
1443 | path-key: 3.1.1
1444 | shebang-command: 2.0.0
1445 | which: 2.0.2
1446 |
1447 | dargs@7.0.0: {}
1448 |
1449 | dateformat@3.0.3: {}
1450 |
1451 | decamelize-keys@1.1.1:
1452 | dependencies:
1453 | decamelize: 1.2.0
1454 | map-obj: 1.0.1
1455 |
1456 | decamelize@1.2.0: {}
1457 |
1458 | dot-prop@5.3.0:
1459 | dependencies:
1460 | is-obj: 2.0.0
1461 |
1462 | emoji-regex@8.0.0: {}
1463 |
1464 | enquirer@2.4.1:
1465 | dependencies:
1466 | ansi-colors: 4.1.3
1467 | strip-ansi: 6.0.1
1468 |
1469 | error-ex@1.3.2:
1470 | dependencies:
1471 | is-arrayish: 0.2.1
1472 |
1473 | esbuild@0.20.2:
1474 | optionalDependencies:
1475 | '@esbuild/aix-ppc64': 0.20.2
1476 | '@esbuild/android-arm': 0.20.2
1477 | '@esbuild/android-arm64': 0.20.2
1478 | '@esbuild/android-x64': 0.20.2
1479 | '@esbuild/darwin-arm64': 0.20.2
1480 | '@esbuild/darwin-x64': 0.20.2
1481 | '@esbuild/freebsd-arm64': 0.20.2
1482 | '@esbuild/freebsd-x64': 0.20.2
1483 | '@esbuild/linux-arm': 0.20.2
1484 | '@esbuild/linux-arm64': 0.20.2
1485 | '@esbuild/linux-ia32': 0.20.2
1486 | '@esbuild/linux-loong64': 0.20.2
1487 | '@esbuild/linux-mips64el': 0.20.2
1488 | '@esbuild/linux-ppc64': 0.20.2
1489 | '@esbuild/linux-riscv64': 0.20.2
1490 | '@esbuild/linux-s390x': 0.20.2
1491 | '@esbuild/linux-x64': 0.20.2
1492 | '@esbuild/netbsd-x64': 0.20.2
1493 | '@esbuild/openbsd-x64': 0.20.2
1494 | '@esbuild/sunos-x64': 0.20.2
1495 | '@esbuild/win32-arm64': 0.20.2
1496 | '@esbuild/win32-ia32': 0.20.2
1497 | '@esbuild/win32-x64': 0.20.2
1498 |
1499 | escalade@3.1.2: {}
1500 |
1501 | escape-string-regexp@1.0.5: {}
1502 |
1503 | execa@5.1.1:
1504 | dependencies:
1505 | cross-spawn: 7.0.3
1506 | get-stream: 6.0.1
1507 | human-signals: 2.1.0
1508 | is-stream: 2.0.1
1509 | merge-stream: 2.0.0
1510 | npm-run-path: 4.0.1
1511 | onetime: 5.1.2
1512 | signal-exit: 3.0.7
1513 | strip-final-newline: 2.0.0
1514 |
1515 | find-up@2.1.0:
1516 | dependencies:
1517 | locate-path: 2.0.0
1518 |
1519 | find-up@4.1.0:
1520 | dependencies:
1521 | locate-path: 5.0.0
1522 | path-exists: 4.0.0
1523 |
1524 | fsevents@2.3.3:
1525 | optional: true
1526 |
1527 | function-bind@1.1.2: {}
1528 |
1529 | get-caller-file@2.0.5: {}
1530 |
1531 | get-pkg-repo@4.2.1:
1532 | dependencies:
1533 | '@hutson/parse-repository-url': 3.0.2
1534 | hosted-git-info: 4.1.0
1535 | through2: 2.0.5
1536 | yargs: 16.2.0
1537 |
1538 | get-stream@6.0.1: {}
1539 |
1540 | git-raw-commits@2.0.11:
1541 | dependencies:
1542 | dargs: 7.0.0
1543 | lodash: 4.17.21
1544 | meow: 8.1.2
1545 | split2: 3.2.2
1546 | through2: 4.0.2
1547 |
1548 | git-remote-origin-url@2.0.0:
1549 | dependencies:
1550 | gitconfiglocal: 1.0.0
1551 | pify: 2.3.0
1552 |
1553 | git-semver-tags@4.1.1:
1554 | dependencies:
1555 | meow: 8.1.2
1556 | semver: 6.3.1
1557 |
1558 | gitconfiglocal@1.0.0:
1559 | dependencies:
1560 | ini: 1.3.8
1561 |
1562 | graceful-fs@4.2.11: {}
1563 |
1564 | handlebars@4.7.8:
1565 | dependencies:
1566 | minimist: 1.2.8
1567 | neo-async: 2.6.2
1568 | source-map: 0.6.1
1569 | wordwrap: 1.0.0
1570 | optionalDependencies:
1571 | uglify-js: 3.17.4
1572 |
1573 | hard-rejection@2.1.0: {}
1574 |
1575 | has-flag@3.0.0: {}
1576 |
1577 | has-flag@4.0.0: {}
1578 |
1579 | hasown@2.0.2:
1580 | dependencies:
1581 | function-bind: 1.1.2
1582 |
1583 | hosted-git-info@2.8.9: {}
1584 |
1585 | hosted-git-info@4.1.0:
1586 | dependencies:
1587 | lru-cache: 6.0.0
1588 |
1589 | human-signals@2.1.0: {}
1590 |
1591 | indent-string@4.0.0: {}
1592 |
1593 | inherits@2.0.4: {}
1594 |
1595 | ini@1.3.8: {}
1596 |
1597 | is-arrayish@0.2.1: {}
1598 |
1599 | is-core-module@2.13.1:
1600 | dependencies:
1601 | hasown: 2.0.2
1602 |
1603 | is-fullwidth-code-point@3.0.0: {}
1604 |
1605 | is-obj@2.0.0: {}
1606 |
1607 | is-plain-obj@1.1.0: {}
1608 |
1609 | is-stream@2.0.1: {}
1610 |
1611 | is-text-path@1.0.1:
1612 | dependencies:
1613 | text-extensions: 1.9.0
1614 |
1615 | isarray@1.0.0: {}
1616 |
1617 | isexe@2.0.0: {}
1618 |
1619 | js-tokens@4.0.0: {}
1620 |
1621 | json-parse-better-errors@1.0.2: {}
1622 |
1623 | json-parse-even-better-errors@2.3.1: {}
1624 |
1625 | json-stringify-safe@5.0.1: {}
1626 |
1627 | jsonparse@1.3.1: {}
1628 |
1629 | kind-of@6.0.3: {}
1630 |
1631 | lines-and-columns@1.2.4: {}
1632 |
1633 | load-json-file@4.0.0:
1634 | dependencies:
1635 | graceful-fs: 4.2.11
1636 | parse-json: 4.0.0
1637 | pify: 3.0.0
1638 | strip-bom: 3.0.0
1639 |
1640 | locate-path@2.0.0:
1641 | dependencies:
1642 | p-locate: 2.0.0
1643 | path-exists: 3.0.0
1644 |
1645 | locate-path@5.0.0:
1646 | dependencies:
1647 | p-locate: 4.1.0
1648 |
1649 | lodash.ismatch@4.4.0: {}
1650 |
1651 | lodash@4.17.21: {}
1652 |
1653 | lru-cache@6.0.0:
1654 | dependencies:
1655 | yallist: 4.0.0
1656 |
1657 | map-obj@1.0.1: {}
1658 |
1659 | map-obj@4.3.0: {}
1660 |
1661 | meow@8.1.2:
1662 | dependencies:
1663 | '@types/minimist': 1.2.5
1664 | camelcase-keys: 6.2.2
1665 | decamelize-keys: 1.1.1
1666 | hard-rejection: 2.1.0
1667 | minimist-options: 4.1.0
1668 | normalize-package-data: 3.0.3
1669 | read-pkg-up: 7.0.1
1670 | redent: 3.0.0
1671 | trim-newlines: 3.0.1
1672 | type-fest: 0.18.1
1673 | yargs-parser: 20.2.9
1674 |
1675 | merge-stream@2.0.0: {}
1676 |
1677 | mimic-fn@2.1.0: {}
1678 |
1679 | min-indent@1.0.1: {}
1680 |
1681 | minimist-options@4.1.0:
1682 | dependencies:
1683 | arrify: 1.0.1
1684 | is-plain-obj: 1.1.0
1685 | kind-of: 6.0.3
1686 |
1687 | minimist@1.2.8: {}
1688 |
1689 | modify-values@1.0.1: {}
1690 |
1691 | nanoid@3.3.7: {}
1692 |
1693 | neo-async@2.6.2: {}
1694 |
1695 | normalize-package-data@2.5.0:
1696 | dependencies:
1697 | hosted-git-info: 2.8.9
1698 | resolve: 1.22.8
1699 | semver: 5.7.2
1700 | validate-npm-package-license: 3.0.4
1701 |
1702 | normalize-package-data@3.0.3:
1703 | dependencies:
1704 | hosted-git-info: 4.1.0
1705 | is-core-module: 2.13.1
1706 | semver: 7.6.2
1707 | validate-npm-package-license: 3.0.4
1708 |
1709 | npm-run-path@4.0.1:
1710 | dependencies:
1711 | path-key: 3.1.1
1712 |
1713 | onetime@5.1.2:
1714 | dependencies:
1715 | mimic-fn: 2.1.0
1716 |
1717 | p-limit@1.3.0:
1718 | dependencies:
1719 | p-try: 1.0.0
1720 |
1721 | p-limit@2.3.0:
1722 | dependencies:
1723 | p-try: 2.2.0
1724 |
1725 | p-locate@2.0.0:
1726 | dependencies:
1727 | p-limit: 1.3.0
1728 |
1729 | p-locate@4.1.0:
1730 | dependencies:
1731 | p-limit: 2.3.0
1732 |
1733 | p-try@1.0.0: {}
1734 |
1735 | p-try@2.2.0: {}
1736 |
1737 | parse-json@4.0.0:
1738 | dependencies:
1739 | error-ex: 1.3.2
1740 | json-parse-better-errors: 1.0.2
1741 |
1742 | parse-json@5.2.0:
1743 | dependencies:
1744 | '@babel/code-frame': 7.24.6
1745 | error-ex: 1.3.2
1746 | json-parse-even-better-errors: 2.3.1
1747 | lines-and-columns: 1.2.4
1748 |
1749 | path-exists@3.0.0: {}
1750 |
1751 | path-exists@4.0.0: {}
1752 |
1753 | path-key@3.1.1: {}
1754 |
1755 | path-parse@1.0.7: {}
1756 |
1757 | path-type@3.0.0:
1758 | dependencies:
1759 | pify: 3.0.0
1760 |
1761 | picocolors@1.0.1: {}
1762 |
1763 | pify@2.3.0: {}
1764 |
1765 | pify@3.0.0: {}
1766 |
1767 | postcss@8.4.38:
1768 | dependencies:
1769 | nanoid: 3.3.7
1770 | picocolors: 1.0.1
1771 | source-map-js: 1.2.0
1772 |
1773 | prettier@2.8.8: {}
1774 |
1775 | process-nextick-args@2.0.1: {}
1776 |
1777 | q@1.5.1: {}
1778 |
1779 | quick-lru@4.0.1: {}
1780 |
1781 | read-pkg-up@3.0.0:
1782 | dependencies:
1783 | find-up: 2.1.0
1784 | read-pkg: 3.0.0
1785 |
1786 | read-pkg-up@7.0.1:
1787 | dependencies:
1788 | find-up: 4.1.0
1789 | read-pkg: 5.2.0
1790 | type-fest: 0.8.1
1791 |
1792 | read-pkg@3.0.0:
1793 | dependencies:
1794 | load-json-file: 4.0.0
1795 | normalize-package-data: 2.5.0
1796 | path-type: 3.0.0
1797 |
1798 | read-pkg@5.2.0:
1799 | dependencies:
1800 | '@types/normalize-package-data': 2.4.4
1801 | normalize-package-data: 2.5.0
1802 | parse-json: 5.2.0
1803 | type-fest: 0.6.0
1804 |
1805 | readable-stream@2.3.8:
1806 | dependencies:
1807 | core-util-is: 1.0.3
1808 | inherits: 2.0.4
1809 | isarray: 1.0.0
1810 | process-nextick-args: 2.0.1
1811 | safe-buffer: 5.1.2
1812 | string_decoder: 1.1.1
1813 | util-deprecate: 1.0.2
1814 |
1815 | readable-stream@3.6.2:
1816 | dependencies:
1817 | inherits: 2.0.4
1818 | string_decoder: 1.3.0
1819 | util-deprecate: 1.0.2
1820 |
1821 | redent@3.0.0:
1822 | dependencies:
1823 | indent-string: 4.0.0
1824 | strip-indent: 3.0.0
1825 |
1826 | require-directory@2.1.1: {}
1827 |
1828 | resolve@1.22.8:
1829 | dependencies:
1830 | is-core-module: 2.13.1
1831 | path-parse: 1.0.7
1832 | supports-preserve-symlinks-flag: 1.0.0
1833 |
1834 | rollup@4.18.0:
1835 | dependencies:
1836 | '@types/estree': 1.0.5
1837 | optionalDependencies:
1838 | '@rollup/rollup-android-arm-eabi': 4.18.0
1839 | '@rollup/rollup-android-arm64': 4.18.0
1840 | '@rollup/rollup-darwin-arm64': 4.18.0
1841 | '@rollup/rollup-darwin-x64': 4.18.0
1842 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
1843 | '@rollup/rollup-linux-arm-musleabihf': 4.18.0
1844 | '@rollup/rollup-linux-arm64-gnu': 4.18.0
1845 | '@rollup/rollup-linux-arm64-musl': 4.18.0
1846 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
1847 | '@rollup/rollup-linux-riscv64-gnu': 4.18.0
1848 | '@rollup/rollup-linux-s390x-gnu': 4.18.0
1849 | '@rollup/rollup-linux-x64-gnu': 4.18.0
1850 | '@rollup/rollup-linux-x64-musl': 4.18.0
1851 | '@rollup/rollup-win32-arm64-msvc': 4.18.0
1852 | '@rollup/rollup-win32-ia32-msvc': 4.18.0
1853 | '@rollup/rollup-win32-x64-msvc': 4.18.0
1854 | fsevents: 2.3.3
1855 |
1856 | safe-buffer@5.1.2: {}
1857 |
1858 | safe-buffer@5.2.1: {}
1859 |
1860 | semver@5.7.2: {}
1861 |
1862 | semver@6.3.1: {}
1863 |
1864 | semver@7.6.2: {}
1865 |
1866 | shebang-command@2.0.0:
1867 | dependencies:
1868 | shebang-regex: 3.0.0
1869 |
1870 | shebang-regex@3.0.0: {}
1871 |
1872 | signal-exit@3.0.7: {}
1873 |
1874 | source-map-js@1.2.0: {}
1875 |
1876 | source-map-support@0.5.21:
1877 | dependencies:
1878 | buffer-from: 1.1.2
1879 | source-map: 0.6.1
1880 |
1881 | source-map@0.6.1: {}
1882 |
1883 | spdx-correct@3.2.0:
1884 | dependencies:
1885 | spdx-expression-parse: 3.0.1
1886 | spdx-license-ids: 3.0.18
1887 |
1888 | spdx-exceptions@2.5.0: {}
1889 |
1890 | spdx-expression-parse@3.0.1:
1891 | dependencies:
1892 | spdx-exceptions: 2.5.0
1893 | spdx-license-ids: 3.0.18
1894 |
1895 | spdx-license-ids@3.0.18: {}
1896 |
1897 | split2@3.2.2:
1898 | dependencies:
1899 | readable-stream: 3.6.2
1900 |
1901 | split@1.0.1:
1902 | dependencies:
1903 | through: 2.3.8
1904 |
1905 | string-width@4.2.3:
1906 | dependencies:
1907 | emoji-regex: 8.0.0
1908 | is-fullwidth-code-point: 3.0.0
1909 | strip-ansi: 6.0.1
1910 |
1911 | string_decoder@1.1.1:
1912 | dependencies:
1913 | safe-buffer: 5.1.2
1914 |
1915 | string_decoder@1.3.0:
1916 | dependencies:
1917 | safe-buffer: 5.2.1
1918 |
1919 | strip-ansi@6.0.1:
1920 | dependencies:
1921 | ansi-regex: 5.0.1
1922 |
1923 | strip-bom@3.0.0: {}
1924 |
1925 | strip-final-newline@2.0.0: {}
1926 |
1927 | strip-indent@3.0.0:
1928 | dependencies:
1929 | min-indent: 1.0.1
1930 |
1931 | supports-color@5.5.0:
1932 | dependencies:
1933 | has-flag: 3.0.0
1934 |
1935 | supports-color@7.2.0:
1936 | dependencies:
1937 | has-flag: 4.0.0
1938 |
1939 | supports-preserve-symlinks-flag@1.0.0: {}
1940 |
1941 | temp-dir@2.0.0: {}
1942 |
1943 | tempfile@3.0.0:
1944 | dependencies:
1945 | temp-dir: 2.0.0
1946 | uuid: 3.4.0
1947 |
1948 | terser@5.31.1:
1949 | dependencies:
1950 | '@jridgewell/source-map': 0.3.6
1951 | acorn: 8.11.3
1952 | commander: 2.20.3
1953 | source-map-support: 0.5.21
1954 |
1955 | text-extensions@1.9.0: {}
1956 |
1957 | through2@2.0.5:
1958 | dependencies:
1959 | readable-stream: 2.3.8
1960 | xtend: 4.0.2
1961 |
1962 | through2@4.0.2:
1963 | dependencies:
1964 | readable-stream: 3.6.2
1965 |
1966 | through@2.3.8: {}
1967 |
1968 | trim-newlines@3.0.1: {}
1969 |
1970 | type-fest@0.18.1: {}
1971 |
1972 | type-fest@0.6.0: {}
1973 |
1974 | type-fest@0.8.1: {}
1975 |
1976 | typescript@5.4.5: {}
1977 |
1978 | uglify-js@3.17.4:
1979 | optional: true
1980 |
1981 | undici-types@5.26.5: {}
1982 |
1983 | util-deprecate@1.0.2: {}
1984 |
1985 | uuid@3.4.0: {}
1986 |
1987 | validate-npm-package-license@3.0.4:
1988 | dependencies:
1989 | spdx-correct: 3.2.0
1990 | spdx-expression-parse: 3.0.1
1991 |
1992 | vite@5.2.13(@types/node@20.14.2)(terser@5.31.1):
1993 | dependencies:
1994 | esbuild: 0.20.2
1995 | postcss: 8.4.38
1996 | rollup: 4.18.0
1997 | optionalDependencies:
1998 | '@types/node': 20.14.2
1999 | fsevents: 2.3.3
2000 | terser: 5.31.1
2001 |
2002 | which@2.0.2:
2003 | dependencies:
2004 | isexe: 2.0.0
2005 |
2006 | wordwrap@1.0.0: {}
2007 |
2008 | wrap-ansi@7.0.0:
2009 | dependencies:
2010 | ansi-styles: 4.3.0
2011 | string-width: 4.2.3
2012 | strip-ansi: 6.0.1
2013 |
2014 | xtend@4.0.2: {}
2015 |
2016 | y18n@5.0.8: {}
2017 |
2018 | yallist@4.0.0: {}
2019 |
2020 | yargs-parser@20.2.9: {}
2021 |
2022 | yargs@16.2.0:
2023 | dependencies:
2024 | cliui: 7.0.4
2025 | escalade: 3.1.2
2026 | get-caller-file: 2.0.5
2027 | require-directory: 2.1.1
2028 | string-width: 4.2.3
2029 | y18n: 5.0.8
2030 | yargs-parser: 20.2.9
2031 |
--------------------------------------------------------------------------------
/scripts/release.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const path = require('path')
3 | const chalk = require('chalk')
4 | const semver = require('semver')
5 | const { prompt } = require('enquirer')
6 | const execa = require('execa')
7 | const currentVersion = require('../package.json').version
8 |
9 | const versionIncrements = ['patch', 'minor', 'major']
10 |
11 | const inc = (i) => semver.inc(currentVersion, i)
12 | const run = (bin, args, opts = {}) =>
13 | execa(bin, args, { stdio: 'inherit', ...opts })
14 | const step = (msg) => console.log(chalk.cyan(msg))
15 |
16 | async function main() {
17 | let targetVersion
18 |
19 | const { release } = await prompt({
20 | type: 'select',
21 | name: 'release',
22 | message: 'Select release type',
23 | choices: versionIncrements.map((i) => `${i} (${inc(i)})`).concat(['custom'])
24 | })
25 |
26 | if (release === 'custom') {
27 | targetVersion = (
28 | await prompt({
29 | type: 'input',
30 | name: 'version',
31 | message: 'Input custom version',
32 | initial: currentVersion
33 | })
34 | ).version
35 | } else {
36 | targetVersion = release.match(/\((.*)\)/)[1]
37 | }
38 |
39 | if (!semver.valid(targetVersion)) {
40 | throw new Error(`Invalid target version: ${targetVersion}`)
41 | }
42 |
43 | const { yes: tagOk } = await prompt({
44 | type: 'confirm',
45 | name: 'yes',
46 | message: `Releasing v${targetVersion}. Confirm?`
47 | })
48 |
49 | if (!tagOk) {
50 | return
51 | }
52 |
53 | // Update the package version.
54 | step('\nUpdating the package version...')
55 | updatePackage(targetVersion)
56 |
57 | // Build the package.
58 | step('\nBuilding the package...')
59 | await run('yarn', ['build'])
60 |
61 | // Generate the changelog.
62 | step('\nGenerating the changelog...')
63 | await run('yarn', ['changelog'])
64 | await run('yarn', ['prettier', '--write', 'CHANGELOG.md'])
65 |
66 | const { yes: changelogOk } = await prompt({
67 | type: 'confirm',
68 | name: 'yes',
69 | message: `Changelog generated. Does it look good?`
70 | })
71 |
72 | if (!changelogOk) {
73 | return
74 | }
75 |
76 | // Commit changes to the Git and create a tag.
77 | step('\nCommitting changes...')
78 | await run('git', ['add', 'CHANGELOG.md', 'package.json'])
79 | await run('git', ['commit', '-m', `release: v${targetVersion}`])
80 | await run('git', ['tag', `v${targetVersion}`])
81 |
82 | // Publish the package.
83 | step('\nPublishing the package...')
84 | await run('yarn', [
85 | 'publish',
86 | '--new-version',
87 | targetVersion,
88 | '--no-commit-hooks',
89 | '--no-git-tag-version'
90 | ])
91 |
92 | // Push to GitHub.
93 | step('\nPushing to GitHub...')
94 | await run('git', ['push', 'origin', `refs/tags/v${targetVersion}`])
95 | await run('git', ['push'])
96 | }
97 |
98 | function updatePackage(version) {
99 | const pkgPath = path.resolve(path.resolve(__dirname, '..'), 'package.json')
100 | const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))
101 |
102 | pkg.version = version
103 |
104 | fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n')
105 | }
106 |
107 | main().catch((err) => console.error(err))
108 |
--------------------------------------------------------------------------------
/src/app.ts:
--------------------------------------------------------------------------------
1 | import { reactive } from '@vue/reactivity'
2 | import { Block } from './block'
3 | import { Directive } from './directives'
4 | import { bindContextMethods, createContext } from './context'
5 | import { toDisplayString } from './directives/text'
6 | import { nextTick } from './scheduler'
7 |
8 | const escapeRegex = (str: string) =>
9 | str.replace(/[-.*+?^${}()|[\]\/\\]/g, '\\$&')
10 |
11 | export const createApp = (initialData?: any) => {
12 | // root context
13 | const ctx = createContext()
14 | if (initialData) {
15 | ctx.scope = reactive(initialData)
16 | bindContextMethods(ctx.scope)
17 |
18 | // handle custom delimiters
19 | if (initialData.$delimiters) {
20 | const [open, close] = (ctx.delimiters = initialData.$delimiters)
21 | ctx.delimitersRE = new RegExp(
22 | escapeRegex(open) + '([^]+?)' + escapeRegex(close),
23 | 'g'
24 | )
25 | }
26 | }
27 |
28 | // global internal helpers
29 | ctx.scope.$s = toDisplayString
30 | ctx.scope.$nextTick = nextTick
31 | ctx.scope.$refs = Object.create(null)
32 |
33 | let rootBlocks: Block[]
34 |
35 | return {
36 | directive(name: string, def?: Directive) {
37 | if (def) {
38 | ctx.dirs[name] = def
39 | return this
40 | } else {
41 | return ctx.dirs[name]
42 | }
43 | },
44 |
45 | use(plugin: any, options = {}) {
46 | plugin.install(this, options)
47 | return this
48 | },
49 |
50 | mount(el?: string | Element | null) {
51 | if (typeof el === 'string') {
52 | el = document.querySelector(el)
53 | if (!el) {
54 | import.meta.env.DEV &&
55 | console.error(`selector ${el} has no matching element.`)
56 | return
57 | }
58 | }
59 |
60 | el = el || document.documentElement
61 | let roots: Element[]
62 | if (el.hasAttribute('v-scope')) {
63 | roots = [el]
64 | } else {
65 | roots = [...el.querySelectorAll(`[v-scope]`)].filter(
66 | (root) => !root.matches(`[v-scope] [v-scope]`)
67 | )
68 | }
69 | if (!roots.length) {
70 | roots = [el]
71 | }
72 |
73 | if (
74 | import.meta.env.DEV &&
75 | roots.length === 1 &&
76 | roots[0] === document.documentElement
77 | ) {
78 | console.warn(
79 | `Mounting on documentElement - this is non-optimal as petite-vue ` +
80 | `will be forced to crawl the entire page's DOM. ` +
81 | `Consider explicitly marking elements controlled by petite-vue ` +
82 | `with \`v-scope\`.`
83 | )
84 | }
85 |
86 | rootBlocks = roots.map((el) => new Block(el, ctx, true))
87 | return this
88 | },
89 |
90 | unmount() {
91 | rootBlocks.forEach((block) => block.teardown())
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/src/block.ts:
--------------------------------------------------------------------------------
1 | import { Context, createContext } from './context'
2 | import { walk } from './walk'
3 | import { remove } from '@vue/shared'
4 | import { stop } from '@vue/reactivity'
5 |
6 | export class Block {
7 | template: Element | DocumentFragment
8 | ctx: Context
9 | key?: any
10 | parentCtx?: Context
11 |
12 | isFragment: boolean
13 | start?: Text
14 | end?: Text
15 |
16 | get el() {
17 | return this.start || (this.template as Element)
18 | }
19 |
20 | constructor(template: Element, parentCtx: Context, isRoot = false) {
21 | this.isFragment = template instanceof HTMLTemplateElement
22 |
23 | if (isRoot) {
24 | this.template = template
25 | } else if (this.isFragment) {
26 | this.template = (template as HTMLTemplateElement).content.cloneNode(
27 | true
28 | ) as DocumentFragment
29 | } else {
30 | this.template = template.cloneNode(true) as Element
31 | }
32 |
33 | if (isRoot) {
34 | this.ctx = parentCtx
35 | } else {
36 | // create child context
37 | this.parentCtx = parentCtx
38 | parentCtx.blocks.push(this)
39 | this.ctx = createContext(parentCtx)
40 | }
41 |
42 | walk(this.template, this.ctx)
43 | }
44 |
45 | insert(parent: Element, anchor: Node | null = null) {
46 | if (this.isFragment) {
47 | if (this.start) {
48 | // already inserted, moving
49 | let node: Node | null = this.start
50 | let next: Node | null
51 | while (node) {
52 | next = node.nextSibling
53 | parent.insertBefore(node, anchor)
54 | if (node === this.end) break
55 | node = next
56 | }
57 | } else {
58 | this.start = new Text('')
59 | this.end = new Text('')
60 | parent.insertBefore(this.end, anchor)
61 | parent.insertBefore(this.start, this.end)
62 | parent.insertBefore(this.template, this.end)
63 | }
64 | } else {
65 | parent.insertBefore(this.template, anchor)
66 | }
67 | }
68 |
69 | remove() {
70 | if (this.parentCtx) {
71 | remove(this.parentCtx.blocks, this)
72 | }
73 | if (this.start) {
74 | const parent = this.start.parentNode!
75 | let node: Node | null = this.start
76 | let next: Node | null
77 | while (node) {
78 | next = node.nextSibling
79 | parent.removeChild(node)
80 | if (node === this.end) break
81 | node = next
82 | }
83 | } else {
84 | this.template.parentNode!.removeChild(this.template)
85 | }
86 | this.teardown()
87 | }
88 |
89 | teardown() {
90 | this.ctx.blocks.forEach((child) => {
91 | child.teardown()
92 | })
93 | this.ctx.effects.forEach(stop)
94 | this.ctx.cleanups.forEach((fn) => fn())
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/src/context.ts:
--------------------------------------------------------------------------------
1 | import {
2 | effect as rawEffect,
3 | reactive,
4 | ReactiveEffectRunner
5 | } from '@vue/reactivity'
6 | import { Block } from './block'
7 | import { Directive } from './directives'
8 | import { queueJob } from './scheduler'
9 | import { inOnce } from './walk'
10 | export interface Context {
11 | key?: any
12 | scope: Record
13 | dirs: Record
14 | blocks: Block[]
15 | effect: typeof rawEffect
16 | effects: ReactiveEffectRunner[]
17 | cleanups: (() => void)[]
18 | delimiters: [string, string]
19 | delimitersRE: RegExp
20 | }
21 |
22 | export const createContext = (parent?: Context): Context => {
23 | const ctx: Context = {
24 | delimiters: ['{{', '}}'],
25 | delimitersRE: /\{\{([^]+?)\}\}/g,
26 | ...parent,
27 | scope: parent ? parent.scope : reactive({}),
28 | dirs: parent ? parent.dirs : {},
29 | effects: [],
30 | blocks: [],
31 | cleanups: [],
32 | effect: (fn) => {
33 | if (inOnce) {
34 | queueJob(fn)
35 | return fn as any
36 | }
37 | const e: ReactiveEffectRunner = rawEffect(fn, {
38 | scheduler: () => queueJob(e)
39 | })
40 | ctx.effects.push(e)
41 | return e
42 | }
43 | }
44 | return ctx
45 | }
46 |
47 | export const createScopedContext = (ctx: Context, data = {}): Context => {
48 | const parentScope = ctx.scope
49 | const mergedScope = Object.create(parentScope)
50 | Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data))
51 | mergedScope.$refs = Object.create(parentScope.$refs)
52 | const reactiveProxy = reactive(
53 | new Proxy(mergedScope, {
54 | set(target, key, val, receiver) {
55 | // when setting a property that doesn't exist on current scope,
56 | // do not create it on the current scope and fallback to parent scope.
57 | if (receiver === reactiveProxy && !target.hasOwnProperty(key)) {
58 | return Reflect.set(parentScope, key, val)
59 | }
60 | return Reflect.set(target, key, val, receiver)
61 | }
62 | })
63 | )
64 |
65 | bindContextMethods(reactiveProxy)
66 | return {
67 | ...ctx,
68 | scope: reactiveProxy
69 | }
70 | }
71 |
72 | export const bindContextMethods = (scope: Record) => {
73 | for (const key of Object.keys(scope)) {
74 | if (typeof scope[key] === 'function') {
75 | scope[key] = scope[key].bind(scope)
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/src/directives/bind.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 | import {
3 | normalizeClass,
4 | normalizeStyle,
5 | isString,
6 | isArray,
7 | hyphenate,
8 | camelize
9 | } from '@vue/shared'
10 |
11 | const forceAttrRE = /^(spellcheck|draggable|form|list|type)$/
12 |
13 | export const bind: Directive = ({
14 | el,
15 | get,
16 | effect,
17 | arg,
18 | modifiers
19 | }) => {
20 | let prevValue: any
21 |
22 | // record static class
23 | if (arg === 'class') {
24 | el._class = el.className
25 | }
26 |
27 | effect(() => {
28 | let value = get()
29 | if (arg) {
30 | if (modifiers?.camel) {
31 | arg = camelize(arg)
32 | }
33 | setProp(el, arg, value, prevValue)
34 | } else {
35 | for (const key in value) {
36 | setProp(el, key, value[key], prevValue && prevValue[key])
37 | }
38 | for (const key in prevValue) {
39 | if (!value || !(key in value)) {
40 | setProp(el, key, null)
41 | }
42 | }
43 | }
44 | prevValue = value
45 | })
46 | }
47 |
48 | const setProp = (
49 | el: Element & { _class?: string },
50 | key: string,
51 | value: any,
52 | prevValue?: any
53 | ) => {
54 | if (key === 'class') {
55 | el.setAttribute(
56 | 'class',
57 | normalizeClass(el._class ? [el._class, value] : value) || ''
58 | )
59 | } else if (key === 'style') {
60 | value = normalizeStyle(value)
61 | const { style } = el as HTMLElement
62 | if (!value) {
63 | el.removeAttribute('style')
64 | } else if (isString(value)) {
65 | if (value !== prevValue) style.cssText = value
66 | } else {
67 | for (const key in value) {
68 | setStyle(style, key, value[key])
69 | }
70 | if (prevValue && !isString(prevValue)) {
71 | for (const key in prevValue) {
72 | if (value[key] == null) {
73 | setStyle(style, key, '')
74 | }
75 | }
76 | }
77 | }
78 | } else if (
79 | !(el instanceof SVGElement) &&
80 | key in el &&
81 | !forceAttrRE.test(key)
82 | ) {
83 | // @ts-ignore
84 | el[key] = value
85 | if (key === 'value') {
86 | // @ts-ignore
87 | el._value = value
88 | }
89 | } else {
90 | // special case for with
91 | // :true-value & :false-value
92 | // store value as dom properties since non-string values will be
93 | // stringified.
94 | if (key === 'true-value') {
95 | ;(el as any)._trueValue = value
96 | } else if (key === 'false-value') {
97 | ;(el as any)._falseValue = value
98 | } else if (value != null) {
99 | el.setAttribute(key, value)
100 | } else {
101 | el.removeAttribute(key)
102 | }
103 | }
104 | }
105 |
106 | const importantRE = /\s*!important$/
107 |
108 | const setStyle = (
109 | style: CSSStyleDeclaration,
110 | name: string,
111 | val: string | string[]
112 | ) => {
113 | if (isArray(val)) {
114 | val.forEach((v) => setStyle(style, name, v))
115 | } else {
116 | if (name.startsWith('--')) {
117 | // custom property definition
118 | style.setProperty(name, val)
119 | } else {
120 | if (importantRE.test(val)) {
121 | // !important
122 | style.setProperty(
123 | hyphenate(name),
124 | val.replace(importantRE, ''),
125 | 'important'
126 | )
127 | } else {
128 | style[name as any] = val
129 | }
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/directives/effect.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 | import { execute } from '../eval'
3 | import { nextTick } from '../scheduler'
4 |
5 | export const effect: Directive = ({ el, ctx, exp, effect }) => {
6 | nextTick(() => effect(() => execute(ctx.scope, exp, el)))
7 | }
8 |
--------------------------------------------------------------------------------
/src/directives/for.ts:
--------------------------------------------------------------------------------
1 | import { isArray, isObject } from '@vue/shared'
2 | import { Block } from '../block'
3 | import { evaluate } from '../eval'
4 | import { Context, createScopedContext } from '../context'
5 |
6 | const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/
7 | const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/
8 | const stripParensRE = /^\(|\)$/g
9 | const destructureRE = /^[{[]\s*((?:[\w_$]+\s*,?\s*)+)[\]}]$/
10 |
11 | type KeyToIndexMap = Map
12 |
13 | export const _for = (el: Element, exp: string, ctx: Context) => {
14 | const inMatch = exp.match(forAliasRE)
15 | if (!inMatch) {
16 | import.meta.env.DEV && console.warn(`invalid v-for expression: ${exp}`)
17 | return
18 | }
19 |
20 | const nextNode = el.nextSibling
21 |
22 | const parent = el.parentElement!
23 | const anchor = new Text('')
24 | parent.insertBefore(anchor, el)
25 | parent.removeChild(el)
26 |
27 | const sourceExp = inMatch[2].trim()
28 | let valueExp = inMatch[1].trim().replace(stripParensRE, '').trim()
29 | let destructureBindings: string[] | undefined
30 | let isArrayDestructure = false
31 | let indexExp: string | undefined
32 | let objIndexExp: string | undefined
33 |
34 | let keyAttr = 'key'
35 | let keyExp =
36 | el.getAttribute(keyAttr) ||
37 | el.getAttribute((keyAttr = ':key')) ||
38 | el.getAttribute((keyAttr = 'v-bind:key'))
39 | if (keyExp) {
40 | el.removeAttribute(keyAttr)
41 | if (keyAttr === 'key') keyExp = JSON.stringify(keyExp)
42 | }
43 |
44 | let match
45 | if ((match = valueExp.match(forIteratorRE))) {
46 | valueExp = valueExp.replace(forIteratorRE, '').trim()
47 | indexExp = match[1].trim()
48 | if (match[2]) {
49 | objIndexExp = match[2].trim()
50 | }
51 | }
52 |
53 | if ((match = valueExp.match(destructureRE))) {
54 | destructureBindings = match[1].split(',').map((s) => s.trim())
55 | isArrayDestructure = valueExp[0] === '['
56 | }
57 |
58 | let mounted = false
59 | let blocks: Block[]
60 | let childCtxs: Context[]
61 | let keyToIndexMap: Map
62 |
63 | const createChildContexts = (source: unknown): [Context[], KeyToIndexMap] => {
64 | const map: KeyToIndexMap = new Map()
65 | const ctxs: Context[] = []
66 |
67 | if (isArray(source)) {
68 | for (let i = 0; i < source.length; i++) {
69 | ctxs.push(createChildContext(map, source[i], i))
70 | }
71 | } else if (typeof source === 'number') {
72 | for (let i = 0; i < source; i++) {
73 | ctxs.push(createChildContext(map, i + 1, i))
74 | }
75 | } else if (isObject(source)) {
76 | let i = 0
77 | for (const key in source) {
78 | ctxs.push(createChildContext(map, source[key], i++, key))
79 | }
80 | }
81 |
82 | return [ctxs, map]
83 | }
84 |
85 | const createChildContext = (
86 | map: KeyToIndexMap,
87 | value: any,
88 | index: number,
89 | objKey?: string
90 | ): Context => {
91 | const data: any = {}
92 | if (destructureBindings) {
93 | destructureBindings.forEach(
94 | (b, i) => (data[b] = value[isArrayDestructure ? i : b])
95 | )
96 | } else {
97 | data[valueExp] = value
98 | }
99 | if (objKey) {
100 | indexExp && (data[indexExp] = objKey)
101 | objIndexExp && (data[objIndexExp] = index)
102 | } else {
103 | indexExp && (data[indexExp] = index)
104 | }
105 | const childCtx = createScopedContext(ctx, data)
106 | const key = keyExp ? evaluate(childCtx.scope, keyExp) : index
107 | map.set(key, index)
108 | childCtx.key = key
109 | return childCtx
110 | }
111 |
112 | const mountBlock = (ctx: Context, ref: Node) => {
113 | const block = new Block(el, ctx)
114 | block.key = ctx.key
115 | block.insert(parent, ref)
116 | return block
117 | }
118 |
119 | ctx.effect(() => {
120 | const source = evaluate(ctx.scope, sourceExp)
121 | const prevKeyToIndexMap = keyToIndexMap
122 | ;[childCtxs, keyToIndexMap] = createChildContexts(source)
123 | if (!mounted) {
124 | blocks = childCtxs.map((s) => mountBlock(s, anchor))
125 | mounted = true
126 | } else {
127 | for (let i = 0; i < blocks.length; i++) {
128 | if (!keyToIndexMap.has(blocks[i].key)) {
129 | blocks[i].remove()
130 | }
131 | }
132 |
133 | const nextBlocks: Block[] = []
134 | let i = childCtxs.length
135 | let nextBlock: Block | undefined
136 | let prevMovedBlock: Block | undefined
137 | while (i--) {
138 | const childCtx = childCtxs[i]
139 | const oldIndex = prevKeyToIndexMap.get(childCtx.key)
140 | let block
141 | if (oldIndex == null) {
142 | // new
143 | block = mountBlock(
144 | childCtx,
145 | nextBlock ? nextBlock.el : anchor
146 | )
147 | } else {
148 | // update
149 | block = blocks[oldIndex]
150 | Object.assign(block.ctx.scope, childCtx.scope)
151 | if (oldIndex !== i) {
152 | // moved
153 | if (
154 | blocks[oldIndex + 1] !== nextBlock ||
155 | // If the next has moved, it must move too
156 | prevMovedBlock === nextBlock
157 | ) {
158 | prevMovedBlock = block
159 | block.insert(parent, nextBlock ? nextBlock.el : anchor)
160 | }
161 | }
162 | }
163 | nextBlocks.unshift(nextBlock = block)
164 | }
165 | blocks = nextBlocks
166 | }
167 | })
168 |
169 | return nextNode
170 | }
171 |
--------------------------------------------------------------------------------
/src/directives/html.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 |
3 | export const html: Directive = ({ el, get, effect }) => {
4 | effect(() => {
5 | el.innerHTML = get()
6 | })
7 | }
8 |
--------------------------------------------------------------------------------
/src/directives/if.ts:
--------------------------------------------------------------------------------
1 | import { Block } from '../block'
2 | import { evaluate } from '../eval'
3 | import { checkAttr } from '../utils'
4 | import { Context } from '../context'
5 |
6 | interface Branch {
7 | exp?: string | null
8 | el: Element
9 | }
10 |
11 | export const _if = (el: Element, exp: string, ctx: Context) => {
12 | if (import.meta.env.DEV && !exp.trim()) {
13 | console.warn(`v-if expression cannot be empty.`)
14 | }
15 |
16 | const parent = el.parentElement!
17 | const anchor = new Comment('v-if')
18 | parent.insertBefore(anchor, el)
19 |
20 | const branches: Branch[] = [
21 | {
22 | exp,
23 | el
24 | }
25 | ]
26 |
27 | // locate else branch
28 | let elseEl: Element | null
29 | let elseExp: string | null
30 | while ((elseEl = el.nextElementSibling)) {
31 | elseExp = null
32 | if (
33 | checkAttr(elseEl, 'v-else') === '' ||
34 | (elseExp = checkAttr(elseEl, 'v-else-if'))
35 | ) {
36 | parent.removeChild(elseEl)
37 | branches.push({ exp: elseExp, el: elseEl })
38 | } else {
39 | break
40 | }
41 | }
42 |
43 | const nextNode = el.nextSibling
44 | parent.removeChild(el)
45 |
46 | let block: Block | undefined
47 | let activeBranchIndex: number = -1
48 |
49 | const removeActiveBlock = () => {
50 | if (block) {
51 | parent.insertBefore(anchor, block.el)
52 | block.remove()
53 | block = undefined
54 | }
55 | }
56 |
57 | ctx.effect(() => {
58 | for (let i = 0; i < branches.length; i++) {
59 | const { exp, el } = branches[i]
60 | if (!exp || evaluate(ctx.scope, exp)) {
61 | if (i !== activeBranchIndex) {
62 | removeActiveBlock()
63 | block = new Block(el, ctx)
64 | block.insert(parent, anchor)
65 | parent.removeChild(anchor)
66 | activeBranchIndex = i
67 | }
68 | return
69 | }
70 | }
71 | // no matched branch.
72 | activeBranchIndex = -1
73 | removeActiveBlock()
74 | })
75 |
76 | return nextNode
77 | }
78 |
--------------------------------------------------------------------------------
/src/directives/index.ts:
--------------------------------------------------------------------------------
1 | import { Context } from '../context'
2 | import { effect as rawEffect } from '@vue/reactivity'
3 | import { bind } from './bind'
4 | import { on } from './on'
5 | import { show } from './show'
6 | import { text } from './text'
7 | import { html } from './html'
8 | import { model } from './model'
9 | import { effect } from './effect'
10 |
11 | export interface Directive {
12 | (ctx: DirectiveContext): (() => void) | void
13 | }
14 |
15 | export interface DirectiveContext {
16 | el: T
17 | get: (exp?: string) => any
18 | effect: typeof rawEffect
19 | exp: string
20 | arg?: string
21 | modifiers?: Record
22 | ctx: Context
23 | }
24 |
25 | export const builtInDirectives: Record> = {
26 | bind,
27 | on,
28 | show,
29 | text,
30 | html,
31 | model,
32 | effect
33 | }
34 |
--------------------------------------------------------------------------------
/src/directives/model.ts:
--------------------------------------------------------------------------------
1 | import { isArray, looseEqual, looseIndexOf, toNumber } from '@vue/shared'
2 | import { Directive } from '.'
3 | import { listen } from '../utils'
4 |
5 | export const model: Directive<
6 | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement
7 | > = ({ el, exp, get, effect, modifiers }) => {
8 | const type = el.type
9 | const assign = get(`(val) => { ${exp} = val }`)
10 | const { trim, number = type === 'number' } = modifiers || {}
11 |
12 | if (el.tagName === 'SELECT') {
13 | const sel = el as HTMLSelectElement
14 | listen(el, 'change', () => {
15 | const selectedVal = Array.prototype.filter
16 | .call(sel.options, (o: HTMLOptionElement) => o.selected)
17 | .map((o: HTMLOptionElement) =>
18 | number ? toNumber(getValue(o)) : getValue(o)
19 | )
20 | assign(sel.multiple ? selectedVal : selectedVal[0])
21 | })
22 | effect(() => {
23 | const value = get()
24 | const isMultiple = sel.multiple
25 | for (let i = 0, l = sel.options.length; i < l; i++) {
26 | const option = sel.options[i]
27 | const optionValue = getValue(option)
28 | if (isMultiple) {
29 | if (isArray(value)) {
30 | option.selected = looseIndexOf(value, optionValue) > -1
31 | } else {
32 | option.selected = value.has(optionValue)
33 | }
34 | } else {
35 | if (looseEqual(getValue(option), value)) {
36 | if (sel.selectedIndex !== i) sel.selectedIndex = i
37 | return
38 | }
39 | }
40 | }
41 | if (!isMultiple && sel.selectedIndex !== -1) {
42 | sel.selectedIndex = -1
43 | }
44 | })
45 | } else if (type === 'checkbox') {
46 | listen(el, 'change', () => {
47 | const modelValue = get()
48 | const checked = (el as HTMLInputElement).checked
49 | if (isArray(modelValue)) {
50 | const elementValue = getValue(el)
51 | const index = looseIndexOf(modelValue, elementValue)
52 | const found = index !== -1
53 | if (checked && !found) {
54 | assign(modelValue.concat(elementValue))
55 | } else if (!checked && found) {
56 | const filtered = [...modelValue]
57 | filtered.splice(index, 1)
58 | assign(filtered)
59 | }
60 | } else {
61 | assign(getCheckboxValue(el as HTMLInputElement, checked))
62 | }
63 | })
64 |
65 | let oldValue: any
66 | effect(() => {
67 | const value = get()
68 | if (isArray(value)) {
69 | ;(el as HTMLInputElement).checked =
70 | looseIndexOf(value, getValue(el)) > -1
71 | } else if (value !== oldValue) {
72 | ;(el as HTMLInputElement).checked = looseEqual(
73 | value,
74 | getCheckboxValue(el as HTMLInputElement, true)
75 | )
76 | }
77 | oldValue = value
78 | })
79 | } else if (type === 'radio') {
80 | listen(el, 'change', () => {
81 | assign(getValue(el))
82 | })
83 | let oldValue: any
84 | effect(() => {
85 | const value = get()
86 | if (value !== oldValue) {
87 | ;(el as HTMLInputElement).checked = looseEqual(value, getValue(el))
88 | }
89 | })
90 | } else {
91 | // text-like
92 | const resolveValue = (val: string) => {
93 | if (trim) return val.trim()
94 | if (number) return toNumber(val)
95 | return val
96 | }
97 |
98 | listen(el, 'compositionstart', onCompositionStart)
99 | listen(el, 'compositionend', onCompositionEnd)
100 | listen(el, modifiers?.lazy ? 'change' : 'input', () => {
101 | if ((el as any).composing) return
102 | assign(resolveValue(el.value))
103 | })
104 | if (trim) {
105 | listen(el, 'change', () => {
106 | el.value = el.value.trim()
107 | })
108 | }
109 |
110 | effect(() => {
111 | if ((el as any).composing) {
112 | return
113 | }
114 | const curVal = el.value
115 | const newVal = get()
116 | if (document.activeElement === el && resolveValue(curVal) === newVal) {
117 | return
118 | }
119 | if (curVal !== newVal) {
120 | el.value = newVal
121 | }
122 | })
123 | }
124 | }
125 |
126 | const getValue = (el: any) => ('_value' in el ? el._value : el.value)
127 |
128 | // retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
129 | const getCheckboxValue = (
130 | el: HTMLInputElement & { _trueValue?: any; _falseValue?: any },
131 | checked: boolean
132 | ) => {
133 | const key = checked ? '_trueValue' : '_falseValue'
134 | return key in el ? el[key] : checked
135 | }
136 |
137 | const onCompositionStart = (e: Event) => {
138 | ;(e.target as any).composing = true
139 | }
140 |
141 | const onCompositionEnd = (e: Event) => {
142 | const target = e.target as any
143 | if (target.composing) {
144 | target.composing = false
145 | trigger(target, 'input')
146 | }
147 | }
148 |
149 | const trigger = (el: HTMLElement, type: string) => {
150 | const e = document.createEvent('HTMLEvents')
151 | e.initEvent(type, true, true)
152 | el.dispatchEvent(e)
153 | }
154 |
--------------------------------------------------------------------------------
/src/directives/on.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 | import { hyphenate } from '@vue/shared'
3 | import { listen } from '../utils'
4 | import { nextTick } from '../scheduler'
5 |
6 | // same as vue 2
7 | const simplePathRE =
8 | /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/
9 |
10 | const systemModifiers = ['ctrl', 'shift', 'alt', 'meta']
11 |
12 | type KeyedEvent = KeyboardEvent | MouseEvent | TouchEvent
13 |
14 | const modifierGuards: Record<
15 | string,
16 | (e: Event, modifiers: Record) => void | boolean
17 | > = {
18 | stop: (e) => e.stopPropagation(),
19 | prevent: (e) => e.preventDefault(),
20 | self: (e) => e.target !== e.currentTarget,
21 | ctrl: (e) => !(e as KeyedEvent).ctrlKey,
22 | shift: (e) => !(e as KeyedEvent).shiftKey,
23 | alt: (e) => !(e as KeyedEvent).altKey,
24 | meta: (e) => !(e as KeyedEvent).metaKey,
25 | left: (e) => 'button' in e && (e as MouseEvent).button !== 0,
26 | middle: (e) => 'button' in e && (e as MouseEvent).button !== 1,
27 | right: (e) => 'button' in e && (e as MouseEvent).button !== 2,
28 | exact: (e, modifiers) =>
29 | systemModifiers.some((m) => (e as any)[`${m}Key`] && !modifiers[m])
30 | }
31 |
32 | export const on: Directive = ({ el, get, exp, arg, modifiers }) => {
33 | if (!arg) {
34 | if (import.meta.env.DEV) {
35 | console.error(`v-on="obj" syntax is not supported in petite-vue.`)
36 | }
37 | return
38 | }
39 |
40 | let handler = simplePathRE.test(exp)
41 | ? get(`(e => ${exp}(e))`)
42 | : get(`($event => { ${exp} })`)
43 |
44 | // special lifecycle events
45 | if (import.meta.env.DEV && (arg === 'mounted' || arg === 'unmounted')) {
46 | console.error(
47 | `mounted and unmounted hooks now need to be prefixed with vue: ` +
48 | `- use @vue:${arg}="handler" instead.`
49 | )
50 | }
51 | if (arg === 'vue:mounted') {
52 | nextTick(handler)
53 | return
54 | } else if (arg === 'vue:unmounted') {
55 | return () => handler()
56 | }
57 |
58 | if (modifiers) {
59 | // map modifiers
60 | if (arg === 'click') {
61 | if (modifiers.right) arg = 'contextmenu'
62 | if (modifiers.middle) arg = 'mouseup'
63 | }
64 |
65 | const raw = handler
66 | handler = (e: Event) => {
67 | if ('key' in e && !(hyphenate((e as KeyboardEvent).key) in modifiers)) {
68 | return
69 | }
70 | for (const key in modifiers) {
71 | const guard = modifierGuards[key]
72 | if (guard && guard(e, modifiers)) {
73 | return
74 | }
75 | }
76 | return raw(e)
77 | }
78 | }
79 |
80 | listen(el, arg, handler, modifiers)
81 | }
82 |
--------------------------------------------------------------------------------
/src/directives/ref.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 |
3 | export const ref: Directive = ({
4 | el,
5 | ctx: {
6 | scope: { $refs }
7 | },
8 | get,
9 | effect
10 | }) => {
11 | let prevRef: any
12 | effect(() => {
13 | const ref = get()
14 | $refs[ref] = el
15 | if (prevRef && ref !== prevRef) {
16 | delete $refs[prevRef]
17 | }
18 | prevRef = ref
19 | })
20 | return () => {
21 | prevRef && delete $refs[prevRef]
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/directives/show.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '.'
2 |
3 | export const show: Directive = ({ el, get, effect }) => {
4 | const initialDisplay = el.style.display
5 | effect(() => {
6 | el.style.display = get() ? initialDisplay : 'none'
7 | })
8 | }
9 |
--------------------------------------------------------------------------------
/src/directives/text.ts:
--------------------------------------------------------------------------------
1 | import { isObject } from '@vue/shared'
2 | import { Directive } from '.'
3 |
4 | export const text: Directive = ({ el, get, effect }) => {
5 | effect(() => {
6 | el.textContent = toDisplayString(get())
7 | })
8 | }
9 |
10 | export const toDisplayString = (value: any) =>
11 | value == null
12 | ? ''
13 | : isObject(value)
14 | ? JSON.stringify(value, null, 2)
15 | : String(value)
16 |
--------------------------------------------------------------------------------
/src/eval.ts:
--------------------------------------------------------------------------------
1 | const evalCache: Record = Object.create(null)
2 |
3 | export const evaluate = (scope: any, exp: string, el?: Node) =>
4 | execute(scope, `return(${exp})`, el)
5 |
6 | export const execute = (scope: any, exp: string, el?: Node) => {
7 | const fn = evalCache[exp] || (evalCache[exp] = toFunction(exp))
8 | try {
9 | return fn(scope, el)
10 | } catch (e) {
11 | if (import.meta.env.DEV) {
12 | console.warn(`Error when evaluating expression "${exp}":`)
13 | }
14 | console.error(e)
15 | }
16 | }
17 |
18 | const toFunction = (exp: string): Function => {
19 | try {
20 | return new Function(`$data`, `$el`, `with($data){${exp}}`)
21 | } catch (e) {
22 | console.error(`${(e as Error).message} in expression: ${exp}`)
23 | return () => {}
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export { createApp } from './app'
2 | export { nextTick } from './scheduler'
3 | export { reactive, effect as watchEffect } from '@vue/reactivity'
4 |
5 | import { createApp } from './app'
6 |
7 | const s = document.currentScript
8 | if (s && s.hasAttribute('init')) {
9 | createApp().mount()
10 | }
11 |
--------------------------------------------------------------------------------
/src/scheduler.ts:
--------------------------------------------------------------------------------
1 | let queued = false
2 | const queue: Function[] = []
3 | const p = Promise.resolve()
4 |
5 | export const nextTick = (fn: () => void) => p.then(fn)
6 |
7 | export const queueJob = (job: Function) => {
8 | if (!queue.includes(job)) queue.push(job)
9 | if (!queued) {
10 | queued = true
11 | nextTick(flushJobs)
12 | }
13 | }
14 |
15 | const flushJobs = () => {
16 | for (const job of queue) {
17 | job()
18 | }
19 | queue.length = 0
20 | queued = false
21 | }
22 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | export const checkAttr = (el: Element, name: string): string | null => {
2 | const val = el.getAttribute(name)
3 | if (val != null) el.removeAttribute(name)
4 | return val
5 | }
6 |
7 | export const listen = (
8 | el: Element,
9 | event: string,
10 | handler: any,
11 | options?: any
12 | ) => {
13 | el.addEventListener(event, handler, options)
14 | }
15 |
--------------------------------------------------------------------------------
/src/walk.ts:
--------------------------------------------------------------------------------
1 | import { builtInDirectives, Directive } from './directives'
2 | import { _if } from './directives/if'
3 | import { _for } from './directives/for'
4 | import { bind } from './directives/bind'
5 | import { on } from './directives/on'
6 | import { text } from './directives/text'
7 | import { evaluate } from './eval'
8 | import { checkAttr } from './utils'
9 | import { ref } from './directives/ref'
10 | import { Context, createScopedContext } from './context'
11 |
12 | const dirRE = /^(?:v-|:|@)/
13 | const modifierRE = /\.([\w-]+)/g
14 |
15 | export let inOnce = false
16 |
17 | export const walk = (node: Node, ctx: Context): ChildNode | null | void => {
18 | const parentCtx = ctx
19 | const type = node.nodeType
20 | if (type === 1) {
21 | // Element
22 | const el = node as Element
23 | if (el.hasAttribute('v-pre')) {
24 | return
25 | }
26 |
27 | checkAttr(el, 'v-cloak')
28 |
29 | let exp: string | null
30 |
31 | // v-if
32 | if ((exp = checkAttr(el, 'v-if'))) {
33 | return _if(el, exp, ctx)
34 | }
35 |
36 | // v-for
37 | if ((exp = checkAttr(el, 'v-for'))) {
38 | return _for(el, exp, ctx)
39 | }
40 |
41 | // v-scope
42 | if ((exp = checkAttr(el, 'v-scope')) || exp === '') {
43 | const scope = exp ? evaluate(ctx.scope, exp, el) : {}
44 | scope.$root = el
45 | ctx = createScopedContext(ctx, scope)
46 | if (scope.$template) {
47 | resolveTemplate(el, scope.$template)
48 | }
49 | }
50 |
51 | // v-once
52 | const hasVOnce = checkAttr(el, 'v-once') != null
53 | if (hasVOnce) {
54 | inOnce = true
55 | }
56 |
57 | // ref
58 | if ((exp = checkAttr(el, 'ref'))) {
59 | if (ctx !== parentCtx) {
60 | applyDirective(el, ref, `"${exp}"`, parentCtx)
61 | }
62 | applyDirective(el, ref, `"${exp}"`, ctx)
63 | }
64 |
65 | // process children first before self attrs
66 | walkChildren(el, ctx)
67 |
68 | // other directives
69 | const deferred: [string, string][] = []
70 | for (const { name, value } of [...el.attributes]) {
71 | if (dirRE.test(name) && name !== 'v-cloak') {
72 | if (name === 'v-model') {
73 | // defer v-model since it relies on :value bindings to be processed
74 | // first, but also before v-on listeners (#73)
75 | deferred.unshift([name, value])
76 | } else if (name[0] === '@' || /^v-on\b/.test(name)) {
77 | deferred.push([name, value])
78 | } else {
79 | processDirective(el, name, value, ctx)
80 | }
81 | }
82 | }
83 | for (const [name, value] of deferred) {
84 | processDirective(el, name, value, ctx)
85 | }
86 |
87 | if (hasVOnce) {
88 | inOnce = false
89 | }
90 | } else if (type === 3) {
91 | // Text
92 | const data = (node as Text).data
93 | if (data.includes(ctx.delimiters[0])) {
94 | let segments: string[] = []
95 | let lastIndex = 0
96 | let match
97 | while ((match = ctx.delimitersRE.exec(data))) {
98 | const leading = data.slice(lastIndex, match.index)
99 | if (leading) segments.push(JSON.stringify(leading))
100 | segments.push(`$s(${match[1]})`)
101 | lastIndex = match.index + match[0].length
102 | }
103 | if (lastIndex < data.length) {
104 | segments.push(JSON.stringify(data.slice(lastIndex)))
105 | }
106 | applyDirective(node, text, segments.join('+'), ctx)
107 | }
108 | } else if (type === 11) {
109 | walkChildren(node as DocumentFragment, ctx)
110 | }
111 | }
112 |
113 | const walkChildren = (node: Element | DocumentFragment, ctx: Context) => {
114 | let child = node.firstChild
115 | while (child) {
116 | child = walk(child, ctx) || child.nextSibling
117 | }
118 | }
119 |
120 | const processDirective = (
121 | el: Element,
122 | raw: string,
123 | exp: string,
124 | ctx: Context
125 | ) => {
126 | let dir: Directive
127 | let arg: string | undefined
128 | let modifiers: Record | undefined
129 |
130 | // modifiers
131 | raw = raw.replace(modifierRE, (_, m) => {
132 | ;(modifiers || (modifiers = {}))[m] = true
133 | return ''
134 | })
135 |
136 | if (raw[0] === ':') {
137 | dir = bind
138 | arg = raw.slice(1)
139 | } else if (raw[0] === '@') {
140 | dir = on
141 | arg = raw.slice(1)
142 | } else {
143 | const argIndex = raw.indexOf(':')
144 | const dirName = argIndex > 0 ? raw.slice(2, argIndex) : raw.slice(2)
145 | dir = builtInDirectives[dirName] || ctx.dirs[dirName]
146 | arg = argIndex > 0 ? raw.slice(argIndex + 1) : undefined
147 | }
148 | if (dir) {
149 | if (dir === bind && arg === 'ref') dir = ref
150 | applyDirective(el, dir, exp, ctx, arg, modifiers)
151 | el.removeAttribute(raw)
152 | } else if (import.meta.env.DEV) {
153 | console.error(`unknown custom directive ${raw}.`)
154 | }
155 | }
156 |
157 | const applyDirective = (
158 | el: Node,
159 | dir: Directive,
160 | exp: string,
161 | ctx: Context,
162 | arg?: string,
163 | modifiers?: Record
164 | ) => {
165 | const get = (e = exp) => evaluate(ctx.scope, e, el)
166 | const cleanup = dir({
167 | el,
168 | get,
169 | effect: ctx.effect,
170 | ctx,
171 | exp,
172 | arg,
173 | modifiers
174 | })
175 | if (cleanup) {
176 | ctx.cleanups.push(cleanup)
177 | }
178 | }
179 |
180 | const resolveTemplate = (el: Element, template: string) => {
181 | if (template[0] === '#') {
182 | const templateEl = document.querySelector(template)
183 | if (import.meta.env.DEV && !templateEl) {
184 | console.error(
185 | `template selector ${template} has no matching element.`
186 | )
187 | }
188 | el.appendChild((templateEl as HTMLTemplateElement).content.cloneNode(true))
189 | return
190 | }
191 | el.innerHTML = template.replace(/<[\/\s]*template\s*>/ig, '')
192 | }
193 |
--------------------------------------------------------------------------------
/tests/bind.html:
--------------------------------------------------------------------------------
1 |
18 |
19 |
34 |
35 |
36 |
simple binding - this should be green
37 |
38 | class binding - this should be red and bold
39 |
40 |
41 | style binding - this should be blue and bold
42 |
43 |
object binding - this should be orange
44 |
45 |
--------------------------------------------------------------------------------
/tests/cloak.html:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
{{ msg }}
11 |
toggle
12 |
13 |
14 |
--------------------------------------------------------------------------------
/tests/component.html:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 | {{ count }} {{ plusOne }}
21 | ++
22 |
23 |
24 |
--------------------------------------------------------------------------------
/tests/custom-delimiters.html:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
count is ${ count }!
10 |
increase
11 |
12 |
${ i }
13 |
14 |
${ count }
15 |
16 |
--------------------------------------------------------------------------------
/tests/effect.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
--------------------------------------------------------------------------------
/tests/for.html:
--------------------------------------------------------------------------------
1 |
20 |
21 |
22 |
add
23 |
reverse
24 |
pop
25 |
splice
26 |
31 |
32 |
37 |
38 |
--------------------------------------------------------------------------------
/tests/html.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/tests/if.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
toggle
9 |
toggle else
10 |
ok
11 |
else if
12 |
else
13 |
14 |
--------------------------------------------------------------------------------
/tests/model.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
20 |
{{ $data }}
21 |
Text Input
22 | {{ text }}
23 |
24 |
25 |
TextArea
26 | {{ text }}
27 |
28 |
29 |
Checkbox
30 |
31 |
{{ checked }}
32 |
33 |
Checkbox w/ Array
34 |
one
35 |
two
36 |
actual number
39 |
{{ arr }}
40 |
41 |
Checkbox w/ true-value / false-value
42 |
48 |
{{ checkToggle }}
49 |
50 |
Radio
51 |
one
52 |
two
53 |
three
56 |
{{ radioSelected }}
57 |
58 |
Select
59 |
60 | one
61 | two
62 | three
63 |
64 |
{{ selected }}
65 |
66 |
--------------------------------------------------------------------------------
/tests/multi-mount.html:
--------------------------------------------------------------------------------
1 |
21 |
22 |
23 | Global count {{ store.count }}
24 | Local count {{ count }}
25 |
26 |
27 |
28 | Global count {{ store.count }}
29 | Local count {{ count }}
30 |
--------------------------------------------------------------------------------
/tests/on.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
13 |
16 | right click
17 | middle click
18 | click once
19 |
20 |
--------------------------------------------------------------------------------
/tests/once.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | {{ count }}
8 |
9 |
Once
10 | {{ count }}
11 |
12 | {{ i }}
13 |
14 |
15 |
++
16 |
17 |
--------------------------------------------------------------------------------
/tests/pre.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
{{ count }}
8 |
{{ count }}
9 |
increment
10 |
--------------------------------------------------------------------------------
/tests/reactive.html:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 |
Global {{ store.count }}
22 |
increment
23 |
24 |
Local {{ localCount }}
25 |
increment
26 |
--------------------------------------------------------------------------------
/tests/ref.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
12 |
Accessing root el (with ref): id is {{ $refs.root.id }}
13 |
Accessing root el (with $root): id is {{ $refs.root.id }}
14 |
15 |
16 |
Span with dynamic ref
17 |
dynamicRef is {{ dynamicRef }}
18 |
19 | change dynamicRef
20 |
21 |
toggle
22 |
23 |
24 |
nested scope ref
25 |
28 | log nested scope refs
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/tests/scope.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | {{ msg }} Change one
8 |
9 |
10 |
11 |
{{ $data }}
12 | {{ msg }} {{ outer }}
13 |
Change two
14 |
Change outer
15 |
16 |
{{ $data }}
17 | {{ msg }} {{ inner }} {{ outer }}
18 |
Change three
19 |
Change inner
20 |
Change outer
21 |
22 |
23 | change outer
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/tests/show.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
11 |
--------------------------------------------------------------------------------
/tests/text.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "outDir": "dist",
5 | "declaration": true,
6 | "sourceMap": false,
7 | "target": "esnext",
8 | "module": "esnext",
9 | "moduleResolution": "node",
10 | "allowJs": false,
11 | "strict": true,
12 | "noUnusedLocals": true,
13 | "rootDir": ".",
14 | "types": ["vite/client"]
15 | },
16 | "include": [
17 | "src"
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import { resolve } from 'node:path'
3 |
4 | export default defineConfig({
5 | build: {
6 | target: 'esnext',
7 | minify: 'terser',
8 | lib: {
9 | entry: resolve(__dirname, 'src/index.ts'),
10 | name: 'PicoVue',
11 | formats: ['es', 'umd', 'iife']
12 | },
13 | rollupOptions: {
14 | plugins: [
15 | {
16 | name: 'remove-collection-handlers',
17 | transform(code, id) {
18 | if (id.endsWith('reactivity.esm-bundler.js')) {
19 | return code
20 | .replace(`mutableCollectionHandlers,`, `null,`)
21 | .replace(`readonlyCollectionHandlers,`, `null,`)
22 | }
23 | }
24 | }
25 | ]
26 | }
27 | }
28 | })
29 |
--------------------------------------------------------------------------------