From 64bb6c30fd18ea03b4c34a2929d06b906a53f610 Mon Sep 17 00:00:00 2001 From: CassioJ2 Date: Sun, 15 Mar 2026 15:14:22 -0300 Subject: [PATCH 001/146] Clear tasks branch --- .env.example | 6 - .gitignore | 33 - README.md | 148 - build/icon.ico | Bin 285478 -> 0 bytes build/icon.png | Bin 63707 -> 0 bytes electron.vite.config.js | 31 - eslint.config.js | 23 - index.html | 12 - npm | 0 package-lock.json | 7609 ----------------- package.json | 73 - public/favicon.svg | 1 - public/icons.svg | 24 - public/logo.svg | 2244 ----- public/logodoapp.png | Bin 63707 -> 0 bytes scripts/prepare-release-assets.cjs | 32 - src/assets/hero.png | Bin 44919 -> 0 bytes src/assets/react.svg | 1 - src/assets/vite.svg | 1 - src/main/config/env.js | 89 - src/main/github/auth.js | 126 - src/main/github/client.js | 201 - src/main/github/errors.js | 8 - src/main/github/http.js | 34 - src/main/index.js | 85 - src/main/ipc/contracts.js | 316 - src/main/ipc/handlers.js | 70 - src/main/ipc/run-smoke-tests.cjs | 661 -- src/main/ipc/spec.js | 141 - src/main/parser/index.js | 113 - src/main/parser/run-tests.cjs | 110 - src/main/store.js | 13 - src/main/tasks/cache.js | 33 - src/main/tasks/local-repo.js | 126 - src/main/tasks/template.js | 10 - src/main/watcher/poller.js | 159 - src/preload/index.js | 36 - src/renderer/App.jsx | 92 - src/renderer/components/CardTypesManager.jsx | 199 - .../components/CardTypesManager.module.css | 321 - src/renderer/components/ColumnsManager.jsx | 184 - .../components/ColumnsManager.module.css | 272 - src/renderer/components/FlagsManager.jsx | 187 - .../components/FlagsManager.module.css | 296 - src/renderer/components/KanbanColumn.jsx | 56 - .../components/KanbanColumn.module.css | 59 - src/renderer/components/LoadingSpinner.jsx | 28 - src/renderer/components/SortableTaskCard.jsx | 42 - src/renderer/components/TaskCard.jsx | 235 - src/renderer/components/TaskCard.module.css | 250 - src/renderer/components/TaskModal.jsx | 421 - src/renderer/components/TaskModal.module.css | 332 - src/renderer/components/Toast.jsx | 18 - src/renderer/components/Toast.module.css | 69 - src/renderer/context/CardTypesContext.jsx | 81 - src/renderer/context/ColumnsContext.jsx | 66 - src/renderer/context/FlagsContext.jsx | 87 - src/renderer/index.css | 11 - src/renderer/index.html | 13 - src/renderer/logo.svg | 1757 ---- src/renderer/main.jsx | 21 - src/renderer/pages/KanbanPage.jsx | 713 -- src/renderer/pages/KanbanPage.module.css | 356 - src/renderer/pages/LoginPage.jsx | 116 - src/renderer/pages/LoginPage.module.css | 144 - src/renderer/pages/RepoSelectPage.jsx | 237 - src/renderer/pages/RepoSelectPage.module.css | 185 - src/renderer/styles/global.css | 135 - src/renderer/styles/tokens.css | 81 - tasks.md | 44 - tsconfig.app.json | 28 - tsconfig.json | 7 - tsconfig.node.json | 26 - 73 files changed, 19738 deletions(-) delete mode 100644 .env.example delete mode 100644 .gitignore delete mode 100644 README.md delete mode 100644 build/icon.ico delete mode 100644 build/icon.png delete mode 100644 electron.vite.config.js delete mode 100644 eslint.config.js delete mode 100644 index.html delete mode 100644 npm delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 public/favicon.svg delete mode 100644 public/icons.svg delete mode 100644 public/logo.svg delete mode 100644 public/logodoapp.png delete mode 100644 scripts/prepare-release-assets.cjs delete mode 100644 src/assets/hero.png delete mode 100644 src/assets/react.svg delete mode 100644 src/assets/vite.svg delete mode 100644 src/main/config/env.js delete mode 100644 src/main/github/auth.js delete mode 100644 src/main/github/client.js delete mode 100644 src/main/github/errors.js delete mode 100644 src/main/github/http.js delete mode 100644 src/main/index.js delete mode 100644 src/main/ipc/contracts.js delete mode 100644 src/main/ipc/handlers.js delete mode 100644 src/main/ipc/run-smoke-tests.cjs delete mode 100644 src/main/ipc/spec.js delete mode 100644 src/main/parser/index.js delete mode 100644 src/main/parser/run-tests.cjs delete mode 100644 src/main/store.js delete mode 100644 src/main/tasks/cache.js delete mode 100644 src/main/tasks/local-repo.js delete mode 100644 src/main/tasks/template.js delete mode 100644 src/main/watcher/poller.js delete mode 100644 src/preload/index.js delete mode 100644 src/renderer/App.jsx delete mode 100644 src/renderer/components/CardTypesManager.jsx delete mode 100644 src/renderer/components/CardTypesManager.module.css delete mode 100644 src/renderer/components/ColumnsManager.jsx delete mode 100644 src/renderer/components/ColumnsManager.module.css delete mode 100644 src/renderer/components/FlagsManager.jsx delete mode 100644 src/renderer/components/FlagsManager.module.css delete mode 100644 src/renderer/components/KanbanColumn.jsx delete mode 100644 src/renderer/components/KanbanColumn.module.css delete mode 100644 src/renderer/components/LoadingSpinner.jsx delete mode 100644 src/renderer/components/SortableTaskCard.jsx delete mode 100644 src/renderer/components/TaskCard.jsx delete mode 100644 src/renderer/components/TaskCard.module.css delete mode 100644 src/renderer/components/TaskModal.jsx delete mode 100644 src/renderer/components/TaskModal.module.css delete mode 100644 src/renderer/components/Toast.jsx delete mode 100644 src/renderer/components/Toast.module.css delete mode 100644 src/renderer/context/CardTypesContext.jsx delete mode 100644 src/renderer/context/ColumnsContext.jsx delete mode 100644 src/renderer/context/FlagsContext.jsx delete mode 100644 src/renderer/index.css delete mode 100644 src/renderer/index.html delete mode 100644 src/renderer/logo.svg delete mode 100644 src/renderer/main.jsx delete mode 100644 src/renderer/pages/KanbanPage.jsx delete mode 100644 src/renderer/pages/KanbanPage.module.css delete mode 100644 src/renderer/pages/LoginPage.jsx delete mode 100644 src/renderer/pages/LoginPage.module.css delete mode 100644 src/renderer/pages/RepoSelectPage.jsx delete mode 100644 src/renderer/pages/RepoSelectPage.module.css delete mode 100644 src/renderer/styles/global.css delete mode 100644 src/renderer/styles/tokens.css delete mode 100644 tasks.md delete mode 100644 tsconfig.app.json delete mode 100644 tsconfig.json delete mode 100644 tsconfig.node.json diff --git a/.env.example b/.env.example deleted file mode 100644 index e48f039..0000000 --- a/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -# GitHub Client ID do seu GitHub App -# Encontre em: github.com/settings/apps -> seu app -> Client ID -GITHUB_CLIENT_ID=your_client_id_here - -# Nao coloque CLIENT_SECRET / PRIVATE_KEY no app cliente. -# O fluxo atual de login do desktop usa apenas o client ID. diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 685f337..0000000 --- a/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -# Dependências -node_modules/ - -# Builds -dist/ -dist-ssr/ -dist-electron/ -out/ - -# Env -.env -.env.* - -# Editor -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -*.local \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 04c41f2..0000000 --- a/README.md +++ /dev/null @@ -1,148 +0,0 @@ -# CodeSprint - -CodeSprint e uma plataforma desktop criada para tornar o planejamento de software mais visivel, colaborativo e conectado ao fluxo real de desenvolvimento. - -Ao combinar board visual, area de backlog, integracao com GitHub e uma fonte de verdade baseada em markdown, o CodeSprint ajuda equipes a sairem de um planejamento espalhado para uma execucao mais clara, organizada e eficiente. - -## Visao Geral do Projeto - -Equipes de software costumam dividir o planejamento entre varios lugares desconectados: issues no GitHub, anotacoes pessoais, chats, boards estaticos e arquivos locais do projeto. Essa fragmentacao gera perda de contexto, esforco duplicado e pouca visibilidade sobre o que realmente precisa ser feito. - -O CodeSprint foi criado para centralizar esse processo em uma experiencia pratica, visual e proxima do ambiente real de desenvolvimento. - -Com o CodeSprint, as equipes podem: - -- conectar uma conta do GitHub -- selecionar um repositorio -- vincular o clone local real no computador -- gerenciar tarefas em visualizacoes de backlog e board -- editar o mesmo arquivo `tasks.md` pelo app ou pelo VS Code -- sincronizar alteracoes com o GitHub quando necessario - -## Funcionalidades Principais - -- autenticacao com GitHub -- selecao de repositorio e vinculacao com pasta local -- gestao de tarefas em fluxo local-first -- atualizacao em tempo real quando o `tasks.md` e alterado fora do app -- visualizacao em board estilo Kanban -- visualizacao em backlog -- suporte a metadados de tarefa, como responsavel, prioridade, etiquetas, descricao e subtarefas -- atribuicao de responsaveis com base nos colaboradores do GitHub -- sincronizacao manual entre trabalho local e repositorio remoto - -## O Problema - -Ferramentas de planejamento geralmente ficam distantes do codigo que deveriam apoiar. - -Isso gera problemas frequentes: - -- o planejamento fica desconectado da execucao -- as equipes perdem visibilidade entre backlog e trabalho em andamento -- atualizacoes dependem de repeticao manual entre ferramentas -- os desenvolvedores trabalham no repositorio, mas o planejamento vive em outro lugar - -O CodeSprint resolve isso ao transformar o proprio repositorio em parte do fluxo de planejamento. - -## A Solucao - -No centro da plataforma existe uma ideia simples: o backlog do projeto nao deve ficar isolado do proprio projeto. - -O CodeSprint transforma o `tasks.md` em uma camada colaborativa de planejamento conectada tanto a interface quanto ao repositorio. O resultado e um fluxo em que as tarefas podem ser criadas, revisadas, atribuidas, reorganizadas e sincronizadas sem perder portabilidade nem controle. - -## Como Funciona - -1. O usuario conecta uma conta do GitHub e seleciona um repositorio. -2. A plataforma vincula esse repositorio ao seu clone local real. -3. O CodeSprint le e escreve tarefas por meio de um arquivo compartilhado `tasks.md`. -4. As tarefas podem ser gerenciadas visualmente em visualizacoes de backlog e board. -5. O mesmo arquivo tambem pode ser editado diretamente no ambiente de desenvolvimento. -6. A sincronizacao com o GitHub acontece quando o usuario decide, preservando um fluxo local-first. - -Essa abordagem mantem o projeto transparente, portavel e facil de integrar ao fluxo de trabalho real de desenvolvimento. - -## Screenshots - -### Tela de Login - -`[Add screenshot here]` - -### Selecao de Repositorio - -`[Add screenshot here]` - -### Visualizacao de Backlog - -`[Add screenshot here]` - -### Visualizacao de Board - -`[Add screenshot here]` - -### Detalhes da Tarefa / Fluxo de Edicao - -`[Add screenshot here]` - -## Stack Tecnica - -- Electron -- React -- JavaScript -- GitHub API -- persistencia de tarefas baseada em markdown - -## Diferenciais - -O CodeSprint nao e apenas mais um board de tarefas. Seu principal diferencial esta na combinacao entre: - -- gestao visual de tarefas -- integracao real com repositorios -- fluxo local-first -- sincronizacao com GitHub -- portabilidade baseada em markdown - -Isso torna a plataforma especialmente relevante para equipes tecnicas que ja trabalham dentro de repositorios e querem manter o planejamento proximo do codigo, e nao separado dele. - -## Exemplo de Uso - -Uma equipe pode usar o CodeSprint para: - -- estruturar demandas em um backlog -- revisar tudo em formato visual -- mover itens selecionados para colunas de execucao -- atribuir tarefas com base nos colaboradores do GitHub -- atualizar o arquivo markdown do projeto sem prender o fluxo a uma plataforma proprietaria - -## Estrutura do Projeto - -A aplicacao esta organizada em torno de: - -- processo principal do Electron para integracoes nativas e IPC -- interface renderer para as experiencias de backlog e board -- logica de parser para leitura e escrita de `tasks.md` -- integracao com GitHub para autenticacao, repositorios, colaboradores e sincronizacao - -## Evolucoes Futuras - -- empacotamento de release mais completo -- fluxos de colaboracao mais amplos -- mais relatorios e filtros visuais -- melhor experiencia de onboarding -- novos fluxos de automacao de tarefas - -## Contexto da Competicao - -Este repositorio foi organizado para apresentar o produto de forma clara para avaliacao. - -O foco da submissao esta em: - -- visao de produto -- experiencia desktop funcional -- fluxo integrado com GitHub -- uso pratico de markdown como camada colaborativa de planejamento - -## Por Que Isso Importa - -O CodeSprint propoe uma ponte mais natural entre planejamento e implementacao. - -Em vez de forcar as equipes a escolher entre organizacao visual e fluxo baseado em repositorio, a plataforma conecta os dois lados. Isso cria um processo mais transparente, melhora a colaboracao e mantem a gestao do projeto perto de onde o trabalho realmente acontece. diff --git a/build/icon.ico b/build/icon.ico deleted file mode 100644 index 3d5c54879c63ad3542975515883bf2dedc5e1f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285478 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

