├── .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 |
--------------------------------------------------------------------------------