├── .gitignore ├── test ├── _setup.js └── mount.test.js ├── rollup.config.js ├── index.d.ts ├── index.js ├── .github └── workflows │ └── node.js.yml ├── LICENSE ├── README.md ├── package.json └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /test/_setup.js: -------------------------------------------------------------------------------- 1 | import { GlobalRegistrator } from '@happy-dom/global-registrator' 2 | GlobalRegistrator.register() 3 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import { readPackageJSON } from 'pkg-types' 2 | 3 | const pkg = await readPackageJSON() 4 | 5 | export default { 6 | input: 'index.js', 7 | output: [ 8 | { file: pkg.main, format: 'cjs' }, 9 | { file: pkg.module, format: 'esm' } 10 | ], 11 | external: ['vue'] 12 | } 13 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import { Component, App, VNode } from 'vue' 2 | 3 | export type MountResult = { 4 | vNode: VNode; 5 | el: HTMLElement; 6 | destroy: Function; 7 | }; 8 | export function mount(component: Component, { props, children, element, app }?: { 9 | props?: TProps; 10 | children?: unknown; 11 | app?: App; 12 | element?: HTMLElement; 13 | }): MountResult; 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { createVNode, render } from 'vue' 2 | 3 | export function mount(component, { props, children, element, app } = {}) { 4 | let el = element 5 | 6 | let vNode = createVNode(component, props, children) 7 | if (app && app._context) vNode.appContext = app._context 8 | if (el) render(vNode, el) 9 | else if (typeof document !== 'undefined' ) render(vNode, el = document.createElement('div')) 10 | 11 | const destroy = () => { 12 | if (el) render(null, el) 13 | el = null 14 | vNode = null 15 | } 16 | 17 | return { vNode, destroy, el } 18 | } 19 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: [push] 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: current 18 | - uses: pnpm/action-setup@v2 19 | with: 20 | version: 7 21 | run_install: true 22 | - name: test and build 23 | run: | 24 | pnpm test 25 | pnpm build 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Dave Honneffer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mount-vue-component 2 | 3 | ## install 4 | 5 | ```shell 6 | yarn add mount-vue-component 7 | ``` 8 | 9 | ## use 10 | 11 | ```js 12 | import { mount } from 'mount-vue-component' 13 | import { h } from 'vue' 14 | 15 | const comp = { 16 | props: ['name'], 17 | setup: (props) => () => h('h1', `Hello, ${props.name}!`), 18 | unmounted() { console.log("Bye") }, 19 | mounted() { console.log("Hi") } 20 | } 21 | const { vNode, destroy, el } = mount(comp, { props: { name: 'world' } }) 22 | ``` 23 | 24 | ## api 25 | 26 | #### `mount(component, { props, children, element, app })` 27 | 28 | - `component`: required, the component to be created/mounted 29 | - `props`: props to be passed onto the component, this can include HTML attributes like `id` or `class` 30 | - `children`: components to be rendered as children of `component` 31 | - `element`: if specified, the element to mount the component into, if not specified, a `div` will be created 32 | - `app`: the Vue app instance from `createApp`, if provided will be bound to the component's `appContext` 33 | 34 | ##### returns `{ vNode, destroy, el }` 35 | 36 | - `vNode`: the instance of the component provided 37 | - `destroy`: a function that will unmount and destroy the component 38 | - `el`: will provide the HTML element the component is mounted into 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mount-vue-component", 3 | "version": "0.10.2", 4 | "description": "a tiny utility to programatically create and mount Vue 3 components - e.g. a Vue.extend replacement", 5 | "type": "module", 6 | "main": "dist/index.cjs.js", 7 | "module": "dist/index.esm.js", 8 | "types": "./index.d.ts", 9 | "scripts": { 10 | "build": "rollup -c", 11 | "preversion": "npm run test && npm run build", 12 | "version": "npm publish --access public", 13 | "postversion": "git push --follow-tags", 14 | "test": "NODE_ENV=production node test/mount.test.js" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/pearofducks/mount-vue-component.git" 19 | }, 20 | "keywords": [ 21 | "vue-3", 22 | "extend", 23 | "component", 24 | "programatic" 25 | ], 26 | "author": "Dave Honneffer", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/pearofducks/mount-vue-component/issues" 30 | }, 31 | "homepage": "https://github.com/pearofducks/mount-vue-component#readme", 32 | "devDependencies": { 33 | "@happy-dom/global-registrator": "^15.6.0", 34 | "happy-dom": "^15.6.0", 35 | "pkg-types": "^1.2.0", 36 | "rollup": "^4.21.2", 37 | "uvu": "^0.5.1", 38 | "vue": "^3.2.37" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /test/mount.test.js: -------------------------------------------------------------------------------- 1 | import './_setup.js' 2 | import { test } from 'uvu' 3 | import * as assert from 'uvu/assert' 4 | import { isVNode, h, createApp } from 'vue' 5 | import { mount as createComponentInstance } from '../index.js' 6 | 7 | const createComponent = (options) => ({ 8 | template: '