vE15UGgG9pd%qL;_RPjukKu} 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 diff --git a/electron.vite.config.js b/electron.vite.config.js deleted file mode 100644 index f39d3c7..0000000 --- a/electron.vite.config.js +++ /dev/null @@ -1,31 +0,0 @@ -import { defineConfig, externalizeDepsPlugin } from 'electron-vite' -import react from '@vitejs/plugin-react' - -const embeddedGitHubClientId = process.env.GITHUB_CLIENT_ID || '' - -export default defineConfig({ - main: { - plugins: [externalizeDepsPlugin()], - define: { - __EMBEDDED_GITHUB_CLIENT_ID__: JSON.stringify(embeddedGitHubClientId) - }, - build: { - minify: true, - sourcemap: false - } - }, - preload: { - plugins: [externalizeDepsPlugin()], - build: { - minify: true, - sourcemap: false - } - }, - renderer: { - plugins: [react()], - build: { - minify: true, - sourcemap: false - } - } -}) diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 5e6b472..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,23 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - js.configs.recommended, - tseslint.configs.recommended, - reactHooks.configs.flat.recommended, - reactRefresh.configs.vite, - ], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - }, -]) diff --git a/index.html b/index.html deleted file mode 100644 index 810661e..0000000 --- a/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - CodeSprint - - -
- - - diff --git a/npm b/npm deleted file mode 100644 index e69de29..0000000 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a942898..0000000 --- a/package-lock.json +++ /dev/null @@ -1,7609 +0,0 @@ -{ - "name": "codesprint", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "codesprint", - "version": "0.1.0", - "dependencies": { - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/sortable": "^10.0.0", - "@dnd-kit/utilities": "^3.2.2", - "electron-store": "^8.1.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@eslint/js": "^9.39.4", - "@types/node": "^24.12.0", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.1", - "electron": "^33.0.0", - "electron-builder": "^25.1.8", - "electron-vite": "^2.3.0", - "eslint": "^9.39.4", - "png-to-ico": "^3.0.1", - "typescript": "~5.9.3", - "vite": "^5.4.10" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", - "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@electron/asar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", - "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", - "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/rebuild/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.16.0", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz", - "integrity": "sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/app-builder-lib": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.1.8.tgz", - "integrity": "sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.1", - "@electron/rebuild": "3.6.1", - "@electron/universal": "2.0.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chromium-pickle-js": "^0.2.0", - "config-file-ts": "0.2.8-rc1", - "debug": "^4.3.4", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "ejs": "^3.1.8", - "electron-publish": "25.1.7", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "lazy-val": "^1.0.5", - "minimatch": "^10.0.0", - "resedit": "^1.7.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "dmg-builder": "25.1.8", - "electron-builder-squirrel-windows": "25.1.8" - } - }, - "node_modules/app-builder-lib/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/app-builder-lib/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "dev": true, - "license": "ISC" - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "license": "MIT", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.8", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builder-util": { - "version": "25.1.7", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.1.7.tgz", - "integrity": "sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.10", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.10", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", - "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001778", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "license": "MIT", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/conf/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/config-file-ts": { - "version": "0.2.8-rc1", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", - "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.3.12", - "typescript": "^5.4.3" - } - }, - "node_modules/config-file-ts/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dmg-builder": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", - "integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "25.1.8", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "33.4.11", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", - "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.1.8.tgz", - "integrity": "sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "25.1.8", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "dmg-builder": "25.1.8", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder-squirrel-windows": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.1.8.tgz", - "integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "25.1.8", - "archiver": "^5.3.1", - "builder-util": "25.1.7", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-publish": { - "version": "25.1.7", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.1.7.tgz", - "integrity": "sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-store": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", - "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", - "license": "MIT", - "dependencies": { - "conf": "^10.2.0", - "type-fest": "^2.17.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-store/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.313", - "dev": true, - "license": "ISC" - }, - "node_modules/electron-vite": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-2.3.0.tgz", - "integrity": "sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.7", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "cac": "^6.7.14", - "esbuild": "^0.21.5", - "magic-string": "^0.30.10", - "picocolors": "^1.0.1" - }, - "bin": { - "electron-vite": "bin/electron-vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@swc/core": "^1.0.0", - "vite": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - } - } - }, - "node_modules/electron/node_modules/@types/node": { - "version": "20.19.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/electron/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.4", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.1", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.7.4", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true, - "license": "ISC" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", - "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "license": "BSD-2-Clause" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.88.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.88.0.tgz", - "integrity": "sha512-At6b4UqIEVudaqPsXjmUO1r/N5BUr4yhDGs5PkBE8/oG5+TfLPhFechiskFsnT6Ql0VfUXbalUUCbfXxtj7K+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", - "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-api-version/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-releases": { - "version": "2.0.36", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pe-library": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/png-to-ico": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/png-to-ico/-/png-to-ico-3.0.1.tgz", - "integrity": "sha512-S8BOAoaGd9gT5uaemQ62arIY3Jzco7Uc7LwUTqRyqJDTsKqOAiyfyN4dSdT0D+Zf8XvgztgpRbM5wnQd7EgYwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "^22.10.3", - "minimist": "^1.2.8", - "pngjs": "^7.0.0" - }, - "bin": { - "png-to-ico": "bin/cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/png-to-ico/node_modules/@types/node": { - "version": "22.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/png-to-ico/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.19.0" - } - }, - "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resedit": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", - "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pe-library": "^0.4.1" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", - "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.7.4", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index b3b065c..0000000 --- a/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "codesprint", - "version": "0.1.0", - "description": "GitHub-synced project manager with local-first kanban and backlog views", - "main": "out/main/index.js", - "author": "CassioJ2", - "private": true, - "scripts": { - "dev": "electron-vite dev", - "build": "electron-vite build", - "preview": "electron-vite preview", - "release:prepare": "node scripts/prepare-release-assets.cjs", - "dist": "npm run release:prepare && npm run build && electron-builder", - "dist:win": "npm run release:prepare && npm run build && electron-builder --win nsis", - "test:parser": "node src/main/parser/run-tests.cjs", - "test:ipc": "node src/main/ipc/run-smoke-tests.cjs", - "test:backend": "npm.cmd run test:parser && npm.cmd run test:ipc" - }, - "dependencies": { - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/sortable": "^10.0.0", - "@dnd-kit/utilities": "^3.2.2", - "electron-store": "^8.1.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@eslint/js": "^9.39.4", - "@types/node": "^24.12.0", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.1", - "electron": "^33.0.0", - "electron-builder": "^25.1.8", - "electron-vite": "^2.3.0", - "eslint": "^9.39.4", - "png-to-ico": "^3.0.1", - "typescript": "~5.9.3", - "vite": "^5.4.10" - }, - "build": { - "appId": "com.codesprint.app", - "productName": "CodeSprint", - "directories": { - "output": "dist" - }, - "asar": true, - "compression": "maximum", - "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", - "files": [ - "out/**/*", - "package.json" - ], - "win": { - "icon": "build/icon.ico", - "target": "nsis", - "signAndEditExecutable": false - }, - "nsis": { - "installerIcon": "build/icon.ico", - "uninstallerIcon": "build/icon.ico", - "installerHeaderIcon": "build/icon.ico" - }, - "mac": { - "icon": "build/icon.png", - "target": "dmg" - }, - "linux": { - "icon": "build/icon.png", - "target": "AppImage" - } - } -} diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/logo.svg b/public/logo.svg deleted file mode 100644 index 7f4d589..0000000 --- a/public/logo.svg +++ /dev/null @@ -1,2244 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/logodoapp.png b/public/logodoapp.png deleted file mode 100644 index 8102cb4803b5b61bde85c533ceec20ca97f0f8de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63707 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 diff --git a/scripts/prepare-release-assets.cjs b/scripts/prepare-release-assets.cjs deleted file mode 100644 index af084c4..0000000 --- a/scripts/prepare-release-assets.cjs +++ /dev/null @@ -1,32 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const pngToIco = require('png-to-ico').default - -const rootDir = path.resolve(__dirname, '..') -const sourcePngPath = path.join(rootDir, 'public', 'logodoapp.png') -const buildDir = path.join(rootDir, 'build') -const targetPngPath = path.join(buildDir, 'icon.png') -const targetIcoPath = path.join(buildDir, 'icon.ico') - -function ensureSourceExists() { - if (!fs.existsSync(sourcePngPath)) { - throw new Error(`Missing source icon: ${sourcePngPath}`) - } -} - -async function main() { - ensureSourceExists() - fs.mkdirSync(buildDir, { recursive: true }) - - const pngBuffer = fs.readFileSync(sourcePngPath) - fs.copyFileSync(sourcePngPath, targetPngPath) - const icoBuffer = await pngToIco(sourcePngPath) - fs.writeFileSync(targetIcoPath, icoBuffer) - - console.log(`Prepared release icons in ${buildDir}`) -} - -main().catch((error) => { - console.error(error) - process.exitCode = 1 -}) diff --git a/src/assets/hero.png b/src/assets/hero.png deleted file mode 100644 index cc51a3d20ad4bc961b596a6adfd686685cd84bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44919 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 JPDHLkV1myZcL)Fg diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/vite.svg b/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/src/main/config/env.js b/src/main/config/env.js deleted file mode 100644 index 37a7d88..0000000 --- a/src/main/config/env.js +++ /dev/null @@ -1,89 +0,0 @@ -import { existsSync, readFileSync } from 'fs' -import { dirname, join, parse, resolve } from 'path' - -function stripWrappingQuotes(value) { - if ( - (value.startsWith('"') && value.endsWith('"')) || - (value.startsWith("'") && value.endsWith("'")) - ) { - return value.slice(1, -1) - } - - return value -} - -function collectParentDirs(startDir) { - const dirs = [] - let current = resolve(startDir) - - while (true) { - dirs.push(current) - - const parent = dirname(current) - if (parent === current || parent === parse(current).root) { - if (parent !== current) { - dirs.push(parent) - } - break - } - - current = parent - } - - return dirs -} - -function getEnvCandidatePaths() { - const candidates = new Set() - const baseDirs = new Set([ - process.cwd(), - dirname(process.execPath), - __dirname - ]) - - for (const baseDir of baseDirs) { - for (const dir of collectParentDirs(baseDir)) { - candidates.add(join(dir, '.env')) - } - } - - return [...candidates] -} - -/** - * Carrega variaveis de um arquivo .env no processo principal sem depender de libs externas. - * Variaveis ja definidas no ambiente nao sao sobrescritas. - */ -export function loadEnvFile() { - const envPath = getEnvCandidatePaths().find((candidate) => existsSync(candidate)) - - if (!envPath) { - return null - } - - const contents = readFileSync(envPath, 'utf-8') - - for (const rawLine of contents.split(/\r?\n/)) { - const line = rawLine.trim() - - if (!line || line.startsWith('#')) { - continue - } - - const separatorIndex = line.indexOf('=') - if (separatorIndex === -1) { - continue - } - - const key = line.slice(0, separatorIndex).trim() - const value = stripWrappingQuotes(line.slice(separatorIndex + 1).trim()) - - if (!key || process.env[key] !== undefined) { - continue - } - - process.env[key] = value - } - - return envPath -} diff --git a/src/main/github/auth.js b/src/main/github/auth.js deleted file mode 100644 index 0d9c82a..0000000 --- a/src/main/github/auth.js +++ /dev/null @@ -1,126 +0,0 @@ -import { fetchWithTimeout, formatFetchError } from './http' - -/** - * GitHub Device Flow Authentication - * - * Flow: - * 1. POST para /login/device/code e recebe device_code + user_code - * 2. Usuario acessa https://github.com/login/device e informa o user_code - * 3. Fazemos polling em /login/oauth/access_token ate receber o token - */ - -const GITHUB_API = 'https://github.com' - -function ensureClientId(clientId) { - if (!clientId?.trim()) { - throw new Error('Missing GitHub Client ID') - } -} - -/** - * Inicia o Device Flow e retorna os dados para exibir ao usuario. - * @param {string} clientId - * @returns {{ device_code, user_code, verification_uri, expires_in, interval }} - */ -export async function startDeviceFlow(clientId) { - ensureClientId(clientId) - - try { - console.log('[auth] Starting GitHub Device Flow...') - - const res = await fetchWithTimeout(`${GITHUB_API}/login/device/code`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - client_id: clientId, - scope: 'repo user' - }) - }) - - if (!res.ok) { - throw new Error(`Device flow init failed: ${res.status}`) - } - - return res.json() - } catch (error) { - console.error('[auth] Device flow error:', error) - throw new Error(formatFetchError('GitHub device flow request failed', error)) - } -} - -/** - * Faz polling ate o usuario autorizar e retorna o access_token. - * @param {string} clientId - * @param {string} deviceCode - * @param {number} intervalSeconds - * @returns {Promise} - */ -export async function pollForToken(clientId, deviceCode, intervalSeconds = 5) { - ensureClientId(clientId) - - return new Promise((resolve, reject) => { - const poll = setInterval(async () => { - try { - console.log('[auth] Polling GitHub for device token...') - - const res = await fetchWithTimeout(`${GITHUB_API}/login/oauth/access_token`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - client_id: clientId, - device_code: deviceCode, - grant_type: 'urn:ietf:params:oauth:grant-type:device_code' - }) - }) - - if (!res.ok) { - clearInterval(poll) - reject(new Error(`Token polling failed: ${res.status}`)) - return - } - - const data = await res.json() - - if (data.access_token) { - clearInterval(poll) - console.log('[auth] Token received successfully') - resolve(data.access_token) - return - } - - if (data.error === 'authorization_pending') { - return - } - - if (data.error === 'slow_down') { - clearInterval(poll) - setTimeout(() => { - pollForToken(clientId, deviceCode, intervalSeconds + 5) - .then(resolve) - .catch(reject) - }, (intervalSeconds + 5) * 1000) - return - } - - if (data.error === 'expired_token') { - clearInterval(poll) - reject(new Error('Device code expired. Please try again.')) - return - } - - clearInterval(poll) - reject(new Error(`Auth error: ${data.error || 'unknown_error'}`)) - } catch (err) { - clearInterval(poll) - console.error('[auth] Token polling error:', err) - reject(new Error(formatFetchError('GitHub token polling failed', err))) - } - }, intervalSeconds * 1000) - }) -} diff --git a/src/main/github/client.js b/src/main/github/client.js deleted file mode 100644 index 89d71c8..0000000 --- a/src/main/github/client.js +++ /dev/null @@ -1,201 +0,0 @@ -import { GitHubApiError } from './errors' -import { fetchWithTimeout } from './http' - -/** - * GitHub API Client - * Todas as chamadas a API do GitHub via REST. - */ - -const API = 'https://api.github.com' -const userProfileCache = new Map() - -function headers(token) { - return { - Authorization: `Bearer ${token}`, - Accept: 'application/vnd.github+json', - 'X-GitHub-Api-Version': '2022-11-28', - 'Content-Type': 'application/json' - } -} - -async function readGitHubError(res, fallbackMessage) { - try { - const data = await res.json() - return { - message: data?.message || fallbackMessage, - code: data?.code || data?.error || null - } - } catch { - return { - message: fallbackMessage, - code: null - } - } -} - -async function getUserProfile(token, login) { - const cacheKey = `${token}:${login}` - if (userProfileCache.has(cacheKey)) { - return userProfileCache.get(cacheKey) - } - - const res = await fetchWithTimeout(`${API}/users/${login}`, { - headers: headers(token) - }) - - if (!res.ok) { - const error = await readGitHubError(res, `getUserProfile failed: ${res.status}`) - throw new GitHubApiError(error.message, { status: res.status, code: error.code }) - } - - const profile = await res.json() - userProfileCache.set(cacheKey, profile) - return profile -} - -/** - * Lista repositorios do usuario autenticado. - * @param {string} token - * @returns {Promise>} - */ -export async function getRepos(token) { - const res = await fetchWithTimeout(`${API}/user/repos?sort=updated&per_page=50`, { - headers: headers(token) - }) - - if (!res.ok) { - const error = await readGitHubError(res, `getRepos failed: ${res.status}`) - throw new GitHubApiError(error.message, { status: res.status, code: error.code }) - } - - const repos = await res.json() - return repos.map((repo) => ({ - id: repo.id, - name: repo.name, - fullName: repo.full_name, - owner: repo.owner.login, - private: repo.private, - updatedAt: repo.updated_at - })) -} - -/** - * Lista colaboradores do repositorio. - * @param {string} token - * @param {string} owner - * @param {string} repo - * @returns {Promise>} - */ -export async function getRepoCollaborators(token, owner, repo) { - const res = await fetchWithTimeout(`${API}/repos/${owner}/${repo}/collaborators?per_page=100`, { - headers: headers(token) - }) - - if (!res.ok) { - const error = await readGitHubError(res, `getRepoCollaborators failed: ${res.status}`) - throw new GitHubApiError(error.message, { status: res.status, code: error.code }) - } - - const collaborators = await res.json() - - const enrichedCollaborators = await Promise.all( - collaborators.map(async (user) => { - try { - const profile = await getUserProfile(token, user.login) - return { - id: user.id, - login: user.login, - name: profile.name || '', - avatarUrl: user.avatar_url, - profileUrl: user.html_url - } - } catch { - return { - id: user.id, - login: user.login, - name: '', - avatarUrl: user.avatar_url, - profileUrl: user.html_url - } - } - }) - ) - - return enrichedCollaborators -} - -/** - * Retorna o conteudo de um arquivo no repositorio. - * @param {string} token - * @param {string} owner - * @param {string} repo - * @param {string} path - * @returns {Promise<{ content: string, sha: string } | null>} - */ -export async function getFile(token, owner, repo, path) { - const res = await fetchWithTimeout(`${API}/repos/${owner}/${repo}/contents/${path}`, { - headers: headers(token) - }) - - if (res.status === 404) { - return null - } - - if (!res.ok) { - const error = await readGitHubError(res, `getFile failed: ${res.status}`) - throw new GitHubApiError(error.message, { status: res.status, code: error.code }) - } - - const data = await res.json() - const content = Buffer.from(data.content, 'base64').toString('utf-8') - return { content, sha: data.sha } -} - -/** - * Cria ou atualiza um arquivo no repositorio e gera um commit. - * @param {string} token - * @param {string} owner - * @param {string} repo - * @param {string} path - * @param {string} content - * @param {string|null} sha - * @param {string} message - * @returns {Promise<{ sha: string }>} - */ -export async function updateFile(token, owner, repo, path, content, sha, message) { - const body = { - message, - content: Buffer.from(content, 'utf-8').toString('base64') - } - - if (sha) { - body.sha = sha - } - - const res = await fetchWithTimeout(`${API}/repos/${owner}/${repo}/contents/${path}`, { - method: 'PUT', - headers: headers(token), - body: JSON.stringify(body) - }) - - if (!res.ok) { - const error = await readGitHubError(res, `updateFile failed: ${res.status}`) - throw new GitHubApiError(error.message, { status: res.status, code: error.code }) - } - - const data = await res.json() - return { sha: data.content.sha } -} - -/** - * Retorna apenas o SHA atual de um arquivo. - * @param {string} token - * @param {string} owner - * @param {string} repo - * @param {string} path - * @returns {Promise} - */ -export async function getFileSha(token, owner, repo, path) { - const file = await getFile(token, owner, repo, path) - return file ? file.sha : null -} diff --git a/src/main/github/errors.js b/src/main/github/errors.js deleted file mode 100644 index b884063..0000000 --- a/src/main/github/errors.js +++ /dev/null @@ -1,8 +0,0 @@ -export class GitHubApiError extends Error { - constructor(message, { status, code } = {}) { - super(message) - this.name = 'GitHubApiError' - this.status = status ?? null - this.code = code ?? null - } -} diff --git a/src/main/github/http.js b/src/main/github/http.js deleted file mode 100644 index fd2c604..0000000 --- a/src/main/github/http.js +++ /dev/null @@ -1,34 +0,0 @@ -import { net } from 'electron' - -const DEFAULT_TIMEOUT_MS = 20_000 - -export function formatFetchError(context, error) { - const cause = error?.cause - const details = [ - error?.message, - error?.code, - cause?.code, - cause?.errno, - cause?.syscall, - cause?.hostname - ].filter(Boolean) - - return `${context}: ${details.join(' | ') || 'unknown network error'}` -} - -export async function fetchWithTimeout(url, options = {}, timeoutMs = DEFAULT_TIMEOUT_MS) { - const requestOptions = { - ...options, - signal: AbortSignal.timeout(timeoutMs) - } - - try { - if (typeof net.fetch === 'function') { - return await net.fetch(url, requestOptions) - } - - return await fetch(url, requestOptions) - } catch (error) { - throw new Error(formatFetchError(`Request failed for ${url}`, error)) - } -} diff --git a/src/main/index.js b/src/main/index.js deleted file mode 100644 index 8390faf..0000000 --- a/src/main/index.js +++ /dev/null @@ -1,85 +0,0 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { setDefaultResultOrder } from 'dns' -import { join } from 'path' -import { loadEnvFile } from './config/env' -import { registerIpcHandlers } from './ipc/handlers' -import { stopPoller } from './watcher/poller' - -const isDev = process.env.NODE_ENV === 'development' - -setDefaultResultOrder('ipv4first') -console.log('[net] DNS default result order set to ipv4first') - -const envPath = loadEnvFile() - -if (envPath) { - console.log(`[env] Loaded environment from ${envPath}`) -} else { - console.warn('[env] No .env file found in expected locations') -} - -function createWindow() { - const mainWindow = new BrowserWindow({ - width: 1200, - height: 800, - minWidth: 900, - minHeight: 600, - show: false, - icon: join(__dirname, '../../build/icon.png'), - autoHideMenuBar: true, - webPreferences: { - preload: join(__dirname, '../preload/index.js'), - sandbox: false, - contextIsolation: true, - devTools: isDev - } - }) - - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) - - mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) - - if (!isDev) { - mainWindow.webContents.on('before-input-event', (event, input) => { - const isReload = (input.control || input.meta) && input.key.toLowerCase() === 'r' - const isDevShortcut = - input.key === 'F12' || - ((input.control || input.meta) && input.shift && input.key.toLowerCase() === 'i') - - if (isReload || isDevShortcut) { - event.preventDefault() - } - }) - } - - if (isDev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) - } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) - } - - return mainWindow -} - -app.whenReady().then(() => { - app.setAppUserModelId('com.codesprnt.app') - - const mainWindow = createWindow() - registerIpcHandlers(ipcMain, mainWindow) - - app.on('activate', function () { - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) -}) - -app.on('window-all-closed', () => { - stopPoller() - if (process.platform !== 'darwin') { - app.quit() - } -}) diff --git a/src/main/ipc/contracts.js b/src/main/ipc/contracts.js deleted file mode 100644 index 3d10f5c..0000000 --- a/src/main/ipc/contracts.js +++ /dev/null @@ -1,316 +0,0 @@ -import { syncLocalWatcherSnapshot } from '../watcher/poller' - -function getClientId(env) { - const embeddedClientId = - typeof __EMBEDDED_GITHUB_CLIENT_ID__ !== 'undefined' - ? __EMBEDDED_GITHUB_CLIENT_ID__ - : '' - const clientId = env.GITHUB_CLIENT_ID?.trim() || embeddedClientId?.trim() - - if (!clientId) { - throw new Error('Missing GITHUB_CLIENT_ID. Configure it before starting GitHub login.') - } - - return clientId -} - -function requireAuth(store) { - const token = store.get('token') - - if (!token) { - throw new Error('Not authenticated') - } - - return token -} - -function requireActiveRepo(store, fallbackRepo) { - const activeRepo = fallbackRepo || store.get('activeRepo') - - if (!activeRepo) { - throw new Error('No active repo selected') - } - - return activeRepo -} - -function isShaConflict(error) { - return error?.status === 409 || error?.status === 422 -} - -function repoKey({ owner, repo }) { - return `${owner}/${repo}` -} - -function getRepoDirty(store, activeRepo) { - const dirtyRepos = store.get('dirtyRepos') || {} - return !!dirtyRepos[repoKey(activeRepo)] -} - -function setRepoDirty(store, activeRepo, dirty) { - const dirtyRepos = { ...(store.get('dirtyRepos') || {}) } - dirtyRepos[repoKey(activeRepo)] = dirty - store.set('dirtyRepos', dirtyRepos) -} - -export function createIpcHandlers({ - env, - mainWindow, - store, - startDeviceFlow, - pollForToken, - getRepos, - getRepoCollaborators, - getFile, - updateFile, - parse, - stringify, - readLocalTasksMarkdown = async () => null, - writeLocalTasksMarkdown = async () => {}, - readRepoTasksMarkdown = async () => null, - writeRepoTasksMarkdown = async () => {}, - pickLocalRepoPath = async () => null, - openTasksFile = async () => ({ success: false }), - validateLocalRepoPath = async () => ({ valid: true }), - startPoller, - stopPoller, - createInitialTasksMarkdown -}) { - const saveQueues = new Map() - - function enqueueRepoSave(repoKey, operation) { - const previous = saveQueues.get(repoKey) || Promise.resolve() - const next = previous.catch(() => {}).then(operation) - - saveQueues.set(repoKey, next) - - return next.finally(() => { - if (saveQueues.get(repoKey) === next) { - saveQueues.delete(repoKey) - } - }) - } - - return { - 'github:login': async () => { - const clientId = getClientId(env) - console.log('[ipc] github:login invoked') - const deviceData = await startDeviceFlow(clientId) - - pollForToken(clientId, deviceData.device_code, deviceData.interval) - .then((token) => { - store.set('token', token) - mainWindow.webContents.send('github:auth-success') - startPoller(mainWindow) - }) - .catch((err) => { - console.error('[ipc] github:login async auth error:', err) - mainWindow.webContents.send('github:auth-error', err.message) - }) - - return { - userCode: deviceData.user_code, - verificationUri: deviceData.verification_uri, - expiresIn: deviceData.expires_in - } - }, - - 'github:repos': async () => { - const token = requireAuth(store) - return getRepos(token) - }, - - 'github:repo-collaborators': async (_, payload = {}) => { - const token = requireAuth(store) - const activeRepo = requireActiveRepo(store, payload.repo) - const { owner, repo } = activeRepo - - return getRepoCollaborators(token, owner, repo) - }, - - 'repo:pick-local-path': async () => { - return pickLocalRepoPath() - }, - - 'repo:open-tasks-file': async () => { - const activeRepo = requireActiveRepo(store) - return openTasksFile(activeRepo) - }, - - 'repo:validate-local-path': async (_, { owner, repo, localPath }) => { - return validateLocalRepoPath(localPath, owner, repo) - }, - - 'tasks:load': async (_, { owner, repo, localPath }) => { - const token = requireAuth(store) - const activeRepo = { owner, repo, localPath: localPath || null } - - store.set('activeRepo', activeRepo) - startPoller(mainWindow) - - const repoMarkdown = await readRepoTasksMarkdown(activeRepo.localPath) - if (repoMarkdown) { - syncLocalWatcherSnapshot(repoMarkdown) - try { - const remoteFile = await getFile(token, owner, repo, 'tasks.md') - store.set('tasksSha', remoteFile?.sha || null) - } catch { - store.set('tasksSha', null) - } - - return parse(repoMarkdown) - } - - const localMarkdown = await readLocalTasksMarkdown(owner, repo) - if (localMarkdown) { - try { - const remoteFile = await getFile(token, owner, repo, 'tasks.md') - store.set('tasksSha', remoteFile?.sha || null) - } catch { - store.set('tasksSha', null) - } - - return parse(localMarkdown) - } - - const file = await getFile(token, owner, repo, 'tasks.md') - - if (!file) { - store.set('tasksSha', null) - setRepoDirty(store, activeRepo, false) - return [] - } - - store.set('tasksSha', file.sha) - await writeLocalTasksMarkdown(owner, repo, file.content) - await writeRepoTasksMarkdown(activeRepo.localPath, file.content) - syncLocalWatcherSnapshot(file.content) - setRepoDirty(store, activeRepo, false) - return parse(file.content) - }, - - 'tasks:init': async (_, payload = {}) => { - const activeRepo = requireActiveRepo(store, payload.repo) - const { owner, repo } = activeRepo - - store.set('activeRepo', activeRepo) - startPoller(mainWindow) - - const localMarkdown = await readLocalTasksMarkdown(owner, repo) - if (localMarkdown && !payload.force) { - return { - created: false, - sha: store.get('tasksSha'), - tasks: parse(localMarkdown) - } - } - - const markdown = createInitialTasksMarkdown() - await writeLocalTasksMarkdown(owner, repo, markdown) - await writeRepoTasksMarkdown(activeRepo.localPath, markdown) - syncLocalWatcherSnapshot(markdown) - setRepoDirty(store, activeRepo, true) - - return { - created: true, - sha: store.get('tasksSha'), - tasks: parse(markdown) - } - }, - - 'tasks:cache': async (_, { tasks, dirty = true }) => { - const activeRepo = requireActiveRepo(store) - const { owner, repo } = activeRepo - const markdown = stringify(tasks) - - await writeLocalTasksMarkdown(owner, repo, markdown) - await writeRepoTasksMarkdown(activeRepo.localPath, markdown) - syncLocalWatcherSnapshot(markdown) - setRepoDirty(store, activeRepo, dirty) - - return { success: true } - }, - - 'tasks:save': async (_, { tasks, commitMessage }) => { - const token = requireAuth(store) - const activeRepo = requireActiveRepo(store) - const { owner, repo } = activeRepo - const repoKey = `${owner}/${repo}` - const localMarkdown = stringify(tasks) - - await writeLocalTasksMarkdown(owner, repo, localMarkdown) - await writeRepoTasksMarkdown(activeRepo.localPath, localMarkdown) - syncLocalWatcherSnapshot(localMarkdown) - setRepoDirty(store, activeRepo, true) - - return enqueueRepoSave(repoKey, async () => { - const sha = store.get('tasksSha') - const message = commitMessage || 'chore: update tasks' - - try { - const result = await updateFile(token, owner, repo, 'tasks.md', localMarkdown, sha, message) - store.set('tasksSha', result.sha) - - const latestFile = await getFile(token, owner, repo, 'tasks.md') - - if (latestFile) { - store.set('tasksSha', latestFile.sha) - await writeLocalTasksMarkdown(owner, repo, latestFile.content) - await writeRepoTasksMarkdown(activeRepo.localPath, latestFile.content) - syncLocalWatcherSnapshot(latestFile.content) - setRepoDirty(store, activeRepo, false) - return { - success: true, - sha: latestFile.sha, - tasks: parse(latestFile.content) - } - } - - return { success: true, sha: result.sha, tasks } - } catch (error) { - if (!isShaConflict(error)) { - throw error - } - - const latestFile = await getFile(token, owner, repo, 'tasks.md') - - if (latestFile) { - store.set('tasksSha', latestFile.sha) - if (getRepoDirty(store, activeRepo)) { - mainWindow.webContents.send('tasks:remote-conflict', parse(latestFile.content)) - } else { - await writeLocalTasksMarkdown(owner, repo, latestFile.content) - await writeRepoTasksMarkdown(activeRepo.localPath, latestFile.content) - syncLocalWatcherSnapshot(latestFile.content) - mainWindow.webContents.send('tasks:external-update', parse(latestFile.content)) - } - } else { - store.set('tasksSha', null) - mainWindow.webContents.send('tasks:external-update', []) - } - - throw new Error('tasks.md changed on GitHub before saving. Latest version was reloaded.') - } - }) - }, - - 'session:get': () => { - const activeRepo = store.get('activeRepo') - return { - isAuthenticated: !!store.get('token'), - activeRepo, - tasksDirty: activeRepo ? getRepoDirty(store, activeRepo) : false - } - }, - - 'session:clear': () => { - store.set('token', null) - store.set('activeRepo', null) - store.set('tasksSha', null) - store.set('dirtyRepos', {}) - stopPoller() - - return { success: true } - } - } -} diff --git a/src/main/ipc/handlers.js b/src/main/ipc/handlers.js deleted file mode 100644 index c8ef5b2..0000000 --- a/src/main/ipc/handlers.js +++ /dev/null @@ -1,70 +0,0 @@ -import { dialog, shell } from 'electron' -import { startDeviceFlow, pollForToken } from '../github/auth' -import { getRepos, getFile, updateFile, getRepoCollaborators } from '../github/client' -import { parse, stringify } from '../parser/index' -import store from '../store' -import { createInitialTasksMarkdown } from '../tasks/template' -import { readLocalTasksMarkdown, writeLocalTasksMarkdown } from '../tasks/cache' -import { getTasksPath, readRepoTasksMarkdown, writeRepoTasksMarkdown, validateLocalRepoPath } from '../tasks/local-repo' -import { startPoller, stopPoller } from '../watcher/poller' -import { createIpcHandlers } from './contracts' -import { IPC_CONTRACT } from './spec' - -/** - * Registra todos os handlers IPC do processo principal. - * @param {Electron.IpcMain} ipcMain - * @param {BrowserWindow} mainWindow - */ -export function registerIpcHandlers(ipcMain, mainWindow) { - const handlers = createIpcHandlers({ - env: process.env, - mainWindow, - store, - startDeviceFlow, - pollForToken, - getRepos, - getRepoCollaborators, - getFile, - updateFile, - parse, - stringify, - readLocalTasksMarkdown, - writeLocalTasksMarkdown, - readRepoTasksMarkdown, - writeRepoTasksMarkdown, - validateLocalRepoPath, - openTasksFile: async (activeRepo) => { - if (!activeRepo?.localPath) { - throw new Error('No local repo linked. Link a local folder before opening tasks.md.') - } - - const openResult = await shell.openPath(getTasksPath(activeRepo.localPath)) - - if (openResult) { - throw new Error(openResult) - } - - return { success: true } - }, - pickLocalRepoPath: async () => { - const result = await dialog.showOpenDialog(mainWindow, { - properties: ['openDirectory'] - }) - - if (result.canceled || !result.filePaths?.length) { - return null - } - - return result.filePaths[0] - }, - startPoller, - stopPoller, - createInitialTasksMarkdown - }) - - ipcMain.handle('ipc:contract', () => IPC_CONTRACT) - - for (const [channel, handler] of Object.entries(handlers)) { - ipcMain.handle(channel, handler) - } -} diff --git a/src/main/ipc/run-smoke-tests.cjs b/src/main/ipc/run-smoke-tests.cjs deleted file mode 100644 index b1092e9..0000000 --- a/src/main/ipc/run-smoke-tests.cjs +++ /dev/null @@ -1,661 +0,0 @@ -const assert = require('node:assert/strict') -const { readFileSync } = require('node:fs') -const { join } = require('node:path') - -function loadFactoryModule() { - const filePath = join(__dirname, 'contracts.js') - const source = readFileSync(filePath, 'utf-8') - .replace("import { syncLocalWatcherSnapshot } from '../watcher/poller'\n\n", '') - .replace('export function createIpcHandlers', 'function createIpcHandlers') - - const factory = new Function('syncLocalWatcherSnapshot', `${source}\nreturn { createIpcHandlers }`) - return factory(() => {}) -} - -function loadSpecModule() { - const filePath = join(__dirname, 'spec.js') - const source = readFileSync(filePath, 'utf-8') - .replace('export const IPC_CONTRACT =', 'const IPC_CONTRACT =') - - const factory = new Function(`${source}\nreturn { IPC_CONTRACT }`) - return factory() -} - -function createMemoryStore(initialState = {}) { - const state = { - token: null, - activeRepo: null, - tasksSha: null, - dirtyRepos: {}, - ...initialState - } - - return { - get(key) { - return state[key] - }, - set(key, value) { - state[key] = value - }, - snapshot() { - return { ...state } - } - } -} - -function createMainWindowRecorder() { - const sent = [] - - return { - sent, - mainWindow: { - webContents: { - send(channel, ...args) { - sent.push({ channel, args }) - } - } - } - } -} - -async function run(name, fn) { - try { - await fn() - console.log(`PASS ${name}`) - } catch (error) { - console.error(`FAIL ${name}`) - throw error - } -} - -const { createIpcHandlers } = loadFactoryModule() -const { IPC_CONTRACT } = loadSpecModule() - -async function main() { - await run('registra handlers esperados e responde session:get', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'abc', - activeRepo: { owner: 'cassio', repo: 'ai-project' } - }) - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - pickLocalRepoPath: async () => 'D:\\Projeto\\AI-Project', - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - assert.deepEqual( - Object.keys(handlers).sort(), - [ - 'github:login', - 'github:repo-collaborators', - 'github:repos', - 'repo:open-tasks-file', - 'repo:pick-local-path', - 'repo:validate-local-path', - 'session:clear', - 'session:get', - 'tasks:cache', - 'tasks:init', - 'tasks:load', - 'tasks:save' - ].sort() - ) - - assert.deepEqual( - Object.keys(IPC_CONTRACT.invoke).sort(), - [ - 'github:login', - 'github:repo-collaborators', - 'github:repos', - 'repo:open-tasks-file', - 'repo:pick-local-path', - 'repo:validate-local-path', - 'session:clear', - 'session:get', - 'tasks:cache', - 'tasks:init', - 'tasks:load', - 'tasks:save' - ].sort() - ) - - const session = handlers['session:get']() - assert.equal(session.isAuthenticated, true) - assert.deepEqual(session.activeRepo, { owner: 'cassio', repo: 'ai-project' }) - }) - - await run('repo:pick-local-path retorna a pasta selecionada', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore() - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - pickLocalRepoPath: async () => 'D:\\Projeto\\AI-Project', - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['repo:pick-local-path']() - assert.equal(result, 'D:\\Projeto\\AI-Project') - }) - - await run('repo:open-tasks-file abre o tasks.md do repo local vinculado', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' } - }) - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - openTasksFile: async (activeRepo) => ({ success: !!activeRepo.localPath }), - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['repo:open-tasks-file']() - assert.equal(result.success, true) - }) - - await run('repo:validate-local-path valida a pasta selecionada contra owner/repo', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore() - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - validateLocalRepoPath: async (localPath, owner, repo) => ({ - valid: true, - reason: null, - remoteUrl: `${localPath}:${owner}/${repo}`, - detectedRepo: { owner, repo } - }), - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['repo:validate-local-path'](null, { - owner: 'cassio', - repo: 'ai-project', - localPath: 'D:\\Projeto\\AI-Project' - }) - - assert.equal(result.valid, true) - assert.deepEqual(result.detectedRepo, { owner: 'cassio', repo: 'ai-project' }) - }) - - await run('github:login publica evento de sucesso apos receber token', async () => { - const { mainWindow, sent } = createMainWindowRecorder() - const store = createMemoryStore() - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({ - device_code: 'device-code', - user_code: 'USER-123', - verification_uri: 'https://github.com/login/device', - expires_in: 900, - interval: 1 - }), - pollForToken: async () => 'token-123', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['github:login']() - await Promise.resolve() - - assert.equal(result.userCode, 'USER-123') - assert.equal(store.get('token'), 'token-123') - assert.equal(sent[0].channel, 'github:auth-success') - }) - - await run('tasks:init cria tasks.md inicial no cache local e no repo real quando informado', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project' } - }) - const writes = [] - const repoWrites = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-created' }), - parse: (markdown) => [{ id: 'TASK-001', title: markdown.split('\n')[2], status: 'pending', subtasks: [] }], - stringify: () => '# Tasks\n', - writeLocalTasksMarkdown: async (...args) => { - writes.push(args) - }, - writeRepoTasksMarkdown: async (...args) => { - repoWrites.push(args) - }, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n\n- [ ] Setup inicial do projeto\n' - }) - - const result = await handlers['tasks:init'](null, { - repo: { - owner: 'cassio', - repo: 'ai-project', - localPath: 'D:\\Projeto\\AI-Project' - } - }) - - assert.equal(result.created, true) - assert.equal(result.sha, null) - assert.equal(writes.length, 1) - assert.equal(writes[0][0], 'cassio') - assert.equal(writes[0][1], 'ai-project') - assert.equal(repoWrites.length, 1) - assert.equal(repoWrites[0][0], 'D:\\Projeto\\AI-Project') - assert.deepEqual(store.get('activeRepo'), { - owner: 'cassio', - repo: 'ai-project', - localPath: 'D:\\Projeto\\AI-Project' - }) - }) - - await run('tasks:load prefere o tasks.md do repositorio local real e preserva SHA remoto quando disponivel', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ token: 'token-123' }) - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => ({ sha: 'sha-remoto', content: '# Tasks\n\n- [ ] Remoto\n' }), - updateFile: async () => ({ sha: 'sha-1' }), - parse: (markdown) => [{ id: 'TASK-001', title: markdown.includes('Repo local') ? 'Repo local' : markdown.includes('Local') ? 'Local' : 'Remoto', status: 'pending', subtasks: [] }], - stringify: () => '# Tasks\n', - readRepoTasksMarkdown: async () => '# Tasks\n\n- [ ] Repo local\n', - readLocalTasksMarkdown: async () => '# Tasks\n\n- [ ] Local\n', - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['tasks:load'](null, { - owner: 'cassio', - repo: 'ai-project', - localPath: 'D:\\Projeto\\AI-Project' - }) - - assert.equal(result[0].title, 'Repo local') - assert.equal(store.get('tasksSha'), 'sha-remoto') - assert.deepEqual(store.get('activeRepo'), { - owner: 'cassio', - repo: 'ai-project', - localPath: 'D:\\Projeto\\AI-Project' - }) - }) - - await run('tasks:init com force recria tasks.md local mesmo quando ja existe', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' } - }) - const writes = [] - const repoWrites = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => ({ sha: 'sha-existente', content: '# Tasks\n' }), - updateFile: async () => ({ sha: 'sha-reset' }), - parse: (markdown) => [{ id: 'TASK-001', title: markdown.split('\n')[2], status: 'pending', subtasks: [] }], - stringify: () => '# Tasks\n', - writeLocalTasksMarkdown: async (...args) => { - writes.push(args) - }, - writeRepoTasksMarkdown: async (...args) => { - repoWrites.push(args) - }, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n\n- [ ] Setup inicial do projeto\n' - }) - - const result = await handlers['tasks:init'](null, { force: true }) - - assert.equal(result.created, true) - assert.equal(result.sha, null) - assert.equal(writes.length, 1) - assert.equal(writes[0][0], 'cassio') - assert.equal(writes[0][1], 'ai-project') - assert.equal(repoWrites[0][0], 'D:\\Projeto\\AI-Project') - }) - - await run('tasks:cache salva o estado local do repo ativo no cache e no repo real', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' } - }) - const writes = [] - const repoWrites = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: (tasks) => JSON.stringify(tasks), - writeLocalTasksMarkdown: async (...args) => { - writes.push(args) - }, - writeRepoTasksMarkdown: async (...args) => { - repoWrites.push(args) - }, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['tasks:cache'](null, { tasks: [{ id: 'TASK-001' }] }) - - assert.equal(result.success, true) - assert.equal(writes[0][0], 'cassio') - assert.equal(writes[0][1], 'ai-project') - assert.equal(writes[0][2], '[{"id":"TASK-001"}]') - assert.equal(repoWrites[0][0], 'D:\\Projeto\\AI-Project') - assert.equal(repoWrites[0][1], '[{"id":"TASK-001"}]') - }) - - await run('session:clear limpa sessao e para o poller', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project' }, - tasksSha: 'sha-123' - }) - let pollerStopped = false - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - startPoller: () => {}, - stopPoller: () => { - pollerStopped = true - }, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = handlers['session:clear']() - - assert.equal(result.success, true) - assert.equal(store.get('token'), null) - assert.equal(store.get('activeRepo'), null) - assert.equal(store.get('tasksSha'), null) - assert.deepEqual(store.get('dirtyRepos'), {}) - assert.equal(pollerStopped, true) - }) - - await run('tasks:save recarrega estado remoto quando encontra conflito de SHA', async () => { - const { mainWindow, sent } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' }, - tasksSha: 'sha-antigo' - }) - const writes = [] - const repoWrites = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => ({ sha: 'sha-remoto', content: '# Tasks\n\n- [x] Task remota\n' }), - updateFile: async () => { - const error = new Error('sha conflict') - error.status = 409 - throw error - }, - parse: () => [{ id: 'TASK-001', title: 'Task remota', status: 'done', subtasks: [] }], - stringify: () => '# Tasks\n\n- [ ] Task local\n', - writeLocalTasksMarkdown: async (...args) => { - writes.push(args) - }, - writeRepoTasksMarkdown: async (...args) => { - repoWrites.push(args) - }, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - await assert.rejects( - () => handlers['tasks:save'](null, { tasks: [], commitMessage: 'test' }), - /changed on GitHub before saving/ - ) - - assert.equal(store.get('tasksSha'), 'sha-remoto') - assert.equal(sent.length, 1) - assert.equal(sent[0].channel, 'tasks:remote-conflict') - assert.equal(sent[0].args[0][0].title, 'Task remota') - assert.equal(writes.length, 1) - assert.equal(repoWrites.length, 1) - }) - - await run('tasks:save serializa salvamentos consecutivos e reutiliza o SHA atualizado', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' }, - tasksSha: 'sha-inicial' - }) - const seenShas = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => ({ sha: 'sha-remoto-final', content: '# Tasks\n' }), - updateFile: async (_token, _owner, _repo, _path, _content, sha) => { - seenShas.push(sha) - await new Promise((resolve) => setTimeout(resolve, 5)) - - if (sha === 'sha-inicial') { - return { sha: 'sha-1' } - } - - if (sha === 'sha-remoto-final') { - return { sha: 'sha-2' } - } - - throw new Error(`unexpected sha ${sha}`) - }, - parse: () => [], - stringify: (tasks) => JSON.stringify(tasks), - writeRepoTasksMarkdown: async () => {}, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const firstSave = handlers['tasks:save'](null, { - tasks: [{ id: 'TASK-001', title: 'Primeira', status: 'pending', subtasks: [] }] - }) - const secondSave = handlers['tasks:save'](null, { - tasks: [{ id: 'TASK-001', title: 'Segunda', status: 'done', subtasks: [] }] - }) - - const results = await Promise.all([firstSave, secondSave]) - - assert.deepEqual(seenShas, ['sha-inicial', 'sha-remoto-final']) - assert.equal(results[0].sha, 'sha-remoto-final') - assert.equal(results[1].sha, 'sha-remoto-final') - assert.equal(store.get('tasksSha'), 'sha-remoto-final') - }) - - await run('tasks:save atualiza cache local com a versao remota final', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project', localPath: 'D:\\Projeto\\AI-Project' }, - tasksSha: 'sha-inicial' - }) - const writes = [] - const repoWrites = [] - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async () => [], - getFile: async () => ({ sha: 'sha-remoto-final', content: '# Tasks\n\n- [x] Remota final\n' }), - updateFile: async () => ({ sha: 'sha-atualizada' }), - parse: () => [{ id: 'TASK-001', title: 'Remota final', status: 'done', subtasks: [] }], - stringify: () => '# Tasks\n\n- [ ] Local\n', - writeLocalTasksMarkdown: async (...args) => { - writes.push(args) - }, - writeRepoTasksMarkdown: async (...args) => { - repoWrites.push(args) - }, - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['tasks:save'](null, { tasks: [], commitMessage: 'test' }) - - assert.equal(result.sha, 'sha-remoto-final') - assert.equal(result.tasks[0].title, 'Remota final') - assert.equal(writes.length, 2) - assert.equal(writes[1][2], '# Tasks\n\n- [x] Remota final\n') - assert.equal(repoWrites.length, 2) - assert.equal(repoWrites[1][1], '# Tasks\n\n- [x] Remota final\n') - }) - - await run('github:repo-collaborators usa o repo ativo da sessao', async () => { - const { mainWindow } = createMainWindowRecorder() - const store = createMemoryStore({ - token: 'token-123', - activeRepo: { owner: 'cassio', repo: 'ai-project' } - }) - - const handlers = createIpcHandlers({ - env: { GITHUB_CLIENT_ID: 'client-id' }, - mainWindow, - store, - startDeviceFlow: async () => ({}), - pollForToken: async () => 'token', - getRepos: async () => [], - getRepoCollaborators: async (_token, owner, repo) => [{ id: 1, login: `${owner}/${repo}` }], - getFile: async () => null, - updateFile: async () => ({ sha: 'sha-1' }), - parse: () => [], - stringify: () => '# Tasks\n', - startPoller: () => {}, - stopPoller: () => {}, - createInitialTasksMarkdown: () => '# Tasks\n' - }) - - const result = await handlers['github:repo-collaborators']() - - assert.deepEqual(result, [{ id: 1, login: 'cassio/ai-project' }]) - }) -} - -main().catch((error) => { - console.error(error) - process.exitCode = 1 -}) diff --git a/src/main/ipc/spec.js b/src/main/ipc/spec.js deleted file mode 100644 index b289838..0000000 --- a/src/main/ipc/spec.js +++ /dev/null @@ -1,141 +0,0 @@ -export const IPC_CONTRACT = { - version: '1.0.0', - invoke: { - 'github:login': { - description: 'Inicia o GitHub Device Flow e retorna os dados para autorizacao.', - args: [], - returns: { - userCode: 'string', - verificationUri: 'string', - expiresIn: 'number' - }, - errors: ['Missing GITHUB_CLIENT_ID'] - }, - 'github:repos': { - description: 'Lista os repositorios da conta autenticada.', - args: [], - returns: 'Array<{ id, name, fullName, owner, private, updatedAt }>', - errors: ['Not authenticated'] - }, - 'github:repo-collaborators': { - description: 'Lista colaboradores do repositorio ativo ou informado.', - args: [{ repo: '{ owner, repo } (optional)' }], - returns: 'Array<{ id, login, name, avatarUrl, profileUrl }>', - errors: ['Not authenticated', 'No active repo selected'] - }, - 'repo:pick-local-path': { - description: 'Abre o seletor de pasta para vincular o repositorio local clonado.', - args: [], - returns: 'string | null', - errors: [] - }, - 'repo:open-tasks-file': { - description: 'Abre o tasks.md do repositorio local vinculado no editor padrao do sistema.', - args: [], - returns: '{ success: boolean }', - errors: ['No active repo selected', 'No local repo linked. Link a local folder before opening tasks.md.'] - }, - 'repo:validate-local-path': { - description: 'Valida se a pasta escolhida parece ser o clone local do repositorio selecionado.', - args: [{ owner: 'string', repo: 'string', localPath: 'string' }], - returns: '{ valid: boolean, reason: string | null, remoteUrl: string | null, detectedRepo: { owner, repo } | null }', - errors: [] - }, - 'tasks:load': { - description: 'Carrega o tasks.md do repositorio selecionado.', - args: [{ owner: 'string', repo: 'string', localPath: 'string (optional)' }], - returns: 'Array', - errors: ['Not authenticated'] - }, - 'tasks:init': { - description: 'Cria ou recria um tasks.md inicial no cache local do repositorio ativo.', - args: [{ repo: '{ owner, repo } (optional)', commitMessage: 'string (optional)', force: 'boolean (optional)' }], - returns: { - created: 'boolean', - sha: 'string | null', - tasks: 'Array' - }, - errors: ['No active repo selected'] - }, - 'tasks:cache': { - description: 'Salva o estado atual das tasks apenas no cache local.', - args: [{ tasks: 'Array', dirty: 'boolean (optional)' }], - returns: { - success: 'boolean' - }, - errors: ['No active repo selected'] - }, - 'tasks:save': { - description: 'Envia o cache local para o GitHub e atualiza o cache com a versao remota final.', - args: [{ tasks: 'Array', commitMessage: 'string (optional)' }], - returns: { - success: 'boolean', - sha: 'string', - tasks: 'Array' - }, - errors: [ - 'Not authenticated', - 'No active repo selected', - 'tasks.md changed on GitHub before saving. Latest version was reloaded.' - ] - }, - 'session:get': { - description: 'Retorna o estado atual da sessao local.', - args: [], - returns: { - isAuthenticated: 'boolean', - activeRepo: '{ owner, repo, localPath? } | null', - tasksDirty: 'boolean' - }, - errors: [] - }, - 'session:clear': { - description: 'Limpa token, repo ativo e cache local de sincronizacao.', - args: [], - returns: { - success: 'boolean' - }, - errors: [] - } - }, - events: { - 'github:auth-success': { - description: 'Emitido quando o Device Flow retorna um token valido.', - payload: [] - }, - 'github:auth-error': { - description: 'Emitido quando o Device Flow falha.', - payload: ['message: string'] - }, - 'tasks:external-update': { - description: 'Emitido quando o tasks.md muda externamente e a UI deve recarregar.', - payload: ['tasks: Array'] - }, - 'tasks:remote-conflict': { - description: 'Emitido quando existe atualizacao remota, mas ha mudancas locais pendentes.', - payload: ['tasks: Array'] - }, - 'tasks:local-file-update': { - description: 'Emitido quando o tasks.md local muda externamente e a UI deve recarregar.', - payload: ['tasks: Array'] - }, - 'tasks:local-file-conflict': { - description: 'Emitido quando o tasks.md local muda externamente, mas ha mudancas locais pendentes.', - payload: ['tasks: Array'] - } - }, - models: { - Task: { - id: 'string', - title: 'string', - status: '"backlog" | "pending" | "in_progress" | "done"', - assignee: 'string (optional)', - subtasks: 'Array' - }, - Subtask: { - id: 'string', - title: 'string', - status: '"pending" | "in_progress" | "done"' - } - } -} diff --git a/src/main/parser/index.js b/src/main/parser/index.js deleted file mode 100644 index 6ec9465..0000000 --- a/src/main/parser/index.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Parser de Markdown <-> JSON - * - * Formato suportado: - * - [ ] Task pendente - * - [x] Task concluida - * - [/] Task em andamento - * - [ ] Subtask - * - [x] Subtask concluida - * - * Metadados extras (description, priority, labels, cardType, assignee) sao - * armazenados como um comentario HTML inline no final da linha da task: - * - [ ] Task title - */ - -const META_PREFIX = '' - -let taskCounter = 0 - -function generateId(prefix = 'TASK') { - return `${prefix}-${String(++taskCounter).padStart(3, '0')}` -} - -function statusFromCheckbox(checkbox) { - if (checkbox === 'x') return 'done' - if (checkbox === '/') return 'in_progress' - return 'pending' -} - -function checkboxFromStatus(status) { - if (status === 'done') return 'x' - if (status === 'in_progress') return '/' - return ' ' -} - -function extractMeta(raw) { - const idx = raw.indexOf(META_PREFIX) - if (idx === -1) return { title: raw.trim(), meta: {} } - - const title = raw.slice(0, idx).trim() - const end = raw.lastIndexOf(META_SUFFIX) - const metaStr = raw.slice(idx + META_PREFIX.length, end) - try { - return { title, meta: JSON.parse(metaStr) } - } catch { - return { title, meta: {} } - } -} - -function buildMetaSuffix(task) { - const meta = {} - if (task.description) meta.description = task.description - if (task.priority) meta.priority = task.priority - if (task.labels?.length) meta.labels = task.labels - if (task.status && !['pending', 'in_progress', 'done'].includes(task.status)) meta.status = task.status - if (task.cardType && task.cardType !== 'task') meta.cardType = task.cardType - if (task.assignee) meta.assignee = task.assignee - if (Object.keys(meta).length === 0) return '' - return ` ${META_PREFIX}${JSON.stringify(meta)}${META_SUFFIX}` -} - -export function parse(markdown) { - taskCounter = 0 - const lines = markdown.split('\n') - const tasks = [] - let currentTask = null - - for (const line of lines) { - const taskMatch = line.match(/^- \[([x /])\] (.+)$/) - if (taskMatch) { - const { title, meta } = extractMeta(taskMatch[2]) - currentTask = { - id: generateId(), - title, - status: meta.status || statusFromCheckbox(taskMatch[1]), - description: meta.description || '', - priority: meta.priority || '', - labels: meta.labels || [], - cardType: meta.cardType || 'task', - assignee: meta.assignee || '', - subtasks: [] - } - tasks.push(currentTask) - continue - } - - const subtaskMatch = line.match(/^ {2,}- \[([x /])\] (.+)$/) - if (subtaskMatch && currentTask) { - currentTask.subtasks.push({ - id: generateId(currentTask.id), - title: subtaskMatch[2].trim(), - status: statusFromCheckbox(subtaskMatch[1]) - }) - } - } - - return tasks -} - -export function stringify(tasks) { - const lines = ['# Tasks', ''] - - for (const task of tasks) { - const metaSuffix = buildMetaSuffix(task) - lines.push(`- [${checkboxFromStatus(task.status)}] ${task.title}${metaSuffix}`) - for (const sub of task.subtasks || []) { - lines.push(` - [${checkboxFromStatus(sub.status)}] ${sub.title}`) - } - } - - return lines.join('\n') + '\n' -} diff --git a/src/main/parser/run-tests.cjs b/src/main/parser/run-tests.cjs deleted file mode 100644 index 94c5d04..0000000 --- a/src/main/parser/run-tests.cjs +++ /dev/null @@ -1,110 +0,0 @@ -const assert = require('node:assert/strict') -const { readFileSync } = require('node:fs') -const { join } = require('node:path') - -function loadParserModule() { - const filePath = join(__dirname, 'index.js') - const source = readFileSync(filePath, 'utf-8') - .replace('export function parse', 'function parse') - .replace('export function stringify', 'function stringify') - - const factory = new Function(`${source}\nreturn { parse, stringify }`) - return factory() -} - -function run(name, fn) { - try { - fn() - console.log(`PASS ${name}`) - } catch (error) { - console.error(`FAIL ${name}`) - throw error - } -} - -const { parse, stringify } = loadParserModule() - -run('parse converte tasks e subtasks com status corretamente', () => { - const markdown = [ - '# Tasks', - '', - '- [ ] Planejar backend', - ' - [x] Definir schema', - ' - [/] Integrar GitHub', - '- [x] Validar parser' - ].join('\n') - - const tasks = parse(markdown) - - assert.equal(tasks.length, 2) - assert.equal(tasks[0].title, 'Planejar backend') - assert.equal(tasks[0].status, 'pending') - assert.equal(tasks[0].subtasks.length, 2) - assert.equal(tasks[0].subtasks[0].status, 'done') - assert.equal(tasks[0].subtasks[1].status, 'in_progress') - assert.equal(tasks[1].status, 'done') -}) - -run('parse e stringify preservam assignee nos metadados', () => { - const markdown = [ - '# Tasks', - '', - '- [ ] Implementar assign ' - ].join('\n') - - const tasks = parse(markdown) - - assert.equal(tasks[0].assignee, 'cassio') - assert.equal(tasks[0].priority, 'high') - - const roundTrip = stringify(tasks) - assert.equal( - roundTrip, - '# Tasks\n\n- [ ] Implementar assign \n' - ) -}) - -run('parse e stringify preservam status backlog via metadado', () => { - const markdown = [ - '# Tasks', - '', - '- [ ] Revisar backlog IA ' - ].join('\n') - - const tasks = parse(markdown) - - assert.equal(tasks[0].status, 'backlog') - assert.equal(tasks[0].priority, 'medium') - - const roundTrip = stringify(tasks) - assert.equal( - roundTrip, - '# Tasks\n\n- [ ] Revisar backlog IA \n' - ) -}) - -run('stringify preserva a estrutura esperada para round-trip', () => { - const tasks = [ - { - id: 'TASK-001', - title: 'Implementar sync', - status: 'in_progress', - assignee: 'maria', - subtasks: [ - { id: 'TASK-001-001', title: 'Ler tasks.md', status: 'done' }, - { id: 'TASK-001-002', title: 'Salvar tasks.md', status: 'pending' } - ] - } - ] - - const markdown = stringify(tasks) - const reparsed = parse(markdown) - - assert.equal(markdown, '# Tasks\n\n- [/] Implementar sync \n - [x] Ler tasks.md\n - [ ] Salvar tasks.md\n') - assert.equal(reparsed.length, 1) - assert.equal(reparsed[0].title, 'Implementar sync') - assert.equal(reparsed[0].assignee, 'maria') - assert.equal(reparsed[0].subtasks.length, 2) - assert.equal(reparsed[0].subtasks[0].title, 'Ler tasks.md') - assert.equal(reparsed[0].subtasks[1].status, 'pending') -}) diff --git a/src/main/store.js b/src/main/store.js deleted file mode 100644 index 6ad0002..0000000 --- a/src/main/store.js +++ /dev/null @@ -1,13 +0,0 @@ -import Store from 'electron-store' - -const store = new Store({ - name: 'codesprnt-state', - defaults: { - token: null, - activeRepo: null, - tasksSha: null, - dirtyRepos: {} - } -}) - -export default store diff --git a/src/main/tasks/cache.js b/src/main/tasks/cache.js deleted file mode 100644 index 2de8bce..0000000 --- a/src/main/tasks/cache.js +++ /dev/null @@ -1,33 +0,0 @@ -import { app } from 'electron' -import { mkdir, readFile, writeFile } from 'node:fs/promises' -import { join } from 'node:path' - -function sanitizeSegment(value) { - return String(value).replace(/[^a-zA-Z0-9._-]/g, '_') -} - -function getCacheDir() { - return join(app.getPath('userData'), 'tasks-cache') -} - -function getCachePath(owner, repo) { - const fileName = `${sanitizeSegment(owner)}__${sanitizeSegment(repo)}__tasks.md` - return join(getCacheDir(), fileName) -} - -export async function readLocalTasksMarkdown(owner, repo) { - try { - return await readFile(getCachePath(owner, repo), 'utf-8') - } catch (error) { - if (error?.code === 'ENOENT') { - return null - } - - throw error - } -} - -export async function writeLocalTasksMarkdown(owner, repo, markdown) { - await mkdir(getCacheDir(), { recursive: true }) - await writeFile(getCachePath(owner, repo), markdown, 'utf-8') -} diff --git a/src/main/tasks/local-repo.js b/src/main/tasks/local-repo.js deleted file mode 100644 index 10ec1da..0000000 --- a/src/main/tasks/local-repo.js +++ /dev/null @@ -1,126 +0,0 @@ -import { mkdir, readFile, stat, writeFile } from 'node:fs/promises' -import { dirname, isAbsolute, join, resolve } from 'node:path' - -export function getTasksPath(localPath) { - return join(localPath, 'tasks.md') -} - -async function readGitConfig(localPath) { - const gitEntryPath = join(localPath, '.git') - const gitEntryStats = await stat(gitEntryPath) - - if (gitEntryStats.isDirectory()) { - return readFile(join(gitEntryPath, 'config'), 'utf-8') - } - - const gitEntry = await readFile(gitEntryPath, 'utf-8') - const gitDirMatch = gitEntry.match(/^gitdir:\s*(.+)$/im) - - if (gitDirMatch) { - const gitDir = gitDirMatch[1].trim() - const resolvedGitDir = isAbsolute(gitDir) - ? gitDir - : resolve(dirname(gitEntryPath), gitDir) - - return readFile(join(resolvedGitDir, 'config'), 'utf-8') - } - - return readFile(join(gitEntryPath, 'config'), 'utf-8') -} - -function extractGithubRepo(remoteUrl) { - const match = remoteUrl.match(/github\.com[:/](?[^/\s]+)\/(?[^/\s]+?)(?:\.git)?$/i) - - if (!match?.groups) { - return null - } - - return { - owner: match.groups.owner, - repo: match.groups.repo - } -} - -export async function validateLocalRepoPath(localPath, owner, repo) { - if (!localPath) { - return { - valid: false, - reason: 'missing_path', - remoteUrl: null, - detectedRepo: null - } - } - - try { - const config = await readGitConfig(localPath) - const remoteMatch = config.match(/\[remote\s+"origin"\][\s\S]*?url\s*=\s*(.+)/i) - const remoteUrl = remoteMatch?.[1]?.trim() || null - - if (!remoteUrl) { - return { - valid: false, - reason: 'missing_origin', - remoteUrl: null, - detectedRepo: null - } - } - - const detectedRepo = extractGithubRepo(remoteUrl) - - if (!detectedRepo) { - return { - valid: false, - reason: 'unsupported_remote', - remoteUrl, - detectedRepo: null - } - } - - const isValid = - detectedRepo.owner.toLowerCase() === owner.toLowerCase() && - detectedRepo.repo.toLowerCase() === repo.toLowerCase() - - return { - valid: isValid, - reason: isValid ? null : 'repo_mismatch', - remoteUrl, - detectedRepo - } - } catch (error) { - if (error?.code === 'ENOENT') { - return { - valid: false, - reason: 'missing_git', - remoteUrl: null, - detectedRepo: null - } - } - - throw error - } -} - -export async function readRepoTasksMarkdown(localPath) { - if (!localPath) { - return null - } - - try { - return await readFile(getTasksPath(localPath), 'utf-8') - } catch (error) { - if (error?.code === 'ENOENT') { - return null - } - - throw error - } -} - -export async function writeRepoTasksMarkdown(localPath, markdown) { - if (!localPath) { - return - } - - await mkdir(localPath, { recursive: true }) - await writeFile(getTasksPath(localPath), markdown, 'utf-8') -} diff --git a/src/main/tasks/template.js b/src/main/tasks/template.js deleted file mode 100644 index 571e6f0..0000000 --- a/src/main/tasks/template.js +++ /dev/null @@ -1,10 +0,0 @@ -export function createInitialTasksMarkdown() { - return [ - '# Tasks', - '', - '- [ ] Setup inicial do projeto', - '- [ ] Definir primeiras tasks', - ' - [ ] Revisar backlog', - ' - [ ] Priorizar sprint' - ].join('\n') + '\n' -} diff --git a/src/main/watcher/poller.js b/src/main/watcher/poller.js deleted file mode 100644 index 431d12c..0000000 --- a/src/main/watcher/poller.js +++ /dev/null @@ -1,159 +0,0 @@ -import { watch } from 'node:fs' -import { getFileSha, getFile } from '../github/client' -import { parse } from '../parser/index' -import store from '../store' -import { writeLocalTasksMarkdown } from '../tasks/cache' -import { getTasksPath, readRepoTasksMarkdown, writeRepoTasksMarkdown } from '../tasks/local-repo' - -const POLL_INTERVAL_MS = 30_000 -let pollerTimer = null -let localWatcher = null -let localWatcherDebounce = null -let lastObservedLocalMarkdown = null - -function repoKey({ owner, repo }) { - return `${owner}/${repo}` -} - -export function syncLocalWatcherSnapshot(markdown) { - lastObservedLocalMarkdown = markdown ?? null -} - -async function handleLocalFileChange(mainWindow) { - try { - const activeRepo = store.get('activeRepo') - - if (!activeRepo?.localPath) { - syncLocalWatcherSnapshot(null) - return - } - - const { owner, repo } = activeRepo - const markdown = await readRepoTasksMarkdown(activeRepo.localPath) - - if ((markdown ?? null) === lastObservedLocalMarkdown) { - return - } - - lastObservedLocalMarkdown = markdown ?? null - - const dirtyRepos = store.get('dirtyRepos') || {} - const hasLocalChanges = !!dirtyRepos[repoKey(activeRepo)] - const tasks = markdown ? parse(markdown) : [] - - if (hasLocalChanges) { - mainWindow.webContents.send('tasks:local-file-conflict', tasks) - return - } - - await writeLocalTasksMarkdown(owner, repo, markdown || '# Tasks\n') - mainWindow.webContents.send('tasks:local-file-update', tasks) - } catch (err) { - console.error('[poller] Local file watcher error:', err.message) - } -} - -function startLocalWatcher(mainWindow) { - const activeRepo = store.get('activeRepo') - - if (!activeRepo?.localPath) { - syncLocalWatcherSnapshot(null) - return - } - - try { - localWatcher = watch(activeRepo.localPath, (_eventType, filename) => { - if (filename && filename !== 'tasks.md') { - return - } - - clearTimeout(localWatcherDebounce) - localWatcherDebounce = setTimeout(() => { - handleLocalFileChange(mainWindow) - }, 150) - }) - } catch (err) { - console.error('[poller] Failed to watch local repo:', err.message) - } -} - -/** - * Inicia o polling do tasks.md no repo ativo. - * Se o SHA mudar, dispara o evento tasks:external-update para o renderer. - * @param {BrowserWindow} mainWindow - */ -export function startPoller(mainWindow) { - stopPoller() - startLocalWatcher(mainWindow) - - pollerTimer = setInterval(async () => { - try { - const token = store.get('token') - const activeRepo = store.get('activeRepo') - - if (!token || !activeRepo) { - return - } - - const { owner, repo } = activeRepo - const currentSha = await getFileSha(token, owner, repo, 'tasks.md') - const cachedSha = store.get('tasksSha') - const dirtyRepos = store.get('dirtyRepos') || {} - const hasLocalChanges = !!dirtyRepos[repoKey(activeRepo)] - - if (currentSha === cachedSha) { - return - } - - if (!currentSha) { - console.log('[poller] tasks.md was removed externally') - store.set('tasksSha', null) - mainWindow.webContents.send('tasks:external-update', []) - return - } - - console.log('[poller] External change detected, fetching new tasks...') - - const file = await getFile(token, owner, repo, 'tasks.md') - if (!file) { - store.set('tasksSha', null) - mainWindow.webContents.send('tasks:external-update', []) - return - } - - const tasks = parse(file.content) - store.set('tasksSha', currentSha) - if (hasLocalChanges) { - mainWindow.webContents.send('tasks:remote-conflict', tasks) - return - } - - await writeLocalTasksMarkdown(owner, repo, file.content) - await writeRepoTasksMarkdown(activeRepo.localPath, file.content) - syncLocalWatcherSnapshot(file.content) - mainWindow.webContents.send('tasks:external-update', tasks) - } catch (err) { - console.error('[poller] Error:', err.message) - } - }, POLL_INTERVAL_MS) - - console.log(`[poller] Started (interval: ${POLL_INTERVAL_MS / 1000}s)`) -} - -export function stopPoller() { - if (pollerTimer) { - clearInterval(pollerTimer) - pollerTimer = null - console.log('[poller] Stopped') - } - - if (localWatcher) { - localWatcher.close() - localWatcher = null - } - - if (localWatcherDebounce) { - clearTimeout(localWatcherDebounce) - localWatcherDebounce = null - } -} diff --git a/src/preload/index.js b/src/preload/index.js deleted file mode 100644 index 32d061d..0000000 --- a/src/preload/index.js +++ /dev/null @@ -1,36 +0,0 @@ -import { contextBridge, ipcRenderer } from 'electron' -import { IPC_CONTRACT } from '../main/ipc/spec' - -/** - * Expõe uma API segura para o renderer via window.electron. - * O renderer nunca acessa o ipcRenderer diretamente. - */ -contextBridge.exposeInMainWorld('electron', { - contract: IPC_CONTRACT, - - /** - * Chama um handler IPC no processo principal e aguarda a resposta. - * @param {string} channel - * @param {...any} args - * @returns {Promise} - */ - invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), - - /** - * Retorna o contrato de canais IPC exposto para o renderer. - * @returns {typeof IPC_CONTRACT} - */ - getContract: () => IPC_CONTRACT, - - /** - * Escuta eventos enviados pelo processo principal. - * @param {string} channel - * @param {Function} callback - * @returns {Function} unsubscribe — chame para remover o listener - */ - on: (channel, callback) => { - const handler = (_event, ...args) => callback(...args) - ipcRenderer.on(channel, handler) - return () => ipcRenderer.removeListener(channel, handler) - } -}) diff --git a/src/renderer/App.jsx b/src/renderer/App.jsx deleted file mode 100644 index a5c3d59..0000000 --- a/src/renderer/App.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import { useState, useEffect } from "react"; -import LoginPage from "./pages/LoginPage"; -import RepoSelectPage from "./pages/RepoSelectPage"; -import KanbanPage from "./pages/KanbanPage"; - -const DEFAULT_REPO_SELECT_UI = { - search: "", - selectedRepoId: null, - scrollTop: 0, - localPath: "", -}; - -export default function App() { - const [page, setPage] = useState("login"); - const [tasks, setTasks] = useState([]); - const [activeRepo, setActiveRepo] = useState(null); - const [hasLocalChanges, setHasLocalChanges] = useState(false); - const [repoSelectUi, setRepoSelectUi] = useState(DEFAULT_REPO_SELECT_UI); - - useEffect(() => { - window.electron.invoke("session:get").then(async (session) => { - if (session.isAuthenticated && session.activeRepo) { - try { - const loadedTasks = await window.electron.invoke("tasks:load", { - owner: session.activeRepo.owner, - repo: session.activeRepo.repo, - localPath: session.activeRepo.localPath, - }); - - setActiveRepo(session.activeRepo); - setTasks(loadedTasks); - setHasLocalChanges(!!session.tasksDirty); - setPage("kanban"); - } catch (_error) { - setPage("repo-select"); - } - } else if (session.isAuthenticated) { - setPage("repo-select"); - } else { - setPage("login"); - } - }); - }, []); - - return ( - <> - {page === "login" && ( - { - setTasks([]); - setActiveRepo(null); - setHasLocalChanges(false); - setRepoSelectUi(DEFAULT_REPO_SELECT_UI); - setPage("repo-select"); - }} - /> - )} - {page === "repo-select" && ( - { - setActiveRepo(repo); - setTasks(selectedTasks); - setHasLocalChanges(!!hasDirtyCache); - setPage("kanban"); - }} - /> - )} - {page === "kanban" && ( - { - setTasks([]); - setPage("repo-select"); - }} - onLogout={() => { - setTasks([]); - setActiveRepo(null); - setHasLocalChanges(false); - setRepoSelectUi(DEFAULT_REPO_SELECT_UI); - setPage("login"); - }} - /> - )} - - ); -} diff --git a/src/renderer/components/CardTypesManager.jsx b/src/renderer/components/CardTypesManager.jsx deleted file mode 100644 index fd11060..0000000 --- a/src/renderer/components/CardTypesManager.jsx +++ /dev/null @@ -1,199 +0,0 @@ -import { useState } from "react"; -import { useCardTypes } from "../context/CardTypesContext"; -import styles from "./CardTypesManager.module.css"; - -const PRESET_COLORS = [ - "#C0392B", - "#E85D24", - "#B45309", - "#00A676", - "#005F73", - "#2B2D42", - "#758956", - "#8B5CF6", - "#EC4899", - "#0EA5E9", -]; - -const PRESET_ICONS = ["✓", "⚠", "🔍", "⚡", "🚫", "📖", "🐛", "💡", "🔧", "📌"]; - -function TypeEditor({ type, onSave, onCancel }) { - const [name, setName] = useState(type?.name || ""); - const [icon, setIcon] = useState(type?.icon || "✓"); - const [color, setColor] = useState(type?.color || "#005F73"); - - return ( -
-
-
- - setName(e.target.value)} - autoFocus - /> -
-
- -
- -
- {PRESET_ICONS.map((i) => ( - - ))} -
-
- -
- -
- {PRESET_COLORS.map((c) => ( -
-
- -
- - {icon} - {name || "Preview"} - -
- -
- - -
-
- ); -} - -export default function CardTypesManager({ onClose }) { - const { allTypes, customTypes, addType, editType, deleteType } = - useCardTypes(); - const [editingId, setEditingId] = useState(null); - const [adding, setAdding] = useState(false); - - const systemTypes = allTypes.filter((t) => t.isSystem); - - return ( -
-
e.stopPropagation()}> -
-

Tipos de cartão

- -
- -
-

Tipos do sistema

-
- {systemTypes.map((type) => ( -
- - {type.icon} - {type.name} - - Sistema -
- ))} -
-
- -
-

Tipos customizados

-
- {customTypes.map((type) => ( -
- {editingId === type.id ? ( - { - editType(type.id, changes); - setEditingId(null); - }} - onCancel={() => setEditingId(null)} - /> - ) : ( -
- - {type.icon} - {type.name} - -
- - -
-
- )} -
- ))} - {customTypes.length === 0 && ( -

Nenhum tipo customizado ainda

- )} -
-
- - {adding ? ( - { - addType(type); - setAdding(false); - }} - onCancel={() => setAdding(false)} - /> - ) : ( - - )} -
-
- ); -} diff --git a/src/renderer/components/CardTypesManager.module.css b/src/renderer/components/CardTypesManager.module.css deleted file mode 100644 index 84e545a..0000000 --- a/src/renderer/components/CardTypesManager.module.css +++ /dev/null @@ -1,321 +0,0 @@ -.overlay { - position: fixed; - inset: 0; - background: rgb(0 0 0 / 0.6); - display: flex; - align-items: center; - justify-content: center; - z-index: 100; -} - -.modal { - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-xl); - padding: var(--space-6); - width: 100%; - max-width: 440px; - display: flex; - flex-direction: column; - gap: var(--space-4); - max-height: 80vh; - overflow-y: auto; -} - -.header { - display: flex; - align-items: center; - justify-content: space-between; -} - -.title { - font-size: var(--text-lg); - font-weight: var(--font-semibold); - color: var(--text-primary); -} - -.btnClose { - font-size: var(--text-sm); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - padding: var(--space-1); - transition: color var(--duration-fast) var(--ease-default); -} - -.btnClose:hover { - color: var(--text-primary); -} - -.section { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.sectionLabel { - font-size: var(--text-xs); - font-weight: var(--font-medium); - text-transform: uppercase; - letter-spacing: 0.06em; - color: var(--text-tertiary); -} - -.list { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.typeRow { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--surface-overlay); -} - -.typeBadge { - display: inline-flex; - align-items: center; - gap: 6px; - font-size: 12px; - font-weight: var(--font-medium); - padding: 3px 10px; - border-radius: var(--radius-full); - border: 1px solid var(--type-color); - color: var(--type-color); -} - -.typeIcon { - font-size: 11px; -} - -.systemTag { - font-size: 10px; - color: var(--text-muted); - background: var(--surface-card); - padding: 2px 8px; - border-radius: var(--radius-full); -} - -.typeActions { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.btnEdit { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-sm); - padding: 2px 8px; - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); - font-family: var(--font-sans); -} - -.btnEdit:hover { - color: var(--color-teal); - border-color: var(--color-teal); -} - -.btnDelete { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - transition: color var(--duration-fast) var(--ease-default); - font-family: var(--font-sans); -} - -.btnDelete:hover { - color: var(--color-danger); -} - -.empty { - font-size: var(--text-sm); - color: var(--text-muted); - text-align: center; - padding: var(--space-3) 0; -} - -.btnAdd { - font-size: var(--text-sm); - color: var(--color-teal); - background: transparent; - border: 1px dashed var(--color-graphite-mid); - border-radius: var(--radius-md); - padding: var(--space-2); - width: 100%; - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); - font-family: var(--font-sans); -} - -.btnAdd:hover { - border-color: var(--color-teal); - background: var(--surface-overlay); -} - -.editor { - display: flex; - flex-direction: column; - gap: var(--space-3); - background: var(--surface-overlay); - border-radius: var(--radius-md); - padding: var(--space-3); -} - -.editorRow { - display: flex; - gap: var(--space-3); -} - -.field { - display: flex; - flex-direction: column; - gap: var(--space-1); - flex: 1; -} - -.fieldLabel { - font-size: var(--text-xs); - font-weight: var(--font-medium); - color: var(--text-muted); - text-transform: uppercase; - letter-spacing: 0.05em; -} - -.editorInput { - width: 100%; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - font-size: var(--text-sm); - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - color: var(--text-primary); - font-family: var(--font-sans); -} - -.editorInput:focus { - border-color: var(--color-teal); - outline: none; -} - -.iconRow { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.iconBtn { - width: 32px; - height: 32px; - border-radius: var(--radius-md); - border: 1px solid var(--color-graphite-mid); - background: var(--surface-card); - cursor: pointer; - font-size: 14px; - display: flex; - align-items: center; - justify-content: center; - transition: all var(--duration-fast) var(--ease-default); -} - -.iconBtn:hover { - border-color: var(--color-teal); -} - -.iconBtnActive { - border-color: var(--color-teal); - background: var(--color-teal-dark); -} - -.colorRow { - display: flex; - align-items: center; - gap: var(--space-2); - flex-wrap: wrap; -} - -.colorDot { - width: 20px; - height: 20px; - border-radius: var(--radius-full); - border: 2px solid transparent; - cursor: pointer; - transition: transform var(--duration-fast) var(--ease-default); -} - -.colorDot:hover { - transform: scale(1.2); -} - -.colorDotActive { - border-color: var(--color-white); - transform: scale(1.15); -} - -.colorPicker { - width: 24px; - height: 24px; - border-radius: var(--radius-full); - border: none; - cursor: pointer; - padding: 0; - background: transparent; -} - -.preview { - display: flex; - align-items: center; -} - -.editorActions { - display: flex; - justify-content: flex-end; - gap: var(--space-2); -} - -.btnCancel { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - border: 1px solid var(--color-graphite-mid); - background: transparent; - color: var(--text-muted); - cursor: pointer; - font-family: var(--font-sans); - transition: all var(--duration-fast) var(--ease-default); -} - -.btnCancel:hover { - color: var(--text-primary); -} - -.btnSave { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--color-teal-dark); - color: var(--color-white); - border: none; - cursor: pointer; - font-family: var(--font-sans); - font-weight: var(--font-medium); - transition: background var(--duration-fast) var(--ease-default); -} - -.btnSave:hover:not(:disabled) { - background: var(--color-teal); -} -.btnSave:disabled { - opacity: 0.5; - cursor: not-allowed; -} diff --git a/src/renderer/components/ColumnsManager.jsx b/src/renderer/components/ColumnsManager.jsx deleted file mode 100644 index 869e275..0000000 --- a/src/renderer/components/ColumnsManager.jsx +++ /dev/null @@ -1,184 +0,0 @@ -import { useState } from "react"; -import { useColumns } from "../context/ColumnsContext"; -import styles from "./ColumnsManager.module.css"; - -const PRESET_COLORS = [ - "#4F4F4F", - "#00A676", - "#94D2BD", - "#C0392B", - "#E85D24", - "#005F73", - "#8B5CF6", - "#0EA5E9", - "#B45309", - "#758956", -]; - -function ColumnEditor({ column, onSave, onCancel }) { - const [label, setLabel] = useState(column?.label || ""); - const [color, setColor] = useState(column?.color || "#005F73"); - - return ( -
- setLabel(e.target.value)} - autoFocus - /> -
- {PRESET_COLORS.map((c) => ( -
-
- - {label || "Preview"} -
-
- - -
-
- ); -} - -export default function ColumnsManager({ onClose }) { - const { columns, addColumn, editColumn, deleteColumn } = useColumns(); - const [editingId, setEditingId] = useState(null); - const [adding, setAdding] = useState(false); - - const systemCols = columns.filter((c) => c.isSystem); - const customCols = columns.filter((c) => !c.isSystem); - - return ( -
-
e.stopPropagation()}> -
-

Gerenciar colunas

- -
- -
-

Colunas do sistema

-
- {systemCols.map((col) => ( -
- {editingId === col.id ? ( - { - editColumn(col.id, changes); - setEditingId(null); - }} - onCancel={() => setEditingId(null)} - /> - ) : ( -
-
- - {col.label} -
- -
- )} -
- ))} -
-
- -
-

Colunas customizadas

-
- {customCols.map((col) => ( -
- {editingId === col.id ? ( - { - editColumn(col.id, changes); - setEditingId(null); - }} - onCancel={() => setEditingId(null)} - /> - ) : ( -
-
- - {col.label} -
-
- - -
-
- )} -
- ))} - {customCols.length === 0 && ( -

Nenhuma coluna customizada ainda

- )} -
-
- - {adding ? ( - { - addColumn(col); - setAdding(false); - }} - onCancel={() => setAdding(false)} - /> - ) : ( - - )} -
-
- ); -} diff --git a/src/renderer/components/ColumnsManager.module.css b/src/renderer/components/ColumnsManager.module.css deleted file mode 100644 index b9aeb51..0000000 --- a/src/renderer/components/ColumnsManager.module.css +++ /dev/null @@ -1,272 +0,0 @@ -.overlay { - position: fixed; - inset: 0; - background: rgb(0 0 0 / 0.6); - display: flex; - align-items: center; - justify-content: center; - z-index: 100; -} - -.modal { - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-xl); - padding: var(--space-6); - width: 100%; - max-width: 440px; - display: flex; - flex-direction: column; - gap: var(--space-4); - max-height: 80vh; - overflow-y: auto; -} - -.header { - display: flex; - align-items: center; - justify-content: space-between; -} - -.title { - font-size: var(--text-lg); - font-weight: var(--font-semibold); - color: var(--text-primary); -} - -.btnClose { - font-size: var(--text-sm); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - padding: var(--space-1); - transition: color var(--duration-fast) var(--ease-default); -} - -.btnClose:hover { - color: var(--text-primary); -} - -.section { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.sectionLabel { - font-size: var(--text-xs); - font-weight: var(--font-medium); - text-transform: uppercase; - letter-spacing: 0.06em; - color: var(--text-tertiary); -} - -.list { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.colRow { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--surface-overlay); -} - -.colInfo { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.dot { - width: 10px; - height: 10px; - border-radius: var(--radius-full); - flex-shrink: 0; -} - -.colLabel { - font-size: var(--text-sm); - color: var(--text-primary); -} - -.colActions { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.btnEdit { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-sm); - padding: 2px 8px; - cursor: pointer; - font-family: var(--font-sans); - transition: all var(--duration-fast) var(--ease-default); -} - -.btnEdit:hover { - color: var(--color-teal); - border-color: var(--color-teal); -} - -.btnDelete { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - font-family: var(--font-sans); - transition: color var(--duration-fast) var(--ease-default); -} - -.btnDelete:hover { - color: var(--color-danger); -} - -.empty { - font-size: var(--text-sm); - color: var(--text-muted); - text-align: center; - padding: var(--space-3) 0; -} - -.btnAdd { - font-size: var(--text-sm); - color: var(--color-teal); - background: transparent; - border: 1px dashed var(--color-graphite-mid); - border-radius: var(--radius-md); - padding: var(--space-2); - width: 100%; - cursor: pointer; - font-family: var(--font-sans); - transition: all var(--duration-fast) var(--ease-default); -} - -.btnAdd:hover { - border-color: var(--color-teal); - background: var(--surface-overlay); -} - -.editor { - display: flex; - flex-direction: column; - gap: var(--space-3); - background: var(--surface-overlay); - border-radius: var(--radius-md); - padding: var(--space-3); -} - -.editorInput { - width: 100%; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - font-size: var(--text-sm); - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - color: var(--text-primary); - font-family: var(--font-sans); -} - -.editorInput:focus { - border-color: var(--color-teal); - outline: none; -} - -.colorRow { - display: flex; - align-items: center; - gap: var(--space-2); - flex-wrap: wrap; -} - -.colorDot { - width: 20px; - height: 20px; - border-radius: var(--radius-full); - border: 2px solid transparent; - cursor: pointer; - transition: transform var(--duration-fast) var(--ease-default); -} - -.colorDot:hover { - transform: scale(1.2); -} - -.colorDotActive { - border-color: var(--color-white); - transform: scale(1.15); -} - -.colorPicker { - width: 24px; - height: 24px; - border-radius: var(--radius-full); - border: none; - cursor: pointer; - padding: 0; - background: transparent; -} - -.preview { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.previewLabel { - font-size: var(--text-sm); - color: var(--text-primary); -} - -.editorActions { - display: flex; - justify-content: flex-end; - gap: var(--space-2); -} - -.btnCancel { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - border: 1px solid var(--color-graphite-mid); - background: transparent; - color: var(--text-muted); - cursor: pointer; - font-family: var(--font-sans); - transition: all var(--duration-fast) var(--ease-default); -} - -.btnCancel:hover { - color: var(--text-primary); -} - -.btnSave { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--color-teal-dark); - color: var(--color-white); - border: none; - cursor: pointer; - font-family: var(--font-sans); - font-weight: var(--font-medium); - transition: background var(--duration-fast) var(--ease-default); -} - -.btnSave:hover:not(:disabled) { - background: var(--color-teal); -} -.btnSave:disabled { - opacity: 0.5; - cursor: not-allowed; -} diff --git a/src/renderer/components/FlagsManager.jsx b/src/renderer/components/FlagsManager.jsx deleted file mode 100644 index 62d30bb..0000000 --- a/src/renderer/components/FlagsManager.jsx +++ /dev/null @@ -1,187 +0,0 @@ -import { useState } from "react"; -import { useFlags } from "../context/FlagsContext"; -import styles from "./FlagsManager.module.css"; - -const PRESET_COLORS = [ - "#C0392B", - "#E85D24", - "#B45309", - "#00A676", - "#005F73", - "#2B2D42", - "#758956", - "#8B5CF6", - "#EC4899", - "#0EA5E9", -]; - -function FlagEditor({ flag, onSave, onCancel }) { - const [name, setName] = useState(flag?.name || ""); - const [color, setColor] = useState(flag?.color || "#005F73"); - const [bold, setBold] = useState(flag?.bold || false); - - return ( -
- setName(e.target.value)} - autoFocus - /> -
- {PRESET_COLORS.map((c) => ( -
- -
- - {name || "Preview"} - -
-
- - -
-
- ); -} - -export default function FlagsManager({ onClose }) { - const { allFlags, customFlags, addFlag, editFlag, deleteFlag } = useFlags(); - const [editingId, setEditingId] = useState(null); - const [adding, setAdding] = useState(false); - - const systemFlags = allFlags.filter((f) => f.isSystem); - - return ( -
-
e.stopPropagation()}> -
-

Gerenciar flags

- -
- -
-

Flags do sistema

-
- {systemFlags.map((flag) => ( -
- - {flag.name} - - Sistema -
- ))} -
-
- -
-

Flags customizadas

-
- {customFlags.map((flag) => ( -
- {editingId === flag.id ? ( - { - editFlag(flag.id, changes); - setEditingId(null); - }} - onCancel={() => setEditingId(null)} - /> - ) : ( -
- - {flag.name} - -
- - -
-
- )} -
- ))} - {customFlags.length === 0 && ( -

Nenhuma flag customizada ainda

- )} -
-
- - {adding ? ( - { - addFlag(flag); - setAdding(false); - }} - onCancel={() => setAdding(false)} - /> - ) : ( - - )} -
-
- ); -} diff --git a/src/renderer/components/FlagsManager.module.css b/src/renderer/components/FlagsManager.module.css deleted file mode 100644 index 963e061..0000000 --- a/src/renderer/components/FlagsManager.module.css +++ /dev/null @@ -1,296 +0,0 @@ -.overlay { - position: fixed; - inset: 0; - background: rgb(0 0 0 / 0.6); - display: flex; - align-items: center; - justify-content: center; - z-index: 100; -} - -.modal { - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-xl); - padding: var(--space-6); - width: 100%; - max-width: 440px; - display: flex; - flex-direction: column; - gap: var(--space-4); - max-height: 80vh; - overflow-y: auto; -} - -.header { - display: flex; - align-items: center; - justify-content: space-between; -} - -.title { - font-size: var(--text-lg); - font-weight: var(--font-semibold); - color: var(--text-primary); -} - -.btnClose { - font-size: var(--text-sm); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - padding: var(--space-1); - transition: color var(--duration-fast) var(--ease-default); -} - -.btnClose:hover { - color: var(--text-primary); -} - -.list { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.flagRow { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--surface-overlay); -} - -.flagBadge { - font-size: 12px; - padding: 2px 10px; - border-radius: var(--radius-full); - border: 1px solid; -} - -.flagActions { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.btnEdit { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-sm); - padding: 2px 8px; - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); -} - -.btnEdit:hover { - color: var(--color-teal); - border-color: var(--color-teal); -} - -.btnDelete { - font-size: var(--text-xs); - color: var(--text-muted); - background: transparent; - border: none; - cursor: pointer; - transition: color var(--duration-fast) var(--ease-default); -} - -.btnDelete:hover { - color: var(--color-danger); -} - -.btnAdd { - font-size: var(--text-sm); - color: var(--color-teal); - background: transparent; - border: 1px dashed var(--color-graphite-mid); - border-radius: var(--radius-md); - padding: var(--space-2); - width: 100%; - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); - font-family: var(--font-sans); -} - -.btnAdd:hover { - border-color: var(--color-teal); - background: var(--surface-overlay); -} - -/* Editor */ -.editor { - display: flex; - flex-direction: column; - gap: var(--space-3); - background: var(--surface-overlay); - border-radius: var(--radius-md); - padding: var(--space-3); -} - -.editorInput { - width: 100%; - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - font-size: var(--text-sm); - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - color: var(--text-primary); - font-family: var(--font-sans); -} - -.editorInput:focus { - border-color: var(--color-teal); - outline: none; -} - -.colorRow { - display: flex; - align-items: center; - gap: var(--space-2); - flex-wrap: wrap; -} - -.colorDot { - width: 20px; - height: 20px; - border-radius: var(--radius-full); - border: 2px solid transparent; - cursor: pointer; - transition: transform var(--duration-fast) var(--ease-default); -} - -.colorDot:hover { - transform: scale(1.2); -} - -.colorDotActive { - border-color: var(--color-white); - transform: scale(1.15); -} - -.colorPicker { - width: 24px; - height: 24px; - border-radius: var(--radius-full); - border: none; - cursor: pointer; - padding: 0; - background: transparent; -} - -.boldToggle { - display: flex; - align-items: center; - gap: var(--space-2); - font-size: var(--text-sm); - color: var(--text-secondary); - cursor: pointer; - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-md); - padding: var(--space-2) var(--space-3); - width: fit-content; - transition: all var(--duration-fast) var(--ease-default); -} - -.boldToggle:hover { - border-color: var(--color-teal); - color: var(--text-primary); -} - -.boldToggle input { - accent-color: var(--color-teal); - width: 14px; - height: 14px; - cursor: pointer; -} - -.editorPreview { - display: flex; - align-items: center; -} - -.flagPreview { - font-size: 12px; - padding: 2px 10px; - border-radius: var(--radius-full); - border: 1px solid; -} - -.editorActions { - display: flex; - justify-content: flex-end; - gap: var(--space-2); -} - -.btnCancel { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - border: 1px solid var(--color-graphite-mid); - background: transparent; - color: var(--text-muted); - cursor: pointer; - font-family: var(--font-sans); - transition: all var(--duration-fast) var(--ease-default); -} - -.btnCancel:hover { - color: var(--text-primary); -} - -.btnSave { - font-size: var(--text-sm); - padding: var(--space-2) var(--space-3); - border-radius: var(--radius-md); - background: var(--color-teal-dark); - color: var(--color-white); - border: none; - cursor: pointer; - font-family: var(--font-sans); - font-weight: var(--font-medium); - transition: background var(--duration-fast) var(--ease-default); -} - -.btnSave:hover:not(:disabled) { - background: var(--color-teal); -} -.btnSave:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.section { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.sectionLabel { - font-size: var(--text-xs); - font-weight: var(--font-medium); - text-transform: uppercase; - letter-spacing: 0.06em; - color: var(--text-tertiary); -} - -.systemTag { - font-size: 10px; - color: var(--text-muted); - background: var(--surface-overlay); - padding: 2px 8px; - border-radius: var(--radius-full); -} - -.empty { - font-size: var(--text-sm); - color: var(--text-muted); - text-align: center; - padding: var(--space-3) 0; -} diff --git a/src/renderer/components/KanbanColumn.jsx b/src/renderer/components/KanbanColumn.jsx deleted file mode 100644 index fc889ec..0000000 --- a/src/renderer/components/KanbanColumn.jsx +++ /dev/null @@ -1,56 +0,0 @@ -import { useDroppable } from "@dnd-kit/core"; -import { - SortableContext, - verticalListSortingStrategy, -} from "@dnd-kit/sortable"; -import SortableTaskCard from "./SortableTaskCard"; -import styles from "./KanbanColumn.module.css"; - -export default function KanbanColumn({ - title, - tasks, - color, - columnId, - collaborators, - onSubtaskToggle, - onDeleteTask, - onEditTask, - primaryActionLabel, - onPrimaryAction, -}) { - const { setNodeRef, isOver } = useDroppable({ id: columnId }); - - return ( -
-
- -

{title}

- {tasks.length} -
- - t.id)} - strategy={verticalListSortingStrategy} - > -
- {tasks.map((task) => ( - - ))} - {tasks.length === 0 && ( -

Nenhuma task aqui

- )} -
-
-
- ); -} diff --git a/src/renderer/components/KanbanColumn.module.css b/src/renderer/components/KanbanColumn.module.css deleted file mode 100644 index 3544e93..0000000 --- a/src/renderer/components/KanbanColumn.module.css +++ /dev/null @@ -1,59 +0,0 @@ -.column { - display: flex; - flex-direction: column; - gap: var(--space-3); - background: var(--surface-overlay); - border-radius: var(--radius-lg); - padding: var(--space-4); - min-width: 280px; - flex: 1; - max-height: calc(100vh - 120px); -} - -.header { - display: flex; - align-items: center; - gap: var(--space-2); - margin-bottom: var(--space-1); -} - -.dot { - width: 10px; - height: 10px; - border-radius: var(--radius-full); - flex-shrink: 0; -} - -.title { - font-size: var(--text-sm); - font-weight: var(--font-semibold); - color: var(--text-primary); - flex: 1; -} - -.count { - font-size: var(--text-xs); - color: var(--text-muted); - background: var(--color-graphite); - padding: 2px 8px; - border-radius: var(--radius-full); -} - -.list { - display: flex; - flex-direction: column; - gap: var(--space-2); - overflow-y: auto; - flex: 1; -} - -.empty { - font-size: var(--text-sm); - color: var(--text-muted); - text-align: center; - padding: var(--space-6) 0; -} -.columnOver { - border: 1px solid var(--color-teal); - background: var(--color-teal-dark); -} diff --git a/src/renderer/components/LoadingSpinner.jsx b/src/renderer/components/LoadingSpinner.jsx deleted file mode 100644 index 4c71db4..0000000 --- a/src/renderer/components/LoadingSpinner.jsx +++ /dev/null @@ -1,28 +0,0 @@ -export default function LoadingSpinner({ size = "md" }) { - const dim = size === "sm" ? 16 : 32; - - return ( - - - - - - ); -} diff --git a/src/renderer/components/SortableTaskCard.jsx b/src/renderer/components/SortableTaskCard.jsx deleted file mode 100644 index 66450eb..0000000 --- a/src/renderer/components/SortableTaskCard.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useSortable } from "@dnd-kit/sortable"; -import { CSS } from "@dnd-kit/utilities"; -import TaskCard from "./TaskCard"; - -export default function SortableTaskCard({ - task, - collaborators, - onSubtaskToggle, - onDelete, - onEdit, - primaryActionLabel, - onPrimaryAction, -}) { - const { - attributes, - listeners, - setNodeRef, - transform, - transition, - isDragging, - } = useSortable({ id: task.id }); - - const style = { - transform: CSS.Transform.toString(transform), - transition, - opacity: isDragging ? 0.4 : 1, - }; - - return ( -
- -
- ); -} diff --git a/src/renderer/components/TaskCard.jsx b/src/renderer/components/TaskCard.jsx deleted file mode 100644 index 922f830..0000000 --- a/src/renderer/components/TaskCard.jsx +++ /dev/null @@ -1,235 +0,0 @@ -import styles from "./TaskCard.module.css"; -import { useFlags } from "../context/FlagsContext"; -import { useCardTypes } from "../context/CardTypesContext"; -import { useColumns } from "../context/ColumnsContext"; - -const PRIORITY_COLORS = { - low: { color: "#4F4F4F", label: "Baixa" }, - medium: { color: "#00A676", label: "Media" }, - high: { color: "#E85D24", label: "Alta" }, -}; - -const TrashIcon = () => ( - - - - - - -); - -export default function TaskCard({ - task, - collaborators = {}, - onSubtaskToggle, - onDelete, - onEdit, - primaryActionLabel, - onPrimaryAction, -}) { - const { allFlags } = useFlags(); - const { allTypes } = useCardTypes(); - const { columns } = useColumns(); - - const currentType = allTypes.find((t) => t.id === (task.cardType || "task")); - const currentColumn = columns.find((c) => c.id === task.status); - const statusColor = currentColumn?.color || "#4F4F4F"; - const subtasksDone = - task.subtasks?.filter((s) => s.status === "done").length ?? 0; - const subtasksTotal = task.subtasks?.length ?? 0; - const taskLabels = allFlags.filter((f) => task.labels?.includes(f.id)); - const priority = task.priority ? PRIORITY_COLORS[task.priority] : null; - const assignee = task.assignee ? collaborators[task.assignee] : null; - const assigneeName = assignee?.name?.trim() || task.assignee || ""; - const assigneeLogin = assignee?.login || task.assignee || ""; - - const handleDelete = (e) => { - e.stopPropagation(); - onDelete?.(task.id); - }; - - const handleProfileClick = (e) => { - e.stopPropagation(); - }; - - const handleSubtaskClick = (e, subtaskId) => { - e.stopPropagation(); - onSubtaskToggle?.(task.id, subtaskId); - }; - - const handlePrimaryAction = (e) => { - e.stopPropagation(); - onPrimaryAction?.(task); - }; - - return ( -
onEdit?.(task)} - > -
- {currentType && ( - - {currentType.icon} {currentType.name} - - )} - -
- -
-

{task.title}

- {task.description && ( -

{task.description}

- )} -
- - {task.assignee && ( -
- Assignee: - {assignee?.profileUrl ? ( - - {assignee?.avatarUrl ? ( - {assigneeName} - ) : ( -
- {assigneeName.charAt(0).toUpperCase()} -
- )} -
- {assigneeName} - @{assigneeLogin} -
-
- ) : ( -
- {assignee?.avatarUrl ? ( - {assigneeName} - ) : ( -
- {assigneeName.charAt(0).toUpperCase()} -
- )} -
- {assigneeName} - @{assigneeLogin} -
-
- )} -
- )} - - {priority && ( -
- Prioridade: -
- - {priority.label} - -
-
- )} - - {taskLabels.length > 0 && ( -
- Etiquetas: -
- {taskLabels.map((f) => ( - - {f.name} - - ))} -
-
- )} - - {subtasksTotal > 0 && ( -
-
-
-
- - {subtasksDone}/{subtasksTotal} subtasks - -
- {task.subtasks.map((sub) => ( - - ))} -
-
- )} - - {primaryActionLabel && onPrimaryAction && ( - - )} -
- ); -} diff --git a/src/renderer/components/TaskCard.module.css b/src/renderer/components/TaskCard.module.css deleted file mode 100644 index 9647c68..0000000 --- a/src/renderer/components/TaskCard.module.css +++ /dev/null @@ -1,250 +0,0 @@ -.card { - background: var(--surface-card); - border: 1px solid var(--color-graphite-mid); - border-radius: var(--radius-md); - padding: var(--space-3); - display: flex; - flex-direction: column; - gap: var(--space-3); - transition: border-color var(--duration-fast) var(--ease-default); -} - -.card:hover { - border-color: var(--card-color); -} - -.headerRow { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: var(--space-2); -} - -.titleGroup { - display: flex; - flex-direction: column; - gap: 4px; -} - -.title { - font-size: var(--text-sm); - font-weight: var(--font-semibold); - color: var(--text-primary); - line-height: var(--leading-base); -} - -.description { - font-size: 11px; - color: var(--text-muted); - line-height: var(--leading-relaxed); -} - -.infoBlock { - display: flex; - flex-direction: column; - gap: 6px; -} - -.infoLabel { - font-size: 11px; - font-weight: var(--font-semibold); - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.04em; -} - -.assigneeRow, -.assigneeLink { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.assigneeLink { - color: inherit; - text-decoration: none; - width: fit-content; -} - -.assigneeLink:hover .assigneeName, -.assigneeLink:hover .assigneeLogin { - color: var(--color-teal); -} - -.assigneeAvatar, -.assigneeFallback { - width: 28px; - height: 28px; - border-radius: 999px; - flex-shrink: 0; -} - -.assigneeAvatar { - object-fit: cover; - border: 1px solid var(--color-graphite-mid); -} - -.assigneeFallback { - display: flex; - align-items: center; - justify-content: center; - background: var(--color-teal-dark); - color: var(--text-on-brand); - font-size: 12px; - font-weight: var(--font-semibold); -} - -.assigneeText { - display: flex; - flex-direction: column; - gap: 2px; - min-width: 0; -} - -.assigneeName { - font-size: var(--text-sm); - color: var(--text-primary); -} - -.assigneeLogin { - font-size: var(--text-xs); - color: var(--text-muted); -} - -.valueList { - display: flex; - flex-wrap: wrap; - gap: 4px; -} - -.btnDelete { - display: flex; - align-items: center; - justify-content: center; - color: var(--text-muted); - background: transparent; - border: none; - padding: 2px 4px; - border-radius: var(--radius-sm); - flex-shrink: 0; - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); -} - -.btnDelete:hover { - color: var(--color-danger); - background: color-mix(in srgb, var(--color-danger) 10%, transparent); -} - -.subtasks { - display: flex; - flex-direction: column; - gap: 6px; -} - -.progressBar { - height: 4px; - background: var(--color-graphite-mid); - border-radius: var(--radius-full); - overflow: hidden; -} - -.progressFill { - height: 100%; - background: var(--color-teal); - border-radius: var(--radius-full); - transition: width var(--duration-base) var(--ease-default); -} - -.subtaskCount { - font-size: var(--text-xs); - color: var(--text-muted); -} - -.subtaskList { - display: flex; - flex-direction: column; - gap: 6px; - margin-top: var(--space-1); -} - -.subtaskButton { - display: flex; - align-items: center; - gap: var(--space-2); - background: transparent; - border: none; - padding: 0; - text-align: left; - color: inherit; - cursor: pointer; -} - -.subtaskCheckbox { - width: 16px; - height: 16px; - border-radius: 4px; - border: 1px solid var(--color-graphite-mid); - display: inline-flex; - align-items: center; - justify-content: center; - font-size: 11px; - color: var(--text-on-brand); - background: transparent; - flex-shrink: 0; - transition: all var(--duration-fast) var(--ease-default); -} - -.subtaskCheckboxDone { - border-color: var(--color-teal); - background: var(--color-teal); -} - -.subtaskTitle { - font-size: var(--text-xs); - color: var(--text-secondary); -} - -.subtaskTitleDone { - text-decoration: line-through; - color: var(--text-muted); -} - -.flag { - font-size: 10px; - font-weight: var(--font-medium); - padding: 2px 8px; - border-radius: var(--radius-full); - border: 1px solid var(--flag-color); - color: var(--flag-color); -} - -.cardTypeBadge { - display: inline-flex; - align-items: center; - gap: 4px; - font-size: 10px; - font-weight: var(--font-medium); - padding: 2px 8px; - border-radius: var(--radius-full); - border: 1px solid var(--type-color); - color: var(--type-color); - width: fit-content; -} - -.primaryAction { - border: 1px solid var(--color-teal); - background: color-mix(in srgb, var(--color-teal) 12%, transparent); - color: var(--color-teal); - border-radius: var(--radius-md); - padding: 8px 10px; - font-size: var(--text-xs); - font-weight: var(--font-medium); - cursor: pointer; - transition: all var(--duration-fast) var(--ease-default); -} - -.primaryAction:hover { - background: var(--color-teal-dark); - color: var(--color-white); -} diff --git a/src/renderer/components/TaskModal.jsx b/src/renderer/components/TaskModal.jsx deleted file mode 100644 index c8f3ed9..0000000 --- a/src/renderer/components/TaskModal.jsx +++ /dev/null @@ -1,421 +0,0 @@ -import { useEffect, useMemo, useState } from "react"; -import styles from "./TaskModal.module.css"; -import { useFlags } from "../context/FlagsContext"; -import FlagsManager from "./FlagsManager"; -import { useCardTypes } from "../context/CardTypesContext"; -import CardTypesManager from "./CardTypesManager"; -import { useColumns } from "../context/ColumnsContext"; - -const PRIORITY_OPTIONS = [ - { value: "low", label: "Baixa", color: "#4F4F4F" }, - { value: "medium", label: "Media", color: "#00A676" }, - { value: "high", label: "Alta", color: "#E85D24" }, -]; - -export default function TaskModal({ - task, - activeRepo, - defaultStatus = "pending", - onSave, - onClose, -}) { - const isEditing = !!task; - const { allFlags } = useFlags(); - const { allTypes } = useCardTypes(); - const { columns } = useColumns(); - - const [cardType, setCardType] = useState(task?.cardType || "task"); - const [title, setTitle] = useState(task?.title || ""); - const [description, setDescription] = useState(task?.description || ""); - const [assignee, setAssignee] = useState(task?.assignee || ""); - const [assigneeSearch, setAssigneeSearch] = useState(""); - const [subtasks, setSubtasks] = useState( - task?.subtasks?.map((s) => s.title) || [""], - ); - const [priority, setPriority] = useState(task?.priority || ""); - const [labels, setLabels] = useState(task?.labels || []); - const [showFlagsManager, setShowFlagsManager] = useState(false); - const [showTypesManager, setShowTypesManager] = useState(false); - const [collaborators, setCollaborators] = useState([]); - const [isLoadingCollaborators, setIsLoadingCollaborators] = useState(false); - const [collaboratorsError, setCollaboratorsError] = useState(""); - const [status, setStatus] = useState(task?.status || defaultStatus); - - useEffect(() => { - let isMounted = true; - - const loadCollaborators = async () => { - if (!activeRepo?.owner || !activeRepo?.repo) { - if (isMounted) { - setCollaborators([]); - setCollaboratorsError(""); - } - return; - } - - try { - if (isMounted) { - setIsLoadingCollaborators(true); - setCollaboratorsError(""); - } - - const result = await window.electron.invoke("github:repo-collaborators"); - - if (isMounted) { - setCollaborators(Array.isArray(result) ? result : []); - } - } catch (error) { - if (isMounted) { - setCollaborators([]); - setCollaboratorsError( - error?.message || "Nao foi possivel carregar pessoas do GitHub.", - ); - } - } finally { - if (isMounted) { - setIsLoadingCollaborators(false); - } - } - }; - - loadCollaborators(); - - return () => { - isMounted = false; - }; - }, [activeRepo?.owner, activeRepo?.repo]); - - const assigneeOptions = useMemo(() => { - const options = [...collaborators]; - - if ( - assignee && - !options.some((collaborator) => collaborator.login === assignee) - ) { - options.unshift({ - id: `current-${assignee}`, - login: assignee, - name: "", - }); - } - - return options.sort((a, b) => { - const labelA = (a.name || a.login).toLowerCase(); - const labelB = (b.name || b.login).toLowerCase(); - return labelA.localeCompare(labelB); - }); - }, [assignee, collaborators]); - - const filteredAssigneeOptions = useMemo(() => { - const query = assigneeSearch.trim().toLowerCase(); - if (!query) return assigneeOptions; - - return assigneeOptions.filter((collaborator) => { - const name = collaborator.name?.toLowerCase() || ""; - const login = collaborator.login?.toLowerCase() || ""; - return name.includes(query) || login.includes(query); - }); - }, [assigneeOptions, assigneeSearch]); - - const handleAddSubtask = () => setSubtasks([...subtasks, ""]); - - const handleSubtaskChange = (index, value) => { - const updated = [...subtasks]; - updated[index] = value; - setSubtasks(updated); - }; - - const handleRemoveSubtask = (index) => { - setSubtasks(subtasks.filter((_, i) => i !== index)); - }; - - const toggleLabel = (id) => { - setLabels((prev) => - prev.includes(id) ? prev.filter((l) => l !== id) : [...prev, id], - ); - }; - - const handleSave = () => { - if (!title.trim()) return; - - const saved = { - id: task?.id || `TASK-${Date.now()}`, - cardType, - title: title.trim(), - description: description.trim(), - assignee: assignee.trim(), - priority, - labels, - status, - subtasks: subtasks - .filter((s) => s.trim()) - .map((s, i) => ({ - id: task?.subtasks?.[i]?.id || `TASK-${Date.now()}-${i}`, - title: s.trim(), - status: task?.subtasks?.[i]?.status || "pending", - })), - }; - - onSave(saved); - onClose(); - }; - - return ( - <> -
-
e.stopPropagation()}> -
-

- {isEditing ? "Editar task" : "Nova task"} -

- -
- -
-
-
- - -
-
- {allTypes.map((t) => ( - - ))} -
-
- -
- -
- - {columns.map((column) => ( - - ))} -
-
- -
- - setTitle(e.target.value)} - autoFocus - /> -
- -
- -