├── temp └── Tampermonkey │ └── sync │ └── .gitkeep ├── src ├── index.ts ├── pinia.d.ts ├── hook.ts ├── vue2.ts ├── main.ts └── vue3.ts ├── .github ├── img.png ├── img_1.png ├── img_2.png ├── img_3.png ├── img_4.png ├── img_5.png └── img_6.png ├── header ├── Vue.png ├── index.ts └── UserScript.ts ├── config.json ├── .gitignore ├── vite.config.ts ├── patches └── pinia+2.1.7.patch ├── readme.md ├── tsconfig.json ├── package.json ├── plugins ├── sync.ts └── header.ts ├── public └── vite.svg ├── tampermonkey.d.ts ├── server.cjs ├── dist └── main.js └── yarn.lock /temp/Tampermonkey/sync/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import main from "./main"; 2 | 3 | main() 4 | -------------------------------------------------------------------------------- /.github/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img.png -------------------------------------------------------------------------------- /header/Vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/header/Vue.png -------------------------------------------------------------------------------- /.github/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_1.png -------------------------------------------------------------------------------- /.github/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_2.png -------------------------------------------------------------------------------- /.github/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_3.png -------------------------------------------------------------------------------- /.github/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_4.png -------------------------------------------------------------------------------- /.github/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_5.png -------------------------------------------------------------------------------- /.github/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xcr1234/vue-devtools-production/HEAD/.github/img_6.png -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "path": "dav", 3 | "meta-touch": true, 4 | "open-in-editor": true, 5 | "username": "derjanb", 6 | "password": "secret" 7 | } -------------------------------------------------------------------------------- /src/pinia.d.ts: -------------------------------------------------------------------------------- 1 | declare module "pinia"{ 2 | 3 | /** 4 | * 此方法修改了pinia的源码,导出registerPiniaDevtools方法,在package.json中通过 "postinstall": "patch-package"加载 5 | * 方法来源: 6 | * https://github.com/vuejs/pinia/blob/v2/packages/pinia/src/devtools/plugin.ts 7 | * @param app vue实例 8 | * @param pinia pinia实例 9 | */ 10 | export function registerPiniaDevtools(app: any, pinia : any); 11 | 12 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | temp/Tampermonkey/sync/*.js 27 | temp/Tampermonkey/sync/*.json 28 | 29 | 30 | !dist/main.js -------------------------------------------------------------------------------- /header/index.ts: -------------------------------------------------------------------------------- 1 | import { RunAt, UserScript} from "./UserScript"; 2 | import * as fs from 'fs' 3 | 4 | //读取png图片为base64格式 5 | const base64str = fs.readFileSync('header/Vue.png','base64') 6 | 7 | const script: UserScript = { 8 | name: 'Vue生产环境(production) Devtools 调试', 9 | namespace: 'https://github.com/xcr1234/vue-devtools-production', 10 | homepage: 'https://github.com/xcr1234/vue-devtools-production', 11 | description: '使用本脚本支持直接调试生产环境的Vue项目 完美支持Vue2、Vue3!', 12 | icon: 'data:image/jpeg;base64,' + base64str, 13 | version: '2.1.0', 14 | includes: [ 15 | '*' 16 | ], 17 | runAt: RunAt.document_end, 18 | grants: "none" 19 | } 20 | 21 | export default script -------------------------------------------------------------------------------- /src/hook.ts: -------------------------------------------------------------------------------- 1 | import {Vue2App, Vue2Store} from "./vue2"; 2 | import {Vue3App} from "./vue3"; 3 | 4 | /** 5 | * Vue Devtools Hook的声明 6 | * 也就是__VUE_DEVTOOLS_GLOBAL_HOOK__的声明 7 | * 8 | * 此声明参考了Vue官方的实现,有一些修改,参考: 9 | * https://github.com/vuejs/devtools/blob/main/packages/app-backend-api/src/global-hook.ts 10 | */ 11 | export interface DevtoolsHook { 12 | //emit方法原来的声明是 emit: (event: string, ...payload: any[]),后面可以是any,这里加上了一些参数: 13 | 14 | emit(type: string, app: Vue2App|Vue2Store, payload?: any):void 15 | 16 | emit(type: string, app: Vue3App, version?: string, payload?: any):void; 17 | 18 | //on方法没有修改: 19 | on: (event: string, handler: T) => void 20 | } 21 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | 3 | import headerPlugin from "./plugins/header"; 4 | import syncPlugin from './plugins/sync' 5 | 6 | export default defineConfig({ 7 | build: { 8 | lib:{ 9 | entry: 'src/index.ts', 10 | name: 'main', 11 | fileName: () => 'main.js', 12 | formats: ['es'] 13 | }, 14 | outDir: 'dist', 15 | 16 | }, 17 | plugins: [ 18 | headerPlugin(), 19 | { 20 | ...syncPlugin(), 21 | apply: (_, {mode}) => mode === 'sync' 22 | } 23 | ], 24 | define:{ 25 | 'process.env.NODE_ENV': JSON.stringify('production') 26 | } 27 | }) -------------------------------------------------------------------------------- /patches/pinia+2.1.7.patch: -------------------------------------------------------------------------------- 1 | diff --git a/node_modules/pinia/dist/pinia.mjs b/node_modules/pinia/dist/pinia.mjs 2 | index b0095a4..0db0a6d 100644 3 | --- a/node_modules/pinia/dist/pinia.mjs 4 | +++ b/node_modules/pinia/dist/pinia.mjs 5 | @@ -2002,4 +2002,4 @@ const PiniaVuePlugin = function (_Vue) { 6 | }); 7 | }; 8 | 9 | -export { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs }; 10 | +export { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs, registerPiniaDevtools }; 11 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Vue生产环境(production) Devtools 调试 2 | 3 | 使用本脚本,在生产环境也可以使用Vue Devtools调试你的项目,支持Vue2、Vue3 4 | 1.1版本对hook方式进行了重写,结构更清晰 5 | **2.0版本用vite重新编译,vue3去除vuex,改用pinia** 6 | 7 | 正常情况下,开启成功后,控制台会显示:,并且可以使用Vue Devtools(vue2)和pinia(vue3): 8 | 9 | ![img](https://pic.imgdb.cn/item/6506d2af661c6c8e5458a22c.png) 10 | 11 | ![img](https://pic.imgdb.cn/item/6506d2c1661c6c8e5458a4a9.png) 12 | 13 | ![img](.github/img_6.png) 14 | 15 | 使用方法: 16 | **方法1** 17 | 在你的vue项目,按F12打开控制台,复制dist/main.js中的内容执行 18 | **方法2** 19 | (1)在浏览器安装 [tampermonkey](https://www.tampermonkey.net/) 插件 20 | (2)去[greasyfork](https://greasyfork.org/zh-CN/scripts/443634-vue%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83-production-devtools-%E8%B0%83%E8%AF%95)安装脚本 21 | 22 | ## 开发 23 | 24 | https://github.com/xcr1234/tampermonkey-typescript 25 | 26 | 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "ts-node": { 24 | "compilerOptions": { 25 | "module": "commonjs" 26 | }, 27 | "transpileOnly": true, 28 | "files": true 29 | }, 30 | "include": ["src"] 31 | } 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tamp", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "build": "tsc && vite build", 8 | "build:sync": "tsc && vite build --watch --mode sync", 9 | "start:server": "node server.cjs", 10 | "postinstall": "patch-package" 11 | }, 12 | "devDependencies": { 13 | "@types/lodash": "^4.17.6", 14 | "@types/node": "^20.14.11", 15 | "chokidar": "3.4.3", 16 | "dialog": "0.3.1", 17 | "glob": "7.1.6", 18 | "open": "7.3.0", 19 | "ts-node": "^9.1.1", 20 | "typescript": "^5.2.2", 21 | "upath": "2.0.1", 22 | "vite": "^5.3.1" 23 | }, 24 | "dependencies": { 25 | "lodash": "^4.17.21", 26 | "patch-package": "^8.0.0", 27 | "pinia": "^2.1.7", 28 | "postinstall-postinstall": "^2.1.0", 29 | "vue": "^3.4.33" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /plugins/sync.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'vite'; 2 | import fs from 'fs' 3 | import path from 'path' 4 | import script from '../header' 5 | 6 | export default (): Plugin => { 7 | return { 8 | name: 'sync-plugin', 9 | closeBundle(){ 10 | const files = fs.readdirSync('temp/Tampermonkey/sync',{ withFileTypes: true }) 11 | const jsonFiles = files.filter(file => file.isFile() && file.name.endsWith('.meta.json')) 12 | for(const file of jsonFiles){ 13 | const filePath = path.join('temp/Tampermonkey/sync', file.name); 14 | const content = fs.readFileSync(filePath, 'utf-8') 15 | const {uuid,name} = JSON.parse(content); 16 | if(name === script.name){ 17 | const jsName = path.join('temp/Tampermonkey/sync',`${uuid}.user.js`) 18 | fs.copyFileSync('dist/main.js',jsName) 19 | console.log('copied file to:', jsName) 20 | return; 21 | } 22 | } 23 | 24 | throw new Error("找不到对应名称的脚本:" + script.name) 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/vue2.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Vue2的hook和devtools声明 3 | */ 4 | import {DevtoolsHook} from "./hook"; 5 | 6 | /** 7 | * 此声明为vuex注册到vue2上的store实例 8 | */ 9 | export interface Vue2Store { 10 | _devtoolHook: DevtoolsHook 11 | 12 | replaceState(state: any): void; 13 | 14 | subscribe(cb: (mutation: any, state: any) => void): void; 15 | } 16 | 17 | /** 18 | * 声明vue实例,也就是我们new Vue()产生的vue实例 19 | */ 20 | export interface Vue2 { 21 | $store?: Vue2Store, 22 | } 23 | 24 | /** 25 | * 声明Vue类,也就是我们import Vue from 'vue'用到的这个Vue 26 | */ 27 | export interface Vue2App{ 28 | config: { 29 | devtools: boolean 30 | }, 31 | version: string, 32 | super?: Vue2App 33 | } 34 | 35 | /** 36 | * Vue2注册到Vue DevTool上的方式 37 | * 参考资料 https://zhuanlan.zhihu.com/p/23921964 38 | * @param devtools 39 | * @param root 40 | */ 41 | export const hookVue2 = (devtools: DevtoolsHook, root: Vue2) => { 42 | //通过vue实例构造函数取出Vue实例 43 | let Vue: Vue2App = Object.getPrototypeOf(root).constructor 44 | while (Vue.super) { 45 | //Vue2有多级,要找到最顶级的 46 | Vue = Vue.super 47 | } 48 | if(Vue.config.devtools){ 49 | //当前已经开启了devtools了,避免在dev环境注入或者重复注入 50 | return 51 | } 52 | //手工开启devtools 53 | Vue.config.devtools = true 54 | 55 | //这部分代码参考了vue2的源码 56 | //https://github.com/vuejs/vue/blob/dev/src/platforms/web/runtime/index.js 57 | devtools.emit('init', Vue) 58 | 59 | console.log(`vue devtools for [${Vue.version}] already open !!!`) 60 | 61 | //如果有vuex store,也注册 62 | //参考vuex的源码实现 63 | if (root.$store) { 64 | const store = root.$store; 65 | store._devtoolHook = devtools; 66 | devtools.emit('vuex:init', store); 67 | devtools.on('vuex:travel-to-state', (targetState: any) => { 68 | store.replaceState(targetState); 69 | }); 70 | store.subscribe( (mutation, state) => { 71 | devtools.emit('vuex:mutation', mutation, state); 72 | }); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import {DevtoolsHook} from "./hook"; 2 | import {hookVue2, Vue2} from "./vue2"; 3 | import {hookVue3, Vue3App} from "./vue3"; 4 | 5 | declare interface WindowApp{ 6 | __vue__?: Vue2, 7 | __vue_app__?: Vue3App 8 | } 9 | 10 | declare const window : { 11 | app?:WindowApp 12 | '__VUE_DEVTOOLS_GLOBAL_HOOK__'?: DevtoolsHook 13 | } & Window 14 | 15 | export default () => { 16 | if (self != top) { 17 | //在iframe中不执行此脚本 18 | return; 19 | } 20 | const devtools = window['__VUE_DEVTOOLS_GLOBAL_HOOK__'] 21 | if (!devtools) { 22 | console.warn('No Vue devtools found , Please install it first: ') 23 | console.warn('see https://github.com/vuejs/vue-devtools') 24 | return 25 | } 26 | //脚本的运行时机为 document-end,因此脚本执行时 能获取到app对象 27 | const app = window.app 28 | if (!app) { 29 | return; 30 | } 31 | if (app.__vue__) { 32 | //脚本运行时就取到了Vue2 app,直接注入Vue2 33 | hookVue2(devtools, app.__vue__) 34 | return; 35 | } 36 | if(app.__vue_app__){ 37 | //脚本运行时就取到了Vue3 app,直接注入Vue3 38 | hookVue3(devtools,app.__vue_app__) 39 | return; 40 | } 41 | //脚本运行时,vue2和vue3都没检测到,需要开启一个MutationObserver,动态检测 42 | //关于MutationObserver参考 https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver 43 | const observer = new MutationObserver(((mutations, observer) => { 44 | const disconnect = observer.disconnect.bind(observer); 45 | for (const mutation of mutations) { 46 | //把target强制转成WindowApp,这样才能获取其中的实例 47 | const target = mutation.target 48 | if(target.__vue__){ 49 | hookVue2(devtools,target.__vue__) 50 | disconnect() 51 | }else if(target.__vue_app__){ 52 | hookVue3(devtools,target.__vue_app__) 53 | disconnect() 54 | } 55 | } 56 | })) 57 | 58 | observer.observe(document.documentElement, { 59 | attributes: true, 60 | subtree: true, 61 | childList: true 62 | }); 63 | } 64 | -------------------------------------------------------------------------------- /src/vue3.ts: -------------------------------------------------------------------------------- 1 | import {DevtoolsHook} from "./hook"; 2 | import {registerPiniaDevtools} from 'pinia' 3 | 4 | export interface Vue3App { 5 | config: { 6 | devtools: boolean, 7 | globalProperties:{ 8 | $store?:any 9 | $pinia?: any 10 | }, 11 | }, 12 | version: string 13 | unmount():void; 14 | } 15 | 16 | 17 | const newVersion = (version: string) => { 18 | if(version.includes('-alpha.')){ 19 | //版本号包括-alpha,只获取前面的部分 20 | version = version.split('-alpha.')[0] 21 | } 22 | // 字符串判断版本号是否大于3.3 23 | const [major, minor] = version.split('.').map(Number); 24 | return major > 3 || (major === 3 && minor >= 3);} 25 | 26 | 27 | /** 28 | * vue3的注册方式 29 | * @param hook 30 | * @param vue 31 | */ 32 | export const hookVue3 = (hook: DevtoolsHook, vue: Vue3App) => { 33 | if(vue.config.devtools){ 34 | //当前已经开启了devtools了,避免在dev环境注入或者重复注入 35 | return 36 | } 37 | //手工开启devtools 38 | vue.config.devtools = true 39 | 40 | // 参考了 vue-core的源码 实现 41 | // https://github.com/vuejs/core/blob/main/packages/runtime-core/src/devtools.ts 42 | 43 | if(newVersion(vue.version)){ 44 | hook.emit('app:init',vue,vue.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 | }else{ 51 | hook.emit('app:init',vue,vue.version,{ 52 | Fragment: Symbol.for('Fragment'), 53 | Text: Symbol.for('Text'), 54 | Comment: Symbol.for('Comment'), 55 | Static: Symbol.for('Static') 56 | }) 57 | } 58 | 59 | 60 | 61 | console.log(`vue devtools for [${vue.version}] already open !!!`) 62 | 63 | const unmount = vue.unmount.bind(vue); 64 | vue.unmount = () => { 65 | hook.emit('app:unmount', vue); 66 | unmount(); 67 | } 68 | if(vue.config.globalProperties.$store){ 69 | console.warn('vuex for vue3 not support. please use pinia') 70 | } 71 | const pinia = vue.config.globalProperties.$pinia 72 | if(pinia){ 73 | registerPiniaDevtools(vue, pinia) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /plugins/header.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'vite'; 2 | import script from '../header' 3 | import {GmFunctions} from "../header/UserScript"; 4 | 5 | const padLen = 20 6 | 7 | const buildHeader = () => { 8 | let result = '// ==UserScript==\n' 9 | if (script.name) { 10 | result += '// @name'.padEnd(padLen, ' ') + script.name + '\n' 11 | } 12 | if (script.namespace) { 13 | result += '// @namespace'.padEnd(padLen, ' ') + script.namespace + '\n' 14 | } 15 | if (script.version) { 16 | result += '// @version'.padEnd(padLen, ' ') + script.version + '\n' 17 | } 18 | if (script.author) { 19 | result += '// @author'.padEnd(padLen, ' ') + script.author + '\n' 20 | } 21 | if (script.description) { 22 | result += '// @description '.padEnd(padLen, ' ') + script.description + '\n' 23 | } 24 | if (script.homepage) { 25 | result += '// @homepage'.padEnd(padLen, ' ') + script.homepage + '\n' 26 | } 27 | if (script.icon) { 28 | result += '// @icon'.padEnd(padLen, ' ') + script.icon + '\n' 29 | } 30 | if (script.icon64) { 31 | result += '// @icon64'.padEnd(padLen, ' ') + script.icon64 + '\n' 32 | } 33 | if (script.updateURL) { 34 | result += '// @updateURL'.padEnd(padLen, ' ') + script.updateURL + '\n' 35 | } 36 | if (script.supportURL) { 37 | result += '// @supportURL'.padEnd(padLen, ' ') + script.supportURL + '\n' 38 | } 39 | if (script.downloadURL) { 40 | result += '// @downloadURL'.padEnd(padLen, ' ') + script.downloadURL + '\n' 41 | } 42 | if (script.includes) { 43 | script.includes.forEach(include => { 44 | result += '// @include'.padEnd(padLen, ' ') + include + '\n' 45 | }) 46 | } 47 | if (script.matches) { 48 | script.matches.forEach(m => { 49 | result += '// @match'.padEnd(padLen, ' ') + m + '\n' 50 | }) 51 | } 52 | if (script.excludes) { 53 | script.excludes.forEach(exclude => { 54 | result += '// @exclude'.padEnd(padLen, ' ') + exclude + '\n' 55 | }) 56 | } 57 | if (script.requires) { 58 | script.requires.forEach(m => { 59 | result += '// @require'.padEnd(padLen, ' ') + m + '\n' 60 | }) 61 | } 62 | if (script.resources) { 63 | script.resources.forEach(m => { 64 | result += '// @resource '.padEnd(padLen, ' ') + m + '\n' 65 | }) 66 | } 67 | if (script.connect) { 68 | result += '// @connect'.padEnd(padLen, ' ') + script.connect + '\n' 69 | } 70 | if (script.runAt) { 71 | result += '// @run-at'.padEnd(padLen, ' ') + script.runAt + '\n' 72 | } 73 | if (script.grants) { 74 | if (typeof script.grants === 'string') { 75 | result += '// @grant'.padEnd(padLen, ' ') + script.grants + '\n' 76 | } else { 77 | const arr = script.grants 78 | arr.forEach(item => { 79 | if (typeof item === 'string') { 80 | result += '// @grant'.padEnd(padLen, ' ') + item + '\n' 81 | } else { 82 | result += '// @grant'.padEnd(padLen, ' ') + GmFunctions[item] + '\n' 83 | } 84 | }) 85 | } 86 | } 87 | if (script.noframes) { 88 | //此处之前少了 “//”,感谢 没礼貌的芬兰人 的评论 89 | //https://gitee.com/ironV/tampermonkey-typescript/blob/master/header/build.ts#note_12538220 90 | result += '// @noframes\n' 91 | } 92 | if (script.nocompat) { 93 | result += '// @nocompat'.padEnd(padLen, ' ') + script.nocompat + '\n' 94 | } 95 | result += '// ==/UserScript==\n' 96 | 97 | return result 98 | } 99 | 100 | const headerPlugin = (): Plugin => { 101 | return { 102 | name: 'header-plugin', 103 | generateBundle(_, bundle) { 104 | for (const fileName of Object.keys(bundle)) { 105 | if (fileName === 'main.js') { 106 | const file = bundle[fileName]; 107 | if (file.type === 'chunk'&& file.code) { 108 | const header = buildHeader() 109 | file.code = header + file.code; 110 | } 111 | } 112 | } 113 | } 114 | } 115 | } 116 | 117 | export default headerPlugin -------------------------------------------------------------------------------- /header/UserScript.ts: -------------------------------------------------------------------------------- 1 | export enum RunAt{ 2 | /** 3 | * 脚本将尽快注入。 4 | */ 5 | document_start = 'document-start' , 6 | /** 7 | * 如果正文元素存在,将注入脚本。 8 | */ 9 | document_body = 'document-body', 10 | /** 11 | * 在调度 DOM内容加载事件时或之后,将注入脚本。 12 | */ 13 | document_end = 'document-end', 14 | /** 15 | * 在调度 DOM内容加载事件后,将注入脚本。 16 | * 如果未给出@run时标记,则这是默认值。 17 | */ 18 | document_idle = 'document-idle', 19 | /** 20 | * 如果在浏览器上下文菜单上单击脚本(仅在基于桌面chrome的浏览器上),脚本将被注入。 21 | * 注意:如果使用这个值,所有的@include和@exclude语句都将被忽略,但是这在将来可能会改变。 22 | */ 23 | context_menu = 'context-menu' 24 | } 25 | 26 | export enum GmFunctions { 27 | unsafeWindow, 28 | addStyle, 29 | addElement, 30 | deleteValue, 31 | listValues, 32 | addValueChangeListener, 33 | removeValueChangeListener, 34 | setValue, 35 | getValue, 36 | log, 37 | getResourceText, 38 | getResourceURL, 39 | registerMenuCommand, 40 | unregisterMenuCommand, 41 | openInTab, 42 | xmlhttpRequest, 43 | download, 44 | getTab, 45 | saveTab, 46 | getTabs, 47 | notification, 48 | setClipboard, 49 | info 50 | } 51 | 52 | export interface UserScript{ 53 | /** 54 | * 脚本名称 55 | */ 56 | name ?: string; 57 | /** 58 | * 脚本的命名空间网址 59 | */ 60 | namespace?: string; 61 | /** 62 | * 脚本的版本号 63 | * 这用于更新检查,以防脚本未从userscript.org安装,或者 TM 检索脚本元数据时出现问题。 64 | */ 65 | version?: string; 66 | /** 67 | * 脚本的作者 68 | */ 69 | author?: string; 70 | /** 71 | * 脚本简单的描述,不要出现换行符 72 | */ 73 | description ?: string; 74 | /** 75 | * 在选项页中使用的作者主页从脚本名称链接到给定页面。请注意,如果@namespace标签以"http://"开头,其内容也将用于此。 76 | */ 77 | homepage ?: string; 78 | /** 79 | * 低分辨率下的脚本图标。 80 | */ 81 | icon ?: string; 82 | /** 83 | * 脚本图标,64*64 84 | */ 85 | icon64?: string; 86 | /** 87 | * 脚本更新url, 88 | * 使用此字段时,version字段必填 89 | */ 90 | updateURL ?: string; 91 | /** 92 | * 脚本支持url 93 | */ 94 | supportURL ?: string; 95 | /** 96 | * 定义当检测到更新时将从其中下载脚本的URL。如果使用none值,则不会执行更新检查。 97 | */ 98 | downloadURL ?: string; 99 | /** 100 | * 该脚本应运行的页面。允许多个标记实例。 101 | * 请注意,@include不支持 URL 哈希参数。 102 | */ 103 | includes ?: string[]; 104 | /** 105 | * 或多或少等于@include标记。 106 | * 参考信息: http://code.google.com/chrome/extensions/match_patterns.html 107 | */ 108 | matches ?: string[]; 109 | /** 110 | * 排除 URL,即使它们也包含在@include或@match。 111 | */ 112 | excludes ?: string[]; 113 | /** 114 | * 指向在脚本本身开始运行之前加载并执行的JavaScript文件 115 | * 注意:通过@require加载的脚本及其“use strict”语句可能会影响userscript的strict模式! 116 | * 例子 117 | * https://code.jquery.com/jquery-2.1.4.min.js 118 | */ 119 | requires ?: string[]; 120 | /** 121 | * 通过脚本预加载可以通过GM_getResourceURL和GM_getResourceText访问的资源。 122 | * 例子: 123 | * icon1 http://www.tampermonkey.net/favicon.ico 124 | * html http://www.tampermonkey.net/index.html 125 | * 详情参考:https://www.tampermonkey.net/documentation.php?ext=dhdg#Subresource_Integrity 126 | */ 127 | resources?: string[]; 128 | /** 129 | * 此标记定义域(无顶级域),包括允许通过GM_xmlhttpRequest检索的子域 130 | * 可以具有以下值: 131 | * 像 tampermonkey.net 这样的域(这也将允许所有子域) 132 | * 子域即 safari.tampermonkey.net 133 | * 将脚本当前运行的域列入白名单 134 | * localhost 访问本地主机 135 | * 1.2.3.4 连接到一个IP地址 136 | * 137 | */ 138 | connect?: string[]; 139 | /** 140 | * 定义脚本被注入的时刻。 141 | * 与其他脚本处理程序相反,@run-at定义了脚本想要运行的第一个可能时刻。 142 | * 这意味着可能会发生这样的情况,使用@require标记的脚本可能会在文档已经加载之后执行,因为获取所需的脚本需要很长时间。 143 | * 无论如何,在给定的注入时刻之后发生的所有domnodeinsert和DOMContentLoaded事件都会被缓存,并在注入脚本时交付给脚本。 144 | */ 145 | runAt ?: RunAt; 146 | /** 147 | * @grant用于将GM_ *函数,unsafeWindow对象和一些强大的窗口函数列入白名单。 148 | * 如果没有给出@grant,会自动给与以下权限 149 | * @link GmFunctions.setValue 150 | * @link GmFunctions.getValue 151 | * @link GmFunctions.setClipboard 152 | * @link GmFunctions.unsafeWindow 153 | * window.close 154 | * window.focus 155 | * window.onurlchange 156 | */ 157 | grants ?: (GmFunctions | string)[] | 'none'; 158 | /** 159 | * 此标记使脚本在主页上运行,但不是在 iframe 上运行。 160 | */ 161 | noframes ?: boolean; 162 | 163 | /** 164 | * 目前,TM试图通过查找@match标记来检测是否使用了谷歌Chrome/Chromium编写的脚本,但并不是每个脚本都使用它。 165 | * 这就是为什么TM支持这个标签来禁用所有可能需要的优化来运行为Firefox/Greasemonkey编写的脚本。 166 | * 要保持此标记的可扩展性,可以添加可由脚本处理的浏览器名称。 167 | */ 168 | nocompat?: string; 169 | } 170 | -------------------------------------------------------------------------------- /tampermonkey.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | unsafeWindow 对象提供对页面 javascript 函数和变量的完全访问。 3 | * */ 4 | declare var unsafeWindow: Window; 5 | 6 | /* 7 | 获取有关脚本和 TM 的一些信息。 8 | * */ 9 | declare var GM_info: { 10 | version: string, 11 | scriptWillUpdate: boolean, 12 | scriptHandler: "Tampermonkey", 13 | scriptUpdateURL?: string, 14 | scriptSource: string, 15 | scriptMetaStr?: string, 16 | isIncognito: boolean, 17 | downloadMode: "native" | "disabled" | "browser", 18 | script: { 19 | author?: string, 20 | description?: string, 21 | excludes: string[], 22 | homepage?: string, 23 | icon?: string, 24 | icon64?: string, 25 | includes?: string[], 26 | lastModified: number, 27 | matches: string[], 28 | name: string, 29 | namespace?: string, 30 | position: number, 31 | "run-at": string, 32 | resources: string[], 33 | unwrap: boolean, 34 | version: string, 35 | options: { 36 | awareOfChrome: boolean, 37 | run_at: string, 38 | noframes?: boolean, 39 | compat_arrayLeft: boolean, 40 | compat_foreach: boolean, 41 | compat_forvarin: boolean, 42 | compat_metadata: boolean, 43 | compat_uW_gmonkey: boolean, 44 | override: { 45 | orig_excludes: string[], 46 | orig_includes: string[], 47 | use_includes: string[], 48 | use_excludes: string[], 49 | [key: string]: any, 50 | }, 51 | [key: string]: any, 52 | }, 53 | [key: string]: any, 54 | }, 55 | [key: string]: any, 56 | }; 57 | 58 | /* 59 | 将给定的样式添加到文档并返回注入的样式元素。 60 | * */ 61 | declare function GM_addStyle(css: string): void; 62 | 63 | /* 64 | 创建一个由“tag_name”指定的 HTML 元素并应用所有给定的“属性”并返回注入的 HTML 元素。 65 | * */ 66 | declare function GM_addElement(tag_name: string, attributes: object) 67 | 68 | /* 69 | 创建一个由“tag_name”指定的 HTML 元素并应用所有给定的“属性”并返回注入的 HTML 元素。如果给出了“parent_node”,则将其附加到它或以其他方式附加到文档头或体。 70 | * */ 71 | declare function GM_addElement(parent_node: HTMLElement, tag_name: string, attributes: object) 72 | 73 | /* 74 | 从存储中删除“名称”。 75 | * */ 76 | declare function GM_deleteValue(name: string): void; 77 | 78 | /* 79 | 列出存储的所有名称。 80 | * */ 81 | declare function GM_listValues(): string[]; 82 | 83 | /* 84 | 将更改侦听器添加到存储并返回侦听器 ID。 85 | 'name' 是观察变量的名称。 86 | 回调函数的“remote”参数显示该值是从另一个选项卡的实例 (true) 还是在此脚本实例 (false) 中修改的。 87 | 因此,不同浏览器选项卡的脚本可以使用此功能相互通信。 88 | * */ 89 | declare function GM_addValueChangeListener(name: string, listener: GM_Types.ValueChangeListener): number; 90 | 91 | /* 92 | 按 ID 删除更改​​侦听器。 93 | * */ 94 | declare function GM_removeValueChangeListener(listenerId: number): void; 95 | 96 | /* 97 | 设置本地存储'name'的值。 98 | * */ 99 | declare function GM_setValue(name: string, value: any): void; 100 | 101 | /* 102 | 从存储中获取 'name' 的值。 103 | * */ 104 | declare function GM_getValue(name: string, defaultValue ?: any): any; 105 | 106 | /* 107 | 将消息打印到控制台。 108 | * */ 109 | declare function GM_log(message: string): any; 110 | 111 | /* 112 | 获取脚本头中预定义的@resource 标记的内容。 113 | * */ 114 | declare function GM_getResourceText(name: string): string; 115 | 116 | /* 117 | 获取脚本标头处预定义 @resource 标记的 base64 编码 URI。 118 | * */ 119 | declare function GM_getResourceURL(name: string): string; 120 | 121 | /* 122 | 在运行此脚本的页面的 Tampermonkey 菜单中注册要显示的菜单,并返回菜单命令 ID。 123 | * */ 124 | declare function GM_registerMenuCommand(name: string, listener: Function, accessKey ?: string): number; 125 | 126 | /* 127 | 使用给定的菜单命令 ID 取消注册先前由 GM_registerMenuCommand 注册的菜单命令。 128 | * */ 129 | declare function GM_unregisterMenuCommand(id: number): void; 130 | 131 | /* 132 | 使用此 url 打开一个新选项卡。 133 | * */ 134 | declare function GM_openInTab(url: string, options: GM_Types.OpenTabOptions): void; 135 | /* 136 | 使用此 url 打开一个新选项卡。 137 | * */ 138 | declare function GM_openInTab(url: string, loadInBackground: boolean): void; 139 | /* 140 | 使用此 url 打开一个新选项卡。 141 | * */ 142 | declare function GM_openInTab(url: string): void; 143 | 144 | /* 145 | 创建一个 xmlHttpRequest。 146 | * */ 147 | declare function GM_xmlhttpRequest(details: GM_Types.XHRDetails): GM_Types.AbortHandle; 148 | 149 | /* 150 | 将给定的 URL 下载到本地磁盘。 151 | * */ 152 | declare function GM_download(details: GM_Types.DownloadDetails): GM_Types.AbortHandle; 153 | /* 154 | 将给定的 URL 下载到本地磁盘。 155 | * */ 156 | declare function GM_download(url: string, filename: string): GM_Types.AbortHandle; 157 | 158 | /* 159 | 只要此选项卡处于打开状态,就获取一个持久对象。 160 | * */ 161 | declare function GM_getTab(callback: (obj: object) => any): void; 162 | 163 | /* 164 | 保存选项卡对象以在页面卸载后重新打开它。 165 | * */ 166 | declare function GM_saveTab(obj: object): void; 167 | 168 | /* 169 | 获取所有选项卡对象作为散列以与其他脚本实例通信。 170 | * */ 171 | declare function GM_getTabs(callback: (objs: { [key: number]: object }) => any): void; 172 | 173 | /* 174 | 显示 HTML5 桌面通知和/或突出显示当前选项卡。 175 | * */ 176 | declare function GM_notification(details: GM_Types.NotificationDetails, ondone: Function): void; 177 | /* 178 | 显示 HTML5 桌面通知和/或突出显示当前选项卡。 179 | * */ 180 | declare function GM_notification(text: string, title: string, image: string, onclick: Function): void; 181 | 182 | /* 183 | 将数据复制到剪贴板。参数 'info' 可以是像“{ type: 'text', mimetype: 'text/plain'}”这样的对象,或者只是一个表示类型的字符串(“text”或“html”)。 184 | * */ 185 | declare function GM_setClipboard(data: string, info ?: string | { type?: string, mimetype?: string }): void; 186 | 187 | declare namespace GM_Types { 188 | 189 | type ValueChangeListener = (name: string, oldValue: any, newValue: any, remote: boolean) => any; 190 | 191 | interface OpenTabOptions { 192 | active?: boolean, 193 | insert?: boolean, 194 | setParent?: boolean 195 | } 196 | 197 | interface XHRResponse extends Function { 198 | 199 | DONE: 4, 200 | HEADERS_RECEIVED: 2, 201 | LOADING: 3, 202 | OPENED: 1, 203 | UNSENT: 0 204 | 205 | context: CONTEXT_TYPE, 206 | finalUrl: string, 207 | readyState: 0 | 1 | 2 | 3 | 4, 208 | responseHeaders: string, 209 | status: number, 210 | statusText: string, 211 | response: string | null, 212 | responseText: string, 213 | responseXML: Document | null 214 | } 215 | 216 | interface XHRProgress extends XHRResponse { 217 | done: number, 218 | lengthComputable: boolean, 219 | loaded: number, 220 | position: number, 221 | total: number, 222 | totalSize: number 223 | } 224 | 225 | type Listener = (this: OBJ, event: OBJ) => any; 226 | 227 | interface XHRDetails { 228 | method?: "GET" | "HEAD" | "POST", 229 | url?: string, 230 | headers?: { readonly [key: string]: string }, 231 | data?: string, 232 | binary?: boolean, 233 | timeout?: number, 234 | context?: CONTEXT_TYPE, 235 | responseType?: "arraybuffer" | "blob" | "json", 236 | overrideMimeType?: string, 237 | anonymous?: boolean, 238 | fetch?: boolean, 239 | username?: string, 240 | password?: string, 241 | 242 | onload?: Listener>, 243 | onloadstart?: Listener>, 244 | onprogress?: Listener>, 245 | onreadystatechange?: Listener>, 246 | ontimeout?: Listener, 247 | onabort?: Function, 248 | onerror?: Function 249 | } 250 | 251 | interface AbortHandle { 252 | abort(): RETURN_TYPE 253 | } 254 | 255 | interface DownloadError { 256 | error: "not_enabled" | "not_whitelisted" | "not_permitted" | "not_supported" | "not_succeeded", 257 | details?: string 258 | } 259 | 260 | interface DownloadDetails { 261 | url: string, 262 | name: string, 263 | headers?: { readonly [key: string]: string }, 264 | saveAs?: boolean, 265 | timeout?: number, 266 | onerror?: Listener, 267 | ontimeout?: Listener, 268 | onload?: Listener, 269 | onprogress?: Listener> 270 | } 271 | 272 | interface NotificationThis extends NotificationDetails { 273 | id: string 274 | } 275 | 276 | type NotificationOnClick = (this: NotificationThis) => any; 277 | type NotificationOnDone = (this: NotificationThis, clicked: boolean) => any; 278 | 279 | interface NotificationDetails { 280 | text?: string, 281 | title?: string, 282 | image?: string, 283 | highlight?: boolean, 284 | timeout?: number 285 | onclick?: NotificationOnClick, 286 | ondone?: NotificationOnDone, 287 | } 288 | } 289 | -------------------------------------------------------------------------------- /server.cjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env nodejs 2 | 3 | 'use strict'; 4 | 5 | var args = {}; 6 | 7 | const fs = require('fs'); 8 | const upath = require('upath'); 9 | const http = require('http'); 10 | const url = require('url'); 11 | const dialog = require('dialog'); 12 | const crypto = require('crypto'); 13 | const chokidar = require('chokidar'); 14 | const open = require('open'); 15 | const path = require('path'); 16 | 17 | 18 | const error = function(m) { 19 | console.error(m); 20 | if (!args['no-dialog']) { 21 | dialog.err(m, 'TamperDAV'); 22 | } 23 | }; 24 | 25 | const warn = function(m) { 26 | console.warn(m); 27 | if (!args['no-dialog']) { 28 | dialog.warn(m, 'TamperDAV'); 29 | } 30 | }; 31 | 32 | // early parsing for the config option 33 | let optionConfig = process.argv.reduce((a, c) => c.split('--config=')[1] || a, ''); 34 | const config = optionConfig || 'config.json'; 35 | 36 | if (fs.existsSync(config)) { 37 | try { 38 | args = JSON.parse(fs.readFileSync(config)); 39 | } catch (e) { 40 | return error(`${config}: ${e.message}`); 41 | } 42 | } 43 | 44 | [ 'username', 'password' ].forEach(function(k) { args[k] = args[k] || process.env['TD_' + k.toUpperCase()]; }); 45 | 46 | process.argv.forEach(function(val/*, index, array*/) { 47 | var s = val.replace(/^[-]{1,2}/, '').split('='); 48 | args[s[0]] = s[1] || true; 49 | }); 50 | 51 | if (process.argv.includes('--help')) { 52 | console.log( 53 | `Usage: ${process.platform === 'win32' ? 'TamperDAV.bat' : './tamperdav.sh'} [options] 54 | Starts a WebDAV server using Node.js 55 | 56 | Options: 57 | --help Shows this information 58 | --config=[path] Uses the specified config file (default: config.json) 59 | --no-auth-warning Disables the warning regarding missing authentication due 60 | to missing username and password 61 | --meta-touch Updates corresponding meta file upon changing a script 62 | file, resulting in connected browsers syncing these changes 63 | --debug Provides some more detailed output for debugging purposes 64 | --open-in-editor=[editor] The editor to use when pressing the cloud editor icon in 65 | Tampermonkey 66 | --open-in-editor Same as above, but uses ${process.platform === 'win32' ? 'notepad.exe' : 'the editor chosen by xdg-open'} 67 | --username=[username] The username for clients to authenticate to the server with 68 | --password=[password] The password for clients to authenticate to the server with 69 | --host=[host] The network address to bind on (default: localhost) 70 | --port=[port] The port that the server will listen on (default: 7000) 71 | --path=[path] The path, relative to server.js, that will serve as storage 72 | --max-cursors=[amount] The maximum number of cached changes the server will store 73 | 74 | All of these options except "--help" can be specified in a JSON formatted file config.json 75 | in the same directory as server.js. An example is: 76 | { 77 | "path": "dav", 78 | "meta-touch": true, 79 | "username": "foo", 80 | "password": "bar", 81 | "port": 1234 82 | } 83 | 84 | Options provided as command line parameters all have precedence over options stored in the 85 | config file. 86 | 87 | Username and password can also be specified in the environment variables TD_USERNAME and 88 | TD_PASSWORD respectively. These have priority over over the config file, but not over the 89 | command line parameters. 90 | ` 91 | ); 92 | process.exit(0); 93 | } 94 | 95 | global.btoa = function(s) { 96 | if (typeof Buffer.from === 'function') { 97 | return Buffer.from(s, 'base64').toString(); // Node 5.10+ 98 | } else { 99 | return new Buffer(s, 'base64').toString(); // older Node versions 100 | } 101 | }; 102 | 103 | if (!args.path) { 104 | return error('path arguments missing'); 105 | } 106 | 107 | const working_dir = path.resolve(__dirname,'temp') 108 | if (!fs.existsSync(working_dir)) { 109 | return error('working directory missing'); 110 | } 111 | 112 | if (!args['no-auth-warning'] && (!args.username || !args.password)) { 113 | warn('TamperDAV is running without any form of authentication. It\'s strongly recommended to configure username and password!', 'TamperDAV'); 114 | } 115 | 116 | RegExp.escape = RegExp.escape || function(s) { 117 | return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 118 | }; 119 | 120 | const port = args.port || 7000; 121 | const max_cursors = args['max-cursors'] || 512; 122 | var subscribers = {}; 123 | 124 | const methods = { 125 | options: function(uri, request, response) { 126 | var allowed_methods = [ 127 | 'GET', 'HEAD', 'OPTIONS', 'PUT', 'PROPFIND', 'MKCOL', 'DELETE', 'SUBSCRIBE' 128 | ].concat(args['open-in-editor'] ? [ 'EDITOR' ] : []).join(','); 129 | 130 | response.setHeader('Access-Control-Allow-Methods', allowed_methods); 131 | response.setHeader('Access-Control-Allow-Credentials','true'); 132 | response.setHeader('Access-Control-Allow-Headers','Authorization,User-Agent,Content-Type,Accept,Origin,X-Requested-With,Cursor'); 133 | 134 | response.statusCode = 200; 135 | response.end(); 136 | }, 137 | propfind: function(uri, request, response) { 138 | var rpath = uri.pathname; 139 | var fpath = upath.join(working_dir, rpath); 140 | 141 | if (!fs.existsSync(fpath)) { 142 | response.statusCode = 404; 143 | response.end(); 144 | return; 145 | } 146 | 147 | var xml; 148 | if (!fs.statSync(fpath).isDirectory()) { 149 | xml = arrayToXml(rpath, [ '' ]); 150 | } else { 151 | var wc = watcherCache[rpath]; 152 | var files, d; 153 | if (!(d = request.headers.depth) || d > 0) { 154 | files = fs.readdirSync(fpath); 155 | } 156 | 157 | xml = arrayToXml(rpath, [ '.' ].concat(files || []), wc && (!d || d > 0) ? wc.current_cursor : undefined); 158 | } 159 | 160 | response.statusCode = 207; 161 | response.setHeader('Content-Type', 'application/xml; charset=utf-8'); 162 | response.end(xml); 163 | }, 164 | mkcol: function(uri, request, response) { 165 | var rpath = uri.pathname; 166 | var fpath = upath.join(working_dir, rpath); 167 | 168 | if (fs.existsSync(fpath)){ 169 | response.statusCode = 405; 170 | response.end('MethodNotAllowedThe resource you tried to create already exists'); 171 | } else { 172 | try { 173 | fs.mkdirSync(fpath); 174 | return methods.propfind(uri, request, response); 175 | } catch (e) { 176 | response.statusCode = 422; 177 | response.end(); 178 | } 179 | } 180 | }, 181 | get: function(uri, request, response) { 182 | var rpath = uri.pathname; 183 | var fpath = upath.join(working_dir, rpath); 184 | 185 | if (fs.existsSync(fpath)){ 186 | let content; 187 | try { 188 | content = fs.readFileSync(fpath); 189 | response.statusCode = 200; 190 | response.setHeader('Content-Type', 'application/octet-stream'); 191 | } catch(e) { 192 | console.error(e); 193 | response.statusCode = 500; 194 | content = e.message; 195 | } finally { 196 | response.end(content); 197 | } 198 | } else { 199 | response.statusCode = 404; 200 | response.end(); 201 | } 202 | }, 203 | editor: function(uri, request, response) { 204 | var editor = args['open-in-editor']; 205 | if (!editor) { 206 | response.statusCode = 501; 207 | response.end(); 208 | return; 209 | } else if (editor === true) { 210 | if (process.platform == 'win32') { 211 | editor = 'notepad'; 212 | } else { 213 | editor = 'xdg-open'; 214 | } 215 | } 216 | 217 | var rpath = uri.pathname; 218 | var fpath = upath.join(working_dir, rpath); 219 | 220 | if (fs.existsSync(fpath)){ 221 | open(upath.resolve(fpath), { app: editor }); 222 | 223 | response.setHeader('Location', `dav://${request.headers.host}${uri.pathname}`); 224 | response.statusCode = 302; 225 | response.end(); 226 | } else { 227 | response.statusCode = 404; 228 | response.end(); 229 | } 230 | }, 231 | put: function(uri, request, response) { 232 | var rpath = uri.pathname; 233 | var fpath = upath.join(working_dir, rpath); 234 | 235 | var data = []; 236 | request.on('data', function (chunk) { 237 | data.push(chunk); 238 | }); 239 | 240 | request.on('end', function () { 241 | fs.writeFileSync(fpath, Buffer.concat(data)); 242 | 243 | var ts; 244 | if ((ts = request.headers['x-oc-mtime'])) { 245 | try { 246 | fs.utimesSync(fpath, ts, ts); 247 | response.setHeader('X-OC-Mtime', 'accepted'); 248 | } catch (e) { 249 | console.error(`setting mtime #{ts} failed`, e.mesage); 250 | } 251 | } 252 | 253 | response.statusCode = 200; 254 | response.end(); 255 | }); 256 | }, 257 | delete: function(uri, request, response) { 258 | var rpath = uri.pathname; 259 | var fpath = upath.join(working_dir, rpath); 260 | 261 | try { 262 | fs.unlinkSync(fpath); 263 | response.statusCode = 204; 264 | response.end(); 265 | } catch (e) { 266 | console.error(`deleting file #{rpath} failed`, e); 267 | response.statusCode = 404; 268 | response.end(); 269 | } 270 | }, 271 | head: function(uri, request, response) { 272 | var rpath = uri.pathname; 273 | var fpath = upath.join(working_dir, rpath); 274 | 275 | var done, stats; 276 | if (fs.existsSync(fpath)){ 277 | try { 278 | stats = fs.statSync(fpath); 279 | } catch (e) { 280 | console.error(`stat file #{rpath} failed`, e); 281 | } 282 | if (stats) { 283 | response.statusCode = 200; 284 | response.setHeader('Content-Length', stats.size); 285 | response.setHeader('Content-Type', 'application/octet-stream'); 286 | response.end(); 287 | done = true; 288 | } 289 | } 290 | if (!done) { 291 | response.statusCode = 404; 292 | response.end(); 293 | } 294 | }, 295 | subscribe: function(uri, request, response) { 296 | var rpath = uri.pathname; 297 | var fpath = upath.join(working_dir, rpath); 298 | 299 | if (!fs.existsSync(fpath)) { 300 | response.statusCode = 404; 301 | response.end(); 302 | return; 303 | } 304 | 305 | if (!fs.statSync(fpath).isDirectory()) { 306 | response.statusCode = 400; 307 | response.end(); 308 | return; 309 | } 310 | 311 | var id = crypto.randomBytes(16).toString('hex'); 312 | var to = global.setTimeout(function() { 313 | delete subscribers[rpath][id]; 314 | 315 | if (response.finished) return; 316 | 317 | response.statusCode = 204; 318 | response.end(); 319 | }, 90 * 1000); 320 | 321 | (subscribers[rpath] = subscribers[rpath] || {})[id] = { response: response, to: to }; 322 | 323 | assureWatcher(rpath); 324 | 325 | var url_args = getUrlArgs(uri.search || ''); 326 | var from_cursor; 327 | if ((from_cursor = (url_args.cursor || request.headers.cursor))) { 328 | sendCachedWatcherChanges(rpath, parseInt(from_cursor, 10)); 329 | } 330 | } 331 | }; 332 | 333 | const getUrlArgs = function(url) { 334 | var c = {}; 335 | var p = url.replace(/^\?/, ''); 336 | 337 | var args = p.split('&'); 338 | var pair; 339 | 340 | for (var i=0; i', 378 | `${upath.join(rpath, name)}`, 379 | '', 380 | '', 381 | `${lastmodified}`, 382 | dir ? '' : '', 383 | !dir ? `${size}` : '', 384 | '', 385 | 'HTTP/1.1 200 OK', 386 | '', 387 | '', 388 | ].filter(function(e) { return e; }).join('\n'); 389 | }).join('\n'); 390 | var new_cursor = cursor ? `${cursor}` : ''; 391 | return `${entries}${new_cursor}`; 392 | 393 | }; 394 | 395 | var watchers = {}; 396 | const notifySubscribers = function(rpath, changed_files, cursor) { 397 | var a; 398 | 399 | if ((a = subscribers[rpath])) { 400 | subscribers[rpath] = {}; 401 | var xml = arrayToXml(rpath, changed_files, cursor); 402 | 403 | Object.keys(a).forEach(function(k) { 404 | var o = a[k]; 405 | var response = o.response; 406 | 407 | response.statusCode = 207; 408 | response.setHeader('Content-Type', 'application/xml; charset=utf-8'); 409 | 410 | response.end(xml); 411 | 412 | global.clearTimeout(o.to); 413 | }); 414 | } 415 | }; 416 | 417 | var watcherCache = {}; 418 | 419 | const sendCachedWatcherChanges = function(rpath, from_cursor) { 420 | var wc, cc; 421 | if (!(wc = watcherCache[rpath])) { 422 | return; 423 | } 424 | for (var i=from_cursor; i<=wc.current_cursor; i++) { 425 | if ((cc = wc.changes[i])) { 426 | notifySubscribers(rpath, Object.keys(cc), i+1); 427 | } 428 | } 429 | 430 | var k; 431 | if ((k = Object.keys(wc.changes)) && k.length > max_cursors) { 432 | var m = wc.current_cursor - max_cursors + 1; 433 | k.forEach(function(e) { 434 | if (e < m) delete wc.changes[e]; 435 | }); 436 | } 437 | 438 | return true; 439 | }; 440 | 441 | const assureWatcher = function(rpath) { 442 | if (watchers[rpath]) return; 443 | 444 | var fpath = upath.join(working_dir, rpath); 445 | var onchange, wc; 446 | var w = chokidar.watch(fpath, { 447 | ignored: /^\./, 448 | atomic: true, 449 | ignoreInitial: true 450 | }); 451 | 452 | w.on('add', (onchange = function(_path) { 453 | var path = upath.normalize(_path); 454 | var cc; 455 | var filename = path.replace(new RegExp('^' + RegExp.escape(fpath) + '\/?'), ''); 456 | if (args['meta-touch']) { 457 | var n, meta, m; 458 | if ((m = path.match(/(.*)\.user.js$/)) && (n = m[1]) && (meta = `${n}.meta.json`) && fs.existsSync(meta)) { 459 | if (args.debug) console.log('metatouch: ', meta); 460 | try { 461 | // This is nuts! But this seems to be the only way to update file timestamps reliably at Windows 10 462 | // require('touch'), fs.utimes -> EPERM: operation not permitted, futime 463 | var c = fs.readFileSync(meta); 464 | fs.writeFileSync(meta, c); 465 | } catch (e) { 466 | console.error(e); 467 | } 468 | } 469 | } 470 | if (!wc) { 471 | wc = watcherCache[rpath] = { changes: {}, to: null, current_cursor: 1 }; 472 | } 473 | if (!(cc = wc.changes[wc.current_cursor])) { 474 | cc = wc.changes[wc.current_cursor] = {}; 475 | } 476 | if (!cc[filename]) { 477 | cc[filename] = true; 478 | } 479 | if (wc.to) { 480 | global.clearTimeout(wc.to); 481 | } 482 | // collect all changes until there is no change for one second 483 | wc.to = global.setTimeout(function() { 484 | sendCachedWatcherChanges(rpath, wc.current_cursor); 485 | var o = watcherCache[rpath]; 486 | o.to = null; 487 | wc.current_cursor++; 488 | }, 1000); 489 | })) 490 | .on('change', onchange) 491 | .on('unlink', onchange) 492 | .on('error', function() { 493 | notifySubscribers(rpath, wc ? wc.changes : []); 494 | }); 495 | 496 | watchers[rpath] = w; 497 | }; 498 | 499 | const requestHandler = function(request, response) { 500 | var uri = url.parse(request.url); 501 | var url_args = getUrlArgs(uri.search || ''); 502 | var method = url_args.method || request.method.toLowerCase(); 503 | var m; 504 | 505 | request.on('error', function(err) { 506 | console.error(err.stack); 507 | }); 508 | 509 | if (args.debug) { 510 | var sh = response.setHeader; 511 | var e = response.end; 512 | 513 | response.setHeader = function() { 514 | console.log('response.setHeader', arguments); 515 | sh.apply(response, arguments); 516 | }; 517 | response.end = function() { 518 | console.log('response.end', arguments); 519 | e.apply(response, arguments); 520 | }; 521 | console.log('request', method, request.url, request.headers); 522 | } 523 | 524 | if (args.username || args.password) { 525 | var a, b, d; 526 | if (!(a = request.headers.authorization) || 527 | !(b = a.match('Basic (.*)')[1]) || 528 | !(d = btoa(b).split(':')) || 529 | d[0] != args.username || 530 | d[1] != args.password) { 531 | 532 | response.setHeader('WWW-Authenticate', 'Basic realm="Enter credentials"'); 533 | response.statusCode = 401; 534 | response.end(); 535 | return; 536 | } 537 | } 538 | 539 | if ((m = methods[method])) { 540 | response.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); 541 | response.setHeader('DAV', '1'); 542 | 543 | return m(uri, request, response); 544 | } else { 545 | console.log(`unknown method ${request.method}`); 546 | response.statusCode = 501; 547 | response.end(); 548 | } 549 | }; 550 | 551 | const server = http.createServer(requestHandler); 552 | const host = args.host || 'localhost'; 553 | 554 | server.listen(port, host, function(err) { 555 | if (err) { 556 | return console.log(err); 557 | } 558 | 559 | console.log(`server is listening on ${port}`); 560 | }); 561 | -------------------------------------------------------------------------------- /dist/main.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Vue生产环境(production) Devtools 调试 3 | // @namespace https://github.com/xcr1234/vue-devtools-production 4 | // @version 2.1.0 5 | // @description 使用本脚本支持直接调试生产环境的Vue项目 完美支持Vue2、Vue3! 6 | // @homepage https://github.com/xcr1234/vue-devtools-production 7 | // @icon data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAbpJREFUOE+lkz9IG2EYxp/3Eo1GHWzFDqFKLQ6CIGpLS9GSQzGniw5OLTg6CCLO5kT86FpolnR3kFYXJ+9o2u9EcPEPEdqp4qKlbbaihpxw98n3JUqMqYp+03s87/P7/jzvEe656J5+KIC+ymwQBmR99OGnYgoh1rethdeyfjY4tg6gR9Z1U615HfTFMeIDCtC38u6RH/L/yPo0/S/lrmX6VRfRKAEBIcQn+Vn5on4j9LLhlQL43mNnaO7w4grR1XlGRHEpHn/c3xWu1wHgBwANQBtVaPu1E09bCuAEj8Wn1B7Fb6Bb7ARA2Pud28l+Pugq1sIjke+B5nA7gBw3zOpz7RIgarNREliSYnb5IOX9yqmraA2hzZq3Tc/Vjj4mvg2ZybIA9aAW4wCivutnjpN7NUSk1Y4/yVJ18CGANDfMzuKTXYlRt+e7IWhLNrk8w4WPYFVfY28+GejOoOlcCyjEmgBhsmRGFrlhvimdm7KDFLPmHpwikAEQyBvI01yKfB2e+XsrgDqFzaYh8L5gmOWGyUrNV2IsbdAtlgYQ5IYp4yu7rv0XojYbkQAnZi7fCfA/040p3MZ43nMG7TKHEfrJ20kAAAAASUVORK5CYII= 8 | // @include * 9 | // @run-at document-end 10 | // @grant none 11 | // ==/UserScript== 12 | const v = (e, t) => { 13 | let o = Object.getPrototypeOf(t).constructor; 14 | for (; o.super; ) 15 | o = o.super; 16 | if (!o.config.devtools && (o.config.devtools = !0, e.emit("init", o), console.log(`vue devtools for [${o.version}] already open !!!`), t.$store)) { 17 | const n = t.$store; 18 | n._devtoolHook = e, e.emit("vuex:init", n), e.on("vuex:travel-to-state", (s) => { 19 | n.replaceState(s); 20 | }), n.subscribe((s, a) => { 21 | e.emit("vuex:mutation", s, a); 22 | }); 23 | } 24 | }; 25 | /** 26 | * @vue/shared v3.4.33 27 | * (c) 2018-present Yuxi (Evan) You and Vue contributors 28 | * @license MIT 29 | **/ 30 | const N = (e) => typeof e == "symbol"; 31 | /** 32 | * @vue/reactivity v3.4.33 33 | * (c) 2018-present Yuxi (Evan) You and Vue contributors 34 | * @license MIT 35 | **/ 36 | new Set( 37 | /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(N) 38 | ); 39 | function E(e) { 40 | const t = e && e.__v_raw; 41 | return t ? E(t) : e; 42 | } 43 | function C() { 44 | return I().__VUE_DEVTOOLS_GLOBAL_HOOK__; 45 | } 46 | function I() { 47 | return typeof navigator < "u" && typeof window < "u" ? window : typeof globalThis < "u" ? globalThis : {}; 48 | } 49 | const R = typeof Proxy == "function", U = "devtools-plugin:setup", D = "plugin:settings:set"; 50 | let _, h; 51 | function G() { 52 | var e; 53 | return _ !== void 0 || (typeof window < "u" && window.performance ? (_ = !0, h = window.performance) : typeof globalThis < "u" && (!((e = globalThis.perf_hooks) === null || e === void 0) && e.performance) ? (_ = !0, h = globalThis.perf_hooks.performance) : _ = !1), _; 54 | } 55 | function F() { 56 | return G() ? h.now() : Date.now(); 57 | } 58 | class M { 59 | constructor(t, o) { 60 | this.target = null, this.targetQueue = [], this.onQueue = [], this.plugin = t, this.hook = o; 61 | const n = {}; 62 | if (t.settings) 63 | for (const i in t.settings) { 64 | const r = t.settings[i]; 65 | n[i] = r.defaultValue; 66 | } 67 | const s = `__vue-devtools-plugin-settings__${t.id}`; 68 | let a = Object.assign({}, n); 69 | try { 70 | const i = localStorage.getItem(s), r = JSON.parse(i); 71 | Object.assign(a, r); 72 | } catch { 73 | } 74 | this.fallbacks = { 75 | getSettings() { 76 | return a; 77 | }, 78 | setSettings(i) { 79 | try { 80 | localStorage.setItem(s, JSON.stringify(i)); 81 | } catch { 82 | } 83 | a = i; 84 | }, 85 | now() { 86 | return F(); 87 | } 88 | }, o && o.on(D, (i, r) => { 89 | i === this.plugin.id && this.fallbacks.setSettings(r); 90 | }), this.proxiedOn = new Proxy({}, { 91 | get: (i, r) => this.target ? this.target.on[r] : (...c) => { 92 | this.onQueue.push({ 93 | method: r, 94 | args: c 95 | }); 96 | } 97 | }), this.proxiedTarget = new Proxy({}, { 98 | get: (i, r) => this.target ? this.target[r] : r === "on" ? this.proxiedOn : Object.keys(this.fallbacks).includes(r) ? (...c) => (this.targetQueue.push({ 99 | method: r, 100 | args: c, 101 | resolve: () => { 102 | } 103 | }), this.fallbacks[r](...c)) : (...c) => new Promise((u) => { 104 | this.targetQueue.push({ 105 | method: r, 106 | args: c, 107 | resolve: u 108 | }); 109 | }) 110 | }); 111 | } 112 | async setRealTarget(t) { 113 | this.target = t; 114 | for (const o of this.onQueue) 115 | this.target.on[o.method](...o.args); 116 | for (const o of this.targetQueue) 117 | o.resolve(await this.target[o.method](...o.args)); 118 | } 119 | } 120 | function H(e, t) { 121 | const o = e, n = I(), s = C(), a = R && o.enableEarlyProxy; 122 | if (s && (n.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !a)) 123 | s.emit(U, e, t); 124 | else { 125 | const i = a ? new M(o, s) : null; 126 | (n.__VUE_DEVTOOLS_PLUGINS__ = n.__VUE_DEVTOOLS_PLUGINS__ || []).push({ 127 | pluginDescriptor: o, 128 | setupFn: t, 129 | proxy: i 130 | }), i && t(i.proxiedTarget); 131 | } 132 | } 133 | /*! 134 | * pinia v2.1.7 135 | * (c) 2023 Eduardo San Martin Morote 136 | * @license MIT 137 | */ 138 | var b; 139 | (function(e) { 140 | e.direct = "direct", e.patchObject = "patch object", e.patchFunction = "patch function"; 141 | })(b || (b = {})); 142 | const J = typeof window < "u"; 143 | const O = typeof window == "object" && window.window === window ? window : typeof self == "object" && self.self === self ? self : typeof global == "object" && global.global === global ? global : typeof globalThis == "object" ? globalThis : { HTMLElement: null }; 144 | function B(e, { autoBom: t = !1 } = {}) { 145 | return t && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type) ? new Blob(["\uFEFF", e], { type: e.type }) : e; 146 | } 147 | function S(e, t, o) { 148 | const n = new XMLHttpRequest(); 149 | n.open("GET", e), n.responseType = "blob", n.onload = function() { 150 | x(n.response, t, o); 151 | }, n.onerror = function() { 152 | console.error("could not download file"); 153 | }, n.send(); 154 | } 155 | function L(e) { 156 | const t = new XMLHttpRequest(); 157 | t.open("HEAD", e, !1); 158 | try { 159 | t.send(); 160 | } catch { 161 | } 162 | return t.status >= 200 && t.status <= 299; 163 | } 164 | function g(e) { 165 | try { 166 | e.dispatchEvent(new MouseEvent("click")); 167 | } catch { 168 | const o = document.createEvent("MouseEvents"); 169 | o.initMouseEvent("click", !0, !0, window, 0, 0, 0, 80, 20, !1, !1, !1, !1, 0, null), e.dispatchEvent(o); 170 | } 171 | } 172 | const m = typeof navigator == "object" ? navigator : { userAgent: "" }, P = /Macintosh/.test(m.userAgent) && /AppleWebKit/.test(m.userAgent) && !/Safari/.test(m.userAgent), x = J ? ( 173 | // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program 174 | typeof HTMLAnchorElement < "u" && "download" in HTMLAnchorElement.prototype && !P ? Q : ( 175 | // Use msSaveOrOpenBlob as a second approach 176 | "msSaveOrOpenBlob" in m ? K : ( 177 | // Fallback to using FileReader and a popup 178 | Y 179 | ) 180 | ) 181 | ) : () => { 182 | }; 183 | function Q(e, t = "download", o) { 184 | const n = document.createElement("a"); 185 | n.download = t, n.rel = "noopener", typeof e == "string" ? (n.href = e, n.origin !== location.origin ? L(n.href) ? S(e, t, o) : (n.target = "_blank", g(n)) : g(n)) : (n.href = URL.createObjectURL(e), setTimeout(function() { 186 | URL.revokeObjectURL(n.href); 187 | }, 4e4), setTimeout(function() { 188 | g(n); 189 | }, 0)); 190 | } 191 | function K(e, t = "download", o) { 192 | if (typeof e == "string") 193 | if (L(e)) 194 | S(e, t, o); 195 | else { 196 | const n = document.createElement("a"); 197 | n.href = e, n.target = "_blank", setTimeout(function() { 198 | g(n); 199 | }); 200 | } 201 | else 202 | navigator.msSaveOrOpenBlob(B(e, o), t); 203 | } 204 | function Y(e, t, o, n) { 205 | if (n = n || open("", "_blank"), n && (n.document.title = n.document.body.innerText = "downloading..."), typeof e == "string") 206 | return S(e, t, o); 207 | const s = e.type === "application/octet-stream", a = /constructor/i.test(String(O.HTMLElement)) || "safari" in O, i = /CriOS\/[\d]+/.test(navigator.userAgent); 208 | if ((i || s && a || P) && typeof FileReader < "u") { 209 | const r = new FileReader(); 210 | r.onloadend = function() { 211 | let c = r.result; 212 | if (typeof c != "string") 213 | throw n = null, new Error("Wrong reader.result type"); 214 | c = i ? c : c.replace(/^data:[^;]*;/, "data:attachment/file;"), n ? n.location.href = c : location.assign(c), n = null; 215 | }, r.readAsDataURL(e); 216 | } else { 217 | const r = URL.createObjectURL(e); 218 | n ? n.location.assign(r) : location.href = r, n = null, setTimeout(function() { 219 | URL.revokeObjectURL(r); 220 | }, 4e4); 221 | } 222 | } 223 | function l(e, t) { 224 | const o = "🍍 " + e; 225 | typeof __VUE_DEVTOOLS_TOAST__ == "function" ? __VUE_DEVTOOLS_TOAST__(o, t) : t === "error" ? console.error(o) : t === "warn" ? console.warn(o) : console.log(o); 226 | } 227 | function w(e) { 228 | return "_a" in e && "install" in e; 229 | } 230 | function A() { 231 | if (!("clipboard" in navigator)) 232 | return l("Your browser doesn't support the Clipboard API", "error"), !0; 233 | } 234 | function $(e) { 235 | return e instanceof Error && e.message.toLowerCase().includes("document is not focused") ? (l('You need to activate the "Emulate a focused page" setting in the "Rendering" panel of devtools.', "warn"), !0) : !1; 236 | } 237 | async function z(e) { 238 | if (!A()) 239 | try { 240 | await navigator.clipboard.writeText(JSON.stringify(e.state.value)), l("Global state copied to clipboard."); 241 | } catch (t) { 242 | if ($(t)) 243 | return; 244 | l("Failed to serialize the state. Check the console for more details.", "error"), console.error(t); 245 | } 246 | } 247 | async function W(e) { 248 | if (!A()) 249 | try { 250 | k(e, JSON.parse(await navigator.clipboard.readText())), l("Global state pasted from clipboard."); 251 | } catch (t) { 252 | if ($(t)) 253 | return; 254 | l("Failed to deserialize the state from clipboard. Check the console for more details.", "error"), console.error(t); 255 | } 256 | } 257 | async function q(e) { 258 | try { 259 | x(new Blob([JSON.stringify(e.state.value)], { 260 | type: "text/plain;charset=utf-8" 261 | }), "pinia-state.json"); 262 | } catch (t) { 263 | l("Failed to export the state as JSON. Check the console for more details.", "error"), console.error(t); 264 | } 265 | } 266 | let f; 267 | function X() { 268 | f || (f = document.createElement("input"), f.type = "file", f.accept = ".json"); 269 | function e() { 270 | return new Promise((t, o) => { 271 | f.onchange = async () => { 272 | const n = f.files; 273 | if (!n) 274 | return t(null); 275 | const s = n.item(0); 276 | return t(s ? { text: await s.text(), file: s } : null); 277 | }, f.oncancel = () => t(null), f.onerror = o, f.click(); 278 | }); 279 | } 280 | return e; 281 | } 282 | async function Z(e) { 283 | try { 284 | const o = await X()(); 285 | if (!o) 286 | return; 287 | const { text: n, file: s } = o; 288 | k(e, JSON.parse(n)), l(`Global state imported from "${s.name}".`); 289 | } catch (t) { 290 | l("Failed to import the state from JSON. Check the console for more details.", "error"), console.error(t); 291 | } 292 | } 293 | function k(e, t) { 294 | for (const o in t) { 295 | const n = e.state.value[o]; 296 | n ? Object.assign(n, t[o]) : e.state.value[o] = t[o]; 297 | } 298 | } 299 | const j = "🍍 Pinia (root)", p = "_root"; 300 | function ee(e) { 301 | return w(e) ? { 302 | id: p, 303 | label: j 304 | } : { 305 | id: e.$id, 306 | label: e.$id 307 | }; 308 | } 309 | function te(e) { 310 | if (w(e)) { 311 | const o = Array.from(e._s.keys()), n = e._s; 312 | return { 313 | state: o.map((a) => ({ 314 | editable: !0, 315 | key: a, 316 | value: e.state.value[a] 317 | })), 318 | getters: o.filter((a) => n.get(a)._getters).map((a) => { 319 | const i = n.get(a); 320 | return { 321 | editable: !1, 322 | key: a, 323 | value: i._getters.reduce((r, c) => (r[c] = i[c], r), {}) 324 | }; 325 | }) 326 | }; 327 | } 328 | const t = { 329 | state: Object.keys(e.$state).map((o) => ({ 330 | editable: !0, 331 | key: o, 332 | value: e.$state[o] 333 | })) 334 | }; 335 | return e._getters && e._getters.length && (t.getters = e._getters.map((o) => ({ 336 | editable: !1, 337 | key: o, 338 | value: e[o] 339 | }))), e._customProperties.size && (t.customProperties = Array.from(e._customProperties).map((o) => ({ 340 | editable: !0, 341 | key: o, 342 | value: e[o] 343 | }))), t; 344 | } 345 | const ne = [], oe = "pinia:mutations", d = "pinia", y = (e) => "🍍 " + e; 346 | function re(e, t) { 347 | H({ 348 | id: "dev.esm.pinia", 349 | label: "Pinia 🍍", 350 | logo: "https://pinia.vuejs.org/logo.svg", 351 | packageName: "pinia", 352 | homepage: "https://pinia.vuejs.org", 353 | componentStateTypes: ne, 354 | app: e 355 | }, (o) => { 356 | typeof o.now != "function" && l("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."), o.addTimelineLayer({ 357 | id: oe, 358 | label: "Pinia 🍍", 359 | color: 15064968 360 | }), o.addInspector({ 361 | id: d, 362 | label: "Pinia 🍍", 363 | icon: "storage", 364 | treeFilterPlaceholder: "Search stores", 365 | actions: [ 366 | { 367 | icon: "content_copy", 368 | action: () => { 369 | z(t); 370 | }, 371 | tooltip: "Serialize and copy the state" 372 | }, 373 | { 374 | icon: "content_paste", 375 | action: async () => { 376 | await W(t), o.sendInspectorTree(d), o.sendInspectorState(d); 377 | }, 378 | tooltip: "Replace the state with the content of your clipboard" 379 | }, 380 | { 381 | icon: "save", 382 | action: () => { 383 | q(t); 384 | }, 385 | tooltip: "Save the state as a JSON file" 386 | }, 387 | { 388 | icon: "folder_open", 389 | action: async () => { 390 | await Z(t), o.sendInspectorTree(d), o.sendInspectorState(d); 391 | }, 392 | tooltip: "Import the state from a JSON file" 393 | } 394 | ], 395 | nodeActions: [ 396 | { 397 | icon: "restore", 398 | tooltip: 'Reset the state (with "$reset")', 399 | action: (n) => { 400 | const s = t._s.get(n); 401 | s ? typeof s.$reset != "function" ? l(`Cannot reset "${n}" store because it doesn't have a "$reset" method implemented.`, "warn") : (s.$reset(), l(`Store "${n}" reset.`)) : l(`Cannot reset "${n}" store because it wasn't found.`, "warn"); 402 | } 403 | } 404 | ] 405 | }), o.on.inspectComponent((n, s) => { 406 | const a = n.componentInstance && n.componentInstance.proxy; 407 | if (a && a._pStores) { 408 | const i = n.componentInstance.proxy._pStores; 409 | Object.values(i).forEach((r) => { 410 | n.instanceData.state.push({ 411 | type: y(r.$id), 412 | key: "state", 413 | editable: !0, 414 | value: r._isOptionsAPI ? { 415 | _custom: { 416 | value: E(r.$state), 417 | actions: [ 418 | { 419 | icon: "restore", 420 | tooltip: "Reset the state of this store", 421 | action: () => r.$reset() 422 | } 423 | ] 424 | } 425 | } : ( 426 | // NOTE: workaround to unwrap transferred refs 427 | Object.keys(r.$state).reduce((c, u) => (c[u] = r.$state[u], c), {}) 428 | ) 429 | }), r._getters && r._getters.length && n.instanceData.state.push({ 430 | type: y(r.$id), 431 | key: "getters", 432 | editable: !1, 433 | value: r._getters.reduce((c, u) => { 434 | try { 435 | c[u] = r[u]; 436 | } catch (V) { 437 | c[u] = V; 438 | } 439 | return c; 440 | }, {}) 441 | }); 442 | }); 443 | } 444 | }), o.on.getInspectorTree((n) => { 445 | if (n.app === e && n.inspectorId === d) { 446 | let s = [t]; 447 | s = s.concat(Array.from(t._s.values())), n.rootNodes = (n.filter ? s.filter((a) => "$id" in a ? a.$id.toLowerCase().includes(n.filter.toLowerCase()) : j.toLowerCase().includes(n.filter.toLowerCase())) : s).map(ee); 448 | } 449 | }), o.on.getInspectorState((n) => { 450 | if (n.app === e && n.inspectorId === d) { 451 | const s = n.nodeId === p ? t : t._s.get(n.nodeId); 452 | if (!s) 453 | return; 454 | s && (n.state = te(s)); 455 | } 456 | }), o.on.editInspectorState((n, s) => { 457 | if (n.app === e && n.inspectorId === d) { 458 | const a = n.nodeId === p ? t : t._s.get(n.nodeId); 459 | if (!a) 460 | return l(`store "${n.nodeId}" not found`, "error"); 461 | const { path: i } = n; 462 | w(a) ? i.unshift("state") : (i.length !== 1 || !a._customProperties.has(i[0]) || i[0] in a.$state) && i.unshift("$state"), n.set(a, i, n.state.value); 463 | } 464 | }), o.on.editComponentState((n) => { 465 | if (n.type.startsWith("🍍")) { 466 | const s = n.type.replace(/^🍍\s*/, ""), a = t._s.get(s); 467 | if (!a) 468 | return l(`store "${s}" not found`, "error"); 469 | const { path: i } = n; 470 | if (i[0] !== "state") 471 | return l(`Invalid path for store "${s}": 472 | ${i} 473 | Only state can be modified.`); 474 | i[0] = "$state", n.set(a, i, n.state.value); 475 | } 476 | }); 477 | }); 478 | } 479 | const se = (e) => { 480 | e.includes("-alpha.") && (e = e.split("-alpha.")[0]); 481 | const [t, o] = e.split(".").map(Number); 482 | return t > 3 || t === 3 && o >= 3; 483 | }, T = (e, t) => { 484 | if (t.config.devtools) 485 | return; 486 | t.config.devtools = !0, se(t.version) ? e.emit("app:init", t, t.version, { 487 | Fragment: Symbol.for("v-fgt"), 488 | Text: Symbol.for("v-txt"), 489 | Comment: Symbol.for("v-cmt"), 490 | Static: Symbol.for("v-stc") 491 | }) : e.emit("app:init", t, t.version, { 492 | Fragment: Symbol.for("Fragment"), 493 | Text: Symbol.for("Text"), 494 | Comment: Symbol.for("Comment"), 495 | Static: Symbol.for("Static") 496 | }), console.log(`vue devtools for [${t.version}] already open !!!`); 497 | const o = t.unmount.bind(t); 498 | t.unmount = () => { 499 | e.emit("app:unmount", t), o(); 500 | }, t.config.globalProperties.$store && console.warn("vuex for vue3 not support. please use pinia"); 501 | const n = t.config.globalProperties.$pinia; 502 | n && re(t, n); 503 | }, ie = () => { 504 | if (self != top) 505 | return; 506 | const e = window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 507 | if (!e) { 508 | console.warn("No Vue devtools found , Please install it first: "), console.warn("see https://github.com/vuejs/vue-devtools"); 509 | return; 510 | } 511 | const t = window.app; 512 | if (!t) 513 | return; 514 | if (t.__vue__) { 515 | v(e, t.__vue__); 516 | return; 517 | } 518 | if (t.__vue_app__) { 519 | T(e, t.__vue_app__); 520 | return; 521 | } 522 | new MutationObserver((n, s) => { 523 | const a = s.disconnect.bind(s); 524 | for (const i of n) { 525 | const r = i.target; 526 | r.__vue__ ? (v(e, r.__vue__), a()) : r.__vue_app__ && (T(e, r.__vue_app__), a()); 527 | } 528 | }).observe(document.documentElement, { 529 | attributes: !0, 530 | subtree: !0, 531 | childList: !0 532 | }); 533 | }; 534 | ie(); 535 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/parser@^7.24.7": 6 | version "7.24.8" 7 | resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" 8 | integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== 9 | 10 | "@esbuild/aix-ppc64@0.21.5": 11 | version "0.21.5" 12 | resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 13 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 14 | 15 | "@esbuild/android-arm64@0.21.5": 16 | version "0.21.5" 17 | resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 18 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 19 | 20 | "@esbuild/android-arm@0.21.5": 21 | version "0.21.5" 22 | resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 23 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 24 | 25 | "@esbuild/android-x64@0.21.5": 26 | version "0.21.5" 27 | resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 28 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 29 | 30 | "@esbuild/darwin-arm64@0.21.5": 31 | version "0.21.5" 32 | resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 33 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 34 | 35 | "@esbuild/darwin-x64@0.21.5": 36 | version "0.21.5" 37 | resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 38 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 39 | 40 | "@esbuild/freebsd-arm64@0.21.5": 41 | version "0.21.5" 42 | resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 43 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 44 | 45 | "@esbuild/freebsd-x64@0.21.5": 46 | version "0.21.5" 47 | resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 48 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 49 | 50 | "@esbuild/linux-arm64@0.21.5": 51 | version "0.21.5" 52 | resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 53 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 54 | 55 | "@esbuild/linux-arm@0.21.5": 56 | version "0.21.5" 57 | resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 58 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 59 | 60 | "@esbuild/linux-ia32@0.21.5": 61 | version "0.21.5" 62 | resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 63 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 64 | 65 | "@esbuild/linux-loong64@0.21.5": 66 | version "0.21.5" 67 | resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 68 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 69 | 70 | "@esbuild/linux-mips64el@0.21.5": 71 | version "0.21.5" 72 | resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 73 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 74 | 75 | "@esbuild/linux-ppc64@0.21.5": 76 | version "0.21.5" 77 | resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 78 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 79 | 80 | "@esbuild/linux-riscv64@0.21.5": 81 | version "0.21.5" 82 | resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 83 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 84 | 85 | "@esbuild/linux-s390x@0.21.5": 86 | version "0.21.5" 87 | resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 88 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 89 | 90 | "@esbuild/linux-x64@0.21.5": 91 | version "0.21.5" 92 | resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 93 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 94 | 95 | "@esbuild/netbsd-x64@0.21.5": 96 | version "0.21.5" 97 | resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 98 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 99 | 100 | "@esbuild/openbsd-x64@0.21.5": 101 | version "0.21.5" 102 | resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 103 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 104 | 105 | "@esbuild/sunos-x64@0.21.5": 106 | version "0.21.5" 107 | resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 108 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 109 | 110 | "@esbuild/win32-arm64@0.21.5": 111 | version "0.21.5" 112 | resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 113 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 114 | 115 | "@esbuild/win32-ia32@0.21.5": 116 | version "0.21.5" 117 | resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 118 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 119 | 120 | "@esbuild/win32-x64@0.21.5": 121 | version "0.21.5" 122 | resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 123 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 124 | 125 | "@jridgewell/sourcemap-codec@^1.4.15": 126 | version "1.5.0" 127 | resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 128 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 129 | 130 | "@rollup/rollup-android-arm-eabi@4.18.1": 131 | version "4.18.1" 132 | resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz#f0da481244b7d9ea15296b35f7fe39cd81157396" 133 | integrity sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA== 134 | 135 | "@rollup/rollup-android-arm64@4.18.1": 136 | version "4.18.1" 137 | resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz#82ab3c575f4235fb647abea5e08eec6cf325964e" 138 | integrity sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg== 139 | 140 | "@rollup/rollup-darwin-arm64@4.18.1": 141 | version "4.18.1" 142 | resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz#6a530452e68a9152809ce58de1f89597632a085b" 143 | integrity sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ== 144 | 145 | "@rollup/rollup-darwin-x64@4.18.1": 146 | version "4.18.1" 147 | resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz#47727479f5ca292cf434d7e75af2725b724ecbc7" 148 | integrity sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA== 149 | 150 | "@rollup/rollup-linux-arm-gnueabihf@4.18.1": 151 | version "4.18.1" 152 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz#46193c498aa7902a8db89ac00128060320e84fef" 153 | integrity sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g== 154 | 155 | "@rollup/rollup-linux-arm-musleabihf@4.18.1": 156 | version "4.18.1" 157 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz#22d831fe239643c1d05c98906420325cee439d85" 158 | integrity sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ== 159 | 160 | "@rollup/rollup-linux-arm64-gnu@4.18.1": 161 | version "4.18.1" 162 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz#19abd33695ec9d588b4a858d122631433084e4a3" 163 | integrity sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ== 164 | 165 | "@rollup/rollup-linux-arm64-musl@4.18.1": 166 | version "4.18.1" 167 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz#d60af8c0b9be424424ff96a0ba19fce65d26f6ab" 168 | integrity sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ== 169 | 170 | "@rollup/rollup-linux-powerpc64le-gnu@4.18.1": 171 | version "4.18.1" 172 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz#b1194e5ed6d138fdde0842d126fccde74a90f457" 173 | integrity sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ== 174 | 175 | "@rollup/rollup-linux-riscv64-gnu@4.18.1": 176 | version "4.18.1" 177 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz#f5a635c017b9bff8b856b0221fbd5c0e3373b7ec" 178 | integrity sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg== 179 | 180 | "@rollup/rollup-linux-s390x-gnu@4.18.1": 181 | version "4.18.1" 182 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz#f1043d9f4026bf6995863cb3f8dd4732606e4baa" 183 | integrity sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg== 184 | 185 | "@rollup/rollup-linux-x64-gnu@4.18.1": 186 | version "4.18.1" 187 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz#1e781730be445119f06c9df5f185e193bc82c610" 188 | integrity sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g== 189 | 190 | "@rollup/rollup-linux-x64-musl@4.18.1": 191 | version "4.18.1" 192 | resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz#08f12e1965d6f27d6898ff932592121cca6abc4b" 193 | integrity sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ== 194 | 195 | "@rollup/rollup-win32-arm64-msvc@4.18.1": 196 | version "4.18.1" 197 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz#4a5dcbbe7af7d41cac92b09798e7c1831da1f599" 198 | integrity sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g== 199 | 200 | "@rollup/rollup-win32-ia32-msvc@4.18.1": 201 | version "4.18.1" 202 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz#075b0713de627843a73b4cf0e087c56b53e9d780" 203 | integrity sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg== 204 | 205 | "@rollup/rollup-win32-x64-msvc@4.18.1": 206 | version "4.18.1" 207 | resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz#0cb240c147c0dfd0e3eaff4cc060a772d39e155c" 208 | integrity sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw== 209 | 210 | "@types/estree@1.0.5": 211 | version "1.0.5" 212 | resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 213 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 214 | 215 | "@types/lodash@^4.17.6": 216 | version "4.17.6" 217 | resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.6.tgz#193ced6a40c8006cfc1ca3f4553444fb38f0e543" 218 | integrity sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA== 219 | 220 | "@types/node@^20.14.11": 221 | version "20.14.11" 222 | resolved "https://registry.npmmirror.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" 223 | integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== 224 | dependencies: 225 | undici-types "~5.26.4" 226 | 227 | "@vue/compiler-core@3.4.33": 228 | version "3.4.33" 229 | resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.33.tgz#0b6013f9300822fd6cb7c8f7683c0483fa456165" 230 | integrity sha512-MoIREbkdPQlnGfSKDMgzTqzqx5nmEjIc0ydLVYlTACGBsfvOJ4tHSbZXKVF536n6fB+0eZaGEOqsGThPpdvF5A== 231 | dependencies: 232 | "@babel/parser" "^7.24.7" 233 | "@vue/shared" "3.4.33" 234 | entities "^4.5.0" 235 | estree-walker "^2.0.2" 236 | source-map-js "^1.2.0" 237 | 238 | "@vue/compiler-dom@3.4.33": 239 | version "3.4.33" 240 | resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.33.tgz#1ceea5408a0e06c857a78d7a2be7fe3b63cf9f64" 241 | integrity sha512-GzB8fxEHKw0gGet5BKlpfXEqoBnzSVWwMnT+dc25wE7pFEfrU/QsvjZMP9rD4iVXHBBoemTct8mN0GJEI6ZX5A== 242 | dependencies: 243 | "@vue/compiler-core" "3.4.33" 244 | "@vue/shared" "3.4.33" 245 | 246 | "@vue/compiler-sfc@3.4.33": 247 | version "3.4.33" 248 | resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.33.tgz#6ea43dee6bb341967be26b47786f1f73a8e089a2" 249 | integrity sha512-7rk7Vbkn21xMwIUpHQR4hCVejwE6nvhBOiDgoBcR03qvGqRKA7dCBSsHZhwhYUsmjlbJ7OtD5UFIyhP6BY+c8A== 250 | dependencies: 251 | "@babel/parser" "^7.24.7" 252 | "@vue/compiler-core" "3.4.33" 253 | "@vue/compiler-dom" "3.4.33" 254 | "@vue/compiler-ssr" "3.4.33" 255 | "@vue/shared" "3.4.33" 256 | estree-walker "^2.0.2" 257 | magic-string "^0.30.10" 258 | postcss "^8.4.39" 259 | source-map-js "^1.2.0" 260 | 261 | "@vue/compiler-ssr@3.4.33": 262 | version "3.4.33" 263 | resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.33.tgz#59ed58f97abb691e6c3973616bb27a12b8c5b135" 264 | integrity sha512-0WveC9Ai+eT/1b6LCV5IfsufBZ0HP7pSSTdDjcuW302tTEgoBw8rHVHKPbGUtzGReUFCRXbv6zQDDgucnV2WzQ== 265 | dependencies: 266 | "@vue/compiler-dom" "3.4.33" 267 | "@vue/shared" "3.4.33" 268 | 269 | "@vue/devtools-api@^6.5.0": 270 | version "6.6.3" 271 | resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.3.tgz#b23a588154cba8986bba82b6e1d0248bde3fd1a0" 272 | integrity sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw== 273 | 274 | "@vue/reactivity@3.4.33": 275 | version "3.4.33" 276 | resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.33.tgz#9d258a8bab369ce57402c51728d3769ecf7adb99" 277 | integrity sha512-B24QIelahDbyHipBgbUItQblbd4w5HpG3KccL+YkGyo3maXyS253FzcTR3pSz739OTphmzlxP7JxEMWBpewilA== 278 | dependencies: 279 | "@vue/shared" "3.4.33" 280 | 281 | "@vue/runtime-core@3.4.33": 282 | version "3.4.33" 283 | resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.33.tgz#c9481aa6d0785f7349a69f3e971082ac0ff720ee" 284 | integrity sha512-6wavthExzT4iAxpe8q37/rDmf44nyOJGISJPxCi9YsQO+8w9v0gLCFLfH5TzD1V1AYrTAdiF4Y1cgUmP68jP6w== 285 | dependencies: 286 | "@vue/reactivity" "3.4.33" 287 | "@vue/shared" "3.4.33" 288 | 289 | "@vue/runtime-dom@3.4.33": 290 | version "3.4.33" 291 | resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.33.tgz#1a36e05478fd24c718f9c5ea9f4bac7d0481c779" 292 | integrity sha512-iHsMCUSFJ+4z432Bn9kZzHX+zOXa6+iw36DaVRmKYZpPt9jW9riF32SxNwB124i61kp9+AZtheQ/mKoJLerAaQ== 293 | dependencies: 294 | "@vue/reactivity" "3.4.33" 295 | "@vue/runtime-core" "3.4.33" 296 | "@vue/shared" "3.4.33" 297 | csstype "^3.1.3" 298 | 299 | "@vue/server-renderer@3.4.33": 300 | version "3.4.33" 301 | resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.33.tgz#b0c4981b2d7758356811fc9d7314a576de2a6d25" 302 | integrity sha512-jTH0d6gQcaYideFP/k0WdEu8PpRS9MF8d0b6SfZzNi+ap972pZ0TNIeTaESwdOtdY0XPVj54XEJ6K0wXxir4fw== 303 | dependencies: 304 | "@vue/compiler-ssr" "3.4.33" 305 | "@vue/shared" "3.4.33" 306 | 307 | "@vue/shared@3.4.33": 308 | version "3.4.33" 309 | resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.33.tgz#2c4f2cfa988bb81e05372f6de556b254ff13e92a" 310 | integrity sha512-aoRY0jQk3A/cuvdkodTrM4NMfxco8n55eG4H7ML/CRy7OryHfiqvug4xrCBBMbbN+dvXAetDDwZW9DXWWjBntA== 311 | 312 | "@yarnpkg/lockfile@^1.1.0": 313 | version "1.1.0" 314 | resolved "https://registry.npmmirror.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" 315 | integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== 316 | 317 | ansi-styles@^4.1.0: 318 | version "4.3.0" 319 | resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 320 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 321 | dependencies: 322 | color-convert "^2.0.1" 323 | 324 | anymatch@~3.1.1: 325 | version "3.1.3" 326 | resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 327 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 328 | dependencies: 329 | normalize-path "^3.0.0" 330 | picomatch "^2.0.4" 331 | 332 | arg@^4.1.0: 333 | version "4.1.3" 334 | resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 335 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 336 | 337 | at-least-node@^1.0.0: 338 | version "1.0.0" 339 | resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 340 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 341 | 342 | balanced-match@^1.0.0: 343 | version "1.0.2" 344 | resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 345 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 346 | 347 | binary-extensions@^2.0.0: 348 | version "2.3.0" 349 | resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 350 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 351 | 352 | brace-expansion@^1.1.7: 353 | version "1.1.11" 354 | resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 355 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 356 | dependencies: 357 | balanced-match "^1.0.0" 358 | concat-map "0.0.1" 359 | 360 | braces@^3.0.3, braces@~3.0.2: 361 | version "3.0.3" 362 | resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 363 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 364 | dependencies: 365 | fill-range "^7.1.1" 366 | 367 | buffer-from@^1.0.0: 368 | version "1.1.2" 369 | resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 370 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 371 | 372 | call-bind@^1.0.5: 373 | version "1.0.7" 374 | resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" 375 | integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== 376 | dependencies: 377 | es-define-property "^1.0.0" 378 | es-errors "^1.3.0" 379 | function-bind "^1.1.2" 380 | get-intrinsic "^1.2.4" 381 | set-function-length "^1.2.1" 382 | 383 | chalk@^4.1.2: 384 | version "4.1.2" 385 | resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 386 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 387 | dependencies: 388 | ansi-styles "^4.1.0" 389 | supports-color "^7.1.0" 390 | 391 | chokidar@3.4.3: 392 | version "3.4.3" 393 | resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" 394 | integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== 395 | dependencies: 396 | anymatch "~3.1.1" 397 | braces "~3.0.2" 398 | glob-parent "~5.1.0" 399 | is-binary-path "~2.1.0" 400 | is-glob "~4.0.1" 401 | normalize-path "~3.0.0" 402 | readdirp "~3.5.0" 403 | optionalDependencies: 404 | fsevents "~2.1.2" 405 | 406 | ci-info@^3.7.0: 407 | version "3.9.0" 408 | resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" 409 | integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== 410 | 411 | color-convert@^2.0.1: 412 | version "2.0.1" 413 | resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 414 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 415 | dependencies: 416 | color-name "~1.1.4" 417 | 418 | color-name@~1.1.4: 419 | version "1.1.4" 420 | resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 421 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 422 | 423 | concat-map@0.0.1: 424 | version "0.0.1" 425 | resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 426 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 427 | 428 | create-require@^1.1.0: 429 | version "1.1.1" 430 | resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 431 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 432 | 433 | cross-spawn@^7.0.3: 434 | version "7.0.3" 435 | resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 436 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 437 | dependencies: 438 | path-key "^3.1.0" 439 | shebang-command "^2.0.0" 440 | which "^2.0.1" 441 | 442 | csstype@^3.1.3: 443 | version "3.1.3" 444 | resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 445 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 446 | 447 | define-data-property@^1.1.4: 448 | version "1.1.4" 449 | resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" 450 | integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== 451 | dependencies: 452 | es-define-property "^1.0.0" 453 | es-errors "^1.3.0" 454 | gopd "^1.0.1" 455 | 456 | dialog@0.3.1: 457 | version "0.3.1" 458 | resolved "https://registry.npmmirror.com/dialog/-/dialog-0.3.1.tgz#8fd9b47fdb277bb9e82172bb6e26bc578aa61254" 459 | integrity sha512-RYndSaXW/tYkfVbUKmyQzerHH080Pis7YabDxIHXRdYO6yo9/VqTIhPRB5RpoHwYlixeiUOvJCF7di+lmBaH6w== 460 | 461 | diff@^4.0.1: 462 | version "4.0.2" 463 | resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 464 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 465 | 466 | entities@^4.5.0: 467 | version "4.5.0" 468 | resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 469 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 470 | 471 | es-define-property@^1.0.0: 472 | version "1.0.0" 473 | resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" 474 | integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== 475 | dependencies: 476 | get-intrinsic "^1.2.4" 477 | 478 | es-errors@^1.3.0: 479 | version "1.3.0" 480 | resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 481 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 482 | 483 | esbuild@^0.21.3: 484 | version "0.21.5" 485 | resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 486 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 487 | optionalDependencies: 488 | "@esbuild/aix-ppc64" "0.21.5" 489 | "@esbuild/android-arm" "0.21.5" 490 | "@esbuild/android-arm64" "0.21.5" 491 | "@esbuild/android-x64" "0.21.5" 492 | "@esbuild/darwin-arm64" "0.21.5" 493 | "@esbuild/darwin-x64" "0.21.5" 494 | "@esbuild/freebsd-arm64" "0.21.5" 495 | "@esbuild/freebsd-x64" "0.21.5" 496 | "@esbuild/linux-arm" "0.21.5" 497 | "@esbuild/linux-arm64" "0.21.5" 498 | "@esbuild/linux-ia32" "0.21.5" 499 | "@esbuild/linux-loong64" "0.21.5" 500 | "@esbuild/linux-mips64el" "0.21.5" 501 | "@esbuild/linux-ppc64" "0.21.5" 502 | "@esbuild/linux-riscv64" "0.21.5" 503 | "@esbuild/linux-s390x" "0.21.5" 504 | "@esbuild/linux-x64" "0.21.5" 505 | "@esbuild/netbsd-x64" "0.21.5" 506 | "@esbuild/openbsd-x64" "0.21.5" 507 | "@esbuild/sunos-x64" "0.21.5" 508 | "@esbuild/win32-arm64" "0.21.5" 509 | "@esbuild/win32-ia32" "0.21.5" 510 | "@esbuild/win32-x64" "0.21.5" 511 | 512 | estree-walker@^2.0.2: 513 | version "2.0.2" 514 | resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 515 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 516 | 517 | fill-range@^7.1.1: 518 | version "7.1.1" 519 | resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 520 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 521 | dependencies: 522 | to-regex-range "^5.0.1" 523 | 524 | find-yarn-workspace-root@^2.0.0: 525 | version "2.0.0" 526 | resolved "https://registry.npmmirror.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" 527 | integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== 528 | dependencies: 529 | micromatch "^4.0.2" 530 | 531 | fs-extra@^9.0.0: 532 | version "9.1.0" 533 | resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 534 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 535 | dependencies: 536 | at-least-node "^1.0.0" 537 | graceful-fs "^4.2.0" 538 | jsonfile "^6.0.1" 539 | universalify "^2.0.0" 540 | 541 | fs.realpath@^1.0.0: 542 | version "1.0.0" 543 | resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 544 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 545 | 546 | fsevents@~2.1.2: 547 | version "2.1.3" 548 | resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 549 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 550 | 551 | fsevents@~2.3.2, fsevents@~2.3.3: 552 | version "2.3.3" 553 | resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 554 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 555 | 556 | function-bind@^1.1.2: 557 | version "1.1.2" 558 | resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 559 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 560 | 561 | get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: 562 | version "1.2.4" 563 | resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" 564 | integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== 565 | dependencies: 566 | es-errors "^1.3.0" 567 | function-bind "^1.1.2" 568 | has-proto "^1.0.1" 569 | has-symbols "^1.0.3" 570 | hasown "^2.0.0" 571 | 572 | glob-parent@~5.1.0: 573 | version "5.1.2" 574 | resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 575 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 576 | dependencies: 577 | is-glob "^4.0.1" 578 | 579 | glob@7.1.6: 580 | version "7.1.6" 581 | resolved "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 582 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 583 | dependencies: 584 | fs.realpath "^1.0.0" 585 | inflight "^1.0.4" 586 | inherits "2" 587 | minimatch "^3.0.4" 588 | once "^1.3.0" 589 | path-is-absolute "^1.0.0" 590 | 591 | glob@^7.1.3: 592 | version "7.2.3" 593 | resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 594 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 595 | dependencies: 596 | fs.realpath "^1.0.0" 597 | inflight "^1.0.4" 598 | inherits "2" 599 | minimatch "^3.1.1" 600 | once "^1.3.0" 601 | path-is-absolute "^1.0.0" 602 | 603 | gopd@^1.0.1: 604 | version "1.0.1" 605 | resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 606 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 607 | dependencies: 608 | get-intrinsic "^1.1.3" 609 | 610 | graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 611 | version "4.2.11" 612 | resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 613 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 614 | 615 | has-flag@^4.0.0: 616 | version "4.0.0" 617 | resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 618 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 619 | 620 | has-property-descriptors@^1.0.2: 621 | version "1.0.2" 622 | resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" 623 | integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== 624 | dependencies: 625 | es-define-property "^1.0.0" 626 | 627 | has-proto@^1.0.1: 628 | version "1.0.3" 629 | resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" 630 | integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== 631 | 632 | has-symbols@^1.0.3: 633 | version "1.0.3" 634 | resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 635 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 636 | 637 | hasown@^2.0.0: 638 | version "2.0.2" 639 | resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 640 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 641 | dependencies: 642 | function-bind "^1.1.2" 643 | 644 | inflight@^1.0.4: 645 | version "1.0.6" 646 | resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 647 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 648 | dependencies: 649 | once "^1.3.0" 650 | wrappy "1" 651 | 652 | inherits@2: 653 | version "2.0.4" 654 | resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 655 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 656 | 657 | is-binary-path@~2.1.0: 658 | version "2.1.0" 659 | resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 660 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 661 | dependencies: 662 | binary-extensions "^2.0.0" 663 | 664 | is-docker@^2.0.0: 665 | version "2.2.1" 666 | resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" 667 | integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== 668 | 669 | is-extglob@^2.1.1: 670 | version "2.1.1" 671 | resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 672 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 673 | 674 | is-glob@^4.0.1, is-glob@~4.0.1: 675 | version "4.0.3" 676 | resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 677 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 678 | dependencies: 679 | is-extglob "^2.1.1" 680 | 681 | is-number@^7.0.0: 682 | version "7.0.0" 683 | resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 684 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 685 | 686 | is-wsl@^2.1.1: 687 | version "2.2.0" 688 | resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 689 | integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== 690 | dependencies: 691 | is-docker "^2.0.0" 692 | 693 | isarray@^2.0.5: 694 | version "2.0.5" 695 | resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 696 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 697 | 698 | isexe@^2.0.0: 699 | version "2.0.0" 700 | resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 701 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 702 | 703 | json-stable-stringify@^1.0.2: 704 | version "1.1.1" 705 | resolved "https://registry.npmmirror.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" 706 | integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== 707 | dependencies: 708 | call-bind "^1.0.5" 709 | isarray "^2.0.5" 710 | jsonify "^0.0.1" 711 | object-keys "^1.1.1" 712 | 713 | jsonfile@^6.0.1: 714 | version "6.1.0" 715 | resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 716 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 717 | dependencies: 718 | universalify "^2.0.0" 719 | optionalDependencies: 720 | graceful-fs "^4.1.6" 721 | 722 | jsonify@^0.0.1: 723 | version "0.0.1" 724 | resolved "https://registry.npmmirror.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" 725 | integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== 726 | 727 | klaw-sync@^6.0.0: 728 | version "6.0.0" 729 | resolved "https://registry.npmmirror.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" 730 | integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== 731 | dependencies: 732 | graceful-fs "^4.1.11" 733 | 734 | lodash@^4.17.21: 735 | version "4.17.21" 736 | resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 737 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 738 | 739 | magic-string@^0.30.10: 740 | version "0.30.10" 741 | resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" 742 | integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== 743 | dependencies: 744 | "@jridgewell/sourcemap-codec" "^1.4.15" 745 | 746 | make-error@^1.1.1: 747 | version "1.3.6" 748 | resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 749 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 750 | 751 | micromatch@^4.0.2: 752 | version "4.0.7" 753 | resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" 754 | integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== 755 | dependencies: 756 | braces "^3.0.3" 757 | picomatch "^2.3.1" 758 | 759 | minimatch@^3.0.4, minimatch@^3.1.1: 760 | version "3.1.2" 761 | resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 762 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 763 | dependencies: 764 | brace-expansion "^1.1.7" 765 | 766 | minimist@^1.2.6: 767 | version "1.2.8" 768 | resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 769 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 770 | 771 | nanoid@^3.3.7: 772 | version "3.3.7" 773 | resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 774 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 775 | 776 | normalize-path@^3.0.0, normalize-path@~3.0.0: 777 | version "3.0.0" 778 | resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 779 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 780 | 781 | object-keys@^1.1.1: 782 | version "1.1.1" 783 | resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 784 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 785 | 786 | once@^1.3.0: 787 | version "1.4.0" 788 | resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 789 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 790 | dependencies: 791 | wrappy "1" 792 | 793 | open@7.3.0: 794 | version "7.3.0" 795 | resolved "https://registry.npmmirror.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" 796 | integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== 797 | dependencies: 798 | is-docker "^2.0.0" 799 | is-wsl "^2.1.1" 800 | 801 | open@^7.4.2: 802 | version "7.4.2" 803 | resolved "https://registry.npmmirror.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" 804 | integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== 805 | dependencies: 806 | is-docker "^2.0.0" 807 | is-wsl "^2.1.1" 808 | 809 | os-tmpdir@~1.0.2: 810 | version "1.0.2" 811 | resolved "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 812 | integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== 813 | 814 | patch-package@^8.0.0: 815 | version "8.0.0" 816 | resolved "https://registry.npmmirror.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" 817 | integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== 818 | dependencies: 819 | "@yarnpkg/lockfile" "^1.1.0" 820 | chalk "^4.1.2" 821 | ci-info "^3.7.0" 822 | cross-spawn "^7.0.3" 823 | find-yarn-workspace-root "^2.0.0" 824 | fs-extra "^9.0.0" 825 | json-stable-stringify "^1.0.2" 826 | klaw-sync "^6.0.0" 827 | minimist "^1.2.6" 828 | open "^7.4.2" 829 | rimraf "^2.6.3" 830 | semver "^7.5.3" 831 | slash "^2.0.0" 832 | tmp "^0.0.33" 833 | yaml "^2.2.2" 834 | 835 | path-is-absolute@^1.0.0: 836 | version "1.0.1" 837 | resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 838 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 839 | 840 | path-key@^3.1.0: 841 | version "3.1.1" 842 | resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 843 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 844 | 845 | picocolors@^1.0.1: 846 | version "1.0.1" 847 | resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" 848 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== 849 | 850 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 851 | version "2.3.1" 852 | resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 853 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 854 | 855 | pinia@^2.1.7: 856 | version "2.1.7" 857 | resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz#4cf5420d9324ca00b7b4984d3fbf693222115bbc" 858 | integrity sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ== 859 | dependencies: 860 | "@vue/devtools-api" "^6.5.0" 861 | vue-demi ">=0.14.5" 862 | 863 | postcss@^8.4.39: 864 | version "8.4.39" 865 | resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" 866 | integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== 867 | dependencies: 868 | nanoid "^3.3.7" 869 | picocolors "^1.0.1" 870 | source-map-js "^1.2.0" 871 | 872 | postinstall-postinstall@^2.1.0: 873 | version "2.1.0" 874 | resolved "https://registry.npmmirror.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" 875 | integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== 876 | 877 | readdirp@~3.5.0: 878 | version "3.5.0" 879 | resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 880 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 881 | dependencies: 882 | picomatch "^2.2.1" 883 | 884 | rimraf@^2.6.3: 885 | version "2.7.1" 886 | resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 887 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 888 | dependencies: 889 | glob "^7.1.3" 890 | 891 | rollup@^4.13.0: 892 | version "4.18.1" 893 | resolved "https://registry.npmmirror.com/rollup/-/rollup-4.18.1.tgz#18a606df5e76ca53b8a69f2d8eab256d69dda851" 894 | integrity sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A== 895 | dependencies: 896 | "@types/estree" "1.0.5" 897 | optionalDependencies: 898 | "@rollup/rollup-android-arm-eabi" "4.18.1" 899 | "@rollup/rollup-android-arm64" "4.18.1" 900 | "@rollup/rollup-darwin-arm64" "4.18.1" 901 | "@rollup/rollup-darwin-x64" "4.18.1" 902 | "@rollup/rollup-linux-arm-gnueabihf" "4.18.1" 903 | "@rollup/rollup-linux-arm-musleabihf" "4.18.1" 904 | "@rollup/rollup-linux-arm64-gnu" "4.18.1" 905 | "@rollup/rollup-linux-arm64-musl" "4.18.1" 906 | "@rollup/rollup-linux-powerpc64le-gnu" "4.18.1" 907 | "@rollup/rollup-linux-riscv64-gnu" "4.18.1" 908 | "@rollup/rollup-linux-s390x-gnu" "4.18.1" 909 | "@rollup/rollup-linux-x64-gnu" "4.18.1" 910 | "@rollup/rollup-linux-x64-musl" "4.18.1" 911 | "@rollup/rollup-win32-arm64-msvc" "4.18.1" 912 | "@rollup/rollup-win32-ia32-msvc" "4.18.1" 913 | "@rollup/rollup-win32-x64-msvc" "4.18.1" 914 | fsevents "~2.3.2" 915 | 916 | semver@^7.5.3: 917 | version "7.6.3" 918 | resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 919 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 920 | 921 | set-function-length@^1.2.1: 922 | version "1.2.2" 923 | resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" 924 | integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== 925 | dependencies: 926 | define-data-property "^1.1.4" 927 | es-errors "^1.3.0" 928 | function-bind "^1.1.2" 929 | get-intrinsic "^1.2.4" 930 | gopd "^1.0.1" 931 | has-property-descriptors "^1.0.2" 932 | 933 | shebang-command@^2.0.0: 934 | version "2.0.0" 935 | resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 936 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 937 | dependencies: 938 | shebang-regex "^3.0.0" 939 | 940 | shebang-regex@^3.0.0: 941 | version "3.0.0" 942 | resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 943 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 944 | 945 | slash@^2.0.0: 946 | version "2.0.0" 947 | resolved "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 948 | integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== 949 | 950 | source-map-js@^1.2.0: 951 | version "1.2.0" 952 | resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 953 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 954 | 955 | source-map-support@^0.5.17: 956 | version "0.5.21" 957 | resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 958 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 959 | dependencies: 960 | buffer-from "^1.0.0" 961 | source-map "^0.6.0" 962 | 963 | source-map@^0.6.0: 964 | version "0.6.1" 965 | resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 966 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 967 | 968 | supports-color@^7.1.0: 969 | version "7.2.0" 970 | resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 971 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 972 | dependencies: 973 | has-flag "^4.0.0" 974 | 975 | tmp@^0.0.33: 976 | version "0.0.33" 977 | resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 978 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 979 | dependencies: 980 | os-tmpdir "~1.0.2" 981 | 982 | to-regex-range@^5.0.1: 983 | version "5.0.1" 984 | resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 985 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 986 | dependencies: 987 | is-number "^7.0.0" 988 | 989 | ts-node@^9.1.1: 990 | version "9.1.1" 991 | resolved "https://registry.npmmirror.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 992 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 993 | dependencies: 994 | arg "^4.1.0" 995 | create-require "^1.1.0" 996 | diff "^4.0.1" 997 | make-error "^1.1.1" 998 | source-map-support "^0.5.17" 999 | yn "3.1.1" 1000 | 1001 | typescript@^5.2.2: 1002 | version "5.5.3" 1003 | resolved "https://registry.npmmirror.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" 1004 | integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== 1005 | 1006 | undici-types@~5.26.4: 1007 | version "5.26.5" 1008 | resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1009 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1010 | 1011 | universalify@^2.0.0: 1012 | version "2.0.1" 1013 | resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1014 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1015 | 1016 | upath@2.0.1: 1017 | version "2.0.1" 1018 | resolved "https://registry.npmmirror.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" 1019 | integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== 1020 | 1021 | vite@^5.3.1: 1022 | version "5.3.3" 1023 | resolved "https://registry.npmmirror.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2" 1024 | integrity sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A== 1025 | dependencies: 1026 | esbuild "^0.21.3" 1027 | postcss "^8.4.39" 1028 | rollup "^4.13.0" 1029 | optionalDependencies: 1030 | fsevents "~2.3.3" 1031 | 1032 | vue-demi@>=0.14.5: 1033 | version "0.14.8" 1034 | resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.8.tgz#00335e9317b45e4a68d3528aaf58e0cec3d5640a" 1035 | integrity sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q== 1036 | 1037 | vue@^3.4.33: 1038 | version "3.4.33" 1039 | resolved "https://registry.npmmirror.com/vue/-/vue-3.4.33.tgz#42a186220c96b93143076871d0c7d7bc46540e4a" 1040 | integrity sha512-VdMCWQOummbhctl4QFMcW6eNtXHsFyDlX60O/tsSQuCcuDOnJ1qPOhhVla65Niece7xq/P2zyZReIO5mP+LGTQ== 1041 | dependencies: 1042 | "@vue/compiler-dom" "3.4.33" 1043 | "@vue/compiler-sfc" "3.4.33" 1044 | "@vue/runtime-dom" "3.4.33" 1045 | "@vue/server-renderer" "3.4.33" 1046 | "@vue/shared" "3.4.33" 1047 | 1048 | which@^2.0.1: 1049 | version "2.0.2" 1050 | resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1051 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1052 | dependencies: 1053 | isexe "^2.0.0" 1054 | 1055 | wrappy@1: 1056 | version "1.0.2" 1057 | resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1058 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1059 | 1060 | yaml@^2.2.2: 1061 | version "2.4.5" 1062 | resolved "https://registry.npmmirror.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" 1063 | integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== 1064 | 1065 | yn@3.1.1: 1066 | version "3.1.1" 1067 | resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1068 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1069 | --------------------------------------------------------------------------------