├── .gitignore ├── client.js ├── client.d.ts ├── .vscode └── settings.json ├── tsconfig.json ├── package.json ├── LICENSE ├── README.md ├── src ├── index.ts └── client.ts └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | out 3 | -------------------------------------------------------------------------------- /client.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./out/client.js'); 2 | -------------------------------------------------------------------------------- /client.d.ts: -------------------------------------------------------------------------------- 1 | export * from './out/client'; 2 | export { default } from './out/client'; 3 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.format.semicolons": "insert", 3 | "editor.insertSpaces": false, 4 | "editor.detectIndentation": false, 5 | "typescript.tsdk": "node_modules/typescript/lib" 6 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2016", 4 | "module": "commonjs", 5 | "rootDir": "src", 6 | "outDir": "out", 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "strict": true, 10 | "skipLibCheck": true, 11 | "declaration": true, 12 | }, 13 | "include": [ "src/**/*" ], 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-plugin-vue-jump", 3 | "version": "0.0.3", 4 | "license": "MIT", 5 | "files": [ 6 | "out", 7 | "client.js", 8 | "client.d.ts" 9 | ], 10 | "main": "out/index.js", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/johnsoncodehk/vite-plugin-vue-jump.git" 14 | }, 15 | "scripts": { 16 | "prepublishOnly": "tsc" 17 | }, 18 | "dependencies": { 19 | "vue-demi": "^0.13.11" 20 | }, 21 | "peerDependencies": { 22 | "vue": "^2.0.0 || >=3.0.0" 23 | }, 24 | "devDependencies": { 25 | "@types/node": "latest", 26 | "@vitejs/plugin-vue": "latest", 27 | "typescript": "latest", 28 | "vue": "latest" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023-present Johnson Chu 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 | # vite-plugin-vue-jump 2 | 3 | This plugin creates for support jump to source code of the specific element from your web page. 4 | 5 | ⚠️ Since this plugin will add `pointerenter` and `pointerleave` events for all elements, you should not use this plugin in production, but just for debugging. 6 | 7 | Try it: https://volarjs.github.io/ 8 | 9 | ## Install 10 | 11 | main.ts: 12 | 13 | ```ts 14 | import jumpPlugin from 'vite-plugin-vue-jump/client'; 15 | 16 | // ... 17 | 18 | app.use(jumpPlugin); 19 | ``` 20 | 21 | Vite config: 22 | 23 | ```ts 24 | import { createVuePluginOptions, searchPackageJson } from 'vite-plugin-vue-jump'; 25 | import vue from '@vitejs/plugin-vue'; 26 | 27 | export default { 28 | plugins: [vue(createVuePluginOptions( 29 | // base config 30 | { reactivityTransform: true }, 31 | // resolve url for dependencies 32 | (filePath) => { 33 | const info = searchPackageJson(filePath); 34 | if (info.packageJson.name === '@vue/theme') { 35 | return 'https://github.com/vuejs/theme/tree/main/' + info.fileRelativePath; 36 | } 37 | else if (info.packageJson.name === '@volar/docs') { 38 | return 'https://github.com/volarjs/volarjs.github.io/blob/master/' + info.fileRelativePath; 39 | } 40 | }, 41 | ))] 42 | }; 43 | ``` 44 | 45 | ## Usage 46 | 47 | Hover any element on your page and press `Alt` + left click to jump. 48 | 49 | ## Sponsors 50 | 51 |

52 | 53 | 54 | 55 |

