├── .nvmrc ├── .husky └── pre-commit ├── .gitignore ├── .prettierignore ├── src ├── plugins │ ├── index.ts │ ├── enablePiniaDevtools.ts │ └── vendors │ │ └── pinia.js ├── icons │ ├── 128.png │ ├── 16.png │ ├── 32.png │ ├── 48.png │ ├── icon.png │ ├── 128-gray.png │ ├── 16-gray.png │ ├── 32-gray.png │ └── 48-gray.png ├── global.d.ts ├── popups │ ├── not-found.html │ ├── enabled.html │ ├── disabled.html │ └── popup.css ├── utils │ ├── index.ts │ └── console.ts ├── detector.ts ├── background.ts ├── types │ └── message.ts ├── manifest.json ├── detectorExec.ts └── crack.ts ├── .prettierrc ├── docs ├── screenshot-vue2.png └── screenshot-vue3.png ├── tsconfig.json ├── .editorconfig ├── CHANGELOG.md ├── README.md ├── scripts └── build-zip.js ├── package.json ├── LICENSE ├── rollup.config.mjs └── yarn.lock /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npx pretty-quick --staged 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | dist-zip 4 | yarn-error.log 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore artifacts: 2 | *.md 3 | src/plugins/vendors/pinia.js 4 | -------------------------------------------------------------------------------- /src/plugins/index.ts: -------------------------------------------------------------------------------- 1 | export { enablePiniaDevtools } from './enablePiniaDevtools'; 2 | -------------------------------------------------------------------------------- /src/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/128.png -------------------------------------------------------------------------------- /src/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/16.png -------------------------------------------------------------------------------- /src/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/32.png -------------------------------------------------------------------------------- /src/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/48.png -------------------------------------------------------------------------------- /src/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/icon.png -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "printWidth": 80, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /src/icons/128-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/128-gray.png -------------------------------------------------------------------------------- /src/icons/16-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/16-gray.png -------------------------------------------------------------------------------- /src/icons/32-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/32-gray.png -------------------------------------------------------------------------------- /src/icons/48-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/src/icons/48-gray.png -------------------------------------------------------------------------------- /docs/screenshot-vue2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/docs/screenshot-vue2.png -------------------------------------------------------------------------------- /docs/screenshot-vue3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzmming/vue-force-dev/HEAD/docs/screenshot-vue3.png -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | interface Window { 2 | $nuxt: any; 3 | __VUE__: any; 4 | __VUE_DEVTOOLS_GLOBAL_HOOK__: any; 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext" 4 | }, 5 | "exclude": ["src/pinia/**/*"] 6 | } 7 | -------------------------------------------------------------------------------- /src/popups/not-found.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Vue.js not detected 6 |

7 | -------------------------------------------------------------------------------- /src/popups/enabled.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Vue.js is detected on this page.
6 | Open DevTools and look for the Vue panel. 7 |

8 | -------------------------------------------------------------------------------- /src/popups/disabled.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Vue.js is detected on this page.
6 | Devtools inspection is not available because it's in production mode or 7 | explicitly disabled by the author. 8 |

9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | # 文档编码格式 5 | charset = utf-8 6 | # 换行符的使用形式(主要是解决window 和 mac或unix 的不同) 7 | end_of_line = lf 8 | # 缩进的大小 9 | indent_size = 2 10 | # 缩进的方式 11 | indent_style = space 12 | # 文档是否需要以换行结尾(/n) 13 | insert_final_newline = true 14 | # 文件结尾是否允许空格 15 | trim_trailing_whitespace = true 16 | 17 | # 对后缀名为 md 的文件生效 18 | [*.md] 19 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /src/popups/popup.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Roboto, Avenir, Helvetica, Arial, sans-serif; 3 | font-size: 14px; 4 | font-weight: 400; 5 | line-height: 1.4; 6 | padding: 10px 12px 12px 12px; 7 | color: #2c3e50; 8 | } 9 | 10 | body, 11 | p { 12 | margin: 0; 13 | } 14 | 15 | p { 16 | min-width: 200px; 17 | max-width: 300px; 18 | } 19 | 20 | .short-paragraph { 21 | min-width: initial; 22 | white-space: nowrap; 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | VUE_DEVTOOLS_MESSAGE_KEY, 3 | LEGACY_VUE_DEVTOOLS_MESSAGE_KEY, 4 | VueDevtoolsMessage, 5 | LegacyVueDevtoolsMessage, 6 | VueDevtoolsMessageDetail, 7 | } from '../types/message'; 8 | 9 | export const unpackVueDevtoolsMessage = ( 10 | data: VueDevtoolsMessage | LegacyVueDevtoolsMessage, 11 | ): VueDevtoolsMessageDetail => 12 | VUE_DEVTOOLS_MESSAGE_KEY === data.key 13 | ? data.data 14 | : LEGACY_VUE_DEVTOOLS_MESSAGE_KEY === data.key 15 | ? data.message 16 | : data; 17 | -------------------------------------------------------------------------------- /src/plugins/enablePiniaDevtools.ts: -------------------------------------------------------------------------------- 1 | import { devtoolsPlugin, registerPiniaDevtools } from './vendors/pinia'; 2 | 3 | export const enablePiniaDevtools = (vueRootInstance, vueVersion) => { 4 | if (vueVersion === 2) { 5 | // There are no plans to support the Vue2 version of Pinia. If needed, please submit an issue and let me know 6 | return; 7 | } 8 | 9 | const pinia = vueRootInstance.config.globalProperties.$pinia; 10 | if (!pinia) return; 11 | pinia.use(devtoolsPlugin); 12 | registerPiniaDevtools(vueRootInstance, pinia); 13 | }; 14 | -------------------------------------------------------------------------------- /src/detector.ts: -------------------------------------------------------------------------------- 1 | import { unpackVueDevtoolsMessage } from './utils/index'; 2 | 3 | // Light up my extension icon 4 | window.addEventListener('message', (e) => { 5 | const data = unpackVueDevtoolsMessage(e.data); 6 | if (e.source === window && data.vueDetected) { 7 | chrome.runtime.sendMessage(data); 8 | } 9 | }); 10 | 11 | const script = document.createElement('script'); 12 | script.src = chrome.runtime.getURL('detectorExec.js'); 13 | script.onload = () => { 14 | script.remove(); 15 | }; 16 | (document.head || document.documentElement).appendChild(script); 17 | -------------------------------------------------------------------------------- /src/background.ts: -------------------------------------------------------------------------------- 1 | import type { VueDevtoolsMessageDetail } from './types/message'; 2 | 3 | chrome.runtime.onMessage.addListener( 4 | (req: VueDevtoolsMessageDetail, sender) => { 5 | if (sender.tab && req.vueDetected) { 6 | chrome.action.setIcon({ 7 | tabId: sender.tab.id, 8 | path: { 9 | 16: `icons/16.png`, 10 | 48: `icons/48.png`, 11 | 128: `icons/128.png`, 12 | }, 13 | }); 14 | chrome.action.setPopup({ 15 | tabId: sender.tab.id, 16 | popup: `popups/enabled.html`, 17 | }); 18 | } 19 | }, 20 | ); 21 | -------------------------------------------------------------------------------- /src/utils/console.ts: -------------------------------------------------------------------------------- 1 | const COLOR = { 2 | log: '#1475b2', 3 | info: '#606060', 4 | error: '#42b883', 5 | }; 6 | const message = ({ type, params }) => { 7 | const LOG_MARK = [ 8 | '%c vue-force-dev', 9 | `padding: 1px; border-radius: 0 3px 3px 0; color: #fff; background:${COLOR[type]}`, 10 | ]; 11 | console[type]( 12 | ...LOG_MARK, 13 | ...params, 14 | '\n\nreport issues: https://github.com/hzmming/vue-force-dev/issues', 15 | ); 16 | }; 17 | 18 | export function error(...params) { 19 | message({ type: 'error', params }); 20 | } 21 | 22 | export function log(...params) { 23 | message({ type: 'log', params }); 24 | } 25 | 26 | export function info(...params) { 27 | message({ type: 'info', params }); 28 | } 29 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 2.1.1 (2024-12-08) 2 | 3 | - fix: remove redundant and incomplete judgments 4 | 5 | 6 | 7 | ## 2.1.0 (2024-11-17) 8 | 9 | - feat: support Vue.js devtools 7.6.4 10 | 11 | 12 | 13 | ## 2.0.0 (2024-04-05) 14 | 15 | - feat: migrate to manifest v3 and support Pinia 16 | 17 | 18 | 19 | ## 1.4.0 (2024-03-03) 20 | 21 | - feat: pass the correct symbol value 22 | 23 | 24 | 25 | ## 1.3.0 (2024-03-01) 26 | 27 | - feat: support Vue Devtools v6.6.1 28 | 29 | 30 | 31 | ## 1.2.0 (2023-11-12) 32 | 33 | - feat: Update detector to repeat detections 34 | 35 | 36 | 37 | ## 1.1.0 (2022-10-12) 38 | 39 | - feat: improve the console log 40 | - fix: Vue may not be finished yet (#7) 41 | 42 | 43 | 44 | ## 1.0.0 (2022-10-03) 45 | 46 | - feat: refactor and support vue3 47 | 48 | 49 | 50 | ## 0.1.0 (2020-09-01) 51 | 52 | - feat: support vue2 53 | -------------------------------------------------------------------------------- /src/types/message.ts: -------------------------------------------------------------------------------- 1 | export const VUE_DEVTOOLS_MESSAGE_KEY = '__VUE_DEVTOOLS_VUE_DETECTED_EVENT__'; 2 | 3 | export interface VueDevtoolsMessageDetail { 4 | devtoolsEnabled: boolean; 5 | vueDetected: boolean; 6 | nuxtDetected: boolean; 7 | vue2Detected: boolean; 8 | vitePressDetected: boolean; 9 | vitePluginDetected: boolean; 10 | vitePluginClientUrl: string; 11 | } 12 | 13 | export interface VueDevtoolsMessage { 14 | key: typeof VUE_DEVTOOLS_MESSAGE_KEY; 15 | data: VueDevtoolsMessageDetail; 16 | } 17 | 18 | // The key used by devtools v6 will be removed in the future 19 | export const LEGACY_VUE_DEVTOOLS_MESSAGE_KEY = '_vue-devtools-send-message'; 20 | 21 | // The message structure used by devtools v6 will be removed in the future 22 | export interface LegacyVueDevtoolsMessage { 23 | key: typeof LEGACY_VUE_DEVTOOLS_MESSAGE_KEY; 24 | message: VueDevtoolsMessageDetail; 25 | } 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue force dev 2 | 3 | [TOC] 4 | 5 | A tool forces Vue to run in development. 6 | 7 | Easy to debug online Vue code. 8 | 9 | ## Install 10 | 11 | [Chrome](https://chrome.google.com/webstore/detail/oohfffedbkbjnbpbbedapppafmlnccmb/reviews) 12 | 13 | [Firefox](https://addons.mozilla.org/en-US/firefox/addon/vue-force-dev/) 14 | 15 | ## Screenshot 16 | 17 | ![](./docs/screenshot-vue3.png) 18 | 19 | ![](./docs/screenshot-vue2.png) 20 | 21 | ## FAQ 22 | 23 | ### How to update Pinia 24 | 25 | 1. Open this website: https://cdn.jsdelivr.net/npm/pinia/dist/pinia.mjs 26 | 27 | 2. Copy it's content to `src/plugins/vendors/pinia.js` 28 | 29 | 3. Modify the code as follows 30 | 31 | ```diff 32 | - function devtoolsPlugin({ app, store, options }) { 33 | + export function devtoolsPlugin({ app, store, options }) { 34 | ``` 35 | 36 | ```diff 37 | - function registerPiniaDevtools(app, pinia) { 38 | + export function registerPiniaDevtools(app, pinia) { 39 | ``` 40 | 41 | 42 | -------------------------------------------------------------------------------- /scripts/build-zip.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs-extra'); 2 | const path = require('path'); 3 | const archiver = require('archiver'); 4 | 5 | const cwd = process.cwd(); 6 | function resolve(...dir) { 7 | return path.join(cwd, ...dir); 8 | } 9 | 10 | const DEST_ZIP_DIR = resolve('./dist-zip'); 11 | 12 | const hyphenate = (str) => { 13 | return str.split(' ').reduce((i, j) => { 14 | i = i ? i + '-' : i; 15 | return i + j.toLowerCase(); 16 | }, ''); 17 | }; 18 | 19 | function main() { 20 | const { name, version } = require('../dist/manifest.json'); 21 | const zipFilename = `${hyphenate(name)}-v${version}.zip`; 22 | 23 | fs.emptyDirSync(DEST_ZIP_DIR); 24 | 25 | console.info(`Building ${zipFilename}...`); 26 | const archive = archiver('zip', { zlib: { level: 9 } }); 27 | const stream = fs.createWriteStream(path.join(DEST_ZIP_DIR, zipFilename)); 28 | 29 | archive.directory('dist', false).pipe(stream); 30 | 31 | archive.finalize(); 32 | } 33 | 34 | main(); 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "version": "2.1.1", 4 | "scripts": { 5 | "dev": "rollup -c -w", 6 | "build": "rollup -c", 7 | "zip": "yarn build && node scripts/build-zip.js", 8 | "prepare": "husky" 9 | }, 10 | "engines": { 11 | "node": "20" 12 | }, 13 | "keywords": [], 14 | "author": "LoryHuang", 15 | "license": "MIT", 16 | "devDependencies": { 17 | "@rollup/plugin-node-resolve": "^15.2.3", 18 | "@rollup/plugin-replace": "^5.0.5", 19 | "@rollup/plugin-typescript": "^11.1.6", 20 | "@types/chrome": "^0.0.197", 21 | "archiver": "^5.3.0", 22 | "eslint": "^8.24.0", 23 | "fs-extra": "^10.0.0", 24 | "husky": "^9.0.11", 25 | "prettier": "^3.2.5", 26 | "pretty-quick": "^4.0.0", 27 | "rollup": "^4.13.0", 28 | "rollup-plugin-copy": "^3.5.0", 29 | "tslib": "^2.6.2", 30 | "typescript": "^5.4.3" 31 | }, 32 | "dependencies": { 33 | "@vue/composition-api": "^1.7.2", 34 | "@vue/devtools-api": "^6.6.1", 35 | "vue": "^3.4.21", 36 | "vue-demi": "^0.14.7" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Vue force dev", 3 | "description": "A tool forces vue to run in development", 4 | "version": "__PACKAGE_JSON_VERSION__", 5 | "manifest_version": 3, 6 | "action": { 7 | "default_popup": "popups/not-found.html", 8 | "default_title": "Vue force dev", 9 | "default_icon": { 10 | "16": "icons/16-gray.png", 11 | "48": "icons/48-gray.png", 12 | "128": "icons/128-gray.png" 13 | } 14 | }, 15 | "web_accessible_resources": [ 16 | { 17 | "resources": ["detectorExec.js"], 18 | "matches": [""], 19 | "extension_ids": [] 20 | } 21 | ], 22 | "icons": { 23 | "16": "icons/16.png", 24 | "48": "icons/48.png", 25 | "128": "icons/128.png" 26 | }, 27 | "background": { 28 | "service_worker": "background.js", 29 | "scripts": ["background.js"] 30 | }, 31 | "host_permissions": [""], 32 | "content_scripts": [ 33 | { 34 | "matches": [""], 35 | "js": ["detector.js"], 36 | "run_at": "document_start" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 Lory Huang 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. -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 3 | import replace from '@rollup/plugin-replace'; 4 | import copy from 'rollup-plugin-copy'; 5 | import { createRequire } from 'module'; 6 | 7 | const require = createRequire(import.meta.url); 8 | 9 | const pkg = require('./package.json'); 10 | 11 | const DIST_PATH = 'dist'; 12 | 13 | export default [ 14 | { 15 | input: 'src/detector.ts', 16 | output: { 17 | dir: DIST_PATH, 18 | }, 19 | plugins: [typescript(), nodeResolve()], 20 | }, 21 | { 22 | input: 'src/detectorExec.ts', 23 | output: { 24 | dir: DIST_PATH, 25 | format: 'iife', 26 | }, 27 | plugins: [ 28 | typescript(), 29 | nodeResolve(), 30 | replace({ 31 | 'process.env.NODE_ENV': JSON.stringify('production'), 32 | preventAssignment: true, 33 | }), 34 | ], 35 | }, 36 | { 37 | input: ['src/background.ts'], 38 | output: { 39 | dir: DIST_PATH, 40 | }, 41 | plugins: [ 42 | typescript(), 43 | nodeResolve(), 44 | copy({ 45 | targets: [ 46 | { 47 | src: 'src/popups', 48 | dest: DIST_PATH, 49 | }, 50 | { 51 | src: 'src/icons', 52 | dest: DIST_PATH, 53 | }, 54 | { 55 | src: 'src/manifest.json', 56 | dest: DIST_PATH, 57 | transform: (contents) => 58 | contents 59 | .toString() 60 | .replace('__PACKAGE_JSON_VERSION__', pkg.version), 61 | }, 62 | ], 63 | }), 64 | ], 65 | }, 66 | ]; 67 | -------------------------------------------------------------------------------- /src/detectorExec.ts: -------------------------------------------------------------------------------- 1 | import { error } from './utils/console'; 2 | import type { 3 | VueDevtoolsMessage, 4 | LegacyVueDevtoolsMessage, 5 | VueDevtoolsMessageDetail, 6 | } from './types/message'; 7 | import { unpackVueDevtoolsMessage } from './utils/index'; 8 | import { crack } from './crack'; 9 | 10 | // Receive the message of vue devtools, crack and replay it. 11 | function listenVueDevtoolsMessage() { 12 | const messageHandler = ( 13 | e: MessageEvent, 14 | ) => { 15 | try { 16 | if (!window.__VUE_DEVTOOLS_GLOBAL_HOOK__) return; 17 | 18 | const data: VueDevtoolsMessageDetail = unpackVueDevtoolsMessage(e.data); 19 | if (e.source === window && data.vueDetected) { 20 | // skip 21 | if (data.devtoolsEnabled) { 22 | window.removeEventListener('message', messageHandler); 23 | return; 24 | } 25 | 26 | detect(e); 27 | } 28 | } catch (e) { 29 | error(e); 30 | window.removeEventListener('message', messageHandler); 31 | } 32 | }; 33 | 34 | window.addEventListener('message', messageHandler); 35 | } 36 | 37 | function detect( 38 | e: MessageEvent, 39 | ) { 40 | const data = unpackVueDevtoolsMessage(e.data); 41 | let delay = 1000; 42 | let detectRemainingTries = 10; 43 | 44 | function executeDetection() { 45 | // force devtools to be enabled 46 | if (crack(data)) { 47 | // replay 48 | window.postMessage(e.data, '*'); 49 | return; 50 | } 51 | 52 | if (detectRemainingTries > 0) { 53 | detectRemainingTries--; 54 | setTimeout(() => { 55 | executeDetection(); 56 | }, delay); 57 | delay *= 5; 58 | } 59 | } 60 | 61 | setTimeout(() => { 62 | executeDetection(); 63 | }, 100); 64 | } 65 | 66 | // inject the hook 67 | if (document instanceof Document) { 68 | listenVueDevtoolsMessage(); 69 | } 70 | -------------------------------------------------------------------------------- /src/crack.ts: -------------------------------------------------------------------------------- 1 | import { error } from './utils/console'; 2 | import { enablePiniaDevtools } from './plugins/index'; 3 | import type { VueDevtoolsMessageDetail } from './types/message'; 4 | 5 | export function crack(data: VueDevtoolsMessageDetail) { 6 | let result; 7 | 8 | if (window.__VUE__) { 9 | result = crackVue3(); 10 | } 11 | // Vue 2 12 | else { 13 | result = crackVue2(); 14 | } 15 | 16 | if (result) data.devtoolsEnabled = true; 17 | 18 | return result; 19 | } 20 | 21 | function crackVue2(Vue?) { 22 | if (!Vue) { 23 | const app = getVueRootInstance(2); 24 | if (!app) return false; // Vue may not be finished yet 25 | Vue = Object.getPrototypeOf(app).constructor; 26 | while (Vue.super) { 27 | Vue = Vue.super; 28 | } 29 | } 30 | 31 | const devtools = window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 32 | Vue.config.devtools = true; 33 | devtools.emit('init', Vue); 34 | 35 | return true; 36 | } 37 | 38 | function crackVue3() { 39 | const app = getVueRootInstance(3); 40 | if (!app) return false; // Vue may not be finished yet 41 | const devtools = window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 42 | devtools.enabled = true; 43 | const version = app.version; 44 | devtools.emit('app:init' /* APP_INIT */, app, version, { 45 | Fragment: Symbol.for('v-fgt'), 46 | Text: Symbol.for('v-txt'), 47 | Comment: Symbol.for('v-cmt'), 48 | Static: Symbol.for('v-stc'), 49 | }); 50 | 51 | // TODO How to trigger the devtools refresh when vue instance changed. 52 | // Maybe `devtools.emit("flush")` can be used, but i don't know when, where and how to use it. 53 | 54 | try { 55 | enablePiniaDevtools(app, 3); 56 | } catch (e) { 57 | error(e); 58 | } 59 | 60 | return true; 61 | } 62 | 63 | function getVueRootInstance(version: number) { 64 | const signProperty = version === 2 ? '__vue__' : '__vue_app__'; 65 | const all = document.querySelectorAll('*'); 66 | for (let i = 0; i < all.length; i++) { 67 | if (all[i][signProperty]) { 68 | return all[i][signProperty]; 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@aashutoshrathi/word-wrap@^1.2.3": 6 | version "1.2.6" 7 | resolved "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" 8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== 9 | 10 | "@babel/parser@^7.23.9": 11 | version "7.24.4" 12 | resolved "https://r.cnpmjs.org/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" 13 | integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== 14 | 15 | "@eslint-community/eslint-utils@^4.2.0": 16 | version "4.4.0" 17 | resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 18 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 19 | dependencies: 20 | eslint-visitor-keys "^3.3.0" 21 | 22 | "@eslint-community/regexpp@^4.6.1": 23 | version "4.10.0" 24 | resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" 25 | integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== 26 | 27 | "@eslint/eslintrc@^2.1.4": 28 | version "2.1.4" 29 | resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 30 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 31 | dependencies: 32 | ajv "^6.12.4" 33 | debug "^4.3.2" 34 | espree "^9.6.0" 35 | globals "^13.19.0" 36 | ignore "^5.2.0" 37 | import-fresh "^3.2.1" 38 | js-yaml "^4.1.0" 39 | minimatch "^3.1.2" 40 | strip-json-comments "^3.1.1" 41 | 42 | "@eslint/js@8.57.0": 43 | version "8.57.0" 44 | resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" 45 | integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== 46 | 47 | "@humanwhocodes/config-array@^0.11.14": 48 | version "0.11.14" 49 | resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" 50 | integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== 51 | dependencies: 52 | "@humanwhocodes/object-schema" "^2.0.2" 53 | debug "^4.3.1" 54 | minimatch "^3.0.5" 55 | 56 | "@humanwhocodes/module-importer@^1.0.1": 57 | version "1.0.1" 58 | resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 59 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 60 | 61 | "@humanwhocodes/object-schema@^2.0.2": 62 | version "2.0.2" 63 | resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" 64 | integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== 65 | 66 | "@jridgewell/sourcemap-codec@^1.4.15": 67 | version "1.4.15" 68 | resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 69 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 70 | 71 | "@nodelib/fs.scandir@2.1.5": 72 | version "2.1.5" 73 | resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 74 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 75 | dependencies: 76 | "@nodelib/fs.stat" "2.0.5" 77 | run-parallel "^1.1.9" 78 | 79 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 80 | version "2.0.5" 81 | resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 82 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 83 | 84 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 85 | version "1.2.8" 86 | resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 87 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 88 | dependencies: 89 | "@nodelib/fs.scandir" "2.1.5" 90 | fastq "^1.6.0" 91 | 92 | "@rollup/plugin-node-resolve@^15.2.3": 93 | version "15.2.3" 94 | resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" 95 | integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== 96 | dependencies: 97 | "@rollup/pluginutils" "^5.0.1" 98 | "@types/resolve" "1.20.2" 99 | deepmerge "^4.2.2" 100 | is-builtin-module "^3.2.1" 101 | is-module "^1.0.0" 102 | resolve "^1.22.1" 103 | 104 | "@rollup/plugin-replace@^5.0.5": 105 | version "5.0.5" 106 | resolved "https://r.cnpmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz#33d5653dce6d03cb24ef98bef7f6d25b57faefdf" 107 | integrity sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ== 108 | dependencies: 109 | "@rollup/pluginutils" "^5.0.1" 110 | magic-string "^0.30.3" 111 | 112 | "@rollup/plugin-typescript@^11.1.6": 113 | version "11.1.6" 114 | resolved "https://registry.npmmirror.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" 115 | integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== 116 | dependencies: 117 | "@rollup/pluginutils" "^5.1.0" 118 | resolve "^1.22.1" 119 | 120 | "@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0": 121 | version "5.1.0" 122 | resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" 123 | integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== 124 | dependencies: 125 | "@types/estree" "^1.0.0" 126 | estree-walker "^2.0.2" 127 | picomatch "^2.3.1" 128 | 129 | "@rollup/rollup-android-arm-eabi@4.13.0": 130 | version "4.13.0" 131 | resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" 132 | integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== 133 | 134 | "@rollup/rollup-android-arm64@4.13.0": 135 | version "4.13.0" 136 | resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" 137 | integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== 138 | 139 | "@rollup/rollup-darwin-arm64@4.13.0": 140 | version "4.13.0" 141 | resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" 142 | integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== 143 | 144 | "@rollup/rollup-darwin-x64@4.13.0": 145 | version "4.13.0" 146 | resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" 147 | integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== 148 | 149 | "@rollup/rollup-linux-arm-gnueabihf@4.13.0": 150 | version "4.13.0" 151 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" 152 | integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== 153 | 154 | "@rollup/rollup-linux-arm64-gnu@4.13.0": 155 | version "4.13.0" 156 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" 157 | integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== 158 | 159 | "@rollup/rollup-linux-arm64-musl@4.13.0": 160 | version "4.13.0" 161 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" 162 | integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== 163 | 164 | "@rollup/rollup-linux-riscv64-gnu@4.13.0": 165 | version "4.13.0" 166 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" 167 | integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== 168 | 169 | "@rollup/rollup-linux-x64-gnu@4.13.0": 170 | version "4.13.0" 171 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" 172 | integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== 173 | 174 | "@rollup/rollup-linux-x64-musl@4.13.0": 175 | version "4.13.0" 176 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" 177 | integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== 178 | 179 | "@rollup/rollup-win32-arm64-msvc@4.13.0": 180 | version "4.13.0" 181 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" 182 | integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== 183 | 184 | "@rollup/rollup-win32-ia32-msvc@4.13.0": 185 | version "4.13.0" 186 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" 187 | integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== 188 | 189 | "@rollup/rollup-win32-x64-msvc@4.13.0": 190 | version "4.13.0" 191 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" 192 | integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== 193 | 194 | "@types/chrome@^0.0.197": 195 | version "0.0.197" 196 | resolved "https://registry.npmmirror.com/@types/chrome/-/chrome-0.0.197.tgz#c1b50cdb72ee40f9bc1411506031a9f8a925ab35" 197 | integrity sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA== 198 | dependencies: 199 | "@types/filesystem" "*" 200 | "@types/har-format" "*" 201 | 202 | "@types/estree@1.0.5", "@types/estree@^1.0.0": 203 | version "1.0.5" 204 | resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 205 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 206 | 207 | "@types/filesystem@*": 208 | version "0.0.36" 209 | resolved "https://registry.npmmirror.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" 210 | integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== 211 | dependencies: 212 | "@types/filewriter" "*" 213 | 214 | "@types/filewriter@*": 215 | version "0.0.33" 216 | resolved "https://registry.npmmirror.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" 217 | integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== 218 | 219 | "@types/fs-extra@^8.0.1": 220 | version "8.1.5" 221 | resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-8.1.5.tgz#33aae2962d3b3ec9219b5aca2555ee00274f5927" 222 | integrity sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ== 223 | dependencies: 224 | "@types/node" "*" 225 | 226 | "@types/glob@^7.1.1": 227 | version "7.2.0" 228 | resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" 229 | integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== 230 | dependencies: 231 | "@types/minimatch" "*" 232 | "@types/node" "*" 233 | 234 | "@types/har-format@*": 235 | version "1.2.15" 236 | resolved "https://registry.npmmirror.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" 237 | integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== 238 | 239 | "@types/minimatch@*": 240 | version "5.1.2" 241 | resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" 242 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== 243 | 244 | "@types/node@*": 245 | version "20.11.30" 246 | resolved "https://registry.npmmirror.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" 247 | integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== 248 | dependencies: 249 | undici-types "~5.26.4" 250 | 251 | "@types/resolve@1.20.2": 252 | version "1.20.2" 253 | resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" 254 | integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== 255 | 256 | "@ungap/structured-clone@^1.2.0": 257 | version "1.2.0" 258 | resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 259 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 260 | 261 | "@vue/compiler-core@3.4.21": 262 | version "3.4.21" 263 | resolved "https://r.cnpmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a" 264 | integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og== 265 | dependencies: 266 | "@babel/parser" "^7.23.9" 267 | "@vue/shared" "3.4.21" 268 | entities "^4.5.0" 269 | estree-walker "^2.0.2" 270 | source-map-js "^1.0.2" 271 | 272 | "@vue/compiler-dom@3.4.21": 273 | version "3.4.21" 274 | resolved "https://r.cnpmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" 275 | integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA== 276 | dependencies: 277 | "@vue/compiler-core" "3.4.21" 278 | "@vue/shared" "3.4.21" 279 | 280 | "@vue/compiler-sfc@3.4.21": 281 | version "3.4.21" 282 | resolved "https://r.cnpmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" 283 | integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== 284 | dependencies: 285 | "@babel/parser" "^7.23.9" 286 | "@vue/compiler-core" "3.4.21" 287 | "@vue/compiler-dom" "3.4.21" 288 | "@vue/compiler-ssr" "3.4.21" 289 | "@vue/shared" "3.4.21" 290 | estree-walker "^2.0.2" 291 | magic-string "^0.30.7" 292 | postcss "^8.4.35" 293 | source-map-js "^1.0.2" 294 | 295 | "@vue/compiler-ssr@3.4.21": 296 | version "3.4.21" 297 | resolved "https://r.cnpmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef" 298 | integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q== 299 | dependencies: 300 | "@vue/compiler-dom" "3.4.21" 301 | "@vue/shared" "3.4.21" 302 | 303 | "@vue/composition-api@^1.7.2": 304 | version "1.7.2" 305 | resolved "https://r.cnpmjs.org/@vue/composition-api/-/composition-api-1.7.2.tgz#0b656f3ec39fefc2cf40aaa8c12426bcfeae1b44" 306 | integrity sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw== 307 | 308 | "@vue/devtools-api@^6.6.1": 309 | version "6.6.1" 310 | resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83" 311 | integrity sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA== 312 | 313 | "@vue/reactivity@3.4.21": 314 | version "3.4.21" 315 | resolved "https://r.cnpmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02" 316 | integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw== 317 | dependencies: 318 | "@vue/shared" "3.4.21" 319 | 320 | "@vue/runtime-core@3.4.21": 321 | version "3.4.21" 322 | resolved "https://r.cnpmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062" 323 | integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA== 324 | dependencies: 325 | "@vue/reactivity" "3.4.21" 326 | "@vue/shared" "3.4.21" 327 | 328 | "@vue/runtime-dom@3.4.21": 329 | version "3.4.21" 330 | resolved "https://r.cnpmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588" 331 | integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw== 332 | dependencies: 333 | "@vue/runtime-core" "3.4.21" 334 | "@vue/shared" "3.4.21" 335 | csstype "^3.1.3" 336 | 337 | "@vue/server-renderer@3.4.21": 338 | version "3.4.21" 339 | resolved "https://r.cnpmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" 340 | integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== 341 | dependencies: 342 | "@vue/compiler-ssr" "3.4.21" 343 | "@vue/shared" "3.4.21" 344 | 345 | "@vue/shared@3.4.21": 346 | version "3.4.21" 347 | resolved "https://r.cnpmjs.org/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" 348 | integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== 349 | 350 | acorn-jsx@^5.3.2: 351 | version "5.3.2" 352 | resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 353 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 354 | 355 | acorn@^8.9.0: 356 | version "8.11.3" 357 | resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 358 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 359 | 360 | ajv@^6.12.4: 361 | version "6.12.6" 362 | resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 363 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 364 | dependencies: 365 | fast-deep-equal "^3.1.1" 366 | fast-json-stable-stringify "^2.0.0" 367 | json-schema-traverse "^0.4.1" 368 | uri-js "^4.2.2" 369 | 370 | ansi-regex@^5.0.1: 371 | version "5.0.1" 372 | resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 373 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 374 | 375 | ansi-styles@^4.1.0: 376 | version "4.3.0" 377 | resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 378 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 379 | dependencies: 380 | color-convert "^2.0.1" 381 | 382 | archiver-utils@^2.1.0: 383 | version "2.1.0" 384 | resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" 385 | integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== 386 | dependencies: 387 | glob "^7.1.4" 388 | graceful-fs "^4.2.0" 389 | lazystream "^1.0.0" 390 | lodash.defaults "^4.2.0" 391 | lodash.difference "^4.5.0" 392 | lodash.flatten "^4.4.0" 393 | lodash.isplainobject "^4.0.6" 394 | lodash.union "^4.6.0" 395 | normalize-path "^3.0.0" 396 | readable-stream "^2.0.0" 397 | 398 | archiver-utils@^3.0.4: 399 | version "3.0.4" 400 | resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7" 401 | integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== 402 | dependencies: 403 | glob "^7.2.3" 404 | graceful-fs "^4.2.0" 405 | lazystream "^1.0.0" 406 | lodash.defaults "^4.2.0" 407 | lodash.difference "^4.5.0" 408 | lodash.flatten "^4.4.0" 409 | lodash.isplainobject "^4.0.6" 410 | lodash.union "^4.6.0" 411 | normalize-path "^3.0.0" 412 | readable-stream "^3.6.0" 413 | 414 | archiver@^5.3.0: 415 | version "5.3.2" 416 | resolved "https://registry.npmmirror.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" 417 | integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw== 418 | dependencies: 419 | archiver-utils "^2.1.0" 420 | async "^3.2.4" 421 | buffer-crc32 "^0.2.1" 422 | readable-stream "^3.6.0" 423 | readdir-glob "^1.1.2" 424 | tar-stream "^2.2.0" 425 | zip-stream "^4.1.0" 426 | 427 | argparse@^2.0.1: 428 | version "2.0.1" 429 | resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 430 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 431 | 432 | array-union@^2.1.0: 433 | version "2.1.0" 434 | resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 435 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 436 | 437 | async@^3.2.4: 438 | version "3.2.5" 439 | resolved "https://registry.npmmirror.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" 440 | integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== 441 | 442 | balanced-match@^1.0.0: 443 | version "1.0.2" 444 | resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 445 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 446 | 447 | base64-js@^1.3.1: 448 | version "1.5.1" 449 | resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 450 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 451 | 452 | bl@^4.0.3: 453 | version "4.1.0" 454 | resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 455 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 456 | dependencies: 457 | buffer "^5.5.0" 458 | inherits "^2.0.4" 459 | readable-stream "^3.4.0" 460 | 461 | brace-expansion@^1.1.7: 462 | version "1.1.11" 463 | resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 464 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 465 | dependencies: 466 | balanced-match "^1.0.0" 467 | concat-map "0.0.1" 468 | 469 | brace-expansion@^2.0.1: 470 | version "2.0.1" 471 | resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 472 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 473 | dependencies: 474 | balanced-match "^1.0.0" 475 | 476 | braces@^3.0.2: 477 | version "3.0.2" 478 | resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 479 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 480 | dependencies: 481 | fill-range "^7.0.1" 482 | 483 | buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: 484 | version "0.2.13" 485 | resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 486 | integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== 487 | 488 | buffer@^5.5.0: 489 | version "5.7.1" 490 | resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 491 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 492 | dependencies: 493 | base64-js "^1.3.1" 494 | ieee754 "^1.1.13" 495 | 496 | builtin-modules@^3.3.0: 497 | version "3.3.0" 498 | resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" 499 | integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== 500 | 501 | callsites@^3.0.0: 502 | version "3.1.0" 503 | resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 504 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 505 | 506 | chalk@^4.0.0: 507 | version "4.1.2" 508 | resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 509 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 510 | dependencies: 511 | ansi-styles "^4.1.0" 512 | supports-color "^7.1.0" 513 | 514 | color-convert@^2.0.1: 515 | version "2.0.1" 516 | resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 517 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 518 | dependencies: 519 | color-name "~1.1.4" 520 | 521 | color-name@~1.1.4: 522 | version "1.1.4" 523 | resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 524 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 525 | 526 | colorette@^1.1.0: 527 | version "1.4.0" 528 | resolved "https://registry.npmmirror.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" 529 | integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== 530 | 531 | compress-commons@^4.1.2: 532 | version "4.1.2" 533 | resolved "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" 534 | integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== 535 | dependencies: 536 | buffer-crc32 "^0.2.13" 537 | crc32-stream "^4.0.2" 538 | normalize-path "^3.0.0" 539 | readable-stream "^3.6.0" 540 | 541 | concat-map@0.0.1: 542 | version "0.0.1" 543 | resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 544 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 545 | 546 | core-util-is@~1.0.0: 547 | version "1.0.3" 548 | resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 549 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 550 | 551 | crc-32@^1.2.0: 552 | version "1.2.2" 553 | resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" 554 | integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== 555 | 556 | crc32-stream@^4.0.2: 557 | version "4.0.3" 558 | resolved "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33" 559 | integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== 560 | dependencies: 561 | crc-32 "^1.2.0" 562 | readable-stream "^3.4.0" 563 | 564 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 565 | version "7.0.3" 566 | resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 567 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 568 | dependencies: 569 | path-key "^3.1.0" 570 | shebang-command "^2.0.0" 571 | which "^2.0.1" 572 | 573 | csstype@^3.1.3: 574 | version "3.1.3" 575 | resolved "https://r.cnpmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 576 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 577 | 578 | debug@^4.3.1, debug@^4.3.2: 579 | version "4.3.4" 580 | resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 581 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 582 | dependencies: 583 | ms "2.1.2" 584 | 585 | deep-is@^0.1.3: 586 | version "0.1.4" 587 | resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 588 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 589 | 590 | deepmerge@^4.2.2: 591 | version "4.3.1" 592 | resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" 593 | integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== 594 | 595 | dir-glob@^3.0.1: 596 | version "3.0.1" 597 | resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 598 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 599 | dependencies: 600 | path-type "^4.0.0" 601 | 602 | doctrine@^3.0.0: 603 | version "3.0.0" 604 | resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 605 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 606 | dependencies: 607 | esutils "^2.0.2" 608 | 609 | end-of-stream@^1.4.1: 610 | version "1.4.4" 611 | resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 612 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 613 | dependencies: 614 | once "^1.4.0" 615 | 616 | entities@^4.5.0: 617 | version "4.5.0" 618 | resolved "https://r.cnpmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 619 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 620 | 621 | escape-string-regexp@^4.0.0: 622 | version "4.0.0" 623 | resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 624 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 625 | 626 | eslint-scope@^7.2.2: 627 | version "7.2.2" 628 | resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 629 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 630 | dependencies: 631 | esrecurse "^4.3.0" 632 | estraverse "^5.2.0" 633 | 634 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 635 | version "3.4.3" 636 | resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 637 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 638 | 639 | eslint@^8.24.0: 640 | version "8.57.0" 641 | resolved "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" 642 | integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== 643 | dependencies: 644 | "@eslint-community/eslint-utils" "^4.2.0" 645 | "@eslint-community/regexpp" "^4.6.1" 646 | "@eslint/eslintrc" "^2.1.4" 647 | "@eslint/js" "8.57.0" 648 | "@humanwhocodes/config-array" "^0.11.14" 649 | "@humanwhocodes/module-importer" "^1.0.1" 650 | "@nodelib/fs.walk" "^1.2.8" 651 | "@ungap/structured-clone" "^1.2.0" 652 | ajv "^6.12.4" 653 | chalk "^4.0.0" 654 | cross-spawn "^7.0.2" 655 | debug "^4.3.2" 656 | doctrine "^3.0.0" 657 | escape-string-regexp "^4.0.0" 658 | eslint-scope "^7.2.2" 659 | eslint-visitor-keys "^3.4.3" 660 | espree "^9.6.1" 661 | esquery "^1.4.2" 662 | esutils "^2.0.2" 663 | fast-deep-equal "^3.1.3" 664 | file-entry-cache "^6.0.1" 665 | find-up "^5.0.0" 666 | glob-parent "^6.0.2" 667 | globals "^13.19.0" 668 | graphemer "^1.4.0" 669 | ignore "^5.2.0" 670 | imurmurhash "^0.1.4" 671 | is-glob "^4.0.0" 672 | is-path-inside "^3.0.3" 673 | js-yaml "^4.1.0" 674 | json-stable-stringify-without-jsonify "^1.0.1" 675 | levn "^0.4.1" 676 | lodash.merge "^4.6.2" 677 | minimatch "^3.1.2" 678 | natural-compare "^1.4.0" 679 | optionator "^0.9.3" 680 | strip-ansi "^6.0.1" 681 | text-table "^0.2.0" 682 | 683 | espree@^9.6.0, espree@^9.6.1: 684 | version "9.6.1" 685 | resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 686 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 687 | dependencies: 688 | acorn "^8.9.0" 689 | acorn-jsx "^5.3.2" 690 | eslint-visitor-keys "^3.4.1" 691 | 692 | esquery@^1.4.2: 693 | version "1.5.0" 694 | resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 695 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 696 | dependencies: 697 | estraverse "^5.1.0" 698 | 699 | esrecurse@^4.3.0: 700 | version "4.3.0" 701 | resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 702 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 703 | dependencies: 704 | estraverse "^5.2.0" 705 | 706 | estraverse@^5.1.0, estraverse@^5.2.0: 707 | version "5.3.0" 708 | resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 709 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 710 | 711 | estree-walker@^2.0.2: 712 | version "2.0.2" 713 | resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 714 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 715 | 716 | esutils@^2.0.2: 717 | version "2.0.3" 718 | resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 719 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 720 | 721 | execa@^5.1.1: 722 | version "5.1.1" 723 | resolved "https://r2.cnpmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 724 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 725 | dependencies: 726 | cross-spawn "^7.0.3" 727 | get-stream "^6.0.0" 728 | human-signals "^2.1.0" 729 | is-stream "^2.0.0" 730 | merge-stream "^2.0.0" 731 | npm-run-path "^4.0.1" 732 | onetime "^5.1.2" 733 | signal-exit "^3.0.3" 734 | strip-final-newline "^2.0.0" 735 | 736 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 737 | version "3.1.3" 738 | resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 739 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 740 | 741 | fast-glob@^3.0.3: 742 | version "3.3.2" 743 | resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 744 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 745 | dependencies: 746 | "@nodelib/fs.stat" "^2.0.2" 747 | "@nodelib/fs.walk" "^1.2.3" 748 | glob-parent "^5.1.2" 749 | merge2 "^1.3.0" 750 | micromatch "^4.0.4" 751 | 752 | fast-json-stable-stringify@^2.0.0: 753 | version "2.1.0" 754 | resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 755 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 756 | 757 | fast-levenshtein@^2.0.6: 758 | version "2.0.6" 759 | resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 760 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 761 | 762 | fastq@^1.6.0: 763 | version "1.17.1" 764 | resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 765 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 766 | dependencies: 767 | reusify "^1.0.4" 768 | 769 | file-entry-cache@^6.0.1: 770 | version "6.0.1" 771 | resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 772 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 773 | dependencies: 774 | flat-cache "^3.0.4" 775 | 776 | fill-range@^7.0.1: 777 | version "7.0.1" 778 | resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 779 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 780 | dependencies: 781 | to-regex-range "^5.0.1" 782 | 783 | find-up@^5.0.0: 784 | version "5.0.0" 785 | resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 786 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 787 | dependencies: 788 | locate-path "^6.0.0" 789 | path-exists "^4.0.0" 790 | 791 | flat-cache@^3.0.4: 792 | version "3.2.0" 793 | resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 794 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 795 | dependencies: 796 | flatted "^3.2.9" 797 | keyv "^4.5.3" 798 | rimraf "^3.0.2" 799 | 800 | flatted@^3.2.9: 801 | version "3.3.1" 802 | resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 803 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 804 | 805 | fs-constants@^1.0.0: 806 | version "1.0.0" 807 | resolved "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 808 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 809 | 810 | fs-extra@^10.0.0: 811 | version "10.1.0" 812 | resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 813 | integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 814 | dependencies: 815 | graceful-fs "^4.2.0" 816 | jsonfile "^6.0.1" 817 | universalify "^2.0.0" 818 | 819 | fs-extra@^8.1.0: 820 | version "8.1.0" 821 | resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 822 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 823 | dependencies: 824 | graceful-fs "^4.2.0" 825 | jsonfile "^4.0.0" 826 | universalify "^0.1.0" 827 | 828 | fs.realpath@^1.0.0: 829 | version "1.0.0" 830 | resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 831 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 832 | 833 | fsevents@~2.3.2: 834 | version "2.3.3" 835 | resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 836 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 837 | 838 | function-bind@^1.1.2: 839 | version "1.1.2" 840 | resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 841 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 842 | 843 | get-stream@^6.0.0: 844 | version "6.0.1" 845 | resolved "https://r2.cnpmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 846 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 847 | 848 | glob-parent@^5.1.2: 849 | version "5.1.2" 850 | resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 851 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 852 | dependencies: 853 | is-glob "^4.0.1" 854 | 855 | glob-parent@^6.0.2: 856 | version "6.0.2" 857 | resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 858 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 859 | dependencies: 860 | is-glob "^4.0.3" 861 | 862 | glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: 863 | version "7.2.3" 864 | resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 865 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 866 | dependencies: 867 | fs.realpath "^1.0.0" 868 | inflight "^1.0.4" 869 | inherits "2" 870 | minimatch "^3.1.1" 871 | once "^1.3.0" 872 | path-is-absolute "^1.0.0" 873 | 874 | globals@^13.19.0: 875 | version "13.24.0" 876 | resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 877 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 878 | dependencies: 879 | type-fest "^0.20.2" 880 | 881 | globby@10.0.1: 882 | version "10.0.1" 883 | resolved "https://registry.npmmirror.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" 884 | integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== 885 | dependencies: 886 | "@types/glob" "^7.1.1" 887 | array-union "^2.1.0" 888 | dir-glob "^3.0.1" 889 | fast-glob "^3.0.3" 890 | glob "^7.1.3" 891 | ignore "^5.1.1" 892 | merge2 "^1.2.3" 893 | slash "^3.0.0" 894 | 895 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 896 | version "4.2.11" 897 | resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 898 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 899 | 900 | graphemer@^1.4.0: 901 | version "1.4.0" 902 | resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 903 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 904 | 905 | has-flag@^4.0.0: 906 | version "4.0.0" 907 | resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 908 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 909 | 910 | hasown@^2.0.0: 911 | version "2.0.2" 912 | resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 913 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 914 | dependencies: 915 | function-bind "^1.1.2" 916 | 917 | human-signals@^2.1.0: 918 | version "2.1.0" 919 | resolved "https://r2.cnpmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 920 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 921 | 922 | husky@^9.0.11: 923 | version "9.0.11" 924 | resolved "https://r.cnpmjs.org/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" 925 | integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== 926 | 927 | ieee754@^1.1.13: 928 | version "1.2.1" 929 | resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 930 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 931 | 932 | ignore@^5.1.1, ignore@^5.2.0, ignore@^5.3.0: 933 | version "5.3.1" 934 | resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" 935 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 936 | 937 | import-fresh@^3.2.1: 938 | version "3.3.0" 939 | resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 940 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 941 | dependencies: 942 | parent-module "^1.0.0" 943 | resolve-from "^4.0.0" 944 | 945 | imurmurhash@^0.1.4: 946 | version "0.1.4" 947 | resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 948 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 949 | 950 | inflight@^1.0.4: 951 | version "1.0.6" 952 | resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 953 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 954 | dependencies: 955 | once "^1.3.0" 956 | wrappy "1" 957 | 958 | inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: 959 | version "2.0.4" 960 | resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 961 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 962 | 963 | is-builtin-module@^3.2.1: 964 | version "3.2.1" 965 | resolved "https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" 966 | integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== 967 | dependencies: 968 | builtin-modules "^3.3.0" 969 | 970 | is-core-module@^2.13.0: 971 | version "2.13.1" 972 | resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" 973 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 974 | dependencies: 975 | hasown "^2.0.0" 976 | 977 | is-extglob@^2.1.1: 978 | version "2.1.1" 979 | resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 980 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 981 | 982 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 983 | version "4.0.3" 984 | resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 985 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 986 | dependencies: 987 | is-extglob "^2.1.1" 988 | 989 | is-module@^1.0.0: 990 | version "1.0.0" 991 | resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 992 | integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== 993 | 994 | is-number@^7.0.0: 995 | version "7.0.0" 996 | resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 997 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 998 | 999 | is-path-inside@^3.0.3: 1000 | version "3.0.3" 1001 | resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1002 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1003 | 1004 | is-plain-object@^3.0.0: 1005 | version "3.0.1" 1006 | resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" 1007 | integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== 1008 | 1009 | is-stream@^2.0.0: 1010 | version "2.0.1" 1011 | resolved "https://r2.cnpmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1012 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1013 | 1014 | isarray@~1.0.0: 1015 | version "1.0.0" 1016 | resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1017 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1018 | 1019 | isexe@^2.0.0: 1020 | version "2.0.0" 1021 | resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1022 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1023 | 1024 | js-yaml@^4.1.0: 1025 | version "4.1.0" 1026 | resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1027 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1028 | dependencies: 1029 | argparse "^2.0.1" 1030 | 1031 | json-buffer@3.0.1: 1032 | version "3.0.1" 1033 | resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1034 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1035 | 1036 | json-schema-traverse@^0.4.1: 1037 | version "0.4.1" 1038 | resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1039 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1040 | 1041 | json-stable-stringify-without-jsonify@^1.0.1: 1042 | version "1.0.1" 1043 | resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1044 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1045 | 1046 | jsonfile@^4.0.0: 1047 | version "4.0.0" 1048 | resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1049 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1050 | optionalDependencies: 1051 | graceful-fs "^4.1.6" 1052 | 1053 | jsonfile@^6.0.1: 1054 | version "6.1.0" 1055 | resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1056 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1057 | dependencies: 1058 | universalify "^2.0.0" 1059 | optionalDependencies: 1060 | graceful-fs "^4.1.6" 1061 | 1062 | keyv@^4.5.3: 1063 | version "4.5.4" 1064 | resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1065 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1066 | dependencies: 1067 | json-buffer "3.0.1" 1068 | 1069 | lazystream@^1.0.0: 1070 | version "1.0.1" 1071 | resolved "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" 1072 | integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== 1073 | dependencies: 1074 | readable-stream "^2.0.5" 1075 | 1076 | levn@^0.4.1: 1077 | version "0.4.1" 1078 | resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1079 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1080 | dependencies: 1081 | prelude-ls "^1.2.1" 1082 | type-check "~0.4.0" 1083 | 1084 | locate-path@^6.0.0: 1085 | version "6.0.0" 1086 | resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1087 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1088 | dependencies: 1089 | p-locate "^5.0.0" 1090 | 1091 | lodash.defaults@^4.2.0: 1092 | version "4.2.0" 1093 | resolved "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 1094 | integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== 1095 | 1096 | lodash.difference@^4.5.0: 1097 | version "4.5.0" 1098 | resolved "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" 1099 | integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== 1100 | 1101 | lodash.flatten@^4.4.0: 1102 | version "4.4.0" 1103 | resolved "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 1104 | integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== 1105 | 1106 | lodash.isplainobject@^4.0.6: 1107 | version "4.0.6" 1108 | resolved "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1109 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 1110 | 1111 | lodash.merge@^4.6.2: 1112 | version "4.6.2" 1113 | resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1114 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1115 | 1116 | lodash.union@^4.6.0: 1117 | version "4.6.0" 1118 | resolved "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" 1119 | integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== 1120 | 1121 | magic-string@^0.30.3, magic-string@^0.30.7: 1122 | version "0.30.9" 1123 | resolved "https://r.cnpmjs.org/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" 1124 | integrity sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw== 1125 | dependencies: 1126 | "@jridgewell/sourcemap-codec" "^1.4.15" 1127 | 1128 | merge-stream@^2.0.0: 1129 | version "2.0.0" 1130 | resolved "https://r2.cnpmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1131 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1132 | 1133 | merge2@^1.2.3, merge2@^1.3.0: 1134 | version "1.4.1" 1135 | resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1136 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1137 | 1138 | micromatch@^4.0.4: 1139 | version "4.0.5" 1140 | resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1141 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1142 | dependencies: 1143 | braces "^3.0.2" 1144 | picomatch "^2.3.1" 1145 | 1146 | mimic-fn@^2.1.0: 1147 | version "2.1.0" 1148 | resolved "https://r2.cnpmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1149 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1150 | 1151 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1152 | version "3.1.2" 1153 | resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1154 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1155 | dependencies: 1156 | brace-expansion "^1.1.7" 1157 | 1158 | minimatch@^5.1.0: 1159 | version "5.1.6" 1160 | resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 1161 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 1162 | dependencies: 1163 | brace-expansion "^2.0.1" 1164 | 1165 | mri@^1.2.0: 1166 | version "1.2.0" 1167 | resolved "https://r2.cnpmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 1168 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 1169 | 1170 | ms@2.1.2: 1171 | version "2.1.2" 1172 | resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1173 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1174 | 1175 | nanoid@^3.3.7: 1176 | version "3.3.7" 1177 | resolved "https://r.cnpmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1178 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1179 | 1180 | natural-compare@^1.4.0: 1181 | version "1.4.0" 1182 | resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1183 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1184 | 1185 | normalize-path@^3.0.0: 1186 | version "3.0.0" 1187 | resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1188 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1189 | 1190 | npm-run-path@^4.0.1: 1191 | version "4.0.1" 1192 | resolved "https://r2.cnpmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1193 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1194 | dependencies: 1195 | path-key "^3.0.0" 1196 | 1197 | once@^1.3.0, once@^1.4.0: 1198 | version "1.4.0" 1199 | resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1200 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1201 | dependencies: 1202 | wrappy "1" 1203 | 1204 | onetime@^5.1.2: 1205 | version "5.1.2" 1206 | resolved "https://r2.cnpmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1207 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1208 | dependencies: 1209 | mimic-fn "^2.1.0" 1210 | 1211 | optionator@^0.9.3: 1212 | version "0.9.3" 1213 | resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" 1214 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== 1215 | dependencies: 1216 | "@aashutoshrathi/word-wrap" "^1.2.3" 1217 | deep-is "^0.1.3" 1218 | fast-levenshtein "^2.0.6" 1219 | levn "^0.4.1" 1220 | prelude-ls "^1.2.1" 1221 | type-check "^0.4.0" 1222 | 1223 | p-limit@^3.0.2: 1224 | version "3.1.0" 1225 | resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1226 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1227 | dependencies: 1228 | yocto-queue "^0.1.0" 1229 | 1230 | p-locate@^5.0.0: 1231 | version "5.0.0" 1232 | resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1233 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1234 | dependencies: 1235 | p-limit "^3.0.2" 1236 | 1237 | parent-module@^1.0.0: 1238 | version "1.0.1" 1239 | resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1240 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1241 | dependencies: 1242 | callsites "^3.0.0" 1243 | 1244 | path-exists@^4.0.0: 1245 | version "4.0.0" 1246 | resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1247 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1248 | 1249 | path-is-absolute@^1.0.0: 1250 | version "1.0.1" 1251 | resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1252 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1253 | 1254 | path-key@^3.0.0, path-key@^3.1.0: 1255 | version "3.1.1" 1256 | resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1257 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1258 | 1259 | path-parse@^1.0.7: 1260 | version "1.0.7" 1261 | resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1262 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1263 | 1264 | path-type@^4.0.0: 1265 | version "4.0.0" 1266 | resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1267 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1268 | 1269 | picocolors@^1.0.0: 1270 | version "1.0.0" 1271 | resolved "https://r2.cnpmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1272 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1273 | 1274 | picomatch@^2.3.1: 1275 | version "2.3.1" 1276 | resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1277 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1278 | 1279 | picomatch@^3.0.1: 1280 | version "3.0.1" 1281 | resolved "https://r.cnpmjs.org/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" 1282 | integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== 1283 | 1284 | postcss@^8.4.35: 1285 | version "8.4.38" 1286 | resolved "https://r.cnpmjs.org/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" 1287 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== 1288 | dependencies: 1289 | nanoid "^3.3.7" 1290 | picocolors "^1.0.0" 1291 | source-map-js "^1.2.0" 1292 | 1293 | prelude-ls@^1.2.1: 1294 | version "1.2.1" 1295 | resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1296 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1297 | 1298 | prettier@^3.2.5: 1299 | version "3.2.5" 1300 | resolved "https://registry.npmmirror.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" 1301 | integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== 1302 | 1303 | pretty-quick@^4.0.0: 1304 | version "4.0.0" 1305 | resolved "https://r.cnpmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz#ea5cce85a5804bfbec7327b0e064509155d03f39" 1306 | integrity sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ== 1307 | dependencies: 1308 | execa "^5.1.1" 1309 | find-up "^5.0.0" 1310 | ignore "^5.3.0" 1311 | mri "^1.2.0" 1312 | picocolors "^1.0.0" 1313 | picomatch "^3.0.1" 1314 | tslib "^2.6.2" 1315 | 1316 | process-nextick-args@~2.0.0: 1317 | version "2.0.1" 1318 | resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1319 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1320 | 1321 | punycode@^2.1.0: 1322 | version "2.3.1" 1323 | resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1324 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1325 | 1326 | queue-microtask@^1.2.2: 1327 | version "1.2.3" 1328 | resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1329 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1330 | 1331 | readable-stream@^2.0.0, readable-stream@^2.0.5: 1332 | version "2.3.8" 1333 | resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 1334 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1335 | dependencies: 1336 | core-util-is "~1.0.0" 1337 | inherits "~2.0.3" 1338 | isarray "~1.0.0" 1339 | process-nextick-args "~2.0.0" 1340 | safe-buffer "~5.1.1" 1341 | string_decoder "~1.1.1" 1342 | util-deprecate "~1.0.1" 1343 | 1344 | readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: 1345 | version "3.6.2" 1346 | resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 1347 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 1348 | dependencies: 1349 | inherits "^2.0.3" 1350 | string_decoder "^1.1.1" 1351 | util-deprecate "^1.0.1" 1352 | 1353 | readdir-glob@^1.1.2: 1354 | version "1.1.3" 1355 | resolved "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" 1356 | integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== 1357 | dependencies: 1358 | minimatch "^5.1.0" 1359 | 1360 | resolve-from@^4.0.0: 1361 | version "4.0.0" 1362 | resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1363 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1364 | 1365 | resolve@^1.22.1: 1366 | version "1.22.8" 1367 | resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 1368 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 1369 | dependencies: 1370 | is-core-module "^2.13.0" 1371 | path-parse "^1.0.7" 1372 | supports-preserve-symlinks-flag "^1.0.0" 1373 | 1374 | reusify@^1.0.4: 1375 | version "1.0.4" 1376 | resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1377 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1378 | 1379 | rimraf@^3.0.2: 1380 | version "3.0.2" 1381 | resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1382 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1383 | dependencies: 1384 | glob "^7.1.3" 1385 | 1386 | rollup-plugin-copy@^3.5.0: 1387 | version "3.5.0" 1388 | resolved "https://registry.npmmirror.com/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz#7ffa2a7a8303e143876fa64fb5eed9022d304eeb" 1389 | integrity sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA== 1390 | dependencies: 1391 | "@types/fs-extra" "^8.0.1" 1392 | colorette "^1.1.0" 1393 | fs-extra "^8.1.0" 1394 | globby "10.0.1" 1395 | is-plain-object "^3.0.0" 1396 | 1397 | rollup@^4.13.0: 1398 | version "4.13.0" 1399 | resolved "https://registry.npmmirror.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" 1400 | integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== 1401 | dependencies: 1402 | "@types/estree" "1.0.5" 1403 | optionalDependencies: 1404 | "@rollup/rollup-android-arm-eabi" "4.13.0" 1405 | "@rollup/rollup-android-arm64" "4.13.0" 1406 | "@rollup/rollup-darwin-arm64" "4.13.0" 1407 | "@rollup/rollup-darwin-x64" "4.13.0" 1408 | "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" 1409 | "@rollup/rollup-linux-arm64-gnu" "4.13.0" 1410 | "@rollup/rollup-linux-arm64-musl" "4.13.0" 1411 | "@rollup/rollup-linux-riscv64-gnu" "4.13.0" 1412 | "@rollup/rollup-linux-x64-gnu" "4.13.0" 1413 | "@rollup/rollup-linux-x64-musl" "4.13.0" 1414 | "@rollup/rollup-win32-arm64-msvc" "4.13.0" 1415 | "@rollup/rollup-win32-ia32-msvc" "4.13.0" 1416 | "@rollup/rollup-win32-x64-msvc" "4.13.0" 1417 | fsevents "~2.3.2" 1418 | 1419 | run-parallel@^1.1.9: 1420 | version "1.2.0" 1421 | resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1422 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1423 | dependencies: 1424 | queue-microtask "^1.2.2" 1425 | 1426 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1427 | version "5.1.2" 1428 | resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1429 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1430 | 1431 | safe-buffer@~5.2.0: 1432 | version "5.2.1" 1433 | resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1434 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1435 | 1436 | shebang-command@^2.0.0: 1437 | version "2.0.0" 1438 | resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1439 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1440 | dependencies: 1441 | shebang-regex "^3.0.0" 1442 | 1443 | shebang-regex@^3.0.0: 1444 | version "3.0.0" 1445 | resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1446 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1447 | 1448 | signal-exit@^3.0.3: 1449 | version "3.0.7" 1450 | resolved "https://r.cnpmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1451 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1452 | 1453 | slash@^3.0.0: 1454 | version "3.0.0" 1455 | resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1456 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1457 | 1458 | source-map-js@^1.0.2, source-map-js@^1.2.0: 1459 | version "1.2.0" 1460 | resolved "https://r.cnpmjs.org/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 1461 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 1462 | 1463 | string_decoder@^1.1.1: 1464 | version "1.3.0" 1465 | resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1466 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1467 | dependencies: 1468 | safe-buffer "~5.2.0" 1469 | 1470 | string_decoder@~1.1.1: 1471 | version "1.1.1" 1472 | resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1473 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1474 | dependencies: 1475 | safe-buffer "~5.1.0" 1476 | 1477 | strip-ansi@^6.0.1: 1478 | version "6.0.1" 1479 | resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1480 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1481 | dependencies: 1482 | ansi-regex "^5.0.1" 1483 | 1484 | strip-final-newline@^2.0.0: 1485 | version "2.0.0" 1486 | resolved "https://r2.cnpmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 1487 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1488 | 1489 | strip-json-comments@^3.1.1: 1490 | version "3.1.1" 1491 | resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1492 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1493 | 1494 | supports-color@^7.1.0: 1495 | version "7.2.0" 1496 | resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1497 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1498 | dependencies: 1499 | has-flag "^4.0.0" 1500 | 1501 | supports-preserve-symlinks-flag@^1.0.0: 1502 | version "1.0.0" 1503 | resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1504 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1505 | 1506 | tar-stream@^2.2.0: 1507 | version "2.2.0" 1508 | resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 1509 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 1510 | dependencies: 1511 | bl "^4.0.3" 1512 | end-of-stream "^1.4.1" 1513 | fs-constants "^1.0.0" 1514 | inherits "^2.0.3" 1515 | readable-stream "^3.1.1" 1516 | 1517 | text-table@^0.2.0: 1518 | version "0.2.0" 1519 | resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1520 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1521 | 1522 | to-regex-range@^5.0.1: 1523 | version "5.0.1" 1524 | resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1525 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1526 | dependencies: 1527 | is-number "^7.0.0" 1528 | 1529 | tslib@^2.6.2: 1530 | version "2.6.2" 1531 | resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 1532 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 1533 | 1534 | type-check@^0.4.0, type-check@~0.4.0: 1535 | version "0.4.0" 1536 | resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1537 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1538 | dependencies: 1539 | prelude-ls "^1.2.1" 1540 | 1541 | type-fest@^0.20.2: 1542 | version "0.20.2" 1543 | resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1544 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1545 | 1546 | typescript@^5.4.3: 1547 | version "5.4.3" 1548 | resolved "https://registry.npmmirror.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" 1549 | integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== 1550 | 1551 | undici-types@~5.26.4: 1552 | version "5.26.5" 1553 | resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1554 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1555 | 1556 | universalify@^0.1.0: 1557 | version "0.1.2" 1558 | resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1559 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1560 | 1561 | universalify@^2.0.0: 1562 | version "2.0.1" 1563 | resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1564 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1565 | 1566 | uri-js@^4.2.2: 1567 | version "4.4.1" 1568 | resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1569 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1570 | dependencies: 1571 | punycode "^2.1.0" 1572 | 1573 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1574 | version "1.0.2" 1575 | resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1576 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1577 | 1578 | vue-demi@^0.14.7: 1579 | version "0.14.7" 1580 | resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2" 1581 | integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA== 1582 | 1583 | vue@^3.4.21: 1584 | version "3.4.21" 1585 | resolved "https://r.cnpmjs.org/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731" 1586 | integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA== 1587 | dependencies: 1588 | "@vue/compiler-dom" "3.4.21" 1589 | "@vue/compiler-sfc" "3.4.21" 1590 | "@vue/runtime-dom" "3.4.21" 1591 | "@vue/server-renderer" "3.4.21" 1592 | "@vue/shared" "3.4.21" 1593 | 1594 | which@^2.0.1: 1595 | version "2.0.2" 1596 | resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1597 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1598 | dependencies: 1599 | isexe "^2.0.0" 1600 | 1601 | wrappy@1: 1602 | version "1.0.2" 1603 | resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1604 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1605 | 1606 | yocto-queue@^0.1.0: 1607 | version "0.1.0" 1608 | resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1609 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1610 | 1611 | zip-stream@^4.1.0: 1612 | version "4.1.1" 1613 | resolved "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" 1614 | integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== 1615 | dependencies: 1616 | archiver-utils "^3.0.4" 1617 | compress-commons "^4.1.2" 1618 | readable-stream "^3.6.0" 1619 | -------------------------------------------------------------------------------- /src/plugins/vendors/pinia.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * pinia v2.1.7 3 | * (c) 2023 Eduardo San Martin Morote 4 | * @license MIT 5 | */ 6 | import { hasInjectionContext, inject, toRaw, watch, unref, markRaw, effectScope, ref, isVue2, isRef, isReactive, set, getCurrentScope, onScopeDispose, getCurrentInstance, reactive, toRef, del, nextTick, computed, toRefs } from 'vue-demi'; 7 | import { setupDevtoolsPlugin } from '@vue/devtools-api'; 8 | 9 | /** 10 | * setActivePinia must be called to handle SSR at the top of functions like 11 | * `fetch`, `setup`, `serverPrefetch` and others 12 | */ 13 | let activePinia; 14 | /** 15 | * Sets or unsets the active pinia. Used in SSR and internally when calling 16 | * actions and getters 17 | * 18 | * @param pinia - Pinia instance 19 | */ 20 | // @ts-expect-error: cannot constrain the type of the return 21 | const setActivePinia = (pinia) => (activePinia = pinia); 22 | /** 23 | * Get the currently active pinia if there is any. 24 | */ 25 | const getActivePinia = () => (hasInjectionContext() && inject(piniaSymbol)) || activePinia; 26 | const piniaSymbol = ((process.env.NODE_ENV !== 'production') ? Symbol('pinia') : /* istanbul ignore next */ Symbol()); 27 | 28 | function isPlainObject( 29 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 30 | o) { 31 | return (o && 32 | typeof o === 'object' && 33 | Object.prototype.toString.call(o) === '[object Object]' && 34 | typeof o.toJSON !== 'function'); 35 | } 36 | // type DeepReadonly = { readonly [P in keyof T]: DeepReadonly } 37 | // TODO: can we change these to numbers? 38 | /** 39 | * Possible types for SubscriptionCallback 40 | */ 41 | var MutationType; 42 | (function (MutationType) { 43 | /** 44 | * Direct mutation of the state: 45 | * 46 | * - `store.name = 'new name'` 47 | * - `store.$state.name = 'new name'` 48 | * - `store.list.push('new item')` 49 | */ 50 | MutationType["direct"] = "direct"; 51 | /** 52 | * Mutated the state with `$patch` and an object 53 | * 54 | * - `store.$patch({ name: 'newName' })` 55 | */ 56 | MutationType["patchObject"] = "patch object"; 57 | /** 58 | * Mutated the state with `$patch` and a function 59 | * 60 | * - `store.$patch(state => state.name = 'newName')` 61 | */ 62 | MutationType["patchFunction"] = "patch function"; 63 | // maybe reset? for $state = {} and $reset 64 | })(MutationType || (MutationType = {})); 65 | 66 | const IS_CLIENT = typeof window !== 'undefined'; 67 | /** 68 | * Should we add the devtools plugins. 69 | * - only if dev mode or forced through the prod devtools flag 70 | * - not in test 71 | * - only if window exists (could change in the future) 72 | */ 73 | const USE_DEVTOOLS = ((process.env.NODE_ENV !== 'production') || (typeof __VUE_PROD_DEVTOOLS__ !== 'undefined' && __VUE_PROD_DEVTOOLS__)) && !(process.env.NODE_ENV === 'test') && IS_CLIENT; 74 | 75 | /* 76 | * FileSaver.js A saveAs() FileSaver implementation. 77 | * 78 | * Originally by Eli Grey, adapted as an ESM module by Eduardo San Martin 79 | * Morote. 80 | * 81 | * License : MIT 82 | */ 83 | // The one and only way of getting global scope in all environments 84 | // https://stackoverflow.com/q/3277182/1008999 85 | const _global = /*#__PURE__*/ (() => typeof window === 'object' && window.window === window 86 | ? window 87 | : typeof self === 'object' && self.self === self 88 | ? self 89 | : typeof global === 'object' && global.global === global 90 | ? global 91 | : typeof globalThis === 'object' 92 | ? globalThis 93 | : { HTMLElement: null })(); 94 | function bom(blob, { autoBom = false } = {}) { 95 | // prepend BOM for UTF-8 XML and text/* types (including HTML) 96 | // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF 97 | if (autoBom && 98 | /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { 99 | return new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type }); 100 | } 101 | return blob; 102 | } 103 | function download(url, name, opts) { 104 | const xhr = new XMLHttpRequest(); 105 | xhr.open('GET', url); 106 | xhr.responseType = 'blob'; 107 | xhr.onload = function () { 108 | saveAs(xhr.response, name, opts); 109 | }; 110 | xhr.onerror = function () { 111 | console.error('could not download file'); 112 | }; 113 | xhr.send(); 114 | } 115 | function corsEnabled(url) { 116 | const xhr = new XMLHttpRequest(); 117 | // use sync to avoid popup blocker 118 | xhr.open('HEAD', url, false); 119 | try { 120 | xhr.send(); 121 | } 122 | catch (e) { } 123 | return xhr.status >= 200 && xhr.status <= 299; 124 | } 125 | // `a.click()` doesn't work for all browsers (#465) 126 | function click(node) { 127 | try { 128 | node.dispatchEvent(new MouseEvent('click')); 129 | } 130 | catch (e) { 131 | const evt = document.createEvent('MouseEvents'); 132 | evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); 133 | node.dispatchEvent(evt); 134 | } 135 | } 136 | const _navigator = 137 | typeof navigator === 'object' ? navigator : { userAgent: '' }; 138 | // Detect WebView inside a native macOS app by ruling out all browsers 139 | // We just need to check for 'Safari' because all other browsers (besides Firefox) include that too 140 | // https://www.whatismybrowser.com/guides/the-latest-user-agent/macos 141 | const isMacOSWebView = /*#__PURE__*/ (() => /Macintosh/.test(_navigator.userAgent) && 142 | /AppleWebKit/.test(_navigator.userAgent) && 143 | !/Safari/.test(_navigator.userAgent))(); 144 | const saveAs = !IS_CLIENT 145 | ? () => { } // noop 146 | : // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program 147 | typeof HTMLAnchorElement !== 'undefined' && 148 | 'download' in HTMLAnchorElement.prototype && 149 | !isMacOSWebView 150 | ? downloadSaveAs 151 | : // Use msSaveOrOpenBlob as a second approach 152 | 'msSaveOrOpenBlob' in _navigator 153 | ? msSaveAs 154 | : // Fallback to using FileReader and a popup 155 | fileSaverSaveAs; 156 | function downloadSaveAs(blob, name = 'download', opts) { 157 | const a = document.createElement('a'); 158 | a.download = name; 159 | a.rel = 'noopener'; // tabnabbing 160 | // TODO: detect chrome extensions & packaged apps 161 | // a.target = '_blank' 162 | if (typeof blob === 'string') { 163 | // Support regular links 164 | a.href = blob; 165 | if (a.origin !== location.origin) { 166 | if (corsEnabled(a.href)) { 167 | download(blob, name, opts); 168 | } 169 | else { 170 | a.target = '_blank'; 171 | click(a); 172 | } 173 | } 174 | else { 175 | click(a); 176 | } 177 | } 178 | else { 179 | // Support blobs 180 | a.href = URL.createObjectURL(blob); 181 | setTimeout(function () { 182 | URL.revokeObjectURL(a.href); 183 | }, 4e4); // 40s 184 | setTimeout(function () { 185 | click(a); 186 | }, 0); 187 | } 188 | } 189 | function msSaveAs(blob, name = 'download', opts) { 190 | if (typeof blob === 'string') { 191 | if (corsEnabled(blob)) { 192 | download(blob, name, opts); 193 | } 194 | else { 195 | const a = document.createElement('a'); 196 | a.href = blob; 197 | a.target = '_blank'; 198 | setTimeout(function () { 199 | click(a); 200 | }); 201 | } 202 | } 203 | else { 204 | // @ts-ignore: works on windows 205 | navigator.msSaveOrOpenBlob(bom(blob, opts), name); 206 | } 207 | } 208 | function fileSaverSaveAs(blob, name, opts, popup) { 209 | // Open a popup immediately do go around popup blocker 210 | // Mostly only available on user interaction and the fileReader is async so... 211 | popup = popup || open('', '_blank'); 212 | if (popup) { 213 | popup.document.title = popup.document.body.innerText = 'downloading...'; 214 | } 215 | if (typeof blob === 'string') 216 | return download(blob, name, opts); 217 | const force = blob.type === 'application/octet-stream'; 218 | const isSafari = /constructor/i.test(String(_global.HTMLElement)) || 'safari' in _global; 219 | const isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent); 220 | if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && 221 | typeof FileReader !== 'undefined') { 222 | // Safari doesn't allow downloading of blob URLs 223 | const reader = new FileReader(); 224 | reader.onloadend = function () { 225 | let url = reader.result; 226 | if (typeof url !== 'string') { 227 | popup = null; 228 | throw new Error('Wrong reader.result type'); 229 | } 230 | url = isChromeIOS 231 | ? url 232 | : url.replace(/^data:[^;]*;/, 'data:attachment/file;'); 233 | if (popup) { 234 | popup.location.href = url; 235 | } 236 | else { 237 | location.assign(url); 238 | } 239 | popup = null; // reverse-tabnabbing #460 240 | }; 241 | reader.readAsDataURL(blob); 242 | } 243 | else { 244 | const url = URL.createObjectURL(blob); 245 | if (popup) 246 | popup.location.assign(url); 247 | else 248 | location.href = url; 249 | popup = null; // reverse-tabnabbing #460 250 | setTimeout(function () { 251 | URL.revokeObjectURL(url); 252 | }, 4e4); // 40s 253 | } 254 | } 255 | 256 | /** 257 | * Shows a toast or console.log 258 | * 259 | * @param message - message to log 260 | * @param type - different color of the tooltip 261 | */ 262 | function toastMessage(message, type) { 263 | const piniaMessage = '🍍 ' + message; 264 | if (typeof __VUE_DEVTOOLS_TOAST__ === 'function') { 265 | // No longer available :( 266 | __VUE_DEVTOOLS_TOAST__(piniaMessage, type); 267 | } 268 | else if (type === 'error') { 269 | console.error(piniaMessage); 270 | } 271 | else if (type === 'warn') { 272 | console.warn(piniaMessage); 273 | } 274 | else { 275 | console.log(piniaMessage); 276 | } 277 | } 278 | function isPinia(o) { 279 | return '_a' in o && 'install' in o; 280 | } 281 | 282 | /** 283 | * This file contain devtools actions, they are not Pinia actions. 284 | */ 285 | // --- 286 | function checkClipboardAccess() { 287 | if (!('clipboard' in navigator)) { 288 | toastMessage(`Your browser doesn't support the Clipboard API`, 'error'); 289 | return true; 290 | } 291 | } 292 | function checkNotFocusedError(error) { 293 | if (error instanceof Error && 294 | error.message.toLowerCase().includes('document is not focused')) { 295 | toastMessage('You need to activate the "Emulate a focused page" setting in the "Rendering" panel of devtools.', 'warn'); 296 | return true; 297 | } 298 | return false; 299 | } 300 | async function actionGlobalCopyState(pinia) { 301 | if (checkClipboardAccess()) 302 | return; 303 | try { 304 | await navigator.clipboard.writeText(JSON.stringify(pinia.state.value)); 305 | toastMessage('Global state copied to clipboard.'); 306 | } 307 | catch (error) { 308 | if (checkNotFocusedError(error)) 309 | return; 310 | toastMessage(`Failed to serialize the state. Check the console for more details.`, 'error'); 311 | console.error(error); 312 | } 313 | } 314 | async function actionGlobalPasteState(pinia) { 315 | if (checkClipboardAccess()) 316 | return; 317 | try { 318 | loadStoresState(pinia, JSON.parse(await navigator.clipboard.readText())); 319 | toastMessage('Global state pasted from clipboard.'); 320 | } 321 | catch (error) { 322 | if (checkNotFocusedError(error)) 323 | return; 324 | toastMessage(`Failed to deserialize the state from clipboard. Check the console for more details.`, 'error'); 325 | console.error(error); 326 | } 327 | } 328 | async function actionGlobalSaveState(pinia) { 329 | try { 330 | saveAs(new Blob([JSON.stringify(pinia.state.value)], { 331 | type: 'text/plain;charset=utf-8', 332 | }), 'pinia-state.json'); 333 | } 334 | catch (error) { 335 | toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error'); 336 | console.error(error); 337 | } 338 | } 339 | let fileInput; 340 | function getFileOpener() { 341 | if (!fileInput) { 342 | fileInput = document.createElement('input'); 343 | fileInput.type = 'file'; 344 | fileInput.accept = '.json'; 345 | } 346 | function openFile() { 347 | return new Promise((resolve, reject) => { 348 | fileInput.onchange = async () => { 349 | const files = fileInput.files; 350 | if (!files) 351 | return resolve(null); 352 | const file = files.item(0); 353 | if (!file) 354 | return resolve(null); 355 | return resolve({ text: await file.text(), file }); 356 | }; 357 | // @ts-ignore: TODO: changed from 4.3 to 4.4 358 | fileInput.oncancel = () => resolve(null); 359 | fileInput.onerror = reject; 360 | fileInput.click(); 361 | }); 362 | } 363 | return openFile; 364 | } 365 | async function actionGlobalOpenStateFile(pinia) { 366 | try { 367 | const open = getFileOpener(); 368 | const result = await open(); 369 | if (!result) 370 | return; 371 | const { text, file } = result; 372 | loadStoresState(pinia, JSON.parse(text)); 373 | toastMessage(`Global state imported from "${file.name}".`); 374 | } 375 | catch (error) { 376 | toastMessage(`Failed to import the state from JSON. Check the console for more details.`, 'error'); 377 | console.error(error); 378 | } 379 | } 380 | function loadStoresState(pinia, state) { 381 | for (const key in state) { 382 | const storeState = pinia.state.value[key]; 383 | // store is already instantiated, patch it 384 | if (storeState) { 385 | Object.assign(storeState, state[key]); 386 | } 387 | else { 388 | // store is not instantiated, set the initial state 389 | pinia.state.value[key] = state[key]; 390 | } 391 | } 392 | } 393 | 394 | function formatDisplay(display) { 395 | return { 396 | _custom: { 397 | display, 398 | }, 399 | }; 400 | } 401 | const PINIA_ROOT_LABEL = '🍍 Pinia (root)'; 402 | const PINIA_ROOT_ID = '_root'; 403 | function formatStoreForInspectorTree(store) { 404 | return isPinia(store) 405 | ? { 406 | id: PINIA_ROOT_ID, 407 | label: PINIA_ROOT_LABEL, 408 | } 409 | : { 410 | id: store.$id, 411 | label: store.$id, 412 | }; 413 | } 414 | function formatStoreForInspectorState(store) { 415 | if (isPinia(store)) { 416 | const storeNames = Array.from(store._s.keys()); 417 | const storeMap = store._s; 418 | const state = { 419 | state: storeNames.map((storeId) => ({ 420 | editable: true, 421 | key: storeId, 422 | value: store.state.value[storeId], 423 | })), 424 | getters: storeNames 425 | .filter((id) => storeMap.get(id)._getters) 426 | .map((id) => { 427 | const store = storeMap.get(id); 428 | return { 429 | editable: false, 430 | key: id, 431 | value: store._getters.reduce((getters, key) => { 432 | getters[key] = store[key]; 433 | return getters; 434 | }, {}), 435 | }; 436 | }), 437 | }; 438 | return state; 439 | } 440 | const state = { 441 | state: Object.keys(store.$state).map((key) => ({ 442 | editable: true, 443 | key, 444 | value: store.$state[key], 445 | })), 446 | }; 447 | // avoid adding empty getters 448 | if (store._getters && store._getters.length) { 449 | state.getters = store._getters.map((getterName) => ({ 450 | editable: false, 451 | key: getterName, 452 | value: store[getterName], 453 | })); 454 | } 455 | if (store._customProperties.size) { 456 | state.customProperties = Array.from(store._customProperties).map((key) => ({ 457 | editable: true, 458 | key, 459 | value: store[key], 460 | })); 461 | } 462 | return state; 463 | } 464 | function formatEventData(events) { 465 | if (!events) 466 | return {}; 467 | if (Array.isArray(events)) { 468 | // TODO: handle add and delete for arrays and objects 469 | return events.reduce((data, event) => { 470 | data.keys.push(event.key); 471 | data.operations.push(event.type); 472 | data.oldValue[event.key] = event.oldValue; 473 | data.newValue[event.key] = event.newValue; 474 | return data; 475 | }, { 476 | oldValue: {}, 477 | keys: [], 478 | operations: [], 479 | newValue: {}, 480 | }); 481 | } 482 | else { 483 | return { 484 | operation: formatDisplay(events.type), 485 | key: formatDisplay(events.key), 486 | oldValue: events.oldValue, 487 | newValue: events.newValue, 488 | }; 489 | } 490 | } 491 | function formatMutationType(type) { 492 | switch (type) { 493 | case MutationType.direct: 494 | return 'mutation'; 495 | case MutationType.patchFunction: 496 | return '$patch'; 497 | case MutationType.patchObject: 498 | return '$patch'; 499 | default: 500 | return 'unknown'; 501 | } 502 | } 503 | 504 | // timeline can be paused when directly changing the state 505 | let isTimelineActive = true; 506 | const componentStateTypes = []; 507 | const MUTATIONS_LAYER_ID = 'pinia:mutations'; 508 | const INSPECTOR_ID = 'pinia'; 509 | const { assign: assign$1 } = Object; 510 | /** 511 | * Gets the displayed name of a store in devtools 512 | * 513 | * @param id - id of the store 514 | * @returns a formatted string 515 | */ 516 | const getStoreType = (id) => '🍍 ' + id; 517 | /** 518 | * Add the pinia plugin without any store. Allows displaying a Pinia plugin tab 519 | * as soon as it is added to the application. 520 | * 521 | * @param app - Vue application 522 | * @param pinia - pinia instance 523 | */ 524 | export function registerPiniaDevtools(app, pinia) { 525 | setupDevtoolsPlugin({ 526 | id: 'dev.esm.pinia', 527 | label: 'Pinia 🍍', 528 | logo: 'https://pinia.vuejs.org/logo.svg', 529 | packageName: 'pinia', 530 | homepage: 'https://pinia.vuejs.org', 531 | componentStateTypes, 532 | app, 533 | }, (api) => { 534 | if (typeof api.now !== 'function') { 535 | toastMessage('You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.'); 536 | } 537 | api.addTimelineLayer({ 538 | id: MUTATIONS_LAYER_ID, 539 | label: `Pinia 🍍`, 540 | color: 0xe5df88, 541 | }); 542 | api.addInspector({ 543 | id: INSPECTOR_ID, 544 | label: 'Pinia 🍍', 545 | icon: 'storage', 546 | treeFilterPlaceholder: 'Search stores', 547 | actions: [ 548 | { 549 | icon: 'content_copy', 550 | action: () => { 551 | actionGlobalCopyState(pinia); 552 | }, 553 | tooltip: 'Serialize and copy the state', 554 | }, 555 | { 556 | icon: 'content_paste', 557 | action: async () => { 558 | await actionGlobalPasteState(pinia); 559 | api.sendInspectorTree(INSPECTOR_ID); 560 | api.sendInspectorState(INSPECTOR_ID); 561 | }, 562 | tooltip: 'Replace the state with the content of your clipboard', 563 | }, 564 | { 565 | icon: 'save', 566 | action: () => { 567 | actionGlobalSaveState(pinia); 568 | }, 569 | tooltip: 'Save the state as a JSON file', 570 | }, 571 | { 572 | icon: 'folder_open', 573 | action: async () => { 574 | await actionGlobalOpenStateFile(pinia); 575 | api.sendInspectorTree(INSPECTOR_ID); 576 | api.sendInspectorState(INSPECTOR_ID); 577 | }, 578 | tooltip: 'Import the state from a JSON file', 579 | }, 580 | ], 581 | nodeActions: [ 582 | { 583 | icon: 'restore', 584 | tooltip: 'Reset the state (with "$reset")', 585 | action: (nodeId) => { 586 | const store = pinia._s.get(nodeId); 587 | if (!store) { 588 | toastMessage(`Cannot reset "${nodeId}" store because it wasn't found.`, 'warn'); 589 | } 590 | else if (typeof store.$reset !== 'function') { 591 | toastMessage(`Cannot reset "${nodeId}" store because it doesn't have a "$reset" method implemented.`, 'warn'); 592 | } 593 | else { 594 | store.$reset(); 595 | toastMessage(`Store "${nodeId}" reset.`); 596 | } 597 | }, 598 | }, 599 | ], 600 | }); 601 | api.on.inspectComponent((payload, ctx) => { 602 | const proxy = (payload.componentInstance && 603 | payload.componentInstance.proxy); 604 | if (proxy && proxy._pStores) { 605 | const piniaStores = payload.componentInstance.proxy._pStores; 606 | Object.values(piniaStores).forEach((store) => { 607 | payload.instanceData.state.push({ 608 | type: getStoreType(store.$id), 609 | key: 'state', 610 | editable: true, 611 | value: store._isOptionsAPI 612 | ? { 613 | _custom: { 614 | value: toRaw(store.$state), 615 | actions: [ 616 | { 617 | icon: 'restore', 618 | tooltip: 'Reset the state of this store', 619 | action: () => store.$reset(), 620 | }, 621 | ], 622 | }, 623 | } 624 | : // NOTE: workaround to unwrap transferred refs 625 | Object.keys(store.$state).reduce((state, key) => { 626 | state[key] = store.$state[key]; 627 | return state; 628 | }, {}), 629 | }); 630 | if (store._getters && store._getters.length) { 631 | payload.instanceData.state.push({ 632 | type: getStoreType(store.$id), 633 | key: 'getters', 634 | editable: false, 635 | value: store._getters.reduce((getters, key) => { 636 | try { 637 | getters[key] = store[key]; 638 | } 639 | catch (error) { 640 | // @ts-expect-error: we just want to show it in devtools 641 | getters[key] = error; 642 | } 643 | return getters; 644 | }, {}), 645 | }); 646 | } 647 | }); 648 | } 649 | }); 650 | api.on.getInspectorTree((payload) => { 651 | if (payload.app === app && payload.inspectorId === INSPECTOR_ID) { 652 | let stores = [pinia]; 653 | stores = stores.concat(Array.from(pinia._s.values())); 654 | payload.rootNodes = (payload.filter 655 | ? stores.filter((store) => '$id' in store 656 | ? store.$id 657 | .toLowerCase() 658 | .includes(payload.filter.toLowerCase()) 659 | : PINIA_ROOT_LABEL.toLowerCase().includes(payload.filter.toLowerCase())) 660 | : stores).map(formatStoreForInspectorTree); 661 | } 662 | }); 663 | api.on.getInspectorState((payload) => { 664 | if (payload.app === app && payload.inspectorId === INSPECTOR_ID) { 665 | const inspectedStore = payload.nodeId === PINIA_ROOT_ID 666 | ? pinia 667 | : pinia._s.get(payload.nodeId); 668 | if (!inspectedStore) { 669 | // this could be the selected store restored for a different project 670 | // so it's better not to say anything here 671 | return; 672 | } 673 | if (inspectedStore) { 674 | payload.state = formatStoreForInspectorState(inspectedStore); 675 | } 676 | } 677 | }); 678 | api.on.editInspectorState((payload, ctx) => { 679 | if (payload.app === app && payload.inspectorId === INSPECTOR_ID) { 680 | const inspectedStore = payload.nodeId === PINIA_ROOT_ID 681 | ? pinia 682 | : pinia._s.get(payload.nodeId); 683 | if (!inspectedStore) { 684 | return toastMessage(`store "${payload.nodeId}" not found`, 'error'); 685 | } 686 | const { path } = payload; 687 | if (!isPinia(inspectedStore)) { 688 | // access only the state 689 | if (path.length !== 1 || 690 | !inspectedStore._customProperties.has(path[0]) || 691 | path[0] in inspectedStore.$state) { 692 | path.unshift('$state'); 693 | } 694 | } 695 | else { 696 | // Root access, we can omit the `.value` because the devtools API does it for us 697 | path.unshift('state'); 698 | } 699 | isTimelineActive = false; 700 | payload.set(inspectedStore, path, payload.state.value); 701 | isTimelineActive = true; 702 | } 703 | }); 704 | api.on.editComponentState((payload) => { 705 | if (payload.type.startsWith('🍍')) { 706 | const storeId = payload.type.replace(/^🍍\s*/, ''); 707 | const store = pinia._s.get(storeId); 708 | if (!store) { 709 | return toastMessage(`store "${storeId}" not found`, 'error'); 710 | } 711 | const { path } = payload; 712 | if (path[0] !== 'state') { 713 | return toastMessage(`Invalid path for store "${storeId}":\n${path}\nOnly state can be modified.`); 714 | } 715 | // rewrite the first entry to be able to directly set the state as 716 | // well as any other path 717 | path[0] = '$state'; 718 | isTimelineActive = false; 719 | payload.set(store, path, payload.state.value); 720 | isTimelineActive = true; 721 | } 722 | }); 723 | }); 724 | } 725 | function addStoreToDevtools(app, store) { 726 | if (!componentStateTypes.includes(getStoreType(store.$id))) { 727 | componentStateTypes.push(getStoreType(store.$id)); 728 | } 729 | setupDevtoolsPlugin({ 730 | id: 'dev.esm.pinia', 731 | label: 'Pinia 🍍', 732 | logo: 'https://pinia.vuejs.org/logo.svg', 733 | packageName: 'pinia', 734 | homepage: 'https://pinia.vuejs.org', 735 | componentStateTypes, 736 | app, 737 | settings: { 738 | logStoreChanges: { 739 | label: 'Notify about new/deleted stores', 740 | type: 'boolean', 741 | defaultValue: true, 742 | }, 743 | // useEmojis: { 744 | // label: 'Use emojis in messages ⚡️', 745 | // type: 'boolean', 746 | // defaultValue: true, 747 | // }, 748 | }, 749 | }, (api) => { 750 | // gracefully handle errors 751 | const now = typeof api.now === 'function' ? api.now.bind(api) : Date.now; 752 | store.$onAction(({ after, onError, name, args }) => { 753 | const groupId = runningActionId++; 754 | api.addTimelineEvent({ 755 | layerId: MUTATIONS_LAYER_ID, 756 | event: { 757 | time: now(), 758 | title: '🛫 ' + name, 759 | subtitle: 'start', 760 | data: { 761 | store: formatDisplay(store.$id), 762 | action: formatDisplay(name), 763 | args, 764 | }, 765 | groupId, 766 | }, 767 | }); 768 | after((result) => { 769 | activeAction = undefined; 770 | api.addTimelineEvent({ 771 | layerId: MUTATIONS_LAYER_ID, 772 | event: { 773 | time: now(), 774 | title: '🛬 ' + name, 775 | subtitle: 'end', 776 | data: { 777 | store: formatDisplay(store.$id), 778 | action: formatDisplay(name), 779 | args, 780 | result, 781 | }, 782 | groupId, 783 | }, 784 | }); 785 | }); 786 | onError((error) => { 787 | activeAction = undefined; 788 | api.addTimelineEvent({ 789 | layerId: MUTATIONS_LAYER_ID, 790 | event: { 791 | time: now(), 792 | logType: 'error', 793 | title: '💥 ' + name, 794 | subtitle: 'end', 795 | data: { 796 | store: formatDisplay(store.$id), 797 | action: formatDisplay(name), 798 | args, 799 | error, 800 | }, 801 | groupId, 802 | }, 803 | }); 804 | }); 805 | }, true); 806 | store._customProperties.forEach((name) => { 807 | watch(() => unref(store[name]), (newValue, oldValue) => { 808 | api.notifyComponentUpdate(); 809 | api.sendInspectorState(INSPECTOR_ID); 810 | if (isTimelineActive) { 811 | api.addTimelineEvent({ 812 | layerId: MUTATIONS_LAYER_ID, 813 | event: { 814 | time: now(), 815 | title: 'Change', 816 | subtitle: name, 817 | data: { 818 | newValue, 819 | oldValue, 820 | }, 821 | groupId: activeAction, 822 | }, 823 | }); 824 | } 825 | }, { deep: true }); 826 | }); 827 | store.$subscribe(({ events, type }, state) => { 828 | api.notifyComponentUpdate(); 829 | api.sendInspectorState(INSPECTOR_ID); 830 | if (!isTimelineActive) 831 | return; 832 | // rootStore.state[store.id] = state 833 | const eventData = { 834 | time: now(), 835 | title: formatMutationType(type), 836 | data: assign$1({ store: formatDisplay(store.$id) }, formatEventData(events)), 837 | groupId: activeAction, 838 | }; 839 | if (type === MutationType.patchFunction) { 840 | eventData.subtitle = '⤵️'; 841 | } 842 | else if (type === MutationType.patchObject) { 843 | eventData.subtitle = '🧩'; 844 | } 845 | else if (events && !Array.isArray(events)) { 846 | eventData.subtitle = events.type; 847 | } 848 | if (events) { 849 | eventData.data['rawEvent(s)'] = { 850 | _custom: { 851 | display: 'DebuggerEvent', 852 | type: 'object', 853 | tooltip: 'raw DebuggerEvent[]', 854 | value: events, 855 | }, 856 | }; 857 | } 858 | api.addTimelineEvent({ 859 | layerId: MUTATIONS_LAYER_ID, 860 | event: eventData, 861 | }); 862 | }, { detached: true, flush: 'sync' }); 863 | const hotUpdate = store._hotUpdate; 864 | store._hotUpdate = markRaw((newStore) => { 865 | hotUpdate(newStore); 866 | api.addTimelineEvent({ 867 | layerId: MUTATIONS_LAYER_ID, 868 | event: { 869 | time: now(), 870 | title: '🔥 ' + store.$id, 871 | subtitle: 'HMR update', 872 | data: { 873 | store: formatDisplay(store.$id), 874 | info: formatDisplay(`HMR update`), 875 | }, 876 | }, 877 | }); 878 | // update the devtools too 879 | api.notifyComponentUpdate(); 880 | api.sendInspectorTree(INSPECTOR_ID); 881 | api.sendInspectorState(INSPECTOR_ID); 882 | }); 883 | const { $dispose } = store; 884 | store.$dispose = () => { 885 | $dispose(); 886 | api.notifyComponentUpdate(); 887 | api.sendInspectorTree(INSPECTOR_ID); 888 | api.sendInspectorState(INSPECTOR_ID); 889 | api.getSettings().logStoreChanges && 890 | toastMessage(`Disposed "${store.$id}" store 🗑`); 891 | }; 892 | // trigger an update so it can display new registered stores 893 | api.notifyComponentUpdate(); 894 | api.sendInspectorTree(INSPECTOR_ID); 895 | api.sendInspectorState(INSPECTOR_ID); 896 | api.getSettings().logStoreChanges && 897 | toastMessage(`"${store.$id}" store installed 🆕`); 898 | }); 899 | } 900 | let runningActionId = 0; 901 | let activeAction; 902 | /** 903 | * Patches a store to enable action grouping in devtools by wrapping the store with a Proxy that is passed as the 904 | * context of all actions, allowing us to set `runningAction` on each access and effectively associating any state 905 | * mutation to the action. 906 | * 907 | * @param store - store to patch 908 | * @param actionNames - list of actionst to patch 909 | */ 910 | function patchActionForGrouping(store, actionNames, wrapWithProxy) { 911 | // original actions of the store as they are given by pinia. We are going to override them 912 | const actions = actionNames.reduce((storeActions, actionName) => { 913 | // use toRaw to avoid tracking #541 914 | storeActions[actionName] = toRaw(store)[actionName]; 915 | return storeActions; 916 | }, {}); 917 | for (const actionName in actions) { 918 | store[actionName] = function () { 919 | // the running action id is incremented in a before action hook 920 | const _actionId = runningActionId; 921 | const trackedStore = wrapWithProxy 922 | ? new Proxy(store, { 923 | get(...args) { 924 | activeAction = _actionId; 925 | return Reflect.get(...args); 926 | }, 927 | set(...args) { 928 | activeAction = _actionId; 929 | return Reflect.set(...args); 930 | }, 931 | }) 932 | : store; 933 | // For Setup Stores we need https://github.com/tc39/proposal-async-context 934 | activeAction = _actionId; 935 | const retValue = actions[actionName].apply(trackedStore, arguments); 936 | // this is safer as async actions in Setup Stores would associate mutations done outside of the action 937 | activeAction = undefined; 938 | return retValue; 939 | }; 940 | } 941 | } 942 | /** 943 | * pinia.use(devtoolsPlugin) 944 | */ 945 | export function devtoolsPlugin({ app, store, options }) { 946 | // HMR module 947 | if (store.$id.startsWith('__hot:')) { 948 | return; 949 | } 950 | // detect option api vs setup api 951 | store._isOptionsAPI = !!options.state; 952 | patchActionForGrouping(store, Object.keys(options.actions), store._isOptionsAPI); 953 | // Upgrade the HMR to also update the new actions 954 | const originalHotUpdate = store._hotUpdate; 955 | toRaw(store)._hotUpdate = function (newStore) { 956 | originalHotUpdate.apply(this, arguments); 957 | patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions), !!store._isOptionsAPI); 958 | }; 959 | addStoreToDevtools(app, 960 | // FIXME: is there a way to allow the assignment from Store to StoreGeneric? 961 | store); 962 | } 963 | 964 | /** 965 | * Creates a Pinia instance to be used by the application 966 | */ 967 | function createPinia() { 968 | const scope = effectScope(true); 969 | // NOTE: here we could check the window object for a state and directly set it 970 | // if there is anything like it with Vue 3 SSR 971 | const state = scope.run(() => ref({})); 972 | let _p = []; 973 | // plugins added before calling app.use(pinia) 974 | let toBeInstalled = []; 975 | const pinia = markRaw({ 976 | install(app) { 977 | // this allows calling useStore() outside of a component setup after 978 | // installing pinia's plugin 979 | setActivePinia(pinia); 980 | if (!isVue2) { 981 | pinia._a = app; 982 | app.provide(piniaSymbol, pinia); 983 | app.config.globalProperties.$pinia = pinia; 984 | /* istanbul ignore else */ 985 | if (USE_DEVTOOLS) { 986 | registerPiniaDevtools(app, pinia); 987 | } 988 | toBeInstalled.forEach((plugin) => _p.push(plugin)); 989 | toBeInstalled = []; 990 | } 991 | }, 992 | use(plugin) { 993 | if (!this._a && !isVue2) { 994 | toBeInstalled.push(plugin); 995 | } 996 | else { 997 | _p.push(plugin); 998 | } 999 | return this; 1000 | }, 1001 | _p, 1002 | // it's actually undefined here 1003 | // @ts-expect-error 1004 | _a: null, 1005 | _e: scope, 1006 | _s: new Map(), 1007 | state, 1008 | }); 1009 | // pinia devtools rely on dev only features so they cannot be forced unless 1010 | // the dev build of Vue is used. Avoid old browsers like IE11. 1011 | if (USE_DEVTOOLS && typeof Proxy !== 'undefined') { 1012 | pinia.use(devtoolsPlugin); 1013 | } 1014 | return pinia; 1015 | } 1016 | 1017 | /** 1018 | * Checks if a function is a `StoreDefinition`. 1019 | * 1020 | * @param fn - object to test 1021 | * @returns true if `fn` is a StoreDefinition 1022 | */ 1023 | const isUseStore = (fn) => { 1024 | return typeof fn === 'function' && typeof fn.$id === 'string'; 1025 | }; 1026 | /** 1027 | * Mutates in place `newState` with `oldState` to _hot update_ it. It will 1028 | * remove any key not existing in `newState` and recursively merge plain 1029 | * objects. 1030 | * 1031 | * @param newState - new state object to be patched 1032 | * @param oldState - old state that should be used to patch newState 1033 | * @returns - newState 1034 | */ 1035 | function patchObject(newState, oldState) { 1036 | // no need to go through symbols because they cannot be serialized anyway 1037 | for (const key in oldState) { 1038 | const subPatch = oldState[key]; 1039 | // skip the whole sub tree 1040 | if (!(key in newState)) { 1041 | continue; 1042 | } 1043 | const targetValue = newState[key]; 1044 | if (isPlainObject(targetValue) && 1045 | isPlainObject(subPatch) && 1046 | !isRef(subPatch) && 1047 | !isReactive(subPatch)) { 1048 | newState[key] = patchObject(targetValue, subPatch); 1049 | } 1050 | else { 1051 | // objects are either a bit more complex (e.g. refs) or primitives, so we 1052 | // just set the whole thing 1053 | if (isVue2) { 1054 | set(newState, key, subPatch); 1055 | } 1056 | else { 1057 | newState[key] = subPatch; 1058 | } 1059 | } 1060 | } 1061 | return newState; 1062 | } 1063 | /** 1064 | * Creates an _accept_ function to pass to `import.meta.hot` in Vite applications. 1065 | * 1066 | * @example 1067 | * ```js 1068 | * const useUser = defineStore(...) 1069 | * if (import.meta.hot) { 1070 | * import.meta.hot.accept(acceptHMRUpdate(useUser, import.meta.hot)) 1071 | * } 1072 | * ``` 1073 | * 1074 | * @param initialUseStore - return of the defineStore to hot update 1075 | * @param hot - `import.meta.hot` 1076 | */ 1077 | function acceptHMRUpdate(initialUseStore, hot) { 1078 | // strip as much as possible from iife.prod 1079 | if (!(process.env.NODE_ENV !== 'production')) { 1080 | return () => { }; 1081 | } 1082 | return (newModule) => { 1083 | const pinia = hot.data.pinia || initialUseStore._pinia; 1084 | if (!pinia) { 1085 | // this store is still not used 1086 | return; 1087 | } 1088 | // preserve the pinia instance across loads 1089 | hot.data.pinia = pinia; 1090 | // console.log('got data', newStore) 1091 | for (const exportName in newModule) { 1092 | const useStore = newModule[exportName]; 1093 | // console.log('checking for', exportName) 1094 | if (isUseStore(useStore) && pinia._s.has(useStore.$id)) { 1095 | // console.log('Accepting update for', useStore.$id) 1096 | const id = useStore.$id; 1097 | if (id !== initialUseStore.$id) { 1098 | console.warn(`The id of the store changed from "${initialUseStore.$id}" to "${id}". Reloading.`); 1099 | // return import.meta.hot.invalidate() 1100 | return hot.invalidate(); 1101 | } 1102 | const existingStore = pinia._s.get(id); 1103 | if (!existingStore) { 1104 | console.log(`[Pinia]: skipping hmr because store doesn't exist yet`); 1105 | return; 1106 | } 1107 | useStore(pinia, existingStore); 1108 | } 1109 | } 1110 | }; 1111 | } 1112 | 1113 | const noop = () => { }; 1114 | function addSubscription(subscriptions, callback, detached, onCleanup = noop) { 1115 | subscriptions.push(callback); 1116 | const removeSubscription = () => { 1117 | const idx = subscriptions.indexOf(callback); 1118 | if (idx > -1) { 1119 | subscriptions.splice(idx, 1); 1120 | onCleanup(); 1121 | } 1122 | }; 1123 | if (!detached && getCurrentScope()) { 1124 | onScopeDispose(removeSubscription); 1125 | } 1126 | return removeSubscription; 1127 | } 1128 | function triggerSubscriptions(subscriptions, ...args) { 1129 | subscriptions.slice().forEach((callback) => { 1130 | callback(...args); 1131 | }); 1132 | } 1133 | 1134 | const fallbackRunWithContext = (fn) => fn(); 1135 | function mergeReactiveObjects(target, patchToApply) { 1136 | // Handle Map instances 1137 | if (target instanceof Map && patchToApply instanceof Map) { 1138 | patchToApply.forEach((value, key) => target.set(key, value)); 1139 | } 1140 | // Handle Set instances 1141 | if (target instanceof Set && patchToApply instanceof Set) { 1142 | patchToApply.forEach(target.add, target); 1143 | } 1144 | // no need to go through symbols because they cannot be serialized anyway 1145 | for (const key in patchToApply) { 1146 | if (!patchToApply.hasOwnProperty(key)) 1147 | continue; 1148 | const subPatch = patchToApply[key]; 1149 | const targetValue = target[key]; 1150 | if (isPlainObject(targetValue) && 1151 | isPlainObject(subPatch) && 1152 | target.hasOwnProperty(key) && 1153 | !isRef(subPatch) && 1154 | !isReactive(subPatch)) { 1155 | // NOTE: here I wanted to warn about inconsistent types but it's not possible because in setup stores one might 1156 | // start the value of a property as a certain type e.g. a Map, and then for some reason, during SSR, change that 1157 | // to `undefined`. When trying to hydrate, we want to override the Map with `undefined`. 1158 | target[key] = mergeReactiveObjects(targetValue, subPatch); 1159 | } 1160 | else { 1161 | // @ts-expect-error: subPatch is a valid value 1162 | target[key] = subPatch; 1163 | } 1164 | } 1165 | return target; 1166 | } 1167 | const skipHydrateSymbol = (process.env.NODE_ENV !== 'production') 1168 | ? Symbol('pinia:skipHydration') 1169 | : /* istanbul ignore next */ Symbol(); 1170 | const skipHydrateMap = /*#__PURE__*/ new WeakMap(); 1171 | /** 1172 | * Tells Pinia to skip the hydration process of a given object. This is useful in setup stores (only) when you return a 1173 | * stateful object in the store but it isn't really state. e.g. returning a router instance in a setup store. 1174 | * 1175 | * @param obj - target object 1176 | * @returns obj 1177 | */ 1178 | function skipHydrate(obj) { 1179 | return isVue2 1180 | ? // in @vue/composition-api, the refs are sealed so defineProperty doesn't work... 1181 | /* istanbul ignore next */ skipHydrateMap.set(obj, 1) && obj 1182 | : Object.defineProperty(obj, skipHydrateSymbol, {}); 1183 | } 1184 | /** 1185 | * Returns whether a value should be hydrated 1186 | * 1187 | * @param obj - target variable 1188 | * @returns true if `obj` should be hydrated 1189 | */ 1190 | function shouldHydrate(obj) { 1191 | return isVue2 1192 | ? /* istanbul ignore next */ !skipHydrateMap.has(obj) 1193 | : !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol); 1194 | } 1195 | const { assign } = Object; 1196 | function isComputed(o) { 1197 | return !!(isRef(o) && o.effect); 1198 | } 1199 | function createOptionsStore(id, options, pinia, hot) { 1200 | const { state, actions, getters } = options; 1201 | const initialState = pinia.state.value[id]; 1202 | let store; 1203 | function setup() { 1204 | if (!initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) { 1205 | /* istanbul ignore if */ 1206 | if (isVue2) { 1207 | set(pinia.state.value, id, state ? state() : {}); 1208 | } 1209 | else { 1210 | pinia.state.value[id] = state ? state() : {}; 1211 | } 1212 | } 1213 | // avoid creating a state in pinia.state.value 1214 | const localState = (process.env.NODE_ENV !== 'production') && hot 1215 | ? // use ref() to unwrap refs inside state TODO: check if this is still necessary 1216 | toRefs(ref(state ? state() : {}).value) 1217 | : toRefs(pinia.state.value[id]); 1218 | return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => { 1219 | if ((process.env.NODE_ENV !== 'production') && name in localState) { 1220 | console.warn(`[🍍]: A getter cannot have the same name as another state property. Rename one of them. Found with "${name}" in store "${id}".`); 1221 | } 1222 | computedGetters[name] = markRaw(computed(() => { 1223 | setActivePinia(pinia); 1224 | // it was created just before 1225 | const store = pinia._s.get(id); 1226 | // allow cross using stores 1227 | /* istanbul ignore next */ 1228 | if (isVue2 && !store._r) 1229 | return; 1230 | // @ts-expect-error 1231 | // return getters![name].call(context, context) 1232 | // TODO: avoid reading the getter while assigning with a global variable 1233 | return getters[name].call(store, store); 1234 | })); 1235 | return computedGetters; 1236 | }, {})); 1237 | } 1238 | store = createSetupStore(id, setup, options, pinia, hot, true); 1239 | return store; 1240 | } 1241 | function createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) { 1242 | let scope; 1243 | const optionsForPlugin = assign({ actions: {} }, options); 1244 | /* istanbul ignore if */ 1245 | if ((process.env.NODE_ENV !== 'production') && !pinia._e.active) { 1246 | throw new Error('Pinia destroyed'); 1247 | } 1248 | // watcher options for $subscribe 1249 | const $subscribeOptions = { 1250 | deep: true, 1251 | // flush: 'post', 1252 | }; 1253 | /* istanbul ignore else */ 1254 | if ((process.env.NODE_ENV !== 'production') && !isVue2) { 1255 | $subscribeOptions.onTrigger = (event) => { 1256 | /* istanbul ignore else */ 1257 | if (isListening) { 1258 | debuggerEvents = event; 1259 | // avoid triggering this while the store is being built and the state is being set in pinia 1260 | } 1261 | else if (isListening == false && !store._hotUpdating) { 1262 | // let patch send all the events together later 1263 | /* istanbul ignore else */ 1264 | if (Array.isArray(debuggerEvents)) { 1265 | debuggerEvents.push(event); 1266 | } 1267 | else { 1268 | console.error('🍍 debuggerEvents should be an array. This is most likely an internal Pinia bug.'); 1269 | } 1270 | } 1271 | }; 1272 | } 1273 | // internal state 1274 | let isListening; // set to true at the end 1275 | let isSyncListening; // set to true at the end 1276 | let subscriptions = []; 1277 | let actionSubscriptions = []; 1278 | let debuggerEvents; 1279 | const initialState = pinia.state.value[$id]; 1280 | // avoid setting the state for option stores if it is set 1281 | // by the setup 1282 | if (!isOptionsStore && !initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) { 1283 | /* istanbul ignore if */ 1284 | if (isVue2) { 1285 | set(pinia.state.value, $id, {}); 1286 | } 1287 | else { 1288 | pinia.state.value[$id] = {}; 1289 | } 1290 | } 1291 | const hotState = ref({}); 1292 | // avoid triggering too many listeners 1293 | // https://github.com/vuejs/pinia/issues/1129 1294 | let activeListener; 1295 | function $patch(partialStateOrMutator) { 1296 | let subscriptionMutation; 1297 | isListening = isSyncListening = false; 1298 | // reset the debugger events since patches are sync 1299 | /* istanbul ignore else */ 1300 | if ((process.env.NODE_ENV !== 'production')) { 1301 | debuggerEvents = []; 1302 | } 1303 | if (typeof partialStateOrMutator === 'function') { 1304 | partialStateOrMutator(pinia.state.value[$id]); 1305 | subscriptionMutation = { 1306 | type: MutationType.patchFunction, 1307 | storeId: $id, 1308 | events: debuggerEvents, 1309 | }; 1310 | } 1311 | else { 1312 | mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator); 1313 | subscriptionMutation = { 1314 | type: MutationType.patchObject, 1315 | payload: partialStateOrMutator, 1316 | storeId: $id, 1317 | events: debuggerEvents, 1318 | }; 1319 | } 1320 | const myListenerId = (activeListener = Symbol()); 1321 | nextTick().then(() => { 1322 | if (activeListener === myListenerId) { 1323 | isListening = true; 1324 | } 1325 | }); 1326 | isSyncListening = true; 1327 | // because we paused the watcher, we need to manually call the subscriptions 1328 | triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]); 1329 | } 1330 | const $reset = isOptionsStore 1331 | ? function $reset() { 1332 | const { state } = options; 1333 | const newState = state ? state() : {}; 1334 | // we use a patch to group all changes into one single subscription 1335 | this.$patch(($state) => { 1336 | assign($state, newState); 1337 | }); 1338 | } 1339 | : /* istanbul ignore next */ 1340 | (process.env.NODE_ENV !== 'production') 1341 | ? () => { 1342 | throw new Error(`🍍: Store "${$id}" is built using the setup syntax and does not implement $reset().`); 1343 | } 1344 | : noop; 1345 | function $dispose() { 1346 | scope.stop(); 1347 | subscriptions = []; 1348 | actionSubscriptions = []; 1349 | pinia._s.delete($id); 1350 | } 1351 | /** 1352 | * Wraps an action to handle subscriptions. 1353 | * 1354 | * @param name - name of the action 1355 | * @param action - action to wrap 1356 | * @returns a wrapped action to handle subscriptions 1357 | */ 1358 | function wrapAction(name, action) { 1359 | return function () { 1360 | setActivePinia(pinia); 1361 | const args = Array.from(arguments); 1362 | const afterCallbackList = []; 1363 | const onErrorCallbackList = []; 1364 | function after(callback) { 1365 | afterCallbackList.push(callback); 1366 | } 1367 | function onError(callback) { 1368 | onErrorCallbackList.push(callback); 1369 | } 1370 | // @ts-expect-error 1371 | triggerSubscriptions(actionSubscriptions, { 1372 | args, 1373 | name, 1374 | store, 1375 | after, 1376 | onError, 1377 | }); 1378 | let ret; 1379 | try { 1380 | ret = action.apply(this && this.$id === $id ? this : store, args); 1381 | // handle sync errors 1382 | } 1383 | catch (error) { 1384 | triggerSubscriptions(onErrorCallbackList, error); 1385 | throw error; 1386 | } 1387 | if (ret instanceof Promise) { 1388 | return ret 1389 | .then((value) => { 1390 | triggerSubscriptions(afterCallbackList, value); 1391 | return value; 1392 | }) 1393 | .catch((error) => { 1394 | triggerSubscriptions(onErrorCallbackList, error); 1395 | return Promise.reject(error); 1396 | }); 1397 | } 1398 | // trigger after callbacks 1399 | triggerSubscriptions(afterCallbackList, ret); 1400 | return ret; 1401 | }; 1402 | } 1403 | const _hmrPayload = /*#__PURE__*/ markRaw({ 1404 | actions: {}, 1405 | getters: {}, 1406 | state: [], 1407 | hotState, 1408 | }); 1409 | const partialStore = { 1410 | _p: pinia, 1411 | // _s: scope, 1412 | $id, 1413 | $onAction: addSubscription.bind(null, actionSubscriptions), 1414 | $patch, 1415 | $reset, 1416 | $subscribe(callback, options = {}) { 1417 | const removeSubscription = addSubscription(subscriptions, callback, options.detached, () => stopWatcher()); 1418 | const stopWatcher = scope.run(() => watch(() => pinia.state.value[$id], (state) => { 1419 | if (options.flush === 'sync' ? isSyncListening : isListening) { 1420 | callback({ 1421 | storeId: $id, 1422 | type: MutationType.direct, 1423 | events: debuggerEvents, 1424 | }, state); 1425 | } 1426 | }, assign({}, $subscribeOptions, options))); 1427 | return removeSubscription; 1428 | }, 1429 | $dispose, 1430 | }; 1431 | /* istanbul ignore if */ 1432 | if (isVue2) { 1433 | // start as non ready 1434 | partialStore._r = false; 1435 | } 1436 | const store = reactive((process.env.NODE_ENV !== 'production') || USE_DEVTOOLS 1437 | ? assign({ 1438 | _hmrPayload, 1439 | _customProperties: markRaw(new Set()), // devtools custom properties 1440 | }, partialStore 1441 | // must be added later 1442 | // setupStore 1443 | ) 1444 | : partialStore); 1445 | // store the partial store now so the setup of stores can instantiate each other before they are finished without 1446 | // creating infinite loops. 1447 | pinia._s.set($id, store); 1448 | const runWithContext = (pinia._a && pinia._a.runWithContext) || fallbackRunWithContext; 1449 | // TODO: idea create skipSerialize that marks properties as non serializable and they are skipped 1450 | const setupStore = runWithContext(() => pinia._e.run(() => (scope = effectScope()).run(setup))); 1451 | // overwrite existing actions to support $onAction 1452 | for (const key in setupStore) { 1453 | const prop = setupStore[key]; 1454 | if ((isRef(prop) && !isComputed(prop)) || isReactive(prop)) { 1455 | // mark it as a piece of state to be serialized 1456 | if ((process.env.NODE_ENV !== 'production') && hot) { 1457 | set(hotState.value, key, toRef(setupStore, key)); 1458 | // createOptionStore directly sets the state in pinia.state.value so we 1459 | // can just skip that 1460 | } 1461 | else if (!isOptionsStore) { 1462 | // in setup stores we must hydrate the state and sync pinia state tree with the refs the user just created 1463 | if (initialState && shouldHydrate(prop)) { 1464 | if (isRef(prop)) { 1465 | prop.value = initialState[key]; 1466 | } 1467 | else { 1468 | // probably a reactive object, lets recursively assign 1469 | // @ts-expect-error: prop is unknown 1470 | mergeReactiveObjects(prop, initialState[key]); 1471 | } 1472 | } 1473 | // transfer the ref to the pinia state to keep everything in sync 1474 | /* istanbul ignore if */ 1475 | if (isVue2) { 1476 | set(pinia.state.value[$id], key, prop); 1477 | } 1478 | else { 1479 | pinia.state.value[$id][key] = prop; 1480 | } 1481 | } 1482 | /* istanbul ignore else */ 1483 | if ((process.env.NODE_ENV !== 'production')) { 1484 | _hmrPayload.state.push(key); 1485 | } 1486 | // action 1487 | } 1488 | else if (typeof prop === 'function') { 1489 | // @ts-expect-error: we are overriding the function we avoid wrapping if 1490 | const actionValue = (process.env.NODE_ENV !== 'production') && hot ? prop : wrapAction(key, prop); 1491 | // this a hot module replacement store because the hotUpdate method needs 1492 | // to do it with the right context 1493 | /* istanbul ignore if */ 1494 | if (isVue2) { 1495 | set(setupStore, key, actionValue); 1496 | } 1497 | else { 1498 | // @ts-expect-error 1499 | setupStore[key] = actionValue; 1500 | } 1501 | /* istanbul ignore else */ 1502 | if ((process.env.NODE_ENV !== 'production')) { 1503 | _hmrPayload.actions[key] = prop; 1504 | } 1505 | // list actions so they can be used in plugins 1506 | // @ts-expect-error 1507 | optionsForPlugin.actions[key] = prop; 1508 | } 1509 | else if ((process.env.NODE_ENV !== 'production')) { 1510 | // add getters for devtools 1511 | if (isComputed(prop)) { 1512 | _hmrPayload.getters[key] = isOptionsStore 1513 | ? // @ts-expect-error 1514 | options.getters[key] 1515 | : prop; 1516 | if (IS_CLIENT) { 1517 | const getters = setupStore._getters || 1518 | // @ts-expect-error: same 1519 | (setupStore._getters = markRaw([])); 1520 | getters.push(key); 1521 | } 1522 | } 1523 | } 1524 | } 1525 | // add the state, getters, and action properties 1526 | /* istanbul ignore if */ 1527 | if (isVue2) { 1528 | Object.keys(setupStore).forEach((key) => { 1529 | set(store, key, setupStore[key]); 1530 | }); 1531 | } 1532 | else { 1533 | assign(store, setupStore); 1534 | // allows retrieving reactive objects with `storeToRefs()`. Must be called after assigning to the reactive object. 1535 | // Make `storeToRefs()` work with `reactive()` #799 1536 | assign(toRaw(store), setupStore); 1537 | } 1538 | // use this instead of a computed with setter to be able to create it anywhere 1539 | // without linking the computed lifespan to wherever the store is first 1540 | // created. 1541 | Object.defineProperty(store, '$state', { 1542 | get: () => ((process.env.NODE_ENV !== 'production') && hot ? hotState.value : pinia.state.value[$id]), 1543 | set: (state) => { 1544 | /* istanbul ignore if */ 1545 | if ((process.env.NODE_ENV !== 'production') && hot) { 1546 | throw new Error('cannot set hotState'); 1547 | } 1548 | $patch(($state) => { 1549 | assign($state, state); 1550 | }); 1551 | }, 1552 | }); 1553 | // add the hotUpdate before plugins to allow them to override it 1554 | /* istanbul ignore else */ 1555 | if ((process.env.NODE_ENV !== 'production')) { 1556 | store._hotUpdate = markRaw((newStore) => { 1557 | store._hotUpdating = true; 1558 | newStore._hmrPayload.state.forEach((stateKey) => { 1559 | if (stateKey in store.$state) { 1560 | const newStateTarget = newStore.$state[stateKey]; 1561 | const oldStateSource = store.$state[stateKey]; 1562 | if (typeof newStateTarget === 'object' && 1563 | isPlainObject(newStateTarget) && 1564 | isPlainObject(oldStateSource)) { 1565 | patchObject(newStateTarget, oldStateSource); 1566 | } 1567 | else { 1568 | // transfer the ref 1569 | newStore.$state[stateKey] = oldStateSource; 1570 | } 1571 | } 1572 | // patch direct access properties to allow store.stateProperty to work as 1573 | // store.$state.stateProperty 1574 | set(store, stateKey, toRef(newStore.$state, stateKey)); 1575 | }); 1576 | // remove deleted state properties 1577 | Object.keys(store.$state).forEach((stateKey) => { 1578 | if (!(stateKey in newStore.$state)) { 1579 | del(store, stateKey); 1580 | } 1581 | }); 1582 | // avoid devtools logging this as a mutation 1583 | isListening = false; 1584 | isSyncListening = false; 1585 | pinia.state.value[$id] = toRef(newStore._hmrPayload, 'hotState'); 1586 | isSyncListening = true; 1587 | nextTick().then(() => { 1588 | isListening = true; 1589 | }); 1590 | for (const actionName in newStore._hmrPayload.actions) { 1591 | const action = newStore[actionName]; 1592 | set(store, actionName, wrapAction(actionName, action)); 1593 | } 1594 | // TODO: does this work in both setup and option store? 1595 | for (const getterName in newStore._hmrPayload.getters) { 1596 | const getter = newStore._hmrPayload.getters[getterName]; 1597 | const getterValue = isOptionsStore 1598 | ? // special handling of options api 1599 | computed(() => { 1600 | setActivePinia(pinia); 1601 | return getter.call(store, store); 1602 | }) 1603 | : getter; 1604 | set(store, getterName, getterValue); 1605 | } 1606 | // remove deleted getters 1607 | Object.keys(store._hmrPayload.getters).forEach((key) => { 1608 | if (!(key in newStore._hmrPayload.getters)) { 1609 | del(store, key); 1610 | } 1611 | }); 1612 | // remove old actions 1613 | Object.keys(store._hmrPayload.actions).forEach((key) => { 1614 | if (!(key in newStore._hmrPayload.actions)) { 1615 | del(store, key); 1616 | } 1617 | }); 1618 | // update the values used in devtools and to allow deleting new properties later on 1619 | store._hmrPayload = newStore._hmrPayload; 1620 | store._getters = newStore._getters; 1621 | store._hotUpdating = false; 1622 | }); 1623 | } 1624 | if (USE_DEVTOOLS) { 1625 | const nonEnumerable = { 1626 | writable: true, 1627 | configurable: true, 1628 | // avoid warning on devtools trying to display this property 1629 | enumerable: false, 1630 | }; 1631 | ['_p', '_hmrPayload', '_getters', '_customProperties'].forEach((p) => { 1632 | Object.defineProperty(store, p, assign({ value: store[p] }, nonEnumerable)); 1633 | }); 1634 | } 1635 | /* istanbul ignore if */ 1636 | if (isVue2) { 1637 | // mark the store as ready before plugins 1638 | store._r = true; 1639 | } 1640 | // apply all plugins 1641 | pinia._p.forEach((extender) => { 1642 | /* istanbul ignore else */ 1643 | if (USE_DEVTOOLS) { 1644 | const extensions = scope.run(() => extender({ 1645 | store, 1646 | app: pinia._a, 1647 | pinia, 1648 | options: optionsForPlugin, 1649 | })); 1650 | Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key)); 1651 | assign(store, extensions); 1652 | } 1653 | else { 1654 | assign(store, scope.run(() => extender({ 1655 | store, 1656 | app: pinia._a, 1657 | pinia, 1658 | options: optionsForPlugin, 1659 | }))); 1660 | } 1661 | }); 1662 | if ((process.env.NODE_ENV !== 'production') && 1663 | store.$state && 1664 | typeof store.$state === 'object' && 1665 | typeof store.$state.constructor === 'function' && 1666 | !store.$state.constructor.toString().includes('[native code]')) { 1667 | console.warn(`[🍍]: The "state" must be a plain object. It cannot be\n` + 1668 | `\tstate: () => new MyClass()\n` + 1669 | `Found in store "${store.$id}".`); 1670 | } 1671 | // only apply hydrate to option stores with an initial state in pinia 1672 | if (initialState && 1673 | isOptionsStore && 1674 | options.hydrate) { 1675 | options.hydrate(store.$state, initialState); 1676 | } 1677 | isListening = true; 1678 | isSyncListening = true; 1679 | return store; 1680 | } 1681 | function defineStore( 1682 | // TODO: add proper types from above 1683 | idOrOptions, setup, setupOptions) { 1684 | let id; 1685 | let options; 1686 | const isSetupStore = typeof setup === 'function'; 1687 | if (typeof idOrOptions === 'string') { 1688 | id = idOrOptions; 1689 | // the option store setup will contain the actual options in this case 1690 | options = isSetupStore ? setupOptions : setup; 1691 | } 1692 | else { 1693 | options = idOrOptions; 1694 | id = idOrOptions.id; 1695 | if ((process.env.NODE_ENV !== 'production') && typeof id !== 'string') { 1696 | throw new Error(`[🍍]: "defineStore()" must be passed a store id as its first argument.`); 1697 | } 1698 | } 1699 | function useStore(pinia, hot) { 1700 | const hasContext = hasInjectionContext(); 1701 | pinia = 1702 | // in test mode, ignore the argument provided as we can always retrieve a 1703 | // pinia instance with getActivePinia() 1704 | ((process.env.NODE_ENV === 'test') && activePinia && activePinia._testing ? null : pinia) || 1705 | (hasContext ? inject(piniaSymbol, null) : null); 1706 | if (pinia) 1707 | setActivePinia(pinia); 1708 | if ((process.env.NODE_ENV !== 'production') && !activePinia) { 1709 | throw new Error(`[🍍]: "getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"?\n` + 1710 | `See https://pinia.vuejs.org/core-concepts/outside-component-usage.html for help.\n` + 1711 | `This will fail in production.`); 1712 | } 1713 | pinia = activePinia; 1714 | if (!pinia._s.has(id)) { 1715 | // creating the store registers it in `pinia._s` 1716 | if (isSetupStore) { 1717 | createSetupStore(id, setup, options, pinia); 1718 | } 1719 | else { 1720 | createOptionsStore(id, options, pinia); 1721 | } 1722 | /* istanbul ignore else */ 1723 | if ((process.env.NODE_ENV !== 'production')) { 1724 | // @ts-expect-error: not the right inferred type 1725 | useStore._pinia = pinia; 1726 | } 1727 | } 1728 | const store = pinia._s.get(id); 1729 | if ((process.env.NODE_ENV !== 'production') && hot) { 1730 | const hotId = '__hot:' + id; 1731 | const newStore = isSetupStore 1732 | ? createSetupStore(hotId, setup, options, pinia, true) 1733 | : createOptionsStore(hotId, assign({}, options), pinia, true); 1734 | hot._hotUpdate(newStore); 1735 | // cleanup the state properties and the store from the cache 1736 | delete pinia.state.value[hotId]; 1737 | pinia._s.delete(hotId); 1738 | } 1739 | if ((process.env.NODE_ENV !== 'production') && IS_CLIENT) { 1740 | const currentInstance = getCurrentInstance(); 1741 | // save stores in instances to access them devtools 1742 | if (currentInstance && 1743 | currentInstance.proxy && 1744 | // avoid adding stores that are just built for hot module replacement 1745 | !hot) { 1746 | const vm = currentInstance.proxy; 1747 | const cache = '_pStores' in vm ? vm._pStores : (vm._pStores = {}); 1748 | cache[id] = store; 1749 | } 1750 | } 1751 | // StoreGeneric cannot be casted towards Store 1752 | return store; 1753 | } 1754 | useStore.$id = id; 1755 | return useStore; 1756 | } 1757 | 1758 | let mapStoreSuffix = 'Store'; 1759 | /** 1760 | * Changes the suffix added by `mapStores()`. Can be set to an empty string. 1761 | * Defaults to `"Store"`. Make sure to extend the MapStoresCustomization 1762 | * interface if you are using TypeScript. 1763 | * 1764 | * @param suffix - new suffix 1765 | */ 1766 | function setMapStoreSuffix(suffix // could be 'Store' but that would be annoying for JS 1767 | ) { 1768 | mapStoreSuffix = suffix; 1769 | } 1770 | /** 1771 | * Allows using stores without the composition API (`setup()`) by generating an 1772 | * object to be spread in the `computed` field of a component. It accepts a list 1773 | * of store definitions. 1774 | * 1775 | * @example 1776 | * ```js 1777 | * export default { 1778 | * computed: { 1779 | * // other computed properties 1780 | * ...mapStores(useUserStore, useCartStore) 1781 | * }, 1782 | * 1783 | * created() { 1784 | * this.userStore // store with id "user" 1785 | * this.cartStore // store with id "cart" 1786 | * } 1787 | * } 1788 | * ``` 1789 | * 1790 | * @param stores - list of stores to map to an object 1791 | */ 1792 | function mapStores(...stores) { 1793 | if ((process.env.NODE_ENV !== 'production') && Array.isArray(stores[0])) { 1794 | console.warn(`[🍍]: Directly pass all stores to "mapStores()" without putting them in an array:\n` + 1795 | `Replace\n` + 1796 | `\tmapStores([useAuthStore, useCartStore])\n` + 1797 | `with\n` + 1798 | `\tmapStores(useAuthStore, useCartStore)\n` + 1799 | `This will fail in production if not fixed.`); 1800 | stores = stores[0]; 1801 | } 1802 | return stores.reduce((reduced, useStore) => { 1803 | // @ts-expect-error: $id is added by defineStore 1804 | reduced[useStore.$id + mapStoreSuffix] = function () { 1805 | return useStore(this.$pinia); 1806 | }; 1807 | return reduced; 1808 | }, {}); 1809 | } 1810 | /** 1811 | * Allows using state and getters from one store without using the composition 1812 | * API (`setup()`) by generating an object to be spread in the `computed` field 1813 | * of a component. 1814 | * 1815 | * @param useStore - store to map from 1816 | * @param keysOrMapper - array or object 1817 | */ 1818 | function mapState(useStore, keysOrMapper) { 1819 | return Array.isArray(keysOrMapper) 1820 | ? keysOrMapper.reduce((reduced, key) => { 1821 | reduced[key] = function () { 1822 | return useStore(this.$pinia)[key]; 1823 | }; 1824 | return reduced; 1825 | }, {}) 1826 | : Object.keys(keysOrMapper).reduce((reduced, key) => { 1827 | // @ts-expect-error 1828 | reduced[key] = function () { 1829 | const store = useStore(this.$pinia); 1830 | const storeKey = keysOrMapper[key]; 1831 | // for some reason TS is unable to infer the type of storeKey to be a 1832 | // function 1833 | return typeof storeKey === 'function' 1834 | ? storeKey.call(this, store) 1835 | : store[storeKey]; 1836 | }; 1837 | return reduced; 1838 | }, {}); 1839 | } 1840 | /** 1841 | * Alias for `mapState()`. You should use `mapState()` instead. 1842 | * @deprecated use `mapState()` instead. 1843 | */ 1844 | const mapGetters = mapState; 1845 | /** 1846 | * Allows directly using actions from your store without using the composition 1847 | * API (`setup()`) by generating an object to be spread in the `methods` field 1848 | * of a component. 1849 | * 1850 | * @param useStore - store to map from 1851 | * @param keysOrMapper - array or object 1852 | */ 1853 | function mapActions(useStore, keysOrMapper) { 1854 | return Array.isArray(keysOrMapper) 1855 | ? keysOrMapper.reduce((reduced, key) => { 1856 | // @ts-expect-error 1857 | reduced[key] = function (...args) { 1858 | return useStore(this.$pinia)[key](...args); 1859 | }; 1860 | return reduced; 1861 | }, {}) 1862 | : Object.keys(keysOrMapper).reduce((reduced, key) => { 1863 | // @ts-expect-error 1864 | reduced[key] = function (...args) { 1865 | return useStore(this.$pinia)[keysOrMapper[key]](...args); 1866 | }; 1867 | return reduced; 1868 | }, {}); 1869 | } 1870 | /** 1871 | * Allows using state and getters from one store without using the composition 1872 | * API (`setup()`) by generating an object to be spread in the `computed` field 1873 | * of a component. 1874 | * 1875 | * @param useStore - store to map from 1876 | * @param keysOrMapper - array or object 1877 | */ 1878 | function mapWritableState(useStore, keysOrMapper) { 1879 | return Array.isArray(keysOrMapper) 1880 | ? keysOrMapper.reduce((reduced, key) => { 1881 | // @ts-ignore 1882 | reduced[key] = { 1883 | get() { 1884 | return useStore(this.$pinia)[key]; 1885 | }, 1886 | set(value) { 1887 | // it's easier to type it here as any 1888 | return (useStore(this.$pinia)[key] = value); 1889 | }, 1890 | }; 1891 | return reduced; 1892 | }, {}) 1893 | : Object.keys(keysOrMapper).reduce((reduced, key) => { 1894 | // @ts-ignore 1895 | reduced[key] = { 1896 | get() { 1897 | return useStore(this.$pinia)[keysOrMapper[key]]; 1898 | }, 1899 | set(value) { 1900 | // it's easier to type it here as any 1901 | return (useStore(this.$pinia)[keysOrMapper[key]] = value); 1902 | }, 1903 | }; 1904 | return reduced; 1905 | }, {}); 1906 | } 1907 | 1908 | /** 1909 | * Creates an object of references with all the state, getters, and plugin-added 1910 | * state properties of the store. Similar to `toRefs()` but specifically 1911 | * designed for Pinia stores so methods and non reactive properties are 1912 | * completely ignored. 1913 | * 1914 | * @param store - store to extract the refs from 1915 | */ 1916 | function storeToRefs(store) { 1917 | // See https://github.com/vuejs/pinia/issues/852 1918 | // It's easier to just use toRefs() even if it includes more stuff 1919 | if (isVue2) { 1920 | // @ts-expect-error: toRefs include methods and others 1921 | return toRefs(store); 1922 | } 1923 | else { 1924 | store = toRaw(store); 1925 | const refs = {}; 1926 | for (const key in store) { 1927 | const value = store[key]; 1928 | if (isRef(value) || isReactive(value)) { 1929 | // @ts-expect-error: the key is state or getter 1930 | refs[key] = 1931 | // --- 1932 | toRef(store, key); 1933 | } 1934 | } 1935 | return refs; 1936 | } 1937 | } 1938 | 1939 | /** 1940 | * Vue 2 Plugin that must be installed for pinia to work. Note **you don't need 1941 | * this plugin if you are using Nuxt.js**. Use the `buildModule` instead: 1942 | * https://pinia.vuejs.org/ssr/nuxt.html. 1943 | * 1944 | * @example 1945 | * ```js 1946 | * import Vue from 'vue' 1947 | * import { PiniaVuePlugin, createPinia } from 'pinia' 1948 | * 1949 | * Vue.use(PiniaVuePlugin) 1950 | * const pinia = createPinia() 1951 | * 1952 | * new Vue({ 1953 | * el: '#app', 1954 | * // ... 1955 | * pinia, 1956 | * }) 1957 | * ``` 1958 | * 1959 | * @param _Vue - `Vue` imported from 'vue'. 1960 | */ 1961 | const PiniaVuePlugin = function (_Vue) { 1962 | // Equivalent of 1963 | // app.config.globalProperties.$pinia = pinia 1964 | _Vue.mixin({ 1965 | beforeCreate() { 1966 | const options = this.$options; 1967 | if (options.pinia) { 1968 | const pinia = options.pinia; 1969 | // HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/main/src/apis/inject.ts#L31 1970 | /* istanbul ignore else */ 1971 | if (!this._provided) { 1972 | const provideCache = {}; 1973 | Object.defineProperty(this, '_provided', { 1974 | get: () => provideCache, 1975 | set: (v) => Object.assign(provideCache, v), 1976 | }); 1977 | } 1978 | this._provided[piniaSymbol] = pinia; 1979 | // propagate the pinia instance in an SSR friendly way 1980 | // avoid adding it to nuxt twice 1981 | /* istanbul ignore else */ 1982 | if (!this.$pinia) { 1983 | this.$pinia = pinia; 1984 | } 1985 | pinia._a = this; 1986 | if (IS_CLIENT) { 1987 | // this allows calling useStore() outside of a component setup after 1988 | // installing pinia's plugin 1989 | setActivePinia(pinia); 1990 | } 1991 | if (USE_DEVTOOLS) { 1992 | registerPiniaDevtools(pinia._a, pinia); 1993 | } 1994 | } 1995 | else if (!this.$pinia && options.parent && options.parent.$pinia) { 1996 | this.$pinia = options.parent.$pinia; 1997 | } 1998 | }, 1999 | destroyed() { 2000 | delete this._pStores; 2001 | }, 2002 | }); 2003 | }; 2004 | 2005 | export { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs }; 2006 | --------------------------------------------------------------------------------