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 3d5c548..0000000 Binary files a/build/icon.ico and /dev/null differ diff --git a/build/icon.png b/build/icon.png deleted file mode 100644 index 8102cb4..0000000 Binary files a/build/icon.png and /dev/null differ 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/playbook/README.md b/playbook/README.md new file mode 100644 index 0000000..1bb1395 --- /dev/null +++ b/playbook/README.md @@ -0,0 +1,43 @@ +# Playbook CodeSprint + +Este diretorio concentra a documentacao operacional para agentes de IA, automacoes e futuras integracoes do ecossistema de tasks do CodeSprint. + +## Objetivo + +Explicar com clareza: + +- o que o produto faz +- como a arquitetura esta organizada +- como backlog, board e sync funcionam +- quais invariantes nao podem ser quebrados +- como implementar mudancas sem adivinhar o comportamento esperado + +## Leitura recomendada + +1. `playbook/product.md` +2. `playbook/architecture.md` +3. `playbook/data-model.md` +4. `playbook/sync.md` +5. `playbook/ui.md` +6. `playbook/playbooks.md` +7. `playbook/ipc.md` +8. `playbook/parser.md` +9. `playbook/mcp.md` + +## Escopo da branch `tasks` + +A branch `tasks` deve conter apenas: + +- `tasks.md` +- `playbook/README.md` +- `playbook/product.md` +- `playbook/architecture.md` +- `playbook/data-model.md` +- `playbook/sync.md` +- `playbook/ui.md` +- `playbook/playbooks.md` +- `playbook/ipc.md` +- `playbook/parser.md` +- `playbook/mcp.md` + +Nenhum arquivo de codigo deve ser tratado como parte da branch `tasks`. diff --git a/playbook/architecture.md b/playbook/architecture.md new file mode 100644 index 0000000..52c4374 --- /dev/null +++ b/playbook/architecture.md @@ -0,0 +1,62 @@ +# Arquitetura + +## Main process + +Responsabilidades: + +- autenticacao com GitHub +- chamadas a API do GitHub +- persistencia local +- watchers +- IPC entre Electron main e renderer + +Pastas relevantes: + +- `src/main/github/` +- `src/main/ipc/` +- `src/main/tasks/` +- `src/main/parser/` +- `src/main/watcher/` + +## Renderer + +Responsabilidades: + +- interface visual +- backlog +- board +- modal de task +- feedback de conflito e sync + +Pastas relevantes: + +- `src/renderer/pages/` +- `src/renderer/components/` + +## Arquivos mais importantes para implementacao + +### Backend + +- `src/main/ipc/contracts.js` +- `src/main/ipc/handlers.js` +- `src/main/github/client.js` +- `src/main/tasks/local-repo.js` +- `src/main/watcher/poller.js` +- `src/main/parser/index.js` + +### Frontend + +- `src/renderer/pages/KanbanPage.jsx` +- `src/renderer/pages/RepoSelectPage.jsx` +- `src/renderer/components/TaskModal.jsx` +- `src/renderer/components/TaskCard.jsx` + +## Regra arquitetural + +Se uma mudanca estrutural for proposta, ela deve preservar: + +- edicao de `tasks.md` com o app aberto +- sync com GitHub +- backlog e board no mesmo modelo +- branch `tasks` +- atribuicao por colaboradores do GitHub diff --git a/playbook/data-model.md b/playbook/data-model.md new file mode 100644 index 0000000..202be21 --- /dev/null +++ b/playbook/data-model.md @@ -0,0 +1,63 @@ +# Modelo de Dados + +## Fonte de verdade + +O estado funcional das tarefas e o conteudo de `tasks.md`. + +Durante o uso do app: + +- o app trabalha primeiro no estado local +- persiste localmente +- sincroniza com a branch `tasks` quando necessario + +## Formato esperado de task + +Cada task pode incluir: + +- `id` +- `title` +- `status` +- `description` +- `priority` +- `labels` +- `cardType` +- `assignee` +- `subtasks` + +Status suportados: + +- `backlog` +- `pending` +- `in_progress` +- `done` + +## Exemplo + +```md +- [ ] Melhorar sync remoto + - [ ] Adicionar botao de puxar remoto + - [ ] Exibir conflito quando houver dirty local + - [ ] Permitir mesclar antes do sync +``` + +## Regras de atualizacao + +Quando um agente alterar `tasks.md`, ele deve: + +1. preservar o que ja existe quando possivel +2. atualizar apenas o necessario +3. manter descricoes curtas e acionaveis +4. evitar tarefas gigantes sem subtarefas +5. adicionar trabalho novo no backlog quando fizer sentido +6. marcar progresso de forma incremental + +## Parser + +O parser: + +- le markdown +- extrai metadata inline +- converte para JSON interno +- permite round-trip de volta para markdown + +Qualquer alteracao na estrutura do arquivo precisa respeitar esse round-trip. diff --git a/playbook/ipc.md b/playbook/ipc.md new file mode 100644 index 0000000..c314843 --- /dev/null +++ b/playbook/ipc.md @@ -0,0 +1,47 @@ +# IPC + +## Papel do IPC no produto + +O IPC e a ponte entre a UI e o processo principal do Electron. + +Ele e responsavel por expor: + +- login com GitHub +- leitura e escrita de tasks +- sync remoto +- validacao de repo local +- estado de sessao + +## Canais principais + +- `github:login` +- `github:repos` +- `github:repo-collaborators` +- `repo:pick-local-path` +- `repo:open-tasks-file` +- `repo:validate-local-path` +- `tasks:load` +- `tasks:init` +- `tasks:cache` +- `tasks:pull` +- `tasks:save` +- `session:get` +- `session:clear` + +## Eventos principais + +- `github:auth-success` +- `github:auth-error` +- `tasks:external-update` +- `tasks:remote-conflict` +- `tasks:local-file-update` +- `tasks:local-file-conflict` + +## Regra de implementacao + +Toda mudanca de contrato deve manter compatibilidade entre: + +- backend Electron +- preload +- renderer +- testes de smoke diff --git a/playbook/mcp.md b/playbook/mcp.md new file mode 100644 index 0000000..e903188 --- /dev/null +++ b/playbook/mcp.md @@ -0,0 +1,26 @@ +# MCP + +## Objetivo futuro + +Se o CodeSprint ganhar um MCP, ele deve expor o contexto operacional do fluxo de tasks sem obrigar a IA a inferir o estado do produto. + +## Recursos minimos + +- repo ativo +- branch `tasks` +- leitura de `tasks.md` +- escrita local em `tasks.md` +- `tasks:pull` +- `tasks:save` +- lista de colaboradores +- estado dirty local +- conflitos remoto/local + +## Beneficio esperado + +Um MCP do CodeSprint deve permitir que a IA: + +- entenda o backlog atual +- atualize tasks sem quebrar o formato +- opere com contexto real do repo +- respeite o fluxo local-first e os conflitos do produto diff --git a/playbook/parser.md b/playbook/parser.md new file mode 100644 index 0000000..92aa7da --- /dev/null +++ b/playbook/parser.md @@ -0,0 +1,30 @@ +# Parser + +## Papel do parser + +O parser converte `tasks.md` em estrutura JSON interna e depois reconstrui markdown sem perder consistencia. + +## Requisitos + +- preservar round-trip +- preservar metadata inline +- suportar subtarefas +- respeitar status de backlog e board + +## Campos relevantes + +- `status` +- `description` +- `priority` +- `labels` +- `cardType` +- `assignee` + +## Regra critica + +Se o parser mudar, o formato do `tasks.md` precisa continuar legivel e estavel para: + +- app +- VS Code +- agentes de IA +- sync remoto diff --git a/playbook/playbooks.md b/playbook/playbooks.md new file mode 100644 index 0000000..894acd8 --- /dev/null +++ b/playbook/playbooks.md @@ -0,0 +1,48 @@ +# Playbooks + +## Como um agente deve trabalhar neste projeto + +### Antes de implementar + +1. Ler `tasks.md` +2. Entender se a entrega ja existe no backlog ou board +3. Conferir o fluxo atual no app antes de redesenhar comportamento +4. Preservar o modelo local-first +5. Evitar propor "solucao magica" que sobrescreva estado do usuario + +### Durante a implementacao + +1. Alterar apenas o necessario +2. Preservar metadados existentes +3. Manter formato parseavel +4. Nao misturar codigo com a branch `tasks` + +### Depois da implementacao + +1. Validar se a task ficou coerente +2. Manter backlog e board consistentes +3. Evitar lixo de teste ou placeholders sem sentido + +## Anti-padroes + +Um agente nao deve: + +- apagar tasks existentes sem motivo claro +- reescrever todo `tasks.md` por conveniencia +- alterar o parser sem considerar round-trip +- criar automacoes que sobrescrevam estado local silenciosamente +- assumir que backlog e board sao estruturas separadas + +## Futuro MCP + +Se este projeto ganhar um MCP no futuro, ele deve expor pelo menos: + +- repo ativo +- branch `tasks` +- leitura de `tasks.md` +- escrita local em `tasks.md` +- `tasks:pull` +- `tasks:save` +- lista de colaboradores +- estado de dirty local +- conflitos remoto/local diff --git a/playbook/product.md b/playbook/product.md new file mode 100644 index 0000000..62c88bd --- /dev/null +++ b/playbook/product.md @@ -0,0 +1,37 @@ +# Produto + +## O que e o CodeSprint + +CodeSprint e um app desktop em Electron com interface React para organizar trabalho tecnico em cima de um repositorio GitHub real. + +O produto usa: + +- `tasks.md` como fonte de verdade das tarefas +- uma branch dedicada `tasks` para sincronizacao de planejamento +- um fluxo local-first para edicao e revisao +- backlog e board como visualizacoes da mesma base de dados + +## Principio central + +O backlog nao deve ficar separado do repositorio. + +Por isso, o produto trata o arquivo `tasks.md` como uma camada de planejamento versionada, editavel tanto pelo app quanto por ferramentas externas como VS Code e agentes de IA. + +## Modelo mental + +Existe um unico conjunto de tasks. + +Esse conjunto pode ser visto de duas formas: + +- `Backlog`: tasks com `status: "backlog"` +- `Board`: tasks com status de execucao, como `pending`, `in_progress` e `done` + +Backlog e board nao sao estruturas separadas. Sao filtros sobre o mesmo modelo. + +## Invariantes de produto + +1. `tasks.md` continua sendo a fonte de verdade funcional. +2. backlog continua sendo `status: "backlog"`. +3. board continua sendo derivado dos outros status. +4. o usuario pode editar `tasks.md` com o app aberto. +5. o app nunca deve sobrescrever trabalho local silenciosamente. diff --git a/playbook/sync.md b/playbook/sync.md new file mode 100644 index 0000000..2df939d --- /dev/null +++ b/playbook/sync.md @@ -0,0 +1,54 @@ +# Sync + +## Branch dedicada + +Nome da branch: + +- `tasks` + +Finalidade: + +- armazenar apenas os arquivos de planejamento +- evitar poluir a `main` com commits constantes de tarefas +- separar codigo do produto e camada de planejamento + +## Arquivos sincronizados na branch `tasks` + +- `tasks.md` +- `playbook/README.md` +- `playbook/product.md` +- `playbook/architecture.md` +- `playbook/data-model.md` +- `playbook/sync.md` +- `playbook/ui.md` +- `playbook/playbooks.md` + +## Fluxos suportados + +- `tasks:cache`: salva localmente +- `tasks:save`: envia para GitHub +- `tasks:pull`: busca remoto +- `tasks:external-update`: remoto mudou e pode ser aplicado +- `tasks:remote-conflict`: remoto mudou mas ha alteracoes locais +- `tasks:local-file-update`: arquivo local mudou por fora +- `tasks:local-file-conflict`: arquivo local mudou por fora mas ha alteracoes locais + +## Regras de conflito + +Quando existir concorrencia entre local e remoto: + +- nao sobrescrever silenciosamente +- oferecer manter local +- oferecer carregar remoto +- oferecer mesclar + +## Regras de merge + +O merge atual deve: + +- preservar o que foi editado localmente +- adicionar tasks remotas novas +- adicionar subtarefas remotas ausentes +- manter labels relevantes de ambos os lados + +Se esse merge evoluir, a prioridade continua sendo previsibilidade, nao automacao opaca. diff --git a/playbook/ui.md b/playbook/ui.md new file mode 100644 index 0000000..05d08f0 --- /dev/null +++ b/playbook/ui.md @@ -0,0 +1,43 @@ +# UI + +## Selecao de repositorio + +A tela deve: + +- listar repositorios do GitHub +- permitir vincular clone local +- validar se a pasta corresponde ao repo escolhido +- carregar o repo com branch `tasks` + +## Header + +O header do board deve indicar: + +- repo ativo +- modo local +- branch de tasks +- arquivos gerenciados na branch `tasks` + +## Backlog + +O backlog deve: + +- mostrar somente tasks com `status: "backlog"` +- permitir filtros +- permitir enviar task para o board + +## Board + +O board deve: + +- mostrar tasks com status de execucao +- suportar drag and drop +- permitir mover task de volta para backlog + +## Conflitos + +Ao detectar concorrencia, a UI deve oferecer: + +- manter local +- carregar remoto +- mesclar 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 8102cb4..0000000 Binary files a/public/logodoapp.png and /dev/null differ 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 cc51a3d..0000000 Binary files a/src/assets/hero.png and /dev/null differ 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 - /> -
- -
- -