diff --git a/.agents/overview.md b/.agents/overview.md index 13ad9e5e..7d35588c 100644 --- a/.agents/overview.md +++ b/.agents/overview.md @@ -110,6 +110,7 @@ task test:frontend task test:e2e task run task dev +task debug ``` Optional RNS/rngit tooling (requires mesh reachability, often slower than PyPI): @@ -290,6 +291,10 @@ Common overrides (CLI flags usually mirror these): | `MESHCHAT_DISABLE_CSRF` | Dangerous. Tests/dev only | | `MESHCHAT_SKIP_STORAGE_LOCK` | Dangerous. Avoid overlapping instances carefully | | `MESHCHAT_RNS_LOG_LEVEL` | RNS log verbosity | +| `MESHCHAT_DEBUGPY` | `task debug`: listen with debugpy | +| `MESHCHAT_DEBUGPY_PORT` | debugpy port (default 5678, bind 127.0.0.1) | +| `MESHCHAT_DEBUGPY_WAIT` | `1` pauses backend until a debugger attaches | +| `MESHCHAT_VUE_DEVTOOLS` | `0` disables the Vite Vue DevTools overlay | Restore helpers: diff --git a/.gitignore b/.gitignore index 7b3b8be6..37b8362b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # IDE and editor files .idea -.vscode/ +.vscode/* +!.vscode/launch.json +!.vscode/tasks.json +!.vscode/extensions.json *.swp *.swo *~ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..e01cb534 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "Vue.volar", + "ms-python.python", + "ms-python.debugpy", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..473941c1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,42 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Backend: Launch meshchat", + "type": "debugpy", + "request": "launch", + "module": "meshchatx.meshchat", + "args": ["--headless", "--host", "127.0.0.1", "--port", "8000"], + "cwd": "${workspaceFolder}", + "justMyCode": true, + "env": { + "PYTHONUNBUFFERED": "1" + } + }, + { + "name": "Backend: Attach debugpy", + "type": "debugpy", + "request": "attach", + "connect": { + "host": "127.0.0.1", + "port": 5678 + }, + "justMyCode": true + }, + { + "name": "Frontend: Chrome (Vite)", + "type": "chrome", + "request": "launch", + "url": "http://127.0.0.1:5173", + "webRoot": "${workspaceFolder}/meshchatx/src/frontend" + } + ], + "compounds": [ + { + "name": "MeshChatX: Vite + Python", + "configurations": ["Backend: Attach debugpy", "Frontend: Chrome (Vite)"], + "preLaunchTask": "meshchatx: debug", + "stopAll": true + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..b5ad591f --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,47 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "meshchatx: debug", + "type": "shell", + "command": "task debug", + "isBackground": true, + "problemMatcher": { + "owner": "meshchatx-dev", + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "\\[dev\\] (Waiting for backend|debugpy)", + "endsPattern": "Local:\\s+https?://127\\.0\\.0\\.1:5173" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated" + } + }, + { + "label": "meshchatx: dev", + "type": "shell", + "command": "task dev", + "isBackground": true, + "problemMatcher": { + "owner": "meshchatx-dev", + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "\\[dev\\] Waiting for backend", + "endsPattern": "Local:\\s+https?://127\\.0\\.0\\.1:5173" + } + }, + "presentation": { + "reveal": "always", + "panel": "dedicated" + } + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index abae22a5..18dc6f79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ### Added +- **Local developer tooling**: [Vue DevTools](https://devtools.vuejs.org/) overlay on `task dev` (Vite serve at http://127.0.0.1:5173 only, `MESHCHAT_VUE_DEVTOOLS=0` to disable). Production `vite build` keeps `__VUE_PROD_DEVTOOLS__` false. `task debug` wraps the backend with debugpy on `127.0.0.1:5678`. Debugger launch configs: **MeshChatX: Vite + Python**. Playwright e2e forces DevTools off. - **Public demo mode**: Read-only mesh showcase via `MESHCHAT_DEMO_MODE` or `--demo` (blocked sends and API mutations, in-app demo banner). Optional ALTCHA v3 on login/setup, `MESHCHAT_AUTH_PAGE_HINT` for login page text, and [docker-compose.demo.yml](docker-compose.demo.yml) for Coolify. - **Database upgrades**: Automatic backup-pre-migrate-*.zip before schema migrations (skip with `MESHCHAT_SKIP_PRE_MIGRATE_BACKUP=1`). CLI `--list-backups` and `--export-backup` to list or copy backups for rollback. Post-migrate quick_check, structured migration logs, pre-migrate zip retention (five by default), storage lock for single-writer volumes, and N-1/N-2 fixture upgrade tests. - **App sidebar**: Grouped layout is the default. Primary links sit under Communicate, Explore, Network, and App labels, with a More disclosure for Archives, Interfaces, Identities, About, and similar destinations. Appearance setting `app_sidebar_layout` can switch back to Classic (one flat list and the expanded identity footer). The grouped footer is a compact identity chip with announce, QR, and auto-announce interval (15 minutes through 24 hours). Press and hold a nav item or section while the sidebar is expanded to reorder links and groups. A save icon appears in the collapse row. Order is stored in the browser. diff --git a/Taskfile.yml b/Taskfile.yml index d4a3c57d..4f48ce5a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -175,10 +175,20 @@ tasks: - uv run python -m meshchatx.meshchat dev: - desc: Vite HMR + backend (http://localhost:5173) + desc: Vite HMR + backend (http://127.0.0.1:5173) with Vue DevTools cmds: - bash scripts/dev-local.sh + debug: + desc: task dev plus Python debugpy on 127.0.0.1:5678 (debugger attach) + cmds: + - MESHCHAT_DEBUGPY=1 bash scripts/dev-local.sh + + debug:wait: + desc: task debug, pause backend until a debugger attaches + cmds: + - MESHCHAT_DEBUGPY=1 MESHCHAT_DEBUGPY_WAIT=1 bash scripts/dev-local.sh + dev-fe: desc: Vite dev server only (pair with task run) cmds: @@ -395,6 +405,11 @@ tasks: - "{{.NPM}} exec vitest run --exclude tests/frontend/LoadTimePerformance.test.js --exclude tests/frontend/i18n.test.js" - "{{.NPM}} exec vitest run --config vitest.electron.config.js" + test:fe:ui: + desc: Vitest UI runner for frontend unit tests + cmds: + - "{{.NPM}} run test:ui" + test:fe:loadtime: desc: Optional frontend load-time / sidebar performance tests (not run in CI) cmds: diff --git a/docs/en/installation.md b/docs/en/installation.md index 402b475e..be0b2558 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -114,11 +114,21 @@ Adjust the filename for your architecture. ```bash task install +task dev +``` + +`task dev` starts the HTTPS backend on `127.0.0.1:8000` and Vite on [http://127.0.0.1:5173](http://127.0.0.1:5173). Open that Vite URL. The [Vue DevTools](https://devtools.vuejs.org/) overlay is injected for this serve only. `vite build` / `task run` never ship it (`__VUE_PROD_DEVTOOLS__` is false). Set `MESHCHAT_VUE_DEVTOOLS=0` to hide the overlay. Click a component in the inspector to open it in the editor (`LAUNCH_EDITOR`, default `code`). + +Python breakpoints: `task debug` is the same stack with [debugpy](https://github.com/microsoft/debugpy) listening on `127.0.0.1:5678` (never `0.0.0.0`). Run **MeshChatX: Vite + Python** from the debugger, or start `task debug` and attach **Backend: Attach debugpy**. `task debug:wait` pauses the backend until that attach happens. + +A production-like run without HMR: + +```bash pnpm run build-frontend uv run python -m meshchatx.meshchat --headless --host 127.0.0.1 ``` -Useful task targets include `task format`, `task lint`, `task test`, and `task build`. +Useful task targets include `task format`, `task lint`, `task test`, `task test:fe:ui`, and `task build`. ## First launch diff --git a/meshchatx.rsm b/meshchatx.rsm index 722f2b4c..ed186e7e 100644 Binary files a/meshchatx.rsm and b/meshchatx.rsm differ diff --git a/meshchatx/src/frontend/js/pwa/swClientRegister.js b/meshchatx/src/frontend/js/pwa/swClientRegister.js index 41c6763e..7a5d0af7 100644 --- a/meshchatx/src/frontend/js/pwa/swClientRegister.js +++ b/meshchatx/src/frontend/js/pwa/swClientRegister.js @@ -39,3 +39,37 @@ export function isIgnorableServiceWorkerRegistrationError(error) { export function serviceWorkerRegisterOptions() { return { updateViaCache: "none" }; } + +/** + * Vite HMR and Vue DevTools break if a leftover PWA worker intercepts modules. + * Register only for production-like browser loads (not Electron, not Vite DEV). + * + * @param {{ isDev?: boolean, isElectron?: boolean }} state + * @returns {boolean} + */ +export function shouldRegisterServiceWorker(state) { + return !state?.isDev && !state?.isElectron; +} + +/** + * Drop existing registrations so a previous task run session cannot cache Vite. + * + * @param {{ getRegistrations?: () => Promise Promise }>> }} [serviceWorker] + * @returns {Promise} + */ +export async function unregisterServiceWorkersIfPresent(serviceWorker) { + if (!serviceWorker || typeof serviceWorker.getRegistrations !== "function") { + return []; + } + const registrations = await serviceWorker.getRegistrations(); + if (!Array.isArray(registrations) || registrations.length === 0) { + return []; + } + const results = []; + for (const registration of registrations) { + if (registration && typeof registration.unregister === "function") { + results.push(Boolean(await registration.unregister())); + } + } + return results; +} diff --git a/meshchatx/src/frontend/main.js b/meshchatx/src/frontend/main.js index cb3a7d87..f979409b 100644 --- a/meshchatx/src/frontend/main.js +++ b/meshchatx/src/frontend/main.js @@ -25,6 +25,8 @@ import { decideControllerChangeReload, isIgnorableServiceWorkerRegistrationError, serviceWorkerRegisterOptions, + shouldRegisterServiceWorker, + unregisterServiceWorkersIfPresent, } from "./js/pwa/swClientRegister.js"; import "./js/HeapMonitor.js"; @@ -442,7 +444,13 @@ if (networkReady) { if (typeof navigator === "undefined" || !("serviceWorker" in navigator)) { return; } - if (ElectronUtils.isElectron()) { + if ( + !shouldRegisterServiceWorker({ + isDev: import.meta.env.DEV, + isElectron: ElectronUtils.isElectron(), + }) + ) { + void unregisterServiceWorkersIfPresent(navigator.serviceWorker); return; } let refreshing = false; diff --git a/meshchatx/src/frontend/public/meshchatx-docs/en/installation.md b/meshchatx/src/frontend/public/meshchatx-docs/en/installation.md index 402b475e..be0b2558 100644 --- a/meshchatx/src/frontend/public/meshchatx-docs/en/installation.md +++ b/meshchatx/src/frontend/public/meshchatx-docs/en/installation.md @@ -114,11 +114,21 @@ Adjust the filename for your architecture. ```bash task install +task dev +``` + +`task dev` starts the HTTPS backend on `127.0.0.1:8000` and Vite on [http://127.0.0.1:5173](http://127.0.0.1:5173). Open that Vite URL. The [Vue DevTools](https://devtools.vuejs.org/) overlay is injected for this serve only. `vite build` / `task run` never ship it (`__VUE_PROD_DEVTOOLS__` is false). Set `MESHCHAT_VUE_DEVTOOLS=0` to hide the overlay. Click a component in the inspector to open it in the editor (`LAUNCH_EDITOR`, default `code`). + +Python breakpoints: `task debug` is the same stack with [debugpy](https://github.com/microsoft/debugpy) listening on `127.0.0.1:5678` (never `0.0.0.0`). Run **MeshChatX: Vite + Python** from the debugger, or start `task debug` and attach **Backend: Attach debugpy**. `task debug:wait` pauses the backend until that attach happens. + +A production-like run without HMR: + +```bash pnpm run build-frontend uv run python -m meshchatx.meshchat --headless --host 127.0.0.1 ``` -Useful task targets include `task format`, `task lint`, `task test`, and `task build`. +Useful task targets include `task format`, `task lint`, `task test`, `task test:fe:ui`, and `task build`. ## First launch diff --git a/package.json b/package.json index c2b8ee6a..75962bbc 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "terser": "^5.49.0", "typescript": "^6.0.3", "vite": "^8.1.5", + "vite-plugin-vue-devtools": "^8.2.1", "vite-plugin-vuetify": "^2.1.3", "vitest": "^4.1.10", "vue-eslint-parser": "^10.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cef64c82..39e81e08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -216,6 +216,9 @@ importers: vite: specifier: ^8.1.5 version: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + vite-plugin-vue-devtools: + specifier: ^8.2.1 + version: 8.2.1(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vite-plugin-vuetify: specifier: ^2.1.3 version: 2.1.3(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(vuetify@3.12.10) @@ -231,6 +234,10 @@ importers: packages: + '@ampproject/remapping@2.2.0': + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -246,6 +253,131 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.22.13': + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.22.9': + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.0': + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.0': + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.22.15': + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.22.15': + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.22.15': + resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.0': + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.10.4': + resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.22.20': + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.29.7': + resolution: {integrity: sha512-2VKeSThsbUc6bLt0bc7CgUbmr96Qzw3fPSuLwx5xONgWX9zBX14daNDr5s83lJe9A+WzSANKeImsfssIHGtZPA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -262,6 +394,22 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.22.15': + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.0': + resolution: {integrity: sha512-cMceqRGsK0dZiEkIT+NujINkOddEbZGv7/+OCaxRQL0+VRkP4SfdCo43K8x9lZM0wZojMDD5evkjNRb0EmBORA==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} @@ -272,6 +420,75 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-proposal-decorators@7.23.0': + resolution: {integrity: sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.22.10': + resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.22.5': + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.22.5': + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.22.15': + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.0': + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -490,6 +707,10 @@ packages: resolution: {integrity: sha512-S00nN1Qt3z3dSP6Db45fj/mksrAq5XWNIJ/SWXGP8XPT2jrzEuYRCSEx08JpJwBcG2F1xgiOtBMGDU0AZHmxew==} engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.1.0': + resolution: {integrity: sha512-YH+BnkvuCiPR+MUOY6JIArdTIGrRtsxnLaIxPRy4CpGJ/V6OO6Gq/1J+FJEc4j5e5h6Bcy3/K7prlMrm93BJoA==} + engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.0': resolution: {integrity: sha512-bFDbLEZ84DtNwXILbufXeQMz3tcGSfy+ROgvnB9jUm+t48G4Po+1UhhyFh6GIsFOE2R31Ab0ddeMv+Z9gcYC4g==} engines: {node: '>=6.0.0'} @@ -508,6 +729,11 @@ packages: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.0.0': + resolution: {integrity: sha512-LcqVnHCjOAj8BTCtjpwYZCMTn4yArusbdObCVRUYvBHhrR5fVLVyENG+UVWM4T4H/ufv7NiBLdprllxWs/5PaQ==} + engines: {node: '>=6.0.0'} + deprecated: incorrect UMD name + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} @@ -1182,6 +1408,22 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.5.40': resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} @@ -1200,6 +1442,17 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/devtools-core@8.2.1': + resolution: {integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@8.2.1': + resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} + + '@vue/devtools-shared@8.2.1': + resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} + '@vue/language-core@3.3.7': resolution: {integrity: sha512-LzmkKinXAMMoh8Jfi/jMUSDUjuPdv8mynH5WJGKfXyZtDw3hQ6GBaoI6Bcnl/Xqlu32q/0Z6i/trp4VXykzyLw==} @@ -1301,6 +1554,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.0.0: resolution: {integrity: sha512-8zjUtFJ3db/QoPXuuEMloS2AUf79/yeyttJ7Abr3hteopJu9HK8vsgGviGUMq+zyA6cZZO6gAyZoMTF6TgaEjA==} engines: {node: '>=8'} @@ -1317,6 +1574,10 @@ packages: resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} engines: {node: '>=12'} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + app-builder-lib@26.15.3: resolution: {integrity: sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==} engines: {node: '>=14.0.0'} @@ -1372,6 +1633,12 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -1392,6 +1659,11 @@ packages: resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} engines: {node: 20 || >=22} + browserslist@4.16.5: + resolution: {integrity: sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.0.0: resolution: {integrity: sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==} @@ -1403,6 +1675,10 @@ packages: resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} engines: {node: '>=14.0.0'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bytestreamjs@2.0.1: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} @@ -1427,10 +1703,17 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + caniuse-lite@1.0.30001214: + resolution: {integrity: sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@4.1.1: resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} engines: {node: '>=10'} @@ -1475,6 +1758,9 @@ packages: resolution: {integrity: sha512-vPAxLvwyfvkfihd9N50TmgjpGsvU3whDvdNCf3fAEjlKt/PH33+xCrtDY9FBL59xjs9wprnMKnK/u43TPFFWuw==} engines: {node: '>=0.10.0'} + color-convert@1.9.0: + resolution: {integrity: sha512-cBdgwBveAUUexnimWkdqoTDizLaNhyWPRTvsNQI7eg2k5Y8sqQzymwc2V0qGhX0QdsPS9pqR5nOxEiMAE7SmHQ==} + color-convert@2.0.0: resolution: {integrity: sha512-hzTicsCJIHdxih9+2aLR1tNGZX5qSJGRHDPVwSY26tVrEf55XNajLOBWz2UuWSIergszA09/bqnOiHyqx9fxQg==} engines: {node: '>=7.0.0'} @@ -1486,6 +1772,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colors@1.1.2: resolution: {integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==} engines: {node: '>=0.1.90'} @@ -1599,10 +1888,22 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + defer-to-connect@2.0.0: resolution: {integrity: sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==} engines: {node: '>=10'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.1.2: resolution: {integrity: sha512-hpr5VSFXGamODSCN6P2zdSBY6zJT7DlcBAHiPIa2PWDvfBqJQntSK0ehUoHoS6HGeSS19dgj7E+1xOjfG3zEtQ==} engines: {node: '>= 0.4'} @@ -1679,6 +1980,9 @@ packages: electron-publish@26.15.3: resolution: {integrity: sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==} + electron-to-chromium@1.3.719: + resolution: {integrity: sha512-heM78GKSqrIzO9Oz0/y22nTBN7bqSP1Pla2SyU9DiSnQD+Ea9SyyN5RWWlgqsqeBLNDkSlE9J9EHFmdMPzxB/g==} + electron-winstaller@5.4.0: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} @@ -1722,6 +2026,9 @@ packages: err-code@2.0.2: resolution: {integrity: sha512-cSVM85xDoIsi+WrRBwhfu4yVaW9NJaMjtGgHfGKkfNeSGwAnK5RDRJfAVsvvVU1LvREs51m2brj9nU251Y+eCA==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-abstract@1.5.0: resolution: {integrity: sha512-hOEuDmmeU5AizmgMRq+4QmlXUHZyYdZ0I2WtxcYcpF7ktDkBzyLQsybaaekIFkJebo5NkeXMqGZge2U4lQUFUw==} engines: {node: '>= 0.4'} @@ -1756,6 +2063,10 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2034,6 +2345,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + geotiff@3.0.5: resolution: {integrity: sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==} engines: {node: '>=10.19'} @@ -2081,6 +2396,10 @@ packages: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} + globals@11.1.0: + resolution: {integrity: sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==} + engines: {node: '>=4'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2124,6 +2443,10 @@ packages: graceful-fs@4.2.6: resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2147,6 +2470,9 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2238,6 +2564,11 @@ packages: resolution: {integrity: sha512-P5rExV1phPi42ppoMWy7V63N3i173RY921l4JJ7zonMSxK+OWGPj76GD+cUKUb68l4vQXcJp2SsG+r/A4ABVzg==} engines: {node: '>= 0.4'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2258,6 +2589,15 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -2273,6 +2613,10 @@ packages: resolution: {integrity: sha512-Z1cLAG7dXM1vJv8mAGjA+XteO0YzYPwD473+qPAWKycNZxwCH/I56QIohKGYCZSB7j6tajrxi/FvOpAfqGhhRQ==} engines: {node: '>= 0.4'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -2335,6 +2679,9 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@5.2.3: resolution: {integrity: sha512-n+mUVyUX5bVv7G/G2zyIHOhdxfuU1dY2NOFzTQUWiMUbFss8b57NFlgCCaggU78wSw5KVS9cllzeLyzyR+n5nw==} hasBin: true @@ -2348,6 +2695,16 @@ packages: canvas: optional: true + jsesc@2.5.1: + resolution: {integrity: sha512-Bl0oKW/TMSVifAQLbupbpOrssQ3CC+lyhZZjofI19OuKtwq8/A9KtxDA22wppbeiFqAQdTnVkDR8ymtRFAxtYw==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2397,6 +2754,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} @@ -2604,6 +2964,9 @@ packages: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2780,6 +3143,9 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@1.1.71: + resolution: {integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==} + nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2823,6 +3189,9 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ol-mapbox-style@13.4.1: resolution: {integrity: sha512-da4FKZUXoXMzK5ADeRHAXzd3bTeiKg/Y9LBOTB6qNTP62MQm93y6ISrIXzOS9atfGgQMEHJ2pCgP272IMeZCXA==} peerDependencies: @@ -2837,6 +3206,10 @@ packages: once@1.3.1: resolution: {integrity: sha512-NzfbaaoQvz2JC/D/Yj3GZi0FJG1w9i3K9Bp99Ws3p0xriPynC/YfRcpo2zoVuIduvH4b8+6up4ogGxnqajSKhA==} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2957,6 +3330,9 @@ packages: resolution: {integrity: sha512-JAmVv2jGxmczplhHO7UoFGJ+pM/yMBpny3vNjwNFuaeQfzKlekQidZ8Ss8EJ0qee8wEQN4lY2IwtWx2oRfMsag==} engines: {node: '>=12', npm: '>=6'} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2999,6 +3375,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3167,6 +3547,10 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -3346,6 +3730,10 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@5.3.0: + resolution: {integrity: sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==} + engines: {node: '>=4'} + supports-color@7.1.0: resolution: {integrity: sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==} engines: {node: '>=8'} @@ -3489,6 +3877,10 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + unreachable-branch-transform@0.3.0: resolution: {integrity: sha512-vza0JqnYAxuiynTpibnaaJsQ/FOKo7oJSXnWT96gIGsvQOfv0QHil8dRcRqONFnYK3YXaqVdbGz36bgCAm0qVg==} @@ -3542,6 +3934,37 @@ packages: '@egjs/hammerjs': ^2.0.0 component-emitter: ^1.3.0 || ^2.0.0 + vite-dev-rpc@2.0.0: + resolution: {integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0 + + vite-hot-client@2.2.0: + resolution: {integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0 + + vite-plugin-inspect@11.4.1: + resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-devtools@8.2.1: + resolution: {integrity: sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + + vite-plugin-vue-inspector@6.0.0: + resolution: {integrity: sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite-plugin-vuetify@2.1.3: resolution: {integrity: sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3763,6 +4186,10 @@ packages: wrappy@1.0.0: resolution: {integrity: sha512-3y8PlpIQuv3/g9rN12ffm6FrWo+fCLlt8mtAruKSVgnPgdV4SoxOF8qmJ+6BXjsfDFe/EMUGFWjCu2dImNHjBQ==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -3785,6 +4212,9 @@ packages: resolution: {integrity: sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==} engines: {node: '>=10'} + yallist@3.0.2: + resolution: {integrity: sha512-U+iKQ8rDYMRmvEpvDUIWZ3CtM9/imlAc+c1yJ7YV0vu+HNtP82sAkXzuDXPLkIPoLZohnXFSs9wf2E17xk5yZA==} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3827,6 +4257,11 @@ packages: snapshots: + '@ampproject/remapping@2.2.0': + dependencies: + '@jridgewell/gen-mapping': 0.1.0 + '@jridgewell/trace-mapping': 0.3.9 + '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -3847,6 +4282,177 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} + '@babel/code-frame@7.22.13': + dependencies: + '@babel/highlight': 7.25.9 + chalk: 2.4.2 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.1.1 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.22.9': {} + + '@babel/core@7.23.0': + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.29.0 + convert-source-map: 2.0.0 + debug: 4.3.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.0': + dependencies: + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 2.5.1 + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.0.2 + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-compilation-targets@7.22.15': + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.16.5 + lru-cache: 5.1.1 + semver: 7.5.2 + + '@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.7 + semver: 7.5.2 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.29.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-member-expression-to-functions@7.22.15': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.29.7 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.22.5': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-plugin-utils@7.10.4': {} + + '@babel/helper-plugin-utils@7.22.5': {} + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-simple-access@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.29.0 + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-string-parser@7.29.7': {} @@ -3855,6 +4461,30 @@ snapshots: '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.22.15': {} + + '@babel/helpers@7.23.0': + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 @@ -3863,6 +4493,111 @@ snapshots: dependencies: '@babel/types': 7.29.7 + '@babel/plugin-proposal-decorators@7.23.0(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.0) + + '@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.10.4 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + + '@babel/template@7.22.15': + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.23.0': + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + debug: 4.3.1 + globals: 11.1.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.27.2 + '@babel/types': 7.29.0 + debug: 4.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.3.1 + transitivePeerDependencies: + - supports-color + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -4113,7 +4848,7 @@ snapshots: '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 + string-width-cjs: string-width@4.2.0 strip-ansi: 6.0.1 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 @@ -4123,6 +4858,11 @@ snapshots: dependencies: minipass: 7.1.2 + '@jridgewell/gen-mapping@0.1.0': + dependencies: + '@jridgewell/set-array': 1.0.0 + '@jridgewell/sourcemap-codec': 1.4.10 + '@jridgewell/gen-mapping@0.3.0': dependencies: '@jridgewell/set-array': 1.2.1 @@ -4143,6 +4883,8 @@ snapshots: '@jridgewell/resolve-uri@3.1.0': {} + '@jridgewell/set-array@1.0.0': {} + '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.3': @@ -4676,6 +5418,35 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.0.8 + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.23.0)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.23.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.29.0 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.23.0) + '@vue/shared': 3.5.40 + optionalDependencies: + '@babel/core': 7.23.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.23.0)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.23.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.29.0 + '@vue/compiler-sfc': 3.5.40 + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.40': dependencies: '@babel/parser': 7.29.7 @@ -4710,6 +5481,21 @@ snapshots: '@vue/devtools-api@6.6.4': {} + '@vue/devtools-core@8.2.1(vue@3.5.40(typescript@6.0.3))': + dependencies: + '@vue/devtools-kit': 8.2.1 + '@vue/devtools-shared': 8.2.1 + vue: 3.5.40(typescript@6.0.3) + + '@vue/devtools-kit@8.2.1': + dependencies: + '@vue/devtools-shared': 8.2.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.2.1': {} + '@vue/language-core@3.3.7': dependencies: '@volar/language-core': 2.4.28 @@ -4826,6 +5612,10 @@ snapshots: ansi-regex@5.0.1: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.0 + ansi-styles@4.0.0: dependencies: color-convert: 2.0.0 @@ -4840,6 +5630,8 @@ snapshots: ansi-styles@6.1.0: {} + ansis@4.3.1: {} + app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3): dependencies: '@electron/asar': 3.4.1 @@ -4926,6 +5718,10 @@ snapshots: dependencies: require-from-string: 2.0.2 + birpc@2.9.0: {} + + birpc@4.0.0: {} + bluebird@3.7.2: {} blueimp-canvas-to-blob@3.29.0: {} @@ -4944,6 +5740,14 @@ snapshots: dependencies: balanced-match: 4.0.4 + browserslist@4.16.5: + dependencies: + caniuse-lite: 1.0.30001214 + colorette: 1.4.0 + electron-to-chromium: 1.3.719 + escalade: 3.1.1 + node-releases: 1.1.71 + buffer-from@1.0.0: {} builder-util-runtime@9.7.0: @@ -4972,6 +5776,10 @@ snapshots: transitivePeerDependencies: - supports-color + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + bytestreamjs@2.0.1: {} cacache@20.0.4: @@ -5006,8 +5814,16 @@ snapshots: callsites@3.1.0: {} + caniuse-lite@1.0.30001214: {} + chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.3.0 + chalk@4.1.1: dependencies: ansi-styles: 4.1.0 @@ -5059,6 +5875,10 @@ snapshots: dependencies: number-is-nan: 1.0.0 + color-convert@1.9.0: + dependencies: + color-name: 1.1.4 + color-convert@2.0.0: dependencies: color-name: 1.1.4 @@ -5069,6 +5889,8 @@ snapshots: color-name@1.1.4: {} + colorette@1.4.0: {} + colors@1.1.2: {} combined-stream@1.0.8: @@ -5160,8 +5982,17 @@ snapshots: deep-is@0.1.4: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + defer-to-connect@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.1.2: dependencies: foreach: 2.0.6 @@ -5272,6 +6103,8 @@ snapshots: transitivePeerDependencies: - supports-color + electron-to-chromium@1.3.719: {} + electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.4.1 @@ -5317,6 +6150,8 @@ snapshots: err-code@2.0.2: {} + error-stack-parser-es@1.0.5: {} + es-abstract@1.5.0: dependencies: es-to-primitive: 1.1.0 @@ -5352,6 +6187,8 @@ snapshots: escalade@3.1.1: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)): @@ -5639,6 +6476,8 @@ snapshots: function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + geotiff@3.0.5: dependencies: '@petamoriken/float16': 3.9.3 @@ -5711,6 +6550,8 @@ snapshots: serialize-error: 7.0.1 optional: true + globals@11.1.0: {} + globals@14.0.0: {} globals@17.7.0: {} @@ -5751,6 +6592,8 @@ snapshots: graceful-fs@4.2.6: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-symbols@1.0.3: {} @@ -5767,6 +6610,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hookable@5.5.3: {} + hosted-git-info@2.8.9: {} html-encoding-sniffer@6.0.0(@noble/hashes@2.2.0): @@ -5854,6 +6699,8 @@ snapshots: is-date-object@1.0.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@1.0.0: @@ -5868,6 +6715,12 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-potential-custom-element-name@1.0.1: {} is-regex@1.0.3: {} @@ -5876,6 +6729,10 @@ snapshots: is-symbol@1.0.1: {} + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@0.0.1: {} isarray@1.0.0: {} @@ -5929,6 +6786,8 @@ snapshots: js-tokens@10.0.0: {} + js-tokens@4.0.0: {} + js-yaml@5.2.3: dependencies: argparse: 2.0.1 @@ -5959,6 +6818,10 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + jsesc@2.5.1: {} + + jsesc@3.0.2: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -6019,6 +6882,8 @@ snapshots: yaml: 2.9.0 zod: 4.4.3 + kolorist@1.8.0: {} + lazy-val@1.0.5: {} lcid@2.0.0: @@ -6163,6 +7028,10 @@ snapshots: lru-cache@11.3.5: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.0.2 + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -6332,6 +7201,8 @@ snapshots: node-int64@0.4.0: {} + node-releases@1.1.71: {} + nopt@6.0.0: dependencies: abbrev: 1.0.3 @@ -6365,6 +7236,8 @@ snapshots: obug@2.1.1: {} + ohash@2.0.11: {} + ol-mapbox-style@13.4.1(patch_hash=a41b77469731f99ec75834cf2703f75fd9a5c573a7e70ec5c866849e58ac8b9d)(ol@10.9.0(patch_hash=c7d2f18804523893b6652fabb2e43ca5120d818dbfc92b710a3f5ab3745d4ef4)): dependencies: '@maplibre/maplibre-gl-style-spec': 24.4.1 @@ -6386,6 +7259,15 @@ snapshots: dependencies: wrappy: 1.0.0 + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6528,6 +7410,8 @@ snapshots: pe-library@0.4.0: {} + perfect-debounce@2.1.0: {} + picocolors@1.1.1: {} picomatch@4.0.4: {} @@ -6572,6 +7456,8 @@ snapshots: commander: 9.4.0 optional: true + powershell-utils@0.1.0: {} + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.1: @@ -6759,6 +7645,8 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.1.5 '@rolldown/binding-win32-x64-msvc': 1.1.5 + run-applescript@7.1.0: {} + rw@1.3.3: {} safe-buffer@5.1.1: {} @@ -6932,6 +7820,10 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@5.3.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.1.0: dependencies: has-flag: 4.0.0 @@ -7063,6 +7955,11 @@ snapshots: universalify@2.0.0: {} + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.4 + unreachable-branch-transform@0.3.0: dependencies: esmangle-evaluator: 1.0.0 @@ -7112,6 +8009,58 @@ snapshots: '@egjs/hammerjs': 2.0.17 component-emitter: 2.0.0 + vite-dev-rpc@2.0.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)): + dependencies: + birpc: 4.0.0 + vite: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + vite-hot-client: 2.2.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)) + + vite-hot-client@2.2.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)): + dependencies: + vite: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + + vite-plugin-inspect@11.4.1(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)): + dependencies: + ansis: 4.3.1 + error-stack-parser-es: 1.0.5 + obug: 2.1.1 + ohash: 2.0.11 + open: 11.0.0 + perfect-debounce: 2.1.0 + sirv: 3.0.2 + unplugin-utils: 0.3.2 + vite: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)) + + vite-plugin-vue-devtools@8.2.1(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): + dependencies: + '@vue/devtools-core': 8.2.1(vue@3.5.40(typescript@6.0.3)) + '@vue/devtools-kit': 8.2.1 + '@vue/devtools-shared': 8.2.1 + sirv: 3.0.2 + vite: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)) + vite-plugin-vue-inspector: 6.0.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@6.0.0(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0)): + dependencies: + '@babel/core': 7.23.0 + '@babel/plugin-proposal-decorators': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.23.0) + '@vue/compiler-dom': 3.5.40 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + vite-plugin-vuetify@2.1.3(vite@8.1.5(@types/node@24.9.0)(jiti@2.7.0)(terser@5.49.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(vuetify@3.12.10): dependencies: '@vuetify/loader-shared': 2.1.2(vue@3.5.40(typescript@6.0.3))(vuetify@3.12.10) @@ -7296,6 +8245,11 @@ snapshots: wrappy@1.0.0: {} + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + xml-name-validator@5.0.0: {} xml-utils@1.10.2: {} @@ -7308,6 +8262,8 @@ snapshots: y18n@5.0.5: {} + yallist@3.0.2: {} + yallist@4.0.0: {} yallist@5.0.0: {} diff --git a/pyproject.toml b/pyproject.toml index b299e41f..13191112 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,6 +83,7 @@ dev = [ "pytest-cov>=7.1.0", "pytest-xdist>=3.8.0", "ruff>=0.14.0", + "debugpy>=1.8.16", "mutmut>=3.5.0; python_version < '4.0'", "basedpyright>=1.39.9", ] diff --git a/scripts/dev-local.sh b/scripts/dev-local.sh index b183070c..f04d146e 100644 --- a/scripts/dev-local.sh +++ b/scripts/dev-local.sh @@ -6,6 +6,7 @@ set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" +export PYTHONUNBUFFERED="${PYTHONUNBUFFERED:-1}" export MESHCHAT_PORT="${MESHCHAT_PORT:-8000}" export E2E_BACKEND_PORT="$MESHCHAT_PORT" @@ -18,8 +19,30 @@ cleanup() { } trap cleanup EXIT INT TERM -uv run python -m meshchatx.meshchat --headless --host 127.0.0.1 --port "$MESHCHAT_PORT" & -BE_PID=$! +start_backend() { + local -a cmd + if [[ "${MESHCHAT_DEBUGPY:-0}" == "1" ]]; then + local dbg_port="${MESHCHAT_DEBUGPY_PORT:-5678}" + if ! uv run python -c "import debugpy" >/dev/null 2>&1; then + echo "[dev] debugpy is not installed. Run: task deps:backend" >&2 + exit 1 + fi + cmd=(uv run python -m debugpy --listen "127.0.0.1:${dbg_port}") + if [[ "${MESHCHAT_DEBUGPY_WAIT:-0}" == "1" ]]; then + cmd+=(--wait-for-client) + echo "[dev] debugpy waiting for attach on 127.0.0.1:${dbg_port}" + else + echo "[dev] debugpy listen 127.0.0.1:${dbg_port} (attach Backend: Attach debugpy)" + fi + cmd+=(-m meshchatx.meshchat --headless --host 127.0.0.1 --port "$MESHCHAT_PORT") + "${cmd[@]}" & + else + uv run python -m meshchatx.meshchat --headless --host 127.0.0.1 --port "$MESHCHAT_PORT" & + fi + BE_PID=$! +} + +start_backend BACKEND_URL="https://127.0.0.1:${MESHCHAT_PORT}/api/v1/status" BACKEND_WAIT_SECS="${DEV_BACKEND_WAIT:-120}" @@ -74,4 +97,7 @@ VITE_HOST="${VITE_DEV_HOST:-127.0.0.1}" VITE_PORT="${VITE_DEV_PORT:-5173}" echo "[dev] Starting Vite at http://${VITE_HOST}:${VITE_PORT} (API proxy -> ${BACKEND_URL%/api/v1/status})" +if [[ "${MESHCHAT_VUE_DEVTOOLS:-1}" != "0" ]]; then + echo "[dev] Vue DevTools overlay is on. MESHCHAT_VUE_DEVTOOLS=0 disables it." +fi pnpm run dev -- --host "$VITE_HOST" --port "$VITE_PORT" diff --git a/scripts/e2e/start-e2e-stack.sh b/scripts/e2e/start-e2e-stack.sh index ad3d8f72..cac2a183 100755 --- a/scripts/e2e/start-e2e-stack.sh +++ b/scripts/e2e/start-e2e-stack.sh @@ -62,6 +62,8 @@ if [[ "$ready" -ne 1 ]]; then fi echo "E2E: starting Vite on ${VITE_HOST}:${VITE_PORT}" +# Vue DevTools overlay intercepts clicks and is not part of the product UI. +export MESHCHAT_VUE_DEVTOOLS=0 pnpm exec vite --host "${VITE_HOST}" --port "${VITE_PORT}" & VITE_PID=$! wait "$VITE_PID" diff --git a/scripts/vite-dx.mjs b/scripts/vite-dx.mjs new file mode 100644 index 00000000..5c75b68d --- /dev/null +++ b/scripts/vite-dx.mjs @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: 0BSD + +/** + * Vite-serve developer experience gates (Vue DevTools, open-in-editor). + * Production vite build must not load these plugins. + */ + +/** + * @param {unknown} value + * @returns {boolean} + */ +export function envFlagEnabled(value) { + if (value === undefined || value === null || value === "") { + return false; + } + return ["1", "true", "yes"].includes(String(value).toLowerCase()); +} + +/** + * Vue DevTools overlay is Vite serve only. Vitest, vite build, and e2e + * (MESHCHAT_VUE_DEVTOOLS=0) stay off. Production bundles never include it. + * + * @param {{ command?: string, env?: NodeJS.ProcessEnv }} [options] + * @returns {boolean} + */ +export function isVueDevToolsEnabled(options = {}) { + const command = options.command; + const env = options.env || process.env; + if (command !== "serve") { + return false; + } + if (env.VITEST) { + return false; + } + const raw = env.MESHCHAT_VUE_DEVTOOLS; + if (raw !== undefined && raw !== "") { + return envFlagEnabled(raw); + } + return true; +} + +/** + * Editor for Vue DevTools open-in-editor. LAUNCH_EDITOR wins, else code. + * + * @param {NodeJS.ProcessEnv} [env] + * @returns {string} + */ +export function detectLaunchEditor(env = process.env) { + const explicit = env.LAUNCH_EDITOR; + if (explicit !== undefined && String(explicit).trim() !== "") { + return String(explicit).trim(); + } + return "code"; +} diff --git a/tests/frontend/BootLoadSmoothness.test.js b/tests/frontend/BootLoadSmoothness.test.js index dd59087a..6af26e75 100644 --- a/tests/frontend/BootLoadSmoothness.test.js +++ b/tests/frontend/BootLoadSmoothness.test.js @@ -52,6 +52,8 @@ describe("boot and load smoothness", () => { expect(main).toContain("ElectronUtils.isElectron()"); expect(main).toContain("serviceWorkerRegisterOptions"); expect(main).toContain("decideControllerChangeReload"); + expect(main).toContain("shouldRegisterServiceWorker"); + expect(main).toContain("import.meta.env.DEV"); }); it("App.vue fades non-keepAlive route swaps on canvas background", () => { diff --git a/tests/frontend/serviceWorkerBuild.test.js b/tests/frontend/serviceWorkerBuild.test.js index 004f2b5c..15b99376 100644 --- a/tests/frontend/serviceWorkerBuild.test.js +++ b/tests/frontend/serviceWorkerBuild.test.js @@ -78,5 +78,8 @@ describe("service worker build", () => { expect(main).toContain("controllerchange"); expect(main).toContain("registration.update()"); expect(main).toContain("visibilitychange"); + expect(main).toContain("shouldRegisterServiceWorker"); + expect(main).toContain("unregisterServiceWorkersIfPresent"); + expect(main).toContain("import.meta.env.DEV"); }); }); diff --git a/tests/frontend/swShellRuntime.oracle.test.js b/tests/frontend/swShellRuntime.oracle.test.js index 59cbf21a..0c40f862 100644 --- a/tests/frontend/swShellRuntime.oracle.test.js +++ b/tests/frontend/swShellRuntime.oracle.test.js @@ -20,6 +20,8 @@ import { decideControllerChangeReload, isIgnorableServiceWorkerRegistrationError, serviceWorkerRegisterOptions, + shouldRegisterServiceWorker, + unregisterServiceWorkersIfPresent, } from "../../meshchatx/src/frontend/js/pwa/swClientRegister.js"; import { makeRequest, MemoryCacheStorage, okResponse } from "./helpers/memoryCacheStorage.js"; @@ -240,6 +242,41 @@ describe("swClientRegister update lifecycle oracle", () => { it("oracle: register options force updateViaCache none", () => { expect(serviceWorkerRegisterOptions()).toEqual({ updateViaCache: "none" }); }); + + it("oracle: service worker registers only outside Vite DEV and Electron", () => { + const cases = [ + { isDev: false, isElectron: false, expected: true }, + { isDev: true, isElectron: false, expected: false }, + { isDev: false, isElectron: true, expected: false }, + { isDev: true, isElectron: true, expected: false }, + ]; + for (const input of cases) { + expect(shouldRegisterServiceWorker(input), JSON.stringify(input)).toBe(input.expected); + } + }); + + it("unregisters leftover workers when getRegistrations is present", async () => { + const unregistered = []; + const serviceWorker = { + getRegistrations: async () => [ + { + unregister: async () => { + unregistered.push("a"); + return true; + }, + }, + { + unregister: async () => { + unregistered.push("b"); + return true; + }, + }, + ], + }; + await expect(unregisterServiceWorkersIfPresent(serviceWorker)).resolves.toEqual([true, true]); + expect(unregistered).toEqual(["a", "b"]); + await expect(unregisterServiceWorkersIfPresent({})).resolves.toEqual([]); + }); }); describe("swShellRuntime navigation preload", () => { diff --git a/tests/frontend/viteDx.test.js b/tests/frontend/viteDx.test.js new file mode 100644 index 00000000..7d30f09c --- /dev/null +++ b/tests/frontend/viteDx.test.js @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: 0BSD + +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { describe, expect, it } from "vitest"; +import { detectLaunchEditor, envFlagEnabled, isVueDevToolsEnabled } from "../../scripts/vite-dx.mjs"; + +const ROOT = resolve(import.meta.dirname, "../.."); + +describe("vite-dx Vue DevTools gate", () => { + it("oracle: only vite serve enables DevTools by default", () => { + const cases = [ + { command: "serve", env: {}, expected: true }, + { command: "build", env: {}, expected: false }, + { command: "serve", env: { VITEST: "true" }, expected: false }, + { command: "serve", env: { MESHCHAT_VUE_DEVTOOLS: "0" }, expected: false }, + { command: "serve", env: { MESHCHAT_VUE_DEVTOOLS: "false" }, expected: false }, + { command: "serve", env: { MESHCHAT_VUE_DEVTOOLS: "1" }, expected: true }, + { command: "build", env: { MESHCHAT_VUE_DEVTOOLS: "1" }, expected: false }, + { command: undefined, env: {}, expected: false }, + ]; + for (const input of cases) { + expect(isVueDevToolsEnabled({ command: input.command, env: input.env }), JSON.stringify(input)).toBe( + input.expected + ); + } + }); + + it("envFlagEnabled accepts 1/true/yes only", () => { + expect(envFlagEnabled("1")).toBe(true); + expect(envFlagEnabled("true")).toBe(true); + expect(envFlagEnabled("YES")).toBe(true); + expect(envFlagEnabled("0")).toBe(false); + expect(envFlagEnabled("")).toBe(false); + expect(envFlagEnabled(undefined)).toBe(false); + }); + + it("detectLaunchEditor prefers LAUNCH_EDITOR then code", () => { + expect(detectLaunchEditor({ LAUNCH_EDITOR: "webstorm" })).toBe("webstorm"); + expect(detectLaunchEditor({})).toBe("code"); + }); + + it("vite.config.js wires the plugin, production DevTools flag, and localhost server", () => { + const vite = readFileSync(resolve(ROOT, "vite.config.js"), "utf8"); + expect(vite).toContain('from "vite-plugin-vue-devtools"'); + expect(vite).toContain("isVueDevToolsEnabled({ command })"); + expect(vite).toContain('__VUE_PROD_DEVTOOLS__: "false"'); + expect(vite).toContain("sourcemap: false"); + expect(vite).toContain("devSourcemap: true"); + expect(vite).toContain('host: "127.0.0.1"'); + expect(vite).toContain("strictPort: true"); + expect(vite).toContain("clearScreen: false"); + }); + + it("e2e Vite stack disables Vue DevTools", () => { + const e2e = readFileSync(resolve(ROOT, "scripts/e2e/start-e2e-stack.sh"), "utf8"); + expect(e2e).toContain("MESHCHAT_VUE_DEVTOOLS=0"); + }); + + it("package.json lists vite-plugin-vue-devtools as a devDependency", () => { + const pkg = JSON.parse(readFileSync(resolve(ROOT, "package.json"), "utf8")); + expect(pkg.devDependencies["vite-plugin-vue-devtools"]).toBeTruthy(); + }); + + it("debugpy in task debug binds 127.0.0.1 only", () => { + const dev = readFileSync(resolve(ROOT, "scripts/dev-local.sh"), "utf8"); + expect(dev).toContain('debugpy --listen "127.0.0.1:${dbg_port}"'); + expect(dev).not.toContain("--listen 0.0.0.0"); + expect(dev).toContain("MESHCHAT_DEBUGPY"); + const taskfile = readFileSync(resolve(ROOT, "Taskfile.yml"), "utf8"); + expect(taskfile).toContain("MESHCHAT_DEBUGPY=1 bash scripts/dev-local.sh"); + }); + + it("debugger launch configs attach debugpy on localhost and Chrome to Vite", () => { + const launch = JSON.parse(readFileSync(resolve(ROOT, ".vscode/launch.json"), "utf8")); + const names = launch.configurations.map((c) => c.name); + expect(names).toContain("Backend: Attach debugpy"); + expect(names).toContain("Frontend: Chrome (Vite)"); + const attach = launch.configurations.find((c) => c.name === "Backend: Attach debugpy"); + expect(attach.connect).toEqual({ host: "127.0.0.1", port: 5678 }); + const chrome = launch.configurations.find((c) => c.name === "Frontend: Chrome (Vite)"); + expect(chrome.url).toBe("http://127.0.0.1:5173"); + const compound = launch.compounds.find((c) => c.name === "MeshChatX: Vite + Python"); + expect(compound.preLaunchTask).toBe("meshchatx: debug"); + }); +}); diff --git a/uv.lock b/uv.lock index 8b7759bb..e3dba407 100644 --- a/uv.lock +++ b/uv.lock @@ -749,6 +749,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/8f/77135ab8d690030cdb0ebeca879640b5945c4cbf5344ecbc507b4628da24/dbus_fast-5.0.22-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7be4271e38251f1ad726962dec60da887c8ed352d157352e4fc27f56aece5c5d", size = 1629160, upload-time = "2026-06-05T18:56:47.688Z" }, ] +[[package]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/fb/cbf306d6e07a313a91e7171a98669054502840931432c227cfd505ee367f/debugpy-1.8.21-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:da456226c7b4c69e35dbe35dcee6623d912000a77816db7856a41af1c72a0264", size = 2203120, upload-time = "2026-06-01T19:30:43.964Z" }, + { url = "https://files.pythonhosted.org/packages/aa/57/aa739bd4ad2cbf96aeb1b20b56918ddd5ae4c28b68709bfcd327f02123ee/debugpy-1.8.21-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:f68b891688e61bdc08b8d364d919ff0051e0b94657b39dcd027bc3173edb7cdc", size = 3059958, upload-time = "2026-06-01T19:30:45.622Z" }, + { url = "https://files.pythonhosted.org/packages/a8/31/453d2c9a23d133fe2c8ec7ca1d816ded52a913487fe3ffef7c01b4b706af/debugpy-1.8.21-cp311-cp311-win32.whl", hash = "sha256:f843a8b08c2edeaf9b1582eed4f25441af21a297c22ff16bf76a662557aa9c9e", size = 5236515, upload-time = "2026-06-01T19:30:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/6660de2f2d7bf388f229335ba4637646eebabdbf38564cb439a95a9193c9/debugpy-1.8.21-cp311-cp311-win_amd64.whl", hash = "sha256:84c564d8cc701d41843b29a92814c1f1bef6798724ca9d675c284ad9f6a547d7", size = 5256138, upload-time = "2026-06-01T19:30:49.113Z" }, + { url = "https://files.pythonhosted.org/packages/a2/df/bf625547431a9cadc9f4cbfeda38866e2b17f6aed147b625377e87834449/debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e", size = 2483609, upload-time = "2026-06-01T19:30:50.794Z" }, + { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/14/cd/27f65b805d7fe005c44e1a36b9183ecdfbcdbf9d3e721a5115d461ecc7ee/debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9", size = 5336340, upload-time = "2026-06-01T19:30:54.047Z" }, + { url = "https://files.pythonhosted.org/packages/77/1d/c84e30c0c674184948b66f076ab271c01d940618a2824c23cd035a27bc20/debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c", size = 5374751, upload-time = "2026-06-01T19:30:55.891Z" }, + { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, + { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3d/f4bbb323a548bfab2af3d6b4ffd9bf22636e55956a1285d317a1de643aad/debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782", size = 2477209, upload-time = "2026-06-01T19:31:04.157Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/97/47/d1aa6d64005a98a9144647d99306b419396f9ad7bf1d73c119e17a81fb4d/debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c", size = 5336724, upload-time = "2026-06-01T19:31:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/b905b90d163af11878c1af8abafa4a25206335e112e284e413454543a6da/debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8", size = 5373803, upload-time = "2026-06-01T19:31:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + [[package]] name = "dmgbuild" version = "1.6.7" @@ -2040,6 +2065,7 @@ dependencies = [ dev = [ { name = "basedpyright" }, { name = "cx-freeze" }, + { name = "debugpy" }, { name = "hypothesis" }, { name = "jsonschema" }, { name = "mutmut", marker = "python_full_version < '4'" }, @@ -2078,6 +2104,7 @@ requires-dist = [ dev = [ { name = "basedpyright", specifier = ">=1.39.9" }, { name = "cx-freeze", specifier = ">=7.0.0" }, + { name = "debugpy", specifier = ">=1.8.16" }, { name = "hypothesis", specifier = ">=6.152.4" }, { name = "jsonschema", specifier = ">=4.26.0" }, { name = "mutmut", marker = "python_full_version < '4'", specifier = ">=3.5.0" }, diff --git a/vite.config.js b/vite.config.js index 4b5bf0ef..088677f8 100644 --- a/vite.config.js +++ b/vite.config.js @@ -3,8 +3,10 @@ import fs from "fs"; import { defineConfig } from "vite"; import { MICRON_PARSER_GO_RELEASE_TAG } from "./scripts/micron-parser-go-version.mjs"; import { meshchatxServiceWorkerPlugin } from "./scripts/build/generate_service_worker.mjs"; +import { detectLaunchEditor, isVueDevToolsEnabled } from "./scripts/vite-dx.mjs"; import tailwindcss from "@tailwindcss/vite"; import vue from "@vitejs/plugin-vue"; +import vueDevTools from "vite-plugin-vue-devtools"; import vuetify from "vite-plugin-vuetify"; const vendorChunkGroups = [ @@ -153,9 +155,10 @@ function loadVisualiserWasmIntegrity() { const micronWasmIntegrity = loadMicronWasmIntegrity(); const visualiserWasmIntegrity = loadVisualiserWasmIntegrity(); -export default defineConfig({ +export default defineConfig(({ command }) => ({ define: { __APP_BUILD_TIME__: JSON.stringify(appBuildTimeIso), + __VUE_PROD_DEVTOOLS__: "false", "import.meta.env.VITE_MICRON_WASM_BUNDLED": JSON.stringify(micronWasmBundled ? "true" : "false"), "import.meta.env.VITE_MICRON_PARSER_GO_RELEASE": JSON.stringify(MICRON_PARSER_GO_RELEASE_TAG), "import.meta.env.VITE_VISUALISER_WASM_BUNDLED": JSON.stringify(visualiserWasmBundled ? "true" : "false"), @@ -166,6 +169,13 @@ export default defineConfig({ }, plugins: [ tailwindcss(), + ...(isVueDevToolsEnabled({ command }) + ? [ + vueDevTools({ + launchEditor: detectLaunchEditor(), + }), + ] + : []), vue({ template: { compilerOptions: { @@ -177,8 +187,18 @@ export default defineConfig({ meshchatxServiceWorkerPlugin({ buildId: appBuildTimeIso }), ], + css: { + devSourcemap: true, + }, + server: { + host: "127.0.0.1", port: 5173, + strictPort: true, + clearScreen: false, + warmup: { + clientFiles: ["./main.js", "./components/App.vue", "./components/messages/MessagesPage.vue"], + }, proxy: { "/api": { target: e2eBackendOrigin, @@ -279,4 +299,4 @@ export default defineConfig({ "micron-parser": path.join(__dirname, "node_modules", "micron-parser", "js", "micron-parser.js"), }, }, -}); +}));