Hello {{ name }}

', 9 | props: { name: String }, 10 | ...options 11 | }) 12 | 13 | test('it can create an instance without any optional arguments', () => { 14 | const comp = createComponent() 15 | const { vNode, el } = createComponentInstance(comp) 16 | assert.ok(isVNode(vNode)) 17 | assert.is(el.tagName, 'DIV') 18 | }) 19 | 20 | test('it can create an instance with props', () => { 21 | const comp = createComponent() 22 | const props = { name: 'world' } 23 | const { el } = createComponentInstance(comp, { props }) 24 | assert.is(el.querySelector('h1').textContent, 'Hello world') 25 | }) 26 | 27 | test('it can create an instance with children', () => { 28 | const comp = createComponent() 29 | const children = () => h('span', 'hello') 30 | const { el } = createComponentInstance(comp, { children }) 31 | assert.is(el.querySelector('h1').textContent, 'Hello hello') 32 | }) 33 | 34 | test('it can create an instance with props and children', () => { 35 | const comp = createComponent() 36 | const props = { name: 'there ' } 37 | const children = () => h('span', 'world') 38 | const { el } = createComponentInstance(comp, { props, children }) 39 | assert.is(el.querySelector('h1').textContent, 'Hello there world') 40 | }) 41 | 42 | test('it can create mount into a specified DOM element', () => { 43 | const comp = createComponent() 44 | const element = document.createElement('section') 45 | const { el } = createComponentInstance(comp, { element }) 46 | assert.is(el.tagName, 'SECTION') 47 | }) 48 | 49 | test('it can create create a component instance with mount hooks', () => { 50 | let called = false 51 | const mounted = () => called = true 52 | const comp = createComponent({ mounted }) 53 | createComponentInstance(comp) 54 | assert.ok(called) 55 | }) 56 | 57 | test('it can create create a component instance with unmount hooks', () => { 58 | let called = false 59 | const unmounted = () => called = true 60 | const comp = createComponent({ unmounted }) 61 | const { destroy } = createComponentInstance(comp) 62 | assert.not(called) 63 | destroy() 64 | assert.ok(called) 65 | }) 66 | 67 | test('it can remove itself from the DOM when destroyed', () => { 68 | const comp = createComponent() 69 | const { el, destroy } = createComponentInstance(comp) 70 | assert.is(el.querySelector('h1').textContent, 'Hello ') 71 | destroy() 72 | assert.is(el.querySelector('h1'), null) 73 | }) 74 | 75 | test('it lacks appContext without an app being provided', () => { 76 | const comp = createComponent() 77 | const { vNode } = createComponentInstance(comp) 78 | assert.not(vNode.appContext) 79 | }) 80 | 81 | test('it can append an appContext to the vNode', () => { 82 | const appComponent = createComponent() 83 | const comp = createComponent() 84 | const app = createApp(appComponent) 85 | const { vNode } = createComponentInstance(comp, { app }) 86 | assert.ok(vNode.appContext) 87 | }) 88 | 89 | test.run() 90 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@happy-dom/global-registrator': 12 | specifier: ^15.6.0 13 | version: 15.6.0 14 | happy-dom: 15 | specifier: ^15.6.0 16 | version: 15.6.0 17 | pkg-types: 18 | specifier: ^1.2.0 19 | version: 1.2.0 20 | rollup: 21 | specifier: ^4.21.2 22 | version: 4.21.2 23 | uvu: 24 | specifier: ^0.5.1 25 | version: 0.5.6 26 | vue: 27 | specifier: ^3.2.37 28 | version: 3.4.38 29 | 30 | packages: 31 | 32 | '@babel/helper-string-parser@7.24.8': 33 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 34 | engines: {node: '>=6.9.0'} 35 | 36 | '@babel/helper-validator-identifier@7.24.7': 37 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 38 | engines: {node: '>=6.9.0'} 39 | 40 | '@babel/parser@7.25.6': 41 | resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} 42 | engines: {node: '>=6.0.0'} 43 | hasBin: true 44 | 45 | '@babel/types@7.25.6': 46 | resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} 47 | engines: {node: '>=6.9.0'} 48 | 49 | '@happy-dom/global-registrator@15.6.0': 50 | resolution: {integrity: sha512-zdOfJ7ElhpUYBOILlh5ZzBYBRjCrCSG+THTHlcC49pSjUqmX1g0nP9rFe1Lpkvg4q32zx+JvCzmj0BY8PzP2AA==} 51 | engines: {node: '>=18.0.0'} 52 | 53 | '@jridgewell/sourcemap-codec@1.5.0': 54 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 55 | 56 | '@rollup/rollup-android-arm-eabi@4.21.2': 57 | resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} 58 | cpu: [arm] 59 | os: [android] 60 | 61 | '@rollup/rollup-android-arm64@4.21.2': 62 | resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} 63 | cpu: [arm64] 64 | os: [android] 65 | 66 | '@rollup/rollup-darwin-arm64@4.21.2': 67 | resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} 68 | cpu: [arm64] 69 | os: [darwin] 70 | 71 | '@rollup/rollup-darwin-x64@4.21.2': 72 | resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} 73 | cpu: [x64] 74 | os: [darwin] 75 | 76 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 77 | resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} 78 | cpu: [arm] 79 | os: [linux] 80 | 81 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 82 | resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} 83 | cpu: [arm] 84 | os: [linux] 85 | 86 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 87 | resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} 88 | cpu: [arm64] 89 | os: [linux] 90 | 91 | '@rollup/rollup-linux-arm64-musl@4.21.2': 92 | resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} 93 | cpu: [arm64] 94 | os: [linux] 95 | 96 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 97 | resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} 98 | cpu: [ppc64] 99 | os: [linux] 100 | 101 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 102 | resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} 103 | cpu: [riscv64] 104 | os: [linux] 105 | 106 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 107 | resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} 108 | cpu: [s390x] 109 | os: [linux] 110 | 111 | '@rollup/rollup-linux-x64-gnu@4.21.2': 112 | resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} 113 | cpu: [x64] 114 | os: [linux] 115 | 116 | '@rollup/rollup-linux-x64-musl@4.21.2': 117 | resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} 118 | cpu: [x64] 119 | os: [linux] 120 | 121 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 122 | resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} 123 | cpu: [arm64] 124 | os: [win32] 125 | 126 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 127 | resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} 128 | cpu: [ia32] 129 | os: [win32] 130 | 131 | '@rollup/rollup-win32-x64-msvc@4.21.2': 132 | resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} 133 | cpu: [x64] 134 | os: [win32] 135 | 136 | '@types/estree@1.0.5': 137 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 138 | 139 | '@vue/compiler-core@3.4.38': 140 | resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} 141 | 142 | '@vue/compiler-dom@3.4.38': 143 | resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} 144 | 145 | '@vue/compiler-sfc@3.4.38': 146 | resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} 147 | 148 | '@vue/compiler-ssr@3.4.38': 149 | resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} 150 | 151 | '@vue/reactivity@3.4.38': 152 | resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} 153 | 154 | '@vue/runtime-core@3.4.38': 155 | resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} 156 | 157 | '@vue/runtime-dom@3.4.38': 158 | resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} 159 | 160 | '@vue/server-renderer@3.4.38': 161 | resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==} 162 | peerDependencies: 163 | vue: 3.4.38 164 | 165 | '@vue/shared@3.4.38': 166 | resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} 167 | 168 | acorn@8.12.1: 169 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 170 | engines: {node: '>=0.4.0'} 171 | hasBin: true 172 | 173 | confbox@0.1.7: 174 | resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} 175 | 176 | csstype@3.1.3: 177 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 178 | 179 | dequal@2.0.3: 180 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 181 | engines: {node: '>=6'} 182 | 183 | diff@5.2.0: 184 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 185 | engines: {node: '>=0.3.1'} 186 | 187 | entities@4.5.0: 188 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 189 | engines: {node: '>=0.12'} 190 | 191 | estree-walker@2.0.2: 192 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 193 | 194 | fsevents@2.3.3: 195 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 196 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 197 | os: [darwin] 198 | 199 | happy-dom@15.6.0: 200 | resolution: {integrity: sha512-M2ikOwrC5+KVofexnA0DZbQ0/hSHm2ZFKCmS3Ora11KGNHgHBdlRzZ/dzpDDPxQyqko3yNohFepJclG2T0GeZQ==} 201 | engines: {node: '>=18.0.0'} 202 | 203 | kleur@4.1.5: 204 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 205 | engines: {node: '>=6'} 206 | 207 | magic-string@0.30.11: 208 | resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} 209 | 210 | mlly@1.7.1: 211 | resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} 212 | 213 | mri@1.2.0: 214 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 215 | engines: {node: '>=4'} 216 | 217 | nanoid@3.3.7: 218 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 219 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 220 | hasBin: true 221 | 222 | pathe@1.1.2: 223 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 224 | 225 | picocolors@1.0.1: 226 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 227 | 228 | pkg-types@1.2.0: 229 | resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} 230 | 231 | postcss@8.4.41: 232 | resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} 233 | engines: {node: ^10 || ^12 || >=14} 234 | 235 | rollup@4.21.2: 236 | resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} 237 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 238 | hasBin: true 239 | 240 | sade@1.8.1: 241 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 242 | engines: {node: '>=6'} 243 | 244 | source-map-js@1.2.0: 245 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 246 | engines: {node: '>=0.10.0'} 247 | 248 | to-fast-properties@2.0.0: 249 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 250 | engines: {node: '>=4'} 251 | 252 | ufo@1.5.4: 253 | resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 254 | 255 | uvu@0.5.6: 256 | resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} 257 | engines: {node: '>=8'} 258 | hasBin: true 259 | 260 | vue@3.4.38: 261 | resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==} 262 | peerDependencies: 263 | typescript: '*' 264 | peerDependenciesMeta: 265 | typescript: 266 | optional: true 267 | 268 | webidl-conversions@7.0.0: 269 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 270 | engines: {node: '>=12'} 271 | 272 | whatwg-mimetype@3.0.0: 273 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 274 | engines: {node: '>=12'} 275 | 276 | snapshots: 277 | 278 | '@babel/helper-string-parser@7.24.8': {} 279 | 280 | '@babel/helper-validator-identifier@7.24.7': {} 281 | 282 | '@babel/parser@7.25.6': 283 | dependencies: 284 | '@babel/types': 7.25.6 285 | 286 | '@babel/types@7.25.6': 287 | dependencies: 288 | '@babel/helper-string-parser': 7.24.8 289 | '@babel/helper-validator-identifier': 7.24.7 290 | to-fast-properties: 2.0.0 291 | 292 | '@happy-dom/global-registrator@15.6.0': 293 | dependencies: 294 | happy-dom: 15.6.0 295 | 296 | '@jridgewell/sourcemap-codec@1.5.0': {} 297 | 298 | '@rollup/rollup-android-arm-eabi@4.21.2': 299 | optional: true 300 | 301 | '@rollup/rollup-android-arm64@4.21.2': 302 | optional: true 303 | 304 | '@rollup/rollup-darwin-arm64@4.21.2': 305 | optional: true 306 | 307 | '@rollup/rollup-darwin-x64@4.21.2': 308 | optional: true 309 | 310 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 311 | optional: true 312 | 313 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 314 | optional: true 315 | 316 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 317 | optional: true 318 | 319 | '@rollup/rollup-linux-arm64-musl@4.21.2': 320 | optional: true 321 | 322 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 323 | optional: true 324 | 325 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 326 | optional: true 327 | 328 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 329 | optional: true 330 | 331 | '@rollup/rollup-linux-x64-gnu@4.21.2': 332 | optional: true 333 | 334 | '@rollup/rollup-linux-x64-musl@4.21.2': 335 | optional: true 336 | 337 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 338 | optional: true 339 | 340 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 341 | optional: true 342 | 343 | '@rollup/rollup-win32-x64-msvc@4.21.2': 344 | optional: true 345 | 346 | '@types/estree@1.0.5': {} 347 | 348 | '@vue/compiler-core@3.4.38': 349 | dependencies: 350 | '@babel/parser': 7.25.6 351 | '@vue/shared': 3.4.38 352 | entities: 4.5.0 353 | estree-walker: 2.0.2 354 | source-map-js: 1.2.0 355 | 356 | '@vue/compiler-dom@3.4.38': 357 | dependencies: 358 | '@vue/compiler-core': 3.4.38 359 | '@vue/shared': 3.4.38 360 | 361 | '@vue/compiler-sfc@3.4.38': 362 | dependencies: 363 | '@babel/parser': 7.25.6 364 | '@vue/compiler-core': 3.4.38 365 | '@vue/compiler-dom': 3.4.38 366 | '@vue/compiler-ssr': 3.4.38 367 | '@vue/shared': 3.4.38 368 | estree-walker: 2.0.2 369 | magic-string: 0.30.11 370 | postcss: 8.4.41 371 | source-map-js: 1.2.0 372 | 373 | '@vue/compiler-ssr@3.4.38': 374 | dependencies: 375 | '@vue/compiler-dom': 3.4.38 376 | '@vue/shared': 3.4.38 377 | 378 | '@vue/reactivity@3.4.38': 379 | dependencies: 380 | '@vue/shared': 3.4.38 381 | 382 | '@vue/runtime-core@3.4.38': 383 | dependencies: 384 | '@vue/reactivity': 3.4.38 385 | '@vue/shared': 3.4.38 386 | 387 | '@vue/runtime-dom@3.4.38': 388 | dependencies: 389 | '@vue/reactivity': 3.4.38 390 | '@vue/runtime-core': 3.4.38 391 | '@vue/shared': 3.4.38 392 | csstype: 3.1.3 393 | 394 | '@vue/server-renderer@3.4.38(vue@3.4.38)': 395 | dependencies: 396 | '@vue/compiler-ssr': 3.4.38 397 | '@vue/shared': 3.4.38 398 | vue: 3.4.38 399 | 400 | '@vue/shared@3.4.38': {} 401 | 402 | acorn@8.12.1: {} 403 | 404 | confbox@0.1.7: {} 405 | 406 | csstype@3.1.3: {} 407 | 408 | dequal@2.0.3: {} 409 | 410 | diff@5.2.0: {} 411 | 412 | entities@4.5.0: {} 413 | 414 | estree-walker@2.0.2: {} 415 | 416 | fsevents@2.3.3: 417 | optional: true 418 | 419 | happy-dom@15.6.0: 420 | dependencies: 421 | entities: 4.5.0 422 | webidl-conversions: 7.0.0 423 | whatwg-mimetype: 3.0.0 424 | 425 | kleur@4.1.5: {} 426 | 427 | magic-string@0.30.11: 428 | dependencies: 429 | '@jridgewell/sourcemap-codec': 1.5.0 430 | 431 | mlly@1.7.1: 432 | dependencies: 433 | acorn: 8.12.1 434 | pathe: 1.1.2 435 | pkg-types: 1.2.0 436 | ufo: 1.5.4 437 | 438 | mri@1.2.0: {} 439 | 440 | nanoid@3.3.7: {} 441 | 442 | pathe@1.1.2: {} 443 | 444 | picocolors@1.0.1: {} 445 | 446 | pkg-types@1.2.0: 447 | dependencies: 448 | confbox: 0.1.7 449 | mlly: 1.7.1 450 | pathe: 1.1.2 451 | 452 | postcss@8.4.41: 453 | dependencies: 454 | nanoid: 3.3.7 455 | picocolors: 1.0.1 456 | source-map-js: 1.2.0 457 | 458 | rollup@4.21.2: 459 | dependencies: 460 | '@types/estree': 1.0.5 461 | optionalDependencies: 462 | '@rollup/rollup-android-arm-eabi': 4.21.2 463 | '@rollup/rollup-android-arm64': 4.21.2 464 | '@rollup/rollup-darwin-arm64': 4.21.2 465 | '@rollup/rollup-darwin-x64': 4.21.2 466 | '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 467 | '@rollup/rollup-linux-arm-musleabihf': 4.21.2 468 | '@rollup/rollup-linux-arm64-gnu': 4.21.2 469 | '@rollup/rollup-linux-arm64-musl': 4.21.2 470 | '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 471 | '@rollup/rollup-linux-riscv64-gnu': 4.21.2 472 | '@rollup/rollup-linux-s390x-gnu': 4.21.2 473 | '@rollup/rollup-linux-x64-gnu': 4.21.2 474 | '@rollup/rollup-linux-x64-musl': 4.21.2 475 | '@rollup/rollup-win32-arm64-msvc': 4.21.2 476 | '@rollup/rollup-win32-ia32-msvc': 4.21.2 477 | '@rollup/rollup-win32-x64-msvc': 4.21.2 478 | fsevents: 2.3.3 479 | 480 | sade@1.8.1: 481 | dependencies: 482 | mri: 1.2.0 483 | 484 | source-map-js@1.2.0: {} 485 | 486 | to-fast-properties@2.0.0: {} 487 | 488 | ufo@1.5.4: {} 489 | 490 | uvu@0.5.6: 491 | dependencies: 492 | dequal: 2.0.3 493 | diff: 5.2.0 494 | kleur: 4.1.5 495 | sade: 1.8.1 496 | 497 | vue@3.4.38: 498 | dependencies: 499 | '@vue/compiler-dom': 3.4.38 500 | '@vue/compiler-sfc': 3.4.38 501 | '@vue/runtime-dom': 3.4.38 502 | '@vue/server-renderer': 3.4.38(vue@3.4.38) 503 | '@vue/shared': 3.4.38 504 | 505 | webidl-conversions@7.0.0: {} 506 | 507 | whatwg-mimetype@3.0.0: {} 508 | --------------------------------------------------------------------------------