56 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Options } from '@vitejs/plugin-vue'; 2 | 3 | export function createVuePluginOptions( 4 | baseOptions: Options = {}, 5 | resolveUrl: (path: string) => string | undefined, 6 | rootPath = process.cwd() 7 | ): Options { 8 | 9 | let compiler = baseOptions.compiler; 10 | let current: { 11 | filename: string; 12 | line: number; 13 | } | undefined; 14 | 15 | const resolveCache = new Map(); 16 | 17 | if (!baseOptions.compiler) { 18 | const vuePath = require.resolve('vue', { paths: [rootPath] }); 19 | const compilerPath = require.resolve('@vue/compiler-sfc', { paths: [require('path').dirname(vuePath)] }); 20 | compiler = require(compilerPath); 21 | baseOptions.compiler = { ...compiler! }; 22 | } 23 | baseOptions.compiler.parse = (...args) => { 24 | const res = compiler!.parse(...args); 25 | if (res.descriptor.template && args[1]?.filename?.endsWith('.vue')) { 26 | current = { 27 | filename: args[1].filename, 28 | line: res.descriptor.template.loc.start.line, 29 | }; 30 | } 31 | else { 32 | current = undefined; 33 | } 34 | return res; 35 | }; 36 | 37 | baseOptions.template ??= {}; 38 | baseOptions.template.compilerOptions ??= {}; 39 | baseOptions.template.compilerOptions.nodeTransforms ??= []; 40 | baseOptions.template.compilerOptions.nodeTransforms.push( 41 | (node) => { 42 | if (node.type === 1 && current) { 43 | if (!resolveCache.has(current.filename)) { 44 | resolveCache.set(current.filename, resolveUrl(current.filename)) 45 | } 46 | const url = resolveCache.get(current.filename); 47 | if (url) { 48 | const start = node.loc.start.line + current.line - 1; 49 | const end = node.loc.end.line + current.line - 1; 50 | addEvent(node, 'pointerenter', `$event && $__jumpToCode ? $__jumpToCode.highlight($event.target, ${JSON.stringify(url)}, [${start},${end}]) : undefined`); 51 | addEvent(node, 'pointerleave', '$event && $__jumpToCode ? $__jumpToCode.unHighlight($event.target) : undefined'); 52 | } 53 | } 54 | }, 55 | ); 56 | 57 | return baseOptions; 58 | 59 | function addEvent(node: any, name: string, exp: string) { 60 | node.props.push({ 61 | type: 7, 62 | name: 'on', 63 | exp: { 64 | type: 4, 65 | content: exp, 66 | isStatic: false, 67 | constType: 0, 68 | loc: node.loc, 69 | }, 70 | arg: { 71 | type: 4, 72 | content: name, 73 | isStatic: true, 74 | constType: 3, 75 | loc: node.loc, 76 | }, 77 | modifiers: [], 78 | loc: node.loc, 79 | }); 80 | } 81 | } 82 | 83 | export function searchPackageJson(filePath: string) { 84 | 85 | const path = require('path'); 86 | 87 | let dir = path.dirname(filePath); 88 | 89 | while (true) { 90 | try { 91 | const pkg = require(require.resolve('./package.json', { paths: [dir] })); 92 | if (pkg) { 93 | return { 94 | packageJson: pkg, 95 | fileRelativePath: path.relative(dir, filePath), 96 | }; 97 | } 98 | } catch { } 99 | const next = path.dirname(dir); 100 | if (!next || next === dir) { 101 | break; 102 | } 103 | dir = next; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/client.ts: -------------------------------------------------------------------------------- 1 | import { Vue2, isVue3, type App } from 'vue-demi'; 2 | 3 | export default function install(app: typeof Vue2 | App, options?: { 4 | overlayStyle?: CSSStyleDeclaration, 5 | hotKey?: string, 6 | }) { 7 | 8 | if (!globalThis.window) 9 | return; 10 | 11 | const hotKey = () => options?.hotKey ?? 'Alt'; 12 | const overlay = createOverlay(); 13 | const clickMask = createClickMask(); 14 | 15 | window.addEventListener('scroll', updateOverlay); 16 | window.addEventListener('pointerdown', event => { 17 | disable(true); 18 | }); 19 | window.addEventListener('keydown', event => { 20 | if (event.key === hotKey()) { 21 | enable(); 22 | } 23 | }); 24 | window.addEventListener('keyup', event => { 25 | if (event.key === hotKey()) { 26 | disable(false); 27 | } 28 | }); 29 | 30 | let highlightNodes: [Element, string, [number, number]][] = []; 31 | let enabled = false; 32 | let jumpData: { 33 | url: string; 34 | range: [number, number]; 35 | } | undefined; 36 | 37 | if (isVue3) { 38 | (app as App).config.globalProperties.$__jumpToCode = { 39 | highlight, 40 | unHighlight, 41 | }; 42 | } else { 43 | app.prototype.$__jumpToCode = { 44 | highlight, 45 | unHighlight, 46 | }; 47 | } 48 | 49 | function enable() { 50 | enabled = true; 51 | clickMask.style.pointerEvents = 'none'; 52 | document.body.appendChild(clickMask); 53 | updateOverlay(); 54 | } 55 | function disable(jump: boolean) { 56 | if (enabled) { 57 | enabled = false; 58 | clickMask.style.pointerEvents = ''; 59 | highlightNodes = []; 60 | updateOverlay(); 61 | if (jumpData) { 62 | if (jump) { 63 | const line = jumpData.range[0] === jumpData.range[1] ? `#L${jumpData.range[0]}` : `#L${jumpData.range[0]}-L${jumpData.range[1]}`; 64 | window.open(jumpData.url + line, '_blank'); 65 | } 66 | jumpData = undefined; 67 | } 68 | } 69 | } 70 | function highlight(node: unknown, fileName: string, range: [number, number]) { 71 | if (node instanceof Element) { 72 | highlightNodes.push([node, fileName, range]); 73 | } 74 | updateOverlay(); 75 | } 76 | function unHighlight(node: Element) { 77 | highlightNodes = highlightNodes.filter(hNode => hNode[0] !== node); 78 | updateOverlay(); 79 | } 80 | function createOverlay() { 81 | const overlay = document.createElement('div'); 82 | if (options?.overlayStyle) { 83 | Object.assign(overlay.style, options.overlayStyle); 84 | } 85 | else { 86 | overlay.style.backgroundColor = 'rgba(65, 184, 131, 0.35)'; 87 | overlay.style.borderRadius = '3px'; 88 | } 89 | overlay.style.position = 'fixed'; 90 | overlay.style.zIndex = '99999999999999'; 91 | overlay.style.pointerEvents = 'none'; 92 | overlay.style.display = 'flex'; 93 | overlay.style.alignItems = 'center'; 94 | overlay.style.justifyContent = 'center'; 95 | return overlay; 96 | } 97 | function createClickMask() { 98 | const overlay = document.createElement('div'); 99 | overlay.style.position = 'fixed'; 100 | overlay.style.zIndex = '99999999999999'; 101 | overlay.style.pointerEvents = 'none'; 102 | overlay.style.display = 'flex'; 103 | overlay.style.left = '0'; 104 | overlay.style.right = '0'; 105 | overlay.style.top = '0'; 106 | overlay.style.bottom = '0'; 107 | overlay.addEventListener('pointerup', () => { 108 | if (overlay.parentNode) { 109 | overlay.parentNode?.removeChild(overlay); 110 | } 111 | }); 112 | return overlay; 113 | } 114 | function updateOverlay() { 115 | if (enabled && highlightNodes.length) { 116 | document.body.appendChild(overlay); 117 | const highlight = highlightNodes[highlightNodes.length - 1]; 118 | const highlightNode = highlight[0]; 119 | const rect = highlightNode.getBoundingClientRect(); 120 | overlay.style.width = ~~rect.width + 'px'; 121 | overlay.style.height = ~~rect.height + 'px'; 122 | overlay.style.top = ~~rect.top + 'px'; 123 | overlay.style.left = ~~rect.left + 'px'; 124 | jumpData = { 125 | url: highlight[1], 126 | range: highlight[2], 127 | }; 128 | } 129 | else if (overlay.parentNode) { 130 | overlay.parentNode.removeChild(overlay); 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/node': latest 5 | '@vitejs/plugin-vue': latest 6 | typescript: latest 7 | vue: latest 8 | vue-demi: ^0.13.11 9 | 10 | dependencies: 11 | vue-demi: 0.13.11_vue@3.2.47 12 | 13 | devDependencies: 14 | '@types/node': 18.11.18 15 | '@vitejs/plugin-vue': 4.0.0_vue@3.2.47 16 | typescript: 4.9.5 17 | vue: 3.2.47 18 | 19 | packages: 20 | 21 | /@babel/helper-string-parser/7.19.4: 22 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 23 | engines: {node: '>=6.9.0'} 24 | 25 | /@babel/helper-validator-identifier/7.19.1: 26 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 27 | engines: {node: '>=6.9.0'} 28 | 29 | /@babel/parser/7.20.13: 30 | resolution: {integrity: sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==} 31 | engines: {node: '>=6.0.0'} 32 | hasBin: true 33 | dependencies: 34 | '@babel/types': 7.20.7 35 | 36 | /@babel/types/7.20.7: 37 | resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} 38 | engines: {node: '>=6.9.0'} 39 | dependencies: 40 | '@babel/helper-string-parser': 7.19.4 41 | '@babel/helper-validator-identifier': 7.19.1 42 | to-fast-properties: 2.0.0 43 | 44 | /@types/node/18.11.18: 45 | resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} 46 | dev: true 47 | 48 | /@vitejs/plugin-vue/4.0.0_vue@3.2.47: 49 | resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} 50 | engines: {node: ^14.18.0 || >=16.0.0} 51 | peerDependencies: 52 | vite: ^4.0.0 53 | vue: ^3.2.25 54 | dependencies: 55 | vue: 3.2.47 56 | dev: true 57 | 58 | /@vue/compiler-core/3.2.47: 59 | resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} 60 | dependencies: 61 | '@babel/parser': 7.20.13 62 | '@vue/shared': 3.2.47 63 | estree-walker: 2.0.2 64 | source-map: 0.6.1 65 | 66 | /@vue/compiler-dom/3.2.47: 67 | resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} 68 | dependencies: 69 | '@vue/compiler-core': 3.2.47 70 | '@vue/shared': 3.2.47 71 | 72 | /@vue/compiler-sfc/3.2.47: 73 | resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} 74 | dependencies: 75 | '@babel/parser': 7.20.13 76 | '@vue/compiler-core': 3.2.47 77 | '@vue/compiler-dom': 3.2.47 78 | '@vue/compiler-ssr': 3.2.47 79 | '@vue/reactivity-transform': 3.2.47 80 | '@vue/shared': 3.2.47 81 | estree-walker: 2.0.2 82 | magic-string: 0.25.9 83 | postcss: 8.4.20 84 | source-map: 0.6.1 85 | 86 | /@vue/compiler-ssr/3.2.47: 87 | resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} 88 | dependencies: 89 | '@vue/compiler-dom': 3.2.47 90 | '@vue/shared': 3.2.47 91 | 92 | /@vue/reactivity-transform/3.2.47: 93 | resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} 94 | dependencies: 95 | '@babel/parser': 7.20.13 96 | '@vue/compiler-core': 3.2.47 97 | '@vue/shared': 3.2.47 98 | estree-walker: 2.0.2 99 | magic-string: 0.25.9 100 | 101 | /@vue/reactivity/3.2.47: 102 | resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} 103 | dependencies: 104 | '@vue/shared': 3.2.47 105 | 106 | /@vue/runtime-core/3.2.47: 107 | resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} 108 | dependencies: 109 | '@vue/reactivity': 3.2.47 110 | '@vue/shared': 3.2.47 111 | 112 | /@vue/runtime-dom/3.2.47: 113 | resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} 114 | dependencies: 115 | '@vue/runtime-core': 3.2.47 116 | '@vue/shared': 3.2.47 117 | csstype: 2.6.21 118 | 119 | /@vue/server-renderer/3.2.47_vue@3.2.47: 120 | resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} 121 | peerDependencies: 122 | vue: 3.2.47 123 | dependencies: 124 | '@vue/compiler-ssr': 3.2.47 125 | '@vue/shared': 3.2.47 126 | vue: 3.2.47 127 | 128 | /@vue/shared/3.2.47: 129 | resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} 130 | 131 | /csstype/2.6.21: 132 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} 133 | 134 | /estree-walker/2.0.2: 135 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 136 | 137 | /magic-string/0.25.9: 138 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 139 | dependencies: 140 | sourcemap-codec: 1.4.8 141 | 142 | /nanoid/3.3.4: 143 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 144 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 145 | hasBin: true 146 | 147 | /picocolors/1.0.0: 148 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 149 | 150 | /postcss/8.4.20: 151 | resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} 152 | engines: {node: ^10 || ^12 || >=14} 153 | dependencies: 154 | nanoid: 3.3.4 155 | picocolors: 1.0.0 156 | source-map-js: 1.0.2 157 | 158 | /source-map-js/1.0.2: 159 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 160 | engines: {node: '>=0.10.0'} 161 | 162 | /source-map/0.6.1: 163 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 164 | engines: {node: '>=0.10.0'} 165 | 166 | /sourcemap-codec/1.4.8: 167 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 168 | deprecated: Please use @jridgewell/sourcemap-codec instead 169 | 170 | /to-fast-properties/2.0.0: 171 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 172 | engines: {node: '>=4'} 173 | 174 | /typescript/4.9.5: 175 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 176 | engines: {node: '>=4.2.0'} 177 | hasBin: true 178 | dev: true 179 | 180 | /vue-demi/0.13.11_vue@3.2.47: 181 | resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} 182 | engines: {node: '>=12'} 183 | hasBin: true 184 | requiresBuild: true 185 | peerDependencies: 186 | '@vue/composition-api': ^1.0.0-rc.1 187 | vue: ^3.0.0-0 || ^2.6.0 188 | peerDependenciesMeta: 189 | '@vue/composition-api': 190 | optional: true 191 | dependencies: 192 | vue: 3.2.47 193 | dev: false 194 | 195 | /vue/3.2.47: 196 | resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} 197 | dependencies: 198 | '@vue/compiler-dom': 3.2.47 199 | '@vue/compiler-sfc': 3.2.47 200 | '@vue/runtime-dom': 3.2.47 201 | '@vue/server-renderer': 3.2.47_vue@3.2.47 202 | '@vue/shared': 3.2.47 203 | --------------------------------------------------------------------------------