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 (
-
-
-
- Nome
- setName(e.target.value)}
- autoFocus
- />
-
-
-
-
-
Ăcone
-
- {PRESET_ICONS.map((i) => (
- setIcon(i)}
- >
- {i}
-
- ))}
-
-
-
-
-
Cor
-
- {PRESET_COLORS.map((c) => (
- setColor(c)}
- />
- ))}
- setColor(e.target.value)}
- />
-
-
-
-
-
- {icon}
- {name || "Preview"}
-
-
-
-
-
- Cancelar
-
-
- name.trim() && onSave({ name: name.trim(), icon, color })
- }
- disabled={!name.trim()}
- >
- Salvar
-
-
-
- );
-}
-
-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}
-
-
- setEditingId(type.id)}
- >
- Editar
-
- deleteType(type.id)}
- >
- â
-
-
-
- )}
-
- ))}
- {customTypes.length === 0 && (
-
Nenhum tipo customizado ainda
- )}
-
-
-
- {adding ? (
-
{
- addType(type);
- setAdding(false);
- }}
- onCancel={() => setAdding(false)}
- />
- ) : (
- setAdding(true)}>
- + Novo tipo
-
- )}
-
-
- );
-}
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) => (
- setColor(c)}
- />
- ))}
- setColor(e.target.value)}
- />
-
-
-
- {label || "Preview"}
-
-
-
- Cancelar
-
- label.trim() && onSave({ label: label.trim(), color })}
- disabled={!label.trim()}
- >
- Salvar
-
-
-
- );
-}
-
-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}
-
-
setEditingId(col.id)}
- >
- Editar
-
-
- )}
-
- ))}
-
-
-
-
-
Colunas customizadas
-
- {customCols.map((col) => (
-
- {editingId === col.id ? (
-
{
- editColumn(col.id, changes);
- setEditingId(null);
- }}
- onCancel={() => setEditingId(null)}
- />
- ) : (
-
-
-
- {col.label}
-
-
- setEditingId(col.id)}
- >
- Editar
-
- deleteColumn(col.id)}
- >
- â
-
-
-
- )}
-
- ))}
- {customCols.length === 0 && (
-
Nenhuma coluna customizada ainda
- )}
-
-
-
- {adding ? (
-
{
- addColumn(col);
- setAdding(false);
- }}
- onCancel={() => setAdding(false)}
- />
- ) : (
- setAdding(true)}>
- + Nova coluna
-
- )}
-
-
- );
-}
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) => (
- setColor(c)}
- />
- ))}
- setColor(e.target.value)}
- title="Cor personalizada"
- />
-
-
- setBold(e.target.checked)}
- />
- Negrito
-
-
-
- {name || "Preview"}
-
-
-
-
- Cancelar
-
-
- name.trim() && onSave({ name: name.trim(), color, bold })
- }
- disabled={!name.trim()}
- >
- Salvar
-
-
-
- );
-}
-
-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}
-
-
- setEditingId(flag.id)}
- >
- Editar
-
- deleteFlag(flag.id)}
- >
- â
-
-
-
- )}
-
- ))}
- {customFlags.length === 0 && (
-
Nenhuma flag customizada ainda
- )}
-
-
-
- {adding ? (
-
{
- addFlag(flag);
- setAdding(false);
- }}
- onCancel={() => setAdding(false)}
- />
- ) : (
- setAdding(true)}>
- + Nova flag
-
- )}
-
-
- );
-}
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 && (
-
- )}
-
- {priority && (
-
-
Prioridade:
-
-
- {priority.label}
-
-
-
- )}
-
- {taskLabels.length > 0 && (
-
-
Etiquetas:
-
- {taskLabels.map((f) => (
-
- {f.name}
-
- ))}
-
-
- )}
-
- {subtasksTotal > 0 && (
-
-
-
- {subtasksDone}/{subtasksTotal} subtasks
-
-
- {task.subtasks.map((sub) => (
- handleSubtaskClick(e, sub.id)}
- >
-
- {sub.status === "done" ? "â" : ""}
-
-
- {sub.title}
-
-
- ))}
-
-
- )}
-
- {primaryActionLabel && onPrimaryAction && (
-
- {primaryActionLabel}
-
- )}
-
- );
-}
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"}
-
-
- x
-
-
-
-
-
-
- Tipo
- setShowTypesManager(true)}
- >
- + Gerenciar
-
-
-
- {allTypes.map((t) => (
- setCardType(t.id)}
- >
- {t.icon} {t.name}
-
- ))}
-
-
-
-
-
Destino
-
- setStatus("backlog")}
- >
- Backlog
-
- {columns.map((column) => (
- setStatus(column.id)}
- >
- {column.label}
-
- ))}
-
-
-
-
- Titulo
- setTitle(e.target.value)}
- autoFocus
- />
-
-
-
- Descricao
-
-
-
-
Responsavel
-
setAssigneeSearch(e.target.value)}
- disabled={isLoadingCollaborators}
- />
-
-
setAssignee("")}
- disabled={isLoadingCollaborators}
- >
- -
-
- Sem responsavel
-
-
- {filteredAssigneeOptions.map((collaborator) => (
-
setAssignee(collaborator.login)}
- disabled={isLoadingCollaborators}
- >
- {collaborator.avatarUrl ? (
-
- ) : (
-
- {(collaborator.name || collaborator.login)
- .charAt(0)
- .toUpperCase()}
-
- )}
-
-
- {collaborator.name || collaborator.login}
-
-
- @{collaborator.login}
-
-
-
- ))}
-
-
- {isLoadingCollaborators
- ? "Carregando pessoas do repositorio..."
- : "Quem vai executar essa task."}
-
- {collaboratorsError && (
-
{collaboratorsError}
- )}
- {!isLoadingCollaborators &&
- !collaboratorsError &&
- filteredAssigneeOptions.length === 0 && (
-
- Nenhuma pessoa encontrada para essa busca.
-
- )}
- {!collaboratorsError &&
- collaborators.length > 0 &&
- activeRepo?.owner &&
- activeRepo?.repo && (
-
- Lista carregada de {activeRepo.owner}/{activeRepo.repo}.
-
- )}
-
-
-
-
Prioridade
-
- {PRIORITY_OPTIONS.map((p) => (
-
- setPriority(priority === p.value ? "" : p.value)
- }
- >
- {p.label}
-
- ))}
-
-
-
-
-
- Etiquetas
- setShowFlagsManager(true)}
- >
- + Gerenciar
-
-
-
- {allFlags.map((f) => (
- toggleLabel(f.id)}
- >
- {f.name}
-
- ))}
-
-
-
-
-
Subtasks
-
- {subtasks.map((sub, i) => (
-
- handleSubtaskChange(i, e.target.value)}
- />
- handleRemoveSubtask(i)}
- >
- x
-
-
- ))}
-
-
- + Adicionar subtask
-
-
-
-
-
-
- Cancelar
-
-
- {isEditing ? "Salvar alteracoes" : "Criar task"}
-
-
-
-
-
- {showFlagsManager && (
- setShowFlagsManager(false)} />
- )}
- {showTypesManager && (
- setShowTypesManager(false)} />
- )}
- >
- );
-}
diff --git a/src/renderer/components/TaskModal.module.css b/src/renderer/components/TaskModal.module.css
deleted file mode 100644
index 35477e5..0000000
--- a/src/renderer/components/TaskModal.module.css
+++ /dev/null
@@ -1,332 +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;
- padding: var(--space-4);
-}
-
-.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: 560px;
- max-height: calc(100vh - 2 * var(--space-4));
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
-}
-
-.modalBody {
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
- overflow-y: auto;
- padding-right: var(--space-1);
-}
-
-.modalHeader {
- display: flex;
- align-items: center;
- justify-content: space-between;
-}
-
-.modalTitle {
- 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;
- padding: var(--space-1);
- border-radius: var(--radius-sm);
- transition: color var(--duration-fast) var(--ease-default);
-}
-
-.btnClose:hover {
- color: var(--text-primary);
-}
-
-.field {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
-}
-
-.label {
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- color: var(--text-secondary);
-}
-
-.input {
- width: 100%;
- padding: var(--space-2) var(--space-3);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- background: var(--surface-overlay);
- border: 1px solid var(--color-graphite-mid);
- color: var(--text-primary);
-}
-
-.input:focus {
- border-color: var(--color-teal);
- outline: none;
-}
-
-.helperText {
- font-size: var(--text-xs);
- color: var(--text-muted);
-}
-
-.helperError {
- font-size: var(--text-xs);
- color: var(--color-danger);
-}
-
-.assigneeList {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
- max-height: 220px;
- overflow-y: auto;
- padding-right: var(--space-1);
-}
-
-.assigneeOption {
- display: flex;
- align-items: center;
- gap: var(--space-2);
- width: 100%;
- padding: var(--space-2) var(--space-3);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: var(--surface-overlay);
- text-align: left;
- color: var(--text-primary);
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.assigneeOption:hover:not(:disabled) {
- border-color: var(--color-teal);
-}
-
-.assigneeOptionActive {
- border-color: var(--color-teal);
- background: color-mix(in srgb, var(--color-teal) 12%, var(--surface-overlay));
-}
-
-.assigneeOption:disabled {
- opacity: 0.6;
- cursor: not-allowed;
-}
-
-.assigneeAvatar,
-.assigneeFallback {
- width: 32px;
- height: 32px;
- 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);
-}
-
-.assigneeMeta {
- 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);
-}
-
-.subtaskList {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
-}
-
-.subtaskRow {
- display: flex;
- gap: var(--space-2);
- align-items: center;
-}
-
-.btnRemove {
- font-size: var(--text-xs);
- color: var(--text-muted);
- background: transparent;
- border: none;
- padding: var(--space-1);
- flex-shrink: 0;
- transition: color var(--duration-fast) var(--ease-default);
-}
-
-.btnRemove:hover {
- color: var(--color-danger);
-}
-
-.btnAddSubtask {
- 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%;
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.btnAddSubtask:hover {
- border-color: var(--color-teal);
- background: var(--surface-overlay);
-}
-
-.modalFooter {
- display: flex;
- justify-content: flex-end;
- gap: var(--space-3);
- margin-top: var(--space-2);
- position: sticky;
- bottom: 0;
- background: var(--surface-card);
- padding-top: var(--space-3);
- border-top: 1px solid var(--color-graphite-mid);
-}
-
-.btnCancel {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: transparent;
- color: var(--text-muted);
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.btnCancel:hover {
- color: var(--text-primary);
- border-color: var(--text-muted);
-}
-
-.btnSave {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- background: var(--color-teal-dark);
- color: var(--text-on-brand);
- border: none;
- 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;
-}
-
-.textarea {
- width: 100%;
- padding: var(--space-2) var(--space-3);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- background: var(--surface-overlay);
- border: 1px solid var(--color-graphite-mid);
- color: var(--text-primary);
- resize: vertical;
- font-family: var(--font-sans);
- line-height: var(--leading-relaxed);
-}
-
-.textarea:focus {
- border-color: var(--color-teal);
- outline: none;
-}
-
-.flagRow {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-2);
-}
-
-.flagBtn {
- font-size: var(--text-xs);
- font-weight: var(--font-medium);
- padding: 3px 10px;
- border-radius: var(--radius-full);
- border: 1px solid var(--flag-color);
- background: transparent;
- color: var(--flag-color);
- cursor: pointer;
- transition: all var(--duration-fast) var(--ease-default);
- font-family: var(--font-sans);
-}
-
-.flagBtn:hover {
- background: var(--flag-color);
- color: #fff;
-}
-
-.flagBtnActive {
- background: var(--flag-color);
- color: #fff;
-}
-
-.labelRow {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: var(--space-2);
-}
-
-.btnAddFlag {
- font-size: var(--text-xs);
- color: var(--color-teal);
- background: transparent;
- border: 1px dashed var(--color-teal);
- border-radius: var(--radius-full);
- padding: 2px 10px;
- cursor: pointer;
- transition: all var(--duration-fast) var(--ease-default);
- font-family: var(--font-sans);
-}
-
-.btnAddFlag:hover {
- background: var(--color-teal-dark);
- color: var(--color-white);
- border-style: solid;
-}
diff --git a/src/renderer/components/Toast.jsx b/src/renderer/components/Toast.jsx
deleted file mode 100644
index 2b1f5d3..0000000
--- a/src/renderer/components/Toast.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useEffect } from "react";
-import styles from "./Toast.module.css";
-
-export default function Toast({ message, type = "info", onClose }) {
- useEffect(() => {
- const timer = setTimeout(onClose, 4000);
- return () => clearTimeout(timer);
- }, [onClose]);
-
- return (
-
- {message}
-
- â
-
-
- );
-}
diff --git a/src/renderer/components/Toast.module.css b/src/renderer/components/Toast.module.css
deleted file mode 100644
index 2077285..0000000
--- a/src/renderer/components/Toast.module.css
+++ /dev/null
@@ -1,69 +0,0 @@
-.toast {
- position: fixed;
- bottom: var(--space-6);
- right: var(--space-6);
- display: flex;
- align-items: center;
- gap: var(--space-3);
- padding: var(--space-3) var(--space-4);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- z-index: 200;
- animation: slideIn var(--duration-base) var(--ease-default);
- max-width: 360px;
- border: 1px solid transparent;
-}
-
-@keyframes slideIn {
- from {
- transform: translateY(20px);
- opacity: 0;
- }
- to {
- transform: translateY(0);
- opacity: 1;
- }
-}
-
-.info {
- background: var(--surface-card);
- border-color: var(--color-graphite-mid);
- color: var(--text-primary);
-}
-
-.success {
- background: var(--surface-card);
- border-color: var(--color-teal);
- color: var(--color-teal-light);
-}
-
-.warning {
- background: var(--surface-card);
- border-color: var(--color-warning);
- color: var(--color-warning);
-}
-
-.error {
- background: var(--surface-card);
- border-color: var(--color-danger);
- color: var(--color-danger);
-}
-
-.message {
- flex: 1;
- line-height: var(--leading-base);
-}
-
-.btnClose {
- font-size: var(--text-xs);
- color: var(--text-muted);
- background: transparent;
- border: none;
- padding: 2px;
- flex-shrink: 0;
- transition: color var(--duration-fast) var(--ease-default);
-}
-
-.btnClose:hover {
- color: var(--text-primary);
-}
diff --git a/src/renderer/context/CardTypesContext.jsx b/src/renderer/context/CardTypesContext.jsx
deleted file mode 100644
index 9dc0336..0000000
--- a/src/renderer/context/CardTypesContext.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { createContext, useContext, useState } from "react";
-
-const SYSTEM_CARD_TYPES = [
- { id: "task", name: "Task", icon: "â", color: "#005F73", isSystem: true },
- { id: "bug", name: "Bug", icon: "â ", color: "#C0392B", isSystem: true },
- {
- id: "story",
- name: "HistĂłria",
- icon: "đ",
- color: "#8B5CF6",
- isSystem: true,
- },
- { id: "spike", name: "Spike", icon: "đ", color: "#B45309", isSystem: true },
- {
- id: "blocker",
- name: "Blocker",
- icon: "đ«",
- color: "#E85D24",
- isSystem: true,
- },
- { id: "epic", name: "Epic", icon: "âĄ", color: "#0EA5E9", isSystem: true },
-];
-
-function loadCustomTypes() {
- try {
- const saved = localStorage.getItem("codesprint:card-types");
- return saved ? JSON.parse(saved) : [];
- } catch {
- return [];
- }
-}
-
-function saveCustomTypes(types) {
- localStorage.setItem("codesprint:card-types", JSON.stringify(types));
-}
-
-const CardTypesContext = createContext(null);
-
-export function CardTypesProvider({ children }) {
- const [customTypes, setCustomTypes] = useState(loadCustomTypes);
-
- const allTypes = [...SYSTEM_CARD_TYPES, ...customTypes];
-
- const updateCustomTypes = (updated) => {
- setCustomTypes(updated);
- saveCustomTypes(updated);
- };
-
- const addType = (type) => {
- const newType = {
- id: `type-${Date.now()}`,
- name: type.name,
- icon: type.icon,
- color: type.color,
- isSystem: false,
- };
- updateCustomTypes([...customTypes, newType]);
- };
-
- const editType = (id, changes) => {
- updateCustomTypes(
- customTypes.map((t) => (t.id === id ? { ...t, ...changes } : t)),
- );
- };
-
- const deleteType = (id) => {
- updateCustomTypes(customTypes.filter((t) => t.id !== id));
- };
-
- return (
-
- {children}
-
- );
-}
-
-export function useCardTypes() {
- return useContext(CardTypesContext);
-}
diff --git a/src/renderer/context/ColumnsContext.jsx b/src/renderer/context/ColumnsContext.jsx
deleted file mode 100644
index 07b843c..0000000
--- a/src/renderer/context/ColumnsContext.jsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { createContext, useContext, useState } from "react";
-
-const DEFAULT_COLUMNS = [
- { id: "pending", label: "Pendente", color: "#4F4F4F", isSystem: true },
- {
- id: "in_progress",
- label: "Em andamento",
- color: "#00A676",
- isSystem: true,
- },
- { id: "done", label: "ConcluĂdo", color: "#94D2BD", isSystem: true },
-];
-
-function loadColumns() {
- try {
- const saved = localStorage.getItem("codesprint:columns");
- return saved ? JSON.parse(saved) : DEFAULT_COLUMNS;
- } catch {
- return DEFAULT_COLUMNS;
- }
-}
-
-function saveColumns(columns) {
- localStorage.setItem("codesprint:columns", JSON.stringify(columns));
-}
-
-const ColumnsContext = createContext(null);
-
-export function ColumnsProvider({ children }) {
- const [columns, setColumns] = useState(loadColumns);
-
- const updateColumns = (updated) => {
- setColumns(updated);
- saveColumns(updated);
- };
-
- const addColumn = (col) => {
- const newCol = {
- id: `col-${Date.now()}`,
- label: col.label,
- color: col.color,
- isSystem: false,
- };
- updateColumns([...columns, newCol]);
- };
-
- const editColumn = (id, changes) => {
- updateColumns(columns.map((c) => (c.id === id ? { ...c, ...changes } : c)));
- };
-
- const deleteColumn = (id) => {
- updateColumns(columns.filter((c) => c.id !== id));
- };
-
- return (
-
- {children}
-
- );
-}
-
-export function useColumns() {
- return useContext(ColumnsContext);
-}
diff --git a/src/renderer/context/FlagsContext.jsx b/src/renderer/context/FlagsContext.jsx
deleted file mode 100644
index 265a4b0..0000000
--- a/src/renderer/context/FlagsContext.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { createContext, useContext, useState } from "react";
-
-const SYSTEM_FLAGS = [
- { id: "bug", name: "Bug", color: "#C0392B", bold: false, isSystem: true },
- {
- id: "feature",
- name: "Feature",
- color: "#005F73",
- bold: false,
- isSystem: true,
- },
- {
- id: "urgente",
- name: "Urgente",
- color: "#E85D24",
- bold: true,
- isSystem: true,
- },
- {
- id: "melhoria",
- name: "Melhoria",
- color: "#00A676",
- bold: false,
- isSystem: true,
- },
- { id: "docs", name: "Docs", color: "#758956", bold: false, isSystem: true },
- { id: "teste", name: "Teste", color: "#2B2D42", bold: false, isSystem: true },
-];
-
-function loadCustomFlags() {
- try {
- const saved = localStorage.getItem("codesprint:custom-flags");
- return saved ? JSON.parse(saved) : [];
- } catch {
- return [];
- }
-}
-
-function saveCustomFlags(flags) {
- localStorage.setItem("codesprint:custom-flags", JSON.stringify(flags));
-}
-
-const FlagsContext = createContext(null);
-
-export function FlagsProvider({ children }) {
- const [customFlags, setCustomFlags] = useState(loadCustomFlags);
-
- const allFlags = [...SYSTEM_FLAGS, ...customFlags];
-
- const updateCustomFlags = (updated) => {
- setCustomFlags(updated);
- saveCustomFlags(updated);
- };
-
- const addFlag = (flag) => {
- const newFlag = {
- id: `flag-${Date.now()}`,
- name: flag.name,
- color: flag.color,
- bold: flag.bold || false,
- isSystem: false,
- };
- updateCustomFlags([...customFlags, newFlag]);
- };
-
- const editFlag = (id, changes) => {
- updateCustomFlags(
- customFlags.map((f) => (f.id === id ? { ...f, ...changes } : f)),
- );
- };
-
- const deleteFlag = (id) => {
- updateCustomFlags(customFlags.filter((f) => f.id !== id));
- };
-
- return (
-
- {children}
-
- );
-}
-
-export function useFlags() {
- return useContext(FlagsContext);
-}
diff --git a/src/renderer/index.css b/src/renderer/index.css
deleted file mode 100644
index 2dbe97d..0000000
--- a/src/renderer/index.css
+++ /dev/null
@@ -1,11 +0,0 @@
-* {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
- background: #0d1117;
- color: #e6edf3;
-}
diff --git a/src/renderer/index.html b/src/renderer/index.html
deleted file mode 100644
index 6fd29d8..0000000
--- a/src/renderer/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
- CodeSprint
-
-
-
-
-
-
-
diff --git a/src/renderer/logo.svg b/src/renderer/logo.svg
deleted file mode 100644
index 00c3f1a..0000000
--- a/src/renderer/logo.svg
+++ /dev/null
@@ -1,1757 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/renderer/main.jsx b/src/renderer/main.jsx
deleted file mode 100644
index 3bef48a..0000000
--- a/src/renderer/main.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from "react";
-import ReactDOM from "react-dom/client";
-import App from "./App";
-import { FlagsProvider } from "./context/FlagsContext";
-import { CardTypesProvider } from "./context/CardTypesContext";
-import { ColumnsProvider } from "./context/ColumnsContext";
-import "./styles/tokens.css";
-import "./styles/global.css";
-import "./index.css";
-
-ReactDOM.createRoot(document.getElementById("root")).render(
-
-
-
-
-
-
-
-
- ,
-);
diff --git a/src/renderer/pages/KanbanPage.jsx b/src/renderer/pages/KanbanPage.jsx
deleted file mode 100644
index c99747a..0000000
--- a/src/renderer/pages/KanbanPage.jsx
+++ /dev/null
@@ -1,713 +0,0 @@
-ï»żimport { useEffect, useMemo, useRef, useState } from "react";
-import {
- DndContext,
- DragOverlay,
- PointerSensor,
- useSensor,
- useSensors,
- closestCorners,
-} from "@dnd-kit/core";
-import { arrayMove } from "@dnd-kit/sortable";
-import KanbanColumn from "../components/KanbanColumn";
-import TaskCard from "../components/TaskCard";
-import TaskModal from "../components/TaskModal";
-import LoadingSpinner from "../components/LoadingSpinner";
-import styles from "./KanbanPage.module.css";
-import Toast from "../components/Toast";
-import logo from "../logo.svg";
-import { useColumns } from "../context/ColumnsContext";
-import { useFlags } from "../context/FlagsContext";
-import ColumnsManager from "../components/ColumnsManager";
-
-export default function KanbanPage({
- initialTasks = [],
- initialHasChanges = false,
- activeRepo,
- onTasksChange,
- onDirtyChange,
- onLogout,
- onChangeRepo,
-}) {
- const DEFAULT_BOARD_STATUS = "pending";
- const [tasks, setTasks] = useState(initialTasks);
- const [step, setStep] = useState("ready");
- const [error, setError] = useState("");
- const [activeTask, setActiveTask] = useState(null);
- const [showModal, setShowModal] = useState(false);
- const [editingTask, setEditingTask] = useState(null);
- const [toast, setToast] = useState(null);
- const [hasChanges, setHasChanges] = useState(initialHasChanges);
- const [collaborators, setCollaborators] = useState([]);
- const [incomingConflict, setIncomingConflict] = useState(null);
- const [activeView, setActiveView] = useState("board");
- const [backlogSearch, setBacklogSearch] = useState("");
- const [backlogPriority, setBacklogPriority] = useState("");
- const [backlogAssignee, setBacklogAssignee] = useState("");
- const [backlogLabel, setBacklogLabel] = useState("");
- const [backlogSort, setBacklogSort] = useState("priority");
- const tasksRef = useRef(initialTasks);
-
- const { columns } = useColumns();
- const { allFlags } = useFlags();
- const [showColumnsManager, setShowColumnsManager] = useState(false);
-
- const sensors = useSensors(
- useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
- );
-
- useEffect(() => {
- setTasks(initialTasks);
- tasksRef.current = initialTasks;
- setStep("ready");
- setHasChanges(initialHasChanges);
- }, [initialTasks, initialHasChanges]);
-
- useEffect(() => {
- tasksRef.current = tasks;
- onTasksChange?.(tasks);
- }, [tasks, onTasksChange]);
-
- useEffect(() => {
- onDirtyChange?.(hasChanges);
- }, [hasChanges, onDirtyChange]);
-
- useEffect(() => {
- const cleanup = window.electron.on(
- "tasks:external-update",
- (updatedTasks) => {
- setTasks(updatedTasks);
- setHasChanges(false);
- setIncomingConflict(null);
- setToast({
- message: "Tasks atualizadas pelo GitHub!",
- type: "success",
- });
- },
- );
-
- const cleanupConflict = window.electron.on(
- "tasks:remote-conflict",
- (incomingTasks) => {
- setIncomingConflict({ tasks: incomingTasks, source: "github" });
- setToast({
- message: "Mudanca remota detectada. Escolha manter local ou carregar remoto.",
- type: "warning",
- });
- },
- );
-
- const cleanupLocalUpdate = window.electron.on(
- "tasks:local-file-update",
- (updatedTasks) => {
- setTasks(updatedTasks);
- setHasChanges(false);
- setIncomingConflict(null);
- setToast({
- message: "Tasks atualizadas pelo arquivo local!",
- type: "success",
- });
- },
- );
-
- const cleanupLocalConflict = window.electron.on(
- "tasks:local-file-conflict",
- (incomingTasks) => {
- setIncomingConflict({ tasks: incomingTasks, source: "local" });
- setToast({
- message: "Mudanca detectada no tasks.md local. Escolha manter local ou carregar arquivo.",
- type: "warning",
- });
- },
- );
-
- return () => {
- cleanup?.();
- cleanupConflict?.();
- cleanupLocalUpdate?.();
- cleanupLocalConflict?.();
- };
- }, []);
-
- useEffect(() => {
- let isMounted = true;
-
- const loadCollaborators = async () => {
- if (!activeRepo?.owner || !activeRepo?.repo) {
- if (isMounted) {
- setCollaborators([]);
- }
- return;
- }
-
- try {
- const result = await window.electron.invoke("github:repo-collaborators");
-
- if (isMounted) {
- setCollaborators(Array.isArray(result) ? result : []);
- }
- } catch {
- if (isMounted) {
- setCollaborators([]);
- }
- }
- };
-
- loadCollaborators();
-
- return () => {
- isMounted = false;
- };
- }, [activeRepo?.owner, activeRepo?.repo]);
-
- const collaboratorsByLogin = useMemo(
- () =>
- collaborators.reduce((acc, collaborator) => {
- acc[collaborator.login] = collaborator;
- return acc;
- }, {}),
- [collaborators],
- );
-
- const persistTasksLocally = async (updatedTasks, dirty = true) => {
- try {
- await window.electron.invoke("tasks:cache", { tasks: updatedTasks, dirty });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const updateTasksLocally = (updatedTasks) => {
- setTasks(updatedTasks);
- setHasChanges(true);
- setIncomingConflict(null);
- persistTasksLocally(updatedTasks, true);
- };
-
- const handleSync = async () => {
- try {
- setStep("syncing");
- setError("");
- const result = await window.electron.invoke("tasks:save", {
- tasks: tasksRef.current,
- commitMessage: "chore: update tasks",
- });
- if (result?.tasks) {
- setTasks(result.tasks);
- }
- setStep("ready");
- setHasChanges(false);
- setIncomingConflict(null);
- setToast({ message: "Sincronizado com GitHub!", type: "success" });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const findColumn = (taskId) =>
- columns.find((col) =>
- tasks.find((t) => t.id === taskId && t.status === col.id),
- )?.id;
-
- const handleDragStart = ({ active }) => {
- setActiveTask(tasks.find((t) => t.id === active.id) || null);
- };
-
- const handleDragOver = ({ active, over }) => {
- if (!over) return;
- const activeCol = findColumn(active.id);
- const overCol =
- columns.find((c) => c.id === over.id)?.id || findColumn(over.id);
- if (!activeCol || !overCol || activeCol === overCol) return;
- updateTasksLocally(
- tasks.map((t) => (t.id === active.id ? { ...t, status: overCol } : t)),
- );
- };
-
- const handleDragEnd = ({ active, over }) => {
- setActiveTask(null);
- if (!over) return;
- const updated = [...tasks];
- const activeIndex = updated.findIndex((t) => t.id === active.id);
- const overIndex = updated.findIndex((t) => t.id === over.id);
- if (activeIndex !== -1 && overIndex !== -1 && activeIndex !== overIndex) {
- updateTasksLocally(arrayMove(updated, activeIndex, overIndex));
- }
- };
-
- const handleSubtaskToggle = (taskId, subtaskId) => {
- updateTasksLocally(
- tasks.map((task) => {
- if (task.id !== taskId) return task;
-
- return {
- ...task,
- subtasks: task.subtasks.map((subtask) =>
- subtask.id === subtaskId
- ? {
- ...subtask,
- status: subtask.status === "done" ? "pending" : "done",
- }
- : subtask,
- ),
- };
- }),
- );
- };
-
- const handleDeleteTask = (taskId) => {
- updateTasksLocally(tasks.filter((t) => t.id !== taskId));
- };
-
- const handleEditTask = (task) => setEditingTask(task);
-
- const handleSaveEdit = (updatedTask) => {
- updateTasksLocally(
- tasks.map((t) => (t.id === updatedTask.id ? updatedTask : t)),
- );
- setEditingTask(null);
- };
-
- const handleCreateTask = (newTask) => {
- updateTasksLocally([...tasks, newTask]);
- };
-
- const handleSendToBoard = (task) => {
- updateTasksLocally(
- tasks.map((item) =>
- item.id === task.id
- ? { ...item, status: columns[0]?.id || DEFAULT_BOARD_STATUS }
- : item,
- ),
- );
- setToast({ message: "Task enviada para o board.", type: "success" });
- };
-
- const handleMoveToBacklog = (task) => {
- updateTasksLocally(
- tasks.map((item) =>
- item.id === task.id ? { ...item, status: "backlog" } : item,
- ),
- );
- setToast({ message: "Task movida para o backlog.", type: "success" });
- };
-
- const handleInitializeTasks = async () => {
- try {
- setStep("syncing");
- setError("");
- const result = await window.electron.invoke("tasks:init", {
- force: true,
- });
- setTasks(result.tasks);
- setHasChanges(true);
- setIncomingConflict(null);
- setStep("ready");
- setToast({ message: "Backlog local recriado!", type: "success" });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const handleOpenTasksFile = async () => {
- try {
- setError("");
- await window.electron.invoke("repo:open-tasks-file");
- setToast({
- message: "tasks.md aberto no editor padrao.",
- type: "success",
- });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const handleLogout = async () => {
- await window.electron.invoke("session:clear");
- onLogout();
- };
-
- const handleKeepLocal = () => {
- setIncomingConflict(null);
- setToast({
- message: "Mantendo alteracoes locais. Faça sync quando estiver pronto.",
- type: "warning",
- });
- };
-
- const handleLoadRemote = async () => {
- if (!incomingConflict) return;
-
- try {
- setTasks(incomingConflict.tasks);
- setHasChanges(false);
- await persistTasksLocally(incomingConflict.tasks, false);
- setIncomingConflict(null);
- setToast({
- message:
- incomingConflict.source === "local"
- ? "Versao do arquivo local carregada no board."
- : "Versao remota carregada no cache local.",
- type: "success",
- });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const tasksByStatus = (status) => tasks.filter((t) => t.status === status);
- const backlogTasks = tasks.filter((task) => task.status === "backlog");
- const filteredBacklogTasks = useMemo(() => {
- const filtered = backlogTasks.filter((task) => {
- const query = backlogSearch.trim().toLowerCase();
- const matchesSearch =
- !query ||
- task.title.toLowerCase().includes(query) ||
- task.description?.toLowerCase().includes(query);
- const matchesPriority =
- !backlogPriority || task.priority === backlogPriority;
- const matchesAssignee =
- !backlogAssignee || task.assignee === backlogAssignee;
- const matchesLabel =
- !backlogLabel || task.labels?.includes(backlogLabel);
-
- return (
- matchesSearch && matchesPriority && matchesAssignee && matchesLabel
- );
- });
-
- const priorityWeight = { high: 0, medium: 1, low: 2, "": 3 };
-
- return [...filtered].sort((a, b) => {
- if (backlogSort === "priority") {
- return (
- (priorityWeight[a.priority || ""] ?? 9) -
- (priorityWeight[b.priority || ""] ?? 9)
- );
- }
-
- if (backlogSort === "assignee") {
- return (a.assignee || "").localeCompare(b.assignee || "");
- }
-
- if (backlogSort === "type") {
- return (a.cardType || "").localeCompare(b.cardType || "");
- }
-
- return a.title.localeCompare(b.title);
- });
- }, [
- backlogAssignee,
- backlogLabel,
- backlogPriority,
- backlogSearch,
- backlogSort,
- backlogTasks,
- ]);
- const storageModeLabel = activeRepo?.localPath ? "Repo local" : "Cache interno";
-
- return (
-
-
-
-
-
CodeSprint
- {activeRepo && (
- <>
-
- {activeRepo.owner}/{activeRepo.repo}
-
-
- {storageModeLabel}
-
- >
- )}
-
-
-
-
- setActiveView("board")}
- >
- Board
-
- setActiveView("backlog")}
- >
- Backlog
-
-
-
setShowModal(true)}
- >
- + Nova task
-
-
- Abrir tasks.md
-
-
- Trocar repo
-
-
setShowColumnsManager(true)}
- >
- Colunas
-
-
-
-
- {step === "error" && (
- {error}
- )}
-
- {step === "syncing" ? (
- <>
- Sincronizando...
- >
- ) : hasChanges ? (
- "Sync"
- ) : (
- "Sincronizado"
- )}
-
-
- Sair
-
-
-
-
- {incomingConflict && (
-
-
- {incomingConflict.source === "local"
- ? "O arquivo tasks.md local mudou fora do app e voce tem mudancas locais pendentes."
- : "Existe uma versao mais nova no GitHub e voce tem mudancas locais pendentes."}
-
-
-
- Manter local
-
-
- {incomingConflict.source === "local"
- ? "Carregar arquivo"
- : "Carregar remoto"}
-
-
-
- )}
-
- {step === "loading" ? (
-
-
-
Carregando tasks...
-
- ) : tasks.length === 0 ? (
-
-
Nenhuma task no backlog
-
- Esse repositorio esta sem tasks no momento. Voce pode criar uma task
- nova agora ou recriar o tasks.md inicial com o modelo
- padrao. Se preferir, abra o arquivo no VS Code e edite por la com o
- app aberto.
-
-
- setShowModal(true)}
- >
- + Nova task
-
-
- {step === "syncing"
- ? "Recriando backlog..."
- : "Recriar tasks.md inicial"}
-
-
- Abrir tasks.md
-
-
- {step === "error" &&
{error}
}
-
- ) : activeView === "board" ? (
-
-
- {columns.map((col) => (
-
- ))}
-
-
- {activeTask && (
- {}}
- />
- )}
-
-
- ) : (
-
-
-
Backlog
-
-
- {filteredBacklogTasks.length}/{backlogTasks.length} items
-
-
- Abrir tasks.md
-
-
-
-
- setBacklogSearch(e.target.value)}
- />
- setBacklogPriority(e.target.value)}
- >
- Todas prioridades
- Alta
- Media
- Baixa
-
- setBacklogAssignee(e.target.value)}
- >
- Todos responsaveis
- {collaborators.map((collaborator) => (
-
- {collaborator.name || collaborator.login}
-
- ))}
-
- setBacklogLabel(e.target.value)}
- >
- Todas etiquetas
- {allFlags.map((flag) => (
-
- {flag.name}
-
- ))}
-
- setBacklogSort(e.target.value)}
- >
- Ordenar por prioridade
- Ordenar por responsavel
- Ordenar por tipo
- Ordenar por titulo
-
-
- {backlogTasks.length === 0 ? (
-
- Nenhuma task no backlog. Crie uma nova task aqui ou mova algo do fluxo para backlog.
-
- ) : filteredBacklogTasks.length === 0 ? (
-
- Nenhuma task corresponde aos filtros atuais.
-
- ) : (
-
- {filteredBacklogTasks.map((task) => (
-
- ))}
-
- )}
-
- )}
-
- {showModal && (
-
setShowModal(false)}
- />
- )}
- {editingTask && (
- setEditingTask(null)}
- />
- )}
- {toast && (
- setToast(null)}
- />
- )}
- {showColumnsManager && (
- setShowColumnsManager(false)} />
- )}
-
- );
-}
diff --git a/src/renderer/pages/KanbanPage.module.css b/src/renderer/pages/KanbanPage.module.css
deleted file mode 100644
index 45170b4..0000000
--- a/src/renderer/pages/KanbanPage.module.css
+++ /dev/null
@@ -1,356 +0,0 @@
-.container {
- display: flex;
- flex-direction: column;
- height: 100vh;
- background: var(--surface-page);
- overflow: hidden;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: var(--space-2) var(--space-6);
- border-bottom: 1px solid var(--color-graphite-mid);
- background: var(--surface-card);
- flex-shrink: 0;
-}
-
-.headerLeft {
- display: flex;
- align-items: center;
- gap: var(--space-3);
-}
-
-.appName {
- font-size: var(--text-lg);
- font-weight: var(--font-semibold);
- color: var(--text-primary);
-}
-
-.repoBadge {
- font-size: var(--text-xs);
- color: var(--text-muted);
- border: 1px solid var(--color-graphite-mid);
- border-radius: 999px;
- padding: 6px 10px;
-}
-
-.storageBadge {
- font-size: var(--text-xs);
- color: var(--color-teal);
- border: 1px solid color-mix(in srgb, var(--color-teal) 45%, var(--color-graphite-mid));
- border-radius: 999px;
- padding: 6px 10px;
- background: color-mix(in srgb, var(--color-teal) 10%, transparent);
-}
-
-.headerRight {
- display: flex;
- align-items: center;
- gap: var(--space-4);
-}
-
-.savingWrap {
- display: flex;
- align-items: center;
- gap: var(--space-2);
-}
-
-.savingText {
- font-size: var(--text-sm);
- color: var(--text-muted);
-}
-
-.errorText {
- font-size: var(--text-sm);
- color: var(--color-danger);
- max-width: 300px;
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
-}
-
-.btnLogout {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: transparent;
- color: var(--text-muted);
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.btnLogout:hover {
- border-color: var(--color-danger);
- color: var(--color-danger);
-}
-
-.btnPrimary {
- padding: var(--space-3) var(--space-4);
- background: var(--color-teal-dark);
- color: var(--text-on-brand);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- transition: background var(--duration-fast) var(--ease-default);
-}
-
-.btnPrimary:hover:not(:disabled) {
- background: var(--color-teal);
-}
-
-.btnPrimary:disabled {
- opacity: 0.6;
- cursor: not-allowed;
-}
-
-.board {
- display: flex;
- gap: var(--space-4);
- padding: var(--space-4) var(--space-6);
- flex: 1;
- overflow-x: auto;
-}
-
-.conflictBar {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: var(--space-4);
- padding: var(--space-3) var(--space-6);
- border-bottom: 1px solid var(--color-warning);
- background: color-mix(in srgb, var(--color-warning) 10%, var(--surface-card));
-}
-
-.conflictText {
- font-size: var(--text-sm);
- color: var(--text-primary);
-}
-
-.conflictActions {
- display: flex;
- gap: var(--space-3);
- flex-wrap: wrap;
-}
-
-.loadingWrap {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: var(--space-4);
- flex: 1;
- color: var(--text-muted);
- font-size: var(--text-sm);
-}
-
-.emptyState {
- display: flex;
- flex: 1;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: var(--space-4);
- padding: var(--space-8);
- text-align: center;
-}
-
-.emptyActions {
- display: flex;
- gap: var(--space-3);
- flex-wrap: wrap;
- justify-content: center;
-}
-
-.emptyTitle {
- font-size: var(--text-2xl);
- color: var(--text-primary);
-}
-
-.emptyText {
- max-width: 560px;
- color: var(--text-muted);
- line-height: 1.6;
-}
-
-.emptyError {
- color: var(--color-danger);
- font-size: var(--text-sm);
-}
-
-.btnNewTask {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- background: var(--color-teal-dark);
- color: var(--color-white);
- border: 1px solid var(--color-teal);
- font-weight: var(--font-medium);
- transition: background var(--duration-fast) var(--ease-default);
- cursor: pointer;
-}
-
-.btnNewTask:hover {
- background: var(--color-teal);
-}
-.btnSync {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: transparent;
- color: var(--text-muted);
- display: flex;
- align-items: center;
- gap: var(--space-2);
- transition: all var(--duration-fast) var(--ease-default);
- cursor: pointer;
-}
-
-.btnSync:disabled {
- opacity: 0.5;
- cursor: default;
-}
-
-.btnSyncPending {
- border-color: var(--color-teal);
- color: var(--color-teal);
- font-weight: var(--font-medium);
-}
-
-.btnSyncPending:hover {
- background: var(--color-teal-dark);
- color: var(--color-white);
-}
-
-.btnFlags {
- font-size: var(--text-sm);
- padding: var(--space-2) var(--space-4);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: transparent;
- color: var(--text-muted);
- cursor: pointer;
- display: flex;
- align-items: center;
- gap: var(--space-2);
- transition: all var(--duration-fast) var(--ease-default);
- font-family: var(--font-sans);
-}
-
-.btnFlags:hover {
- border-color: var(--color-teal);
- color: var(--color-teal);
-}
-
-.headerCenter {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
- gap: var(--space-3);
-}
-
-.viewTabs {
- display: inline-flex;
- align-items: center;
- gap: 6px;
- padding: 4px;
- border: 1px solid var(--color-graphite-mid);
- border-radius: 999px;
- background: var(--surface-overlay);
-}
-
-.viewTab {
- font-size: var(--text-xs);
- padding: 8px 12px;
- border-radius: 999px;
- border: none;
- background: transparent;
- color: var(--text-muted);
- cursor: pointer;
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.viewTabActive {
- background: var(--color-teal-dark);
- color: var(--color-white);
-}
-
-.backlogWrap {
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
- padding: var(--space-5) var(--space-6);
- overflow-y: auto;
-}
-
-.backlogHeader {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: var(--space-3);
-}
-
-.backlogHeaderActions {
- display: flex;
- align-items: center;
- gap: var(--space-3);
-}
-
-.backlogFilters {
- display: grid;
- grid-template-columns: minmax(220px, 1.4fr) repeat(3, minmax(160px, 1fr));
- gap: var(--space-3);
-}
-
-.backlogInput,
-.backlogSelect {
- width: 100%;
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-md);
- background: var(--surface-card);
- color: var(--text-primary);
- padding: 10px 12px;
- font-size: var(--text-sm);
-}
-
-.backlogTitle {
- font-size: var(--text-xl);
- color: var(--text-primary);
-}
-
-.backlogCount {
- font-size: var(--text-xs);
- color: var(--text-muted);
- border: 1px solid var(--color-graphite-mid);
- border-radius: 999px;
- padding: 6px 10px;
-}
-
-.backlogList {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
- gap: var(--space-4);
-}
-
-.backlogEmpty {
- border: 1px dashed var(--color-graphite-mid);
- border-radius: var(--radius-lg);
- padding: var(--space-6);
- color: var(--text-muted);
- background: var(--surface-card);
-}
-
-@media (max-width: 1100px) {
- .backlogFilters {
- grid-template-columns: 1fr 1fr;
- }
-}
-
-@media (max-width: 720px) {
- .backlogFilters {
- grid-template-columns: 1fr;
- }
-}
diff --git a/src/renderer/pages/LoginPage.jsx b/src/renderer/pages/LoginPage.jsx
deleted file mode 100644
index 86b7ac5..0000000
--- a/src/renderer/pages/LoginPage.jsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { useState, useEffect } from "react";
-import LoadingSpinner from "../components/LoadingSpinner";
-import styles from "./LoginPage.module.css";
-import logo from "../logo.svg";
-
-export default function LoginPage({ onAuthSuccess }) {
- const [step, setStep] = useState("idle"); // idle | waiting | polling | error
- const [userCode, setUserCode] = useState("");
- const [verificationUri, setVerificationUri] = useState("");
- const [error, setError] = useState("");
-
- useEffect(() => {
- const cleanup = window.electron.on("github:auth-success", () => {
- setStep("idle");
- onAuthSuccess();
- });
-
- const cleanupError = window.electron.on("github:auth-error", (msg) => {
- setError(msg);
- setStep("error");
- });
-
- return () => {
- cleanup?.();
- cleanupError?.();
- };
- }, [onAuthSuccess]);
-
- const handleLogin = async () => {
- try {
- setStep("waiting");
- setError("");
-
- const data = await window.electron.invoke("github:login");
-
- setUserCode(data.userCode);
- setVerificationUri(data.verificationUri);
- setStep("polling");
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const handleCopyCode = () => {
- navigator.clipboard.writeText(userCode);
- };
-
- return (
-
-
-
-
-
-
-
CodeSprint
-
- AI-Native project manager synced with GitHub
-
-
- {step === "idle" && (
-
- Entrar com GitHub
-
- )}
-
- {step === "waiting" && (
-
-
-
Iniciando autenticação...
-
- )}
-
- {step === "polling" && (
-
-
- Acesse o link abaixo e insira o cĂłdigo:
-
-
-
- {verificationUri}
-
-
-
- {userCode}
-
-
- Copiar
-
-
-
-
-
-
Aguardando autorização...
-
-
- )}
-
- {step === "error" && (
-
-
{error}
-
-
- Tentar novamente
-
-
- )}
-
-
- );
-}
diff --git a/src/renderer/pages/LoginPage.module.css b/src/renderer/pages/LoginPage.module.css
deleted file mode 100644
index 32c8a7d..0000000
--- a/src/renderer/pages/LoginPage.module.css
+++ /dev/null
@@ -1,144 +0,0 @@
-.container {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100vh;
- background: var(--surface-page);
-}
-
-.card {
- background: var(--surface-card);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-xl);
- padding: var(--space-8);
- width: 100%;
- max-width: 420px;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--space-3);
-}
-
-.logo {
- margin-bottom: var(--space-1);
-}
-
-.title {
- font-size: var(--text-2xl);
- font-weight: var(--font-semibold);
- color: var(--text-primary);
-}
-
-.subtitle {
- font-size: var(--text-sm);
- color: var(--text-muted);
- text-align: center;
- margin-bottom: var(--space-2);
-}
-
-.btnPrimary {
- width: 100%;
- padding: var(--space-3) var(--space-4);
- background: var(--color-teal-dark);
- color: var(--text-on-brand);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- transition: background var(--duration-fast) var(--ease-default);
-}
-
-.btnPrimary:hover {
- background: var(--color-teal);
-}
-
-.loadingWrap {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--space-3);
-}
-
-.loadingText {
- font-size: var(--text-sm);
- color: var(--text-muted);
-}
-
-.codeWrap {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--space-3);
- width: 100%;
-}
-
-.instruction {
- font-size: var(--text-sm);
- color: var(--text-secondary);
- text-align: center;
-}
-
-.link {
- font-size: var(--text-sm);
- color: var(--color-teal);
- word-break: break-all;
- text-align: center;
-}
-
-.codeBox {
- display: flex;
- align-items: center;
- gap: var(--space-3);
- background: var(--surface-overlay);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-md);
- padding: var(--space-3) var(--space-4);
- width: 100%;
- justify-content: space-between;
-}
-
-.code {
- font-family: var(--font-mono);
- font-size: var(--text-xl);
- font-weight: var(--font-semibold);
- color: var(--color-teal-light);
- letter-spacing: 0.15em;
-}
-
-.btnCopy {
- font-size: var(--text-xs);
- padding: var(--space-1) var(--space-3);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-sm);
- color: var(--text-muted);
- background: transparent;
-}
-
-.btnCopy:hover {
- border-color: var(--color-teal);
- color: var(--color-teal);
-}
-
-.pollingWrap {
- display: flex;
- align-items: center;
- gap: var(--space-2);
-}
-
-.pollingText {
- font-size: var(--text-sm);
- color: var(--text-muted);
-}
-
-.errorWrap {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--space-3);
- width: 100%;
-}
-
-.errorText {
- font-size: var(--text-sm);
- color: var(--color-danger);
- text-align: center;
-}
diff --git a/src/renderer/pages/RepoSelectPage.jsx b/src/renderer/pages/RepoSelectPage.jsx
deleted file mode 100644
index 0b2eafa..0000000
--- a/src/renderer/pages/RepoSelectPage.jsx
+++ /dev/null
@@ -1,237 +0,0 @@
-ï»żimport { useEffect, useRef, useState } from "react";
-import LoadingSpinner from "../components/LoadingSpinner";
-import styles from "./RepoSelectPage.module.css";
-
-export default function RepoSelectPage({
- initialUiState,
- onUiStateChange,
- onRepoSelected,
-}) {
- const [repos, setRepos] = useState([]);
- const [filtered, setFiltered] = useState([]);
- const [search, setSearch] = useState(initialUiState?.search || "");
- const [selected, setSelected] = useState(null);
- const [localPath, setLocalPath] = useState(initialUiState?.localPath || "");
- const [localRepoHint, setLocalRepoHint] = useState("");
- const [step, setStep] = useState("loading");
- const [error, setError] = useState("");
- const listRef = useRef(null);
-
- useEffect(() => {
- const loadRepos = async () => {
- try {
- setStep("loading");
- setError("");
- const data = await window.electron.invoke("github:repos");
- setRepos(data);
- setFiltered(data);
- setStep("ready");
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- loadRepos();
- }, []);
-
- useEffect(() => {
- const q = search.toLowerCase();
- const nextFiltered = repos.filter((r) =>
- r.name.toLowerCase().includes(q) || r.fullName.toLowerCase().includes(q),
- );
- setFiltered(nextFiltered);
- }, [search, repos]);
-
- useEffect(() => {
- if (!repos.length || !initialUiState?.selectedRepoId) return;
-
- const selectedRepo = repos.find(
- (repo) => repo.id === initialUiState.selectedRepoId,
- );
-
- if (selectedRepo) {
- setSelected(selectedRepo);
- }
- }, [repos, initialUiState?.selectedRepoId]);
-
- useEffect(() => {
- if (step !== "ready" || !listRef.current) return;
-
- listRef.current.scrollTop = initialUiState?.scrollTop || 0;
- }, [step, initialUiState?.scrollTop]);
-
- useEffect(() => {
- onUiStateChange?.({
- search,
- selectedRepoId: selected?.id || null,
- scrollTop: listRef.current?.scrollTop || 0,
- localPath,
- });
- }, [search, selected, localPath, onUiStateChange]);
-
- const handlePickLocalPath = async () => {
- try {
- const pickedPath = await window.electron.invoke("repo:pick-local-path");
- if (pickedPath) {
- setLocalPath(pickedPath);
- setLocalRepoHint("");
- }
- } catch (err) {
- if (err.message?.includes("No handler registered")) {
- setError("O app precisa ser reiniciado para carregar o seletor de pasta local.");
- setStep("ready");
- return;
- }
-
- setError(err.message);
- setStep("error");
- }
- };
-
- const handleConfirm = async () => {
- if (!selected) return;
- try {
- setStep("confirming");
- setError("");
-
- if (localPath) {
- const validation = await window.electron.invoke(
- "repo:validate-local-path",
- {
- owner: selected.owner,
- repo: selected.name,
- localPath,
- },
- );
-
- if (!validation?.valid) {
- const detectedFullName = validation?.detectedRepo
- ? `${validation.detectedRepo.owner}/${validation.detectedRepo.repo}`
- : null;
-
- const reasonMessage = detectedFullName
- ? `A pasta escolhida aponta para ${detectedFullName}, nao para ${selected.owner}/${selected.name}.`
- : "A pasta escolhida nao parece ser o clone local desse repositorio.";
-
- setLocalRepoHint(reasonMessage);
- setError(reasonMessage);
- setStep("ready");
- return;
- }
-
- setLocalRepoHint(`Clone local validado para ${selected.owner}/${selected.name}.`);
- }
-
- const tasks = await window.electron.invoke("tasks:load", {
- owner: selected.owner,
- repo: selected.name,
- localPath: localPath || undefined,
- });
- const session = await window.electron.invoke("session:get");
- onRepoSelected({
- repo: { owner: selected.owner, repo: selected.name, localPath: localPath || null },
- tasks,
- hasDirtyCache: !!session.tasksDirty,
- });
- } catch (err) {
- setError(err.message);
- setStep("error");
- }
- };
-
- const handleScroll = () => {
- onUiStateChange?.({
- search,
- selectedRepoId: selected?.id || null,
- scrollTop: listRef.current?.scrollTop || 0,
- localPath,
- });
- };
-
- return (
-
-
-
Selecionar repositorio
-
- Escolha o repositorio e, se quiser usar o clone local real, vincule a pasta do projeto.
-
-
- {step === "loading" && (
-
-
-
Carregando repositorios...
-
- )}
-
- {(step === "ready" || step === "confirming") && (
- <>
-
setSearch(e.target.value)}
- />
-
-
- {filtered.map((repo) => (
-
setSelected(repo)}
- >
- {repo.name}
- {repo.fullName}
-
- ))}
-
- {filtered.length === 0 && (
-
Nenhum repositorio encontrado
- )}
-
-
-
-
- Repositorio local
-
- {localPath ? "Trocar pasta" : "Selecionar pasta"}
-
-
-
- {localPath || "Nenhuma pasta vinculada. Sem isso, o app usa o cache interno."}
-
- {localRepoHint && (
-
{localRepoHint}
- )}
-
-
-
- {step === "confirming" ? (
-
- ) : (
- "Confirmar selecao"
- )}
-
- >
- )}
-
- {step === "error" && (
-
-
{error}
-
window.location.reload()}
- >
- Tentar novamente
-
-
- )}
-
-
- );
-}
diff --git a/src/renderer/pages/RepoSelectPage.module.css b/src/renderer/pages/RepoSelectPage.module.css
deleted file mode 100644
index bb37a44..0000000
--- a/src/renderer/pages/RepoSelectPage.module.css
+++ /dev/null
@@ -1,185 +0,0 @@
-ï»ż.container {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100vh;
- background: var(--surface-page);
-}
-
-.card {
- background: var(--surface-card);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-xl);
- padding: var(--space-8);
- width: 100%;
- max-width: 520px;
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
-}
-
-.title {
- font-size: var(--text-2xl);
- font-weight: var(--font-semibold);
- color: var(--text-primary);
-}
-
-.subtitle {
- font-size: var(--text-sm);
- color: var(--text-muted);
- margin-top: calc(var(--space-1) * -1);
-}
-
-.search {
- width: 100%;
- padding: var(--space-2) var(--space-3);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
-}
-
-.list {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
- max-height: 320px;
- overflow-y: auto;
- padding-right: var(--space-1);
-}
-
-.repoItem {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- gap: 4px;
- padding: var(--space-3);
- border-radius: var(--radius-md);
- border: 1px solid var(--color-graphite-mid);
- background: var(--surface-overlay);
- width: 100%;
- text-align: left;
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-.repoItem:hover {
- border-color: var(--color-teal);
-}
-
-.repoItemActive {
- border-color: var(--color-teal) !important;
- background: var(--color-teal-dark) !important;
-}
-
-.repoName {
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- color: var(--text-primary);
-}
-
-.repoDesc {
- font-size: var(--text-xs);
- color: var(--text-muted);
-}
-
-.localRepoBox {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
- padding: var(--space-3);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-md);
- background: var(--surface-overlay);
-}
-
-.localRepoHeader {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: var(--space-3);
-}
-
-.localRepoTitle {
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- color: var(--text-primary);
-}
-
-.localRepoText {
- font-size: var(--text-xs);
- color: var(--text-muted);
- word-break: break-word;
-}
-
-.localRepoHint {
- font-size: var(--text-xs);
- color: var(--color-teal);
- line-height: 1.5;
-}
-
-.empty {
- font-size: var(--text-sm);
- color: var(--text-muted);
- text-align: center;
- padding: var(--space-4);
-}
-
-.btnPrimary {
- width: 100%;
- padding: var(--space-3) var(--space-4);
- background: var(--color-teal-dark);
- color: var(--text-on-brand);
- border-radius: var(--radius-md);
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- transition: background var(--duration-fast) var(--ease-default);
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.btnPrimary:hover:not(:disabled) {
- background: var(--color-teal);
-}
-
-.btnPrimary:disabled {
- opacity: 0.5;
- cursor: not-allowed;
-}
-
-.btnSecondary {
- 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);
- font-size: var(--text-xs);
-}
-
-.btnSecondary:hover {
- border-color: var(--color-teal);
- color: var(--color-teal);
-}
-
-.loadingWrap {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--space-3);
- padding: var(--space-8) 0;
-}
-
-.loadingText {
- font-size: var(--text-sm);
- color: var(--text-muted);
-}
-
-.errorWrap {
- display: flex;
- flex-direction: column;
- gap: var(--space-3);
-}
-
-.errorText {
- font-size: var(--text-sm);
- color: var(--color-danger);
- text-align: center;
-}
diff --git a/src/renderer/styles/global.css b/src/renderer/styles/global.css
deleted file mode 100644
index 456bc3c..0000000
--- a/src/renderer/styles/global.css
+++ /dev/null
@@ -1,135 +0,0 @@
-@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap");
-
-/* âââ Reset & Base ââââââââââââââââââââââââââââââ */
-*,
-*::before,
-*::after {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
-}
-
-html,
-body,
-#root {
- height: 100%;
- width: 100%;
-}
-
-body {
- font-family: var(--font-sans);
- font-size: var(--text-base);
- font-weight: var(--font-normal);
- line-height: var(--leading-base);
- color: var(--text-primary);
- background-color: var(--surface-page);
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-/* âââ Tipografia ââââââââââââââââââââââââââââââââ */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-weight: var(--font-semibold);
- line-height: var(--leading-tight);
- color: var(--text-primary);
-}
-
-h1 {
- font-size: var(--text-3xl);
-}
-h2 {
- font-size: var(--text-2xl);
-}
-h3 {
- font-size: var(--text-xl);
-}
-h4 {
- font-size: var(--text-lg);
-}
-h5 {
- font-size: var(--text-base);
-}
-h6 {
- font-size: var(--text-sm);
-}
-
-p {
- line-height: var(--leading-relaxed);
- color: var(--text-secondary);
-}
-
-a {
- color: var(--color-teal);
- text-decoration: none;
- transition: color var(--duration-fast) var(--ease-default);
-}
-
-a:hover {
- color: var(--color-teal-light);
-}
-
-code,
-pre {
- font-family: var(--font-mono);
- font-size: var(--text-sm);
-}
-
-/* âââ Scrollbar âââââââââââââââââââââââââââââââââ */
-::-webkit-scrollbar {
- width: 6px;
-}
-
-::-webkit-scrollbar-track {
- background: var(--surface-page);
-}
-
-::-webkit-scrollbar-thumb {
- background: var(--color-graphite-mid);
- border-radius: var(--radius-full);
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: var(--color-teal-dark);
-}
-
-/* âââ Seleção de texto ââââââââââââââââââââââââââ */
-::selection {
- background: var(--color-teal-dark);
- color: var(--color-white);
-}
-
-/* âââ BotĂ”es base âââââââââââââââââââââââââââââââ */
-button {
- font-family: var(--font-sans);
- font-size: var(--text-sm);
- font-weight: var(--font-medium);
- cursor: pointer;
- border: none;
- outline: none;
- transition: all var(--duration-fast) var(--ease-default);
-}
-
-/* âââ Inputs base âââââââââââââââââââââââââââââââ */
-input,
-textarea,
-select {
- font-family: var(--font-sans);
- font-size: var(--text-sm);
- color: var(--text-primary);
- background: var(--surface-card);
- border: 1px solid var(--color-graphite-mid);
- border-radius: var(--radius-md);
- outline: none;
- transition: border-color var(--duration-fast) var(--ease-default);
-}
-
-input:focus,
-textarea:focus,
-select:focus {
- border-color: var(--color-teal);
-}
diff --git a/src/renderer/styles/tokens.css b/src/renderer/styles/tokens.css
deleted file mode 100644
index f4f2a2a..0000000
--- a/src/renderer/styles/tokens.css
+++ /dev/null
@@ -1,81 +0,0 @@
-/* âââ Paleta CodeSprint âââââââââââââââââââââââââ */
-:root {
- /* Paleta base */
- --color-teal-dark: #005f73;
- --color-teal: #00a676;
- --color-teal-light: #94d2bd;
- --color-gray-light: #e9ecef;
- --color-white: #ffffff;
- --color-graphite: #2b2d42;
- --color-graphite-mid: #363850;
- --color-graphite-soft: #424560;
-
- /* âââ SuperfĂcies âââââââââââââââââââââââââââââââ */
- --surface-page: #0a0f0f;
- --surface-card: #111917;
- --surface-overlay: #1a2422;
-
- /* âââ Texto âââââââââââââââââââââââââââââââââââââ */
- --text-primary: #ffffff;
- --text-secondary: var(--color-teal-light);
- --text-muted: var(--color-gray-light);
- --text-on-brand: #ffffff;
-
- /* âââ Brand âââââââââââââââââââââââââââââââââââââ */
- --color-brand: var(--color-teal-dark);
- --color-brand-hover: var(--color-teal);
- --color-accent: var(--color-teal);
-
- /* âââ SemĂąnticas ââââââââââââââââââââââââââââââââ */
- --color-success: var(--color-teal);
- --color-warning: #b45309;
- --color-danger: #c0392b;
-
- /* âââ Tipografia ââââââââââââââââââââââââââââââââ */
- --font-sans: "Inter", system-ui, sans-serif;
- --font-mono: "JetBrains Mono", "Fira Code", monospace;
-
- --text-xs: 0.75rem;
- --text-sm: 0.875rem;
- --text-base: 1rem;
- --text-lg: 1.125rem;
- --text-xl: 1.25rem;
- --text-2xl: 1.5rem;
- --text-3xl: 1.875rem;
-
- --font-normal: 400;
- --font-medium: 500;
- --font-semibold: 600;
-
- --leading-tight: 1.25;
- --leading-base: 1.5;
- --leading-relaxed: 1.75;
-
- /* âââ Espaçamentos ââââââââââââââââââââââââââââââ */
- --space-1: 0.25rem;
- --space-2: 0.5rem;
- --space-3: 0.75rem;
- --space-4: 1rem;
- --space-6: 1.5rem;
- --space-8: 2rem;
- --space-12: 3rem;
- --space-16: 4rem;
-
- /* âââ Bordas ââââââââââââââââââââââââââââââââââââ */
- --radius-sm: 4px;
- --radius-md: 8px;
- --radius-lg: 12px;
- --radius-xl: 16px;
- --radius-full: 9999px;
-
- /* âââ Sombras âââââââââââââââââââââââââââââââââââ */
- --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
- --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4);
- --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.5);
-
- /* âââ TransiçÔes ââââââââââââââââââââââââââââââââ */
- --ease-default: cubic-bezier(0.4, 0, 0.2, 1);
- --duration-fast: 150ms;
- --duration-base: 250ms;
- --duration-slow: 400ms;
-}
diff --git a/tasks.md b/tasks.md
index 6a58851..bc6ea62 100644
--- a/tasks.md
+++ b/tasks.md
@@ -1,44 +1,7 @@
# Tasks
-- [x] Setup inicial do projeto
-- [x] Definir primeiras tasks
+- [ ] Setup inicial do projeto
+- [ ] Definir primeiras tasks
- [ ] Revisar backlog
- [ ] Priorizar sprint
-- [x] teste 2
- - [ ] as
- - [ ] ea
-- [x] teste
-- [ ] aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- - [x] a
- - [x] b
- - [x] c
- - [x] d
- - [x] e
- - [x] f
- - [x] g
- - [x] h
- - [x] i
- - [x] j
- - [x] k
- - [x] l
- - [x] m
- - [x] n
- - [x] o
- - [x] p
- - [x] q
- - [x] r
- - [x] s
- - [x] t
- - [x] u
- - [x] v
- - [x] 1
- - [x] 2
- - [x] 3
- - [x] 4
- - [x] 5
- - [x] aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-- [x] teste 3
-- [x] teste 4
-- [x] teste 5
-- [x] teste 6
-- [ ] teste 7
+ - [ ] 1
diff --git a/tsconfig.app.json b/tsconfig.app.json
deleted file mode 100644
index af516fc..0000000
--- a/tsconfig.app.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "target": "ES2023",
- "useDefineForClassFields": true,
- "lib": ["ES2023", "DOM", "DOM.Iterable"],
- "module": "ESNext",
- "types": ["vite/client"],
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
- "jsx": "react-jsx",
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["src"]
-}
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index 1ffef60..0000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
-}
diff --git a/tsconfig.node.json b/tsconfig.node.json
deleted file mode 100644
index 8a67f62..0000000
--- a/tsconfig.node.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "target": "ES2023",
- "lib": ["ES2023"],
- "module": "ESNext",
- "types": ["node"],
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "moduleDetection": "force",
- "noEmit": true,
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "erasableSyntaxOnly": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
- },
- "include": ["vite.config.ts"]
-}