diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..0247794
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,153 @@
+name: CI/CD Pipeline
+
+on:
+ push:
+ branches: [main, master, develop]
+ pull_request:
+ branches: [main, master]
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Check Formatting (Prettier)
+ run: npx prettier --check .
+
+ - name: Run ESLint
+ run: npm run lint
+
+ - name: Run Markdown Lint
+ run: npm run lint:md
+
+ - name: Security Scan (npm audit)
+ run: npm run security -- --audit-level=critical
+
+ test:
+ runs-on: ubuntu-latest
+ needs: lint
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Run Unit Tests
+ run: npm run test
+
+ - name: Upload Coverage
+ uses: codecov/codecov-action@v4
+ with:
+ file: ./coverage/coverage-final.json
+ fail_ci_if_error: false
+ token: ${{ secrets.CODECOV_TOKEN }}
+
+ build:
+ runs-on: ubuntu-latest
+ needs: test
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Build with VitePress
+ run: npm run docs:build
+
+ - name: Cache Build Artifacts
+ uses: actions/cache@v3
+ with:
+ path: .vitepress/dist
+ key: ${{ runner.os }}-build-${{ github.sha }}
+
+ e2e:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Install Playwright Browsers
+ run: npx playwright install --with-deps chromium
+
+ - name: Build with VitePress (for e2e)
+ run: npm run docs:build
+
+ - name: Run E2E Tests
+ run: npm run test:e2e
+
+ - uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: playwright-report
+ path: playwright-report/
+ retention-days: 15
+
+ deploy-staging:
+ runs-on: ubuntu-latest
+ needs: e2e
+ environment:
+ name: staging
+ url: "https://staging.roadmap-developer.com"
+ if: github.ref == 'refs/heads/develop' || github.event_name == 'pull_request'
+ steps:
+ - name: Deploy to Staging Placeholder
+ run: echo "Deploying build artifacts to Staging environment."
+
+ - name: Health Check (Staging)
+ run: echo "Performing health check on staging..."
+
+ deploy-production:
+ runs-on: ubuntu-latest
+ needs: e2e
+ environment:
+ name: production
+ url: "https://roadmap-developer.com"
+ if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
+ steps:
+ - name: Deploy to Production Placeholder
+ run: echo "Deploying build artifacts to Production. Requires manual approval in GitHub Environments."
+
+ - name: Post-deployment Health Check
+ run: echo "Verifying production health check endpoints..."
+
+ - name: Setup Rollback Capability
+ run: echo "Registering deployment ID for rollback capability."
+
+ notify:
+ runs-on: ubuntu-latest
+ needs: [deploy-production, deploy-staging]
+ if: failure()
+ steps:
+ - name: Slack Notification
+ run: echo "Sending failure notification to Slack/Email alerting team of deployment/build issue."
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index a20387f..c7c7c4b 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -43,7 +43,7 @@ jobs:
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Install dependencies
- run: npm ci
+ run: npm install
- name: Build with VitePress
run: npm run docs:build
- name: Upload artifact
diff --git a/.gitignore b/.gitignore
index e90afc6..830bfdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,9 @@ dist
cache
.vitepress/dist
.vitepress/cache
+
+# Test Reports and Coverage
+coverage/
+playwright-report/
+test-results/
+playwright/.cache/
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..720f79a
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,16 @@
+{
+ "default": true,
+ "MD013": false,
+ "MD033": false,
+ "MD024": { "siblings_only": true },
+ "MD041": false,
+ "MD025": false,
+ "MD029": false,
+ "MD046": false,
+ "MD001": false,
+ "MD030": false,
+ "MD031": false,
+ "MD040": true,
+ "MD045": true,
+ "MD026": false
+}
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 93d4038..6a5f771 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -1,89 +1,113 @@
-import { defineConfig } from 'vitepress'
-import { withMermaid } from 'vitepress-plugin-mermaid'
+import { defineConfig } from "vitepress";
+import { withMermaid } from "vitepress-plugin-mermaid";
-export default withMermaid(defineConfig({
- lang: 'pt-BR',
- title: "Roadmap Developer 2026",
- description: "Guia completo e atualizado para desenvolvedores em 2026. Transformado em site com VitePress.",
- cleanUrls: true,
- lastUpdated: true,
- srcExclude: ['README.md', 'AGENTS.md'],
- head: [
- ['link', { rel: 'icon', href: '/coder-cat.jpg' }],
- ['meta', { property: 'og:type', content: 'website' }],
- ['meta', { property: 'og:locale', content: 'pt_BR' }],
- ['meta', { property: 'og:title', content: 'Roadmap Developer 2026' }],
- ['meta', { property: 'og:site_name', content: 'Roadmap Developer 2026' }],
- ['meta', { property: 'og:image', content: '/coder-cat.jpg' }],
- ],
- vite: {
- ssr: {
- noExternal: ['mermaid', 'vitepress-plugin-mermaid']
- },
- optimizeDeps: {
- include: ['mermaid']
- },
- build: {
- chunkSizeWarningLimit: 1500
- }
- },
- themeConfig: {
- nav: [
- { text: 'Home', link: '/' },
- { text: 'Trilhas', items: [
- { text: 'Comum', link: '/roadmaps/general/common' },
- { text: 'Guia de Estudos', link: '/roadmaps/general/study-guide' },
- { text: 'Frontend', link: '/roadmaps/frontend/frontend' },
- { text: 'Backend', link: '/roadmaps/backend/backend' },
- { text: 'Full Stack', link: '/roadmaps/fullstack/fullstack' },
- { text: 'Mobile', link: '/roadmaps/mobile/mobile' },
- { text: 'DevOps', link: '/roadmaps/devops/devops' },
- { text: 'Engenharia de Dados', link: '/roadmaps/data/data-engineering' },
- { text: 'Cybersecurity', link: '/roadmaps/security/cybersecurity' },
- { text: 'AI', link: '/roadmaps/ai/artificial-intelligence' },
- { text: 'QA & Testing', link: '/roadmaps/qa/qa-testing' }
- ]},
- { text: 'Conselhos', link: '/advices' }
+export default withMermaid(
+ defineConfig({
+ lang: "pt-BR",
+ title: "Roadmap Developer 2026",
+ description:
+ "Guia completo e atualizado para desenvolvedores em 2026. Transformado em site com VitePress.",
+ cleanUrls: true,
+ lastUpdated: true,
+ srcExclude: ["README.md", "AGENTS.md"],
+ head: [
+ ["link", { rel: "icon", href: "/coder-cat.jpg" }],
+ ["meta", { property: "og:type", content: "website" }],
+ ["meta", { property: "og:locale", content: "pt_BR" }],
+ ["meta", { property: "og:title", content: "Roadmap Developer 2026" }],
+ ["meta", { property: "og:site_name", content: "Roadmap Developer 2026" }],
+ ["meta", { property: "og:image", content: "/coder-cat.jpg" }],
],
-
- sidebar: [
- {
- text: 'Introdução',
- items: [
- { text: 'Início', link: '/' },
- { text: 'Conselhos de Carreira', link: '/advices' }
- ]
+ vite: {
+ ssr: {
+ noExternal: ["mermaid", "vitepress-plugin-mermaid"],
},
- {
- text: 'Trilhas de Estudo',
- items: [
- { text: 'Trilha Comum (Base)', link: '/roadmaps/general/common' },
- { text: 'Guia de Estudos 2026', link: '/roadmaps/general/study-guide' },
- { text: 'Padrões de Especialista (2026)', link: '/roadmaps/general/2026-specialist-patterns' },
- { text: 'Frontend', link: '/roadmaps/frontend/frontend' },
- { text: 'Backend', link: '/roadmaps/backend/backend' },
- { text: 'Full Stack', link: '/roadmaps/fullstack/fullstack' },
- { text: 'Mobile', link: '/roadmaps/mobile/mobile' },
- { text: 'DevOps', link: '/roadmaps/devops/devops' },
- { text: 'Engenharia de Dados', link: '/roadmaps/data/data-engineering' },
- { text: 'Cybersecurity', link: '/roadmaps/security/cybersecurity' },
- { text: 'Inteligência Artificial', link: '/roadmaps/ai/artificial-intelligence' },
- { text: 'QA & Testing', link: '/roadmaps/qa/qa-testing' }
- ]
- }
- ],
+ optimizeDeps: {
+ include: ["mermaid"],
+ },
+ build: {
+ chunkSizeWarningLimit: 1500,
+ },
+ },
+ themeConfig: {
+ nav: [
+ { text: "Home", link: "/" },
+ {
+ text: "Trilhas",
+ items: [
+ { text: "Comum", link: "/roadmaps/general/common" },
+ { text: "Guia de Estudos", link: "/roadmaps/general/study-guide" },
+ { text: "Frontend", link: "/roadmaps/frontend/frontend" },
+ { text: "Backend", link: "/roadmaps/backend/backend" },
+ { text: "Full Stack", link: "/roadmaps/fullstack/fullstack" },
+ { text: "Mobile", link: "/roadmaps/mobile/mobile" },
+ { text: "DevOps", link: "/roadmaps/devops/devops" },
+ {
+ text: "Engenharia de Dados",
+ link: "/roadmaps/data/data-engineering",
+ },
+ { text: "Cybersecurity", link: "/roadmaps/security/cybersecurity" },
+ { text: "AI", link: "/roadmaps/ai/artificial-intelligence" },
+ { text: "QA & Testing", link: "/roadmaps/qa/qa-testing" },
+ ],
+ },
+ { text: "Conselhos", link: "/advices" },
+ ],
- socialLinks: [
- { icon: 'github', link: 'https://github.com/kamranahmedse/developer-roadmap' } // Keeping credit or changing to repo link if known
- ],
+ sidebar: [
+ {
+ text: "Introdução",
+ items: [
+ { text: "Início", link: "/" },
+ { text: "Conselhos de Carreira", link: "/advices" },
+ ],
+ },
+ {
+ text: "Trilhas de Estudo",
+ items: [
+ { text: "Trilha Comum (Base)", link: "/roadmaps/general/common" },
+ {
+ text: "Guia de Estudos 2026",
+ link: "/roadmaps/general/study-guide",
+ },
+ {
+ text: "Padrões de Especialista (2026)",
+ link: "/roadmaps/general/2026-specialist-patterns",
+ },
+ { text: "Frontend", link: "/roadmaps/frontend/frontend" },
+ { text: "Backend", link: "/roadmaps/backend/backend" },
+ { text: "Full Stack", link: "/roadmaps/fullstack/fullstack" },
+ { text: "Mobile", link: "/roadmaps/mobile/mobile" },
+ { text: "DevOps", link: "/roadmaps/devops/devops" },
+ {
+ text: "Engenharia de Dados",
+ link: "/roadmaps/data/data-engineering",
+ },
+ { text: "Cybersecurity", link: "/roadmaps/security/cybersecurity" },
+ {
+ text: "Inteligência Artificial",
+ link: "/roadmaps/ai/artificial-intelligence",
+ },
+ { text: "QA & Testing", link: "/roadmaps/qa/qa-testing" },
+ ],
+ },
+ ],
- footer: {
- message: 'Lançado sob a licença MIT.',
- copyright: 'Copyright © 2026 Roadmap Developer'
- },
+ socialLinks: [
+ {
+ icon: "github",
+ link: "https://github.com/kamranahmedse/developer-roadmap",
+ }, // Keeping credit or changing to repo link if known
+ ],
+
+ footer: {
+ message: "Lançado sob a licença MIT.",
+ copyright: "Copyright © 2026 Roadmap Developer",
+ },
- search: {
- provider: 'local'
- }
- }
-}))
+ search: {
+ provider: "local",
+ },
+ },
+ }),
+);
diff --git a/AGENTS.md b/AGENTS.md
index e4d51e4..7bcae3f 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -6,49 +6,50 @@ Este arquivo contém diretrizes para agentes de Inteligência Artificial que tra
### 📂 Estrutura do Projeto
-* `roadmaps/`: Contém os arquivos Markdown com o conteúdo das trilhas.
- * `ai/`, `backend/`, `frontend/`, `mobile/`, `devops/`, `general/`: Subdiretórios para cada área.
-* `.vitepress/`: Configuração do site estático (VitePress).
- * `config.mts`: Configuração principal (menu, sidebar, plugins).
-* `AGENTS.md`: Este arquivo.
+- `roadmaps/`: Contém os arquivos Markdown com o conteúdo das trilhas.
+ - `ai/`, `backend/`, `frontend/`, `mobile/`, `devops/`, `general/`: Subdiretórios para cada área.
+- `.vitepress/`: Configuração do site estático (VitePress).
+ - `config.mts`: Configuração principal (menu, sidebar, plugins).
+- `AGENTS.md`: Este arquivo.
### 📝 Diretrizes de Conteúdo
1. **Foco em 2026:** Todo conteúdo deve refletir o estado da arte previsto para 2026. Isso inclui:
- * IA Generativa e Agentes em todos os lugares.
- * Sustentabilidade (Green Software).
- * Privacidade e Edge Computing (Local AI).
- * Ferramentas modernas (Rust, WebGPU, Platform Engineering).
+ - IA Generativa e Agentes em todos os lugares.
+ - Sustentabilidade (Green Software).
+ - Privacidade e Edge Computing (Local AI).
+ - Ferramentas modernas (Rust, WebGPU, Platform Engineering).
2. **Qualidade:**
- * Use português claro e inclusivo.
- * Evite "palestrinha". Seja direto e prático.
- * Sempre inclua links para recursos *reais* e de alta qualidade (docs oficiais, cursos renomados).
+ - Use português claro e inclusivo.
+ - Evite "palestrinha". Seja direto e prático.
+ - Sempre inclua links para recursos _reais_ e de alta qualidade (docs oficiais, cursos renomados).
3. **Visual:**
- * Mantenha os diagramas Mermaid (`flowchart TD`) no início de cada roadmap.
- * Use emojis para melhorar a escaneabilidade.
+ - Mantenha os diagramas Mermaid (`flowchart TD`) no início de cada roadmap.
+ - Use emojis para melhorar a escaneabilidade.
### ⚙️ Instruções Técnicas
1. **VitePress:**
- * O site é gerado usando VitePress.
- * Ao adicionar um novo arquivo `.md`, lembre-se de atualizá-lo no `sidebar` e `nav` em `.vitepress/config.mts`.
- * Verifique se o build passa: `npm run docs:build`.
+ - O site é gerado usando VitePress.
+ - Ao adicionar um novo arquivo `.md`, lembre-se de atualizá-lo no `sidebar` e `nav` em `.vitepress/config.mts`.
+ - Verifique se o build passa: `npm run docs:build`.
2. **Mermaid:**
- * Usamos `vitepress-plugin-mermaid`.
- * Blocos de código mermaid devem usar a sintaxe:
- ```markdown
- ```mermaid
- flowchart TD
- ...
- ```
- ```
+ - Usamos `vitepress-plugin-mermaid`.
+ - Blocos de código mermaid devem usar a sintaxe:
+ - Blocos de código mermaid devem usar a sintaxe:
+ ```markdown
+ ` ` `mermaid
+ flowchart TD
+ ...
+ ` ` `
+ ```
3. **Verificação:**
- * Sempre verifique links quebrados.
- * Não deixe placeholders (`TODO`, `FIXME`) no código submetido.
+ - Sempre verifique links quebrados.
+ - Não deixe placeholders (`TODO`, `FIXME`) no código submetido.
### 🚀 Deploy
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e320770..f2bcf98 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
## [1.0.3] - 2026-Edition Update
### Adicionado
+
- **VitePress:** Transformação completa dos arquivos Markdown em site estático.
- **Trilhas Atualizadas para 2026:**
- **IA:** Agentes Autônomos, MCP, RAG Avançado.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 14d37fc..4eafee2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -7,45 +7,69 @@ Obrigado por querer contribuir com o **Roadmap Developer 2026**! Este projeto é
Este projeto usa [VitePress](https://vitepress.dev/) para gerar o site estático.
### Pré-requisitos
+
- Node.js (versão 18 ou superior)
- NPM ou Yarn
### Passos
1. **Clone o repositório:**
+
```bash
git clone https://github.com/seu-usuario/roadmap-developer-2026.git
cd roadmap-developer-2026
```
2. **Instale as dependências:**
+
```bash
npm install
```
3. **Rode o servidor de desenvolvimento:**
+
```bash
npm run docs:dev
```
+
O site estará disponível em `http://localhost:5173`. As mudanças nos arquivos Markdown são refletidas instantaneamente.
4. **Verifique o Build de Produção:**
Antes de enviar suas mudanças, verifique se o build passa sem erros:
+
```bash
npm run docs:build
```
+5. **Garanta a Qualidade e Execute os Testes:**
+ Todos os commits devem passar pelos checks de CI/CD:
+
+ ```bash
+ # Formate o código e o markdown
+ npm run format
+
+ # Execute o linter de JS e de Markdown
+ npm run lint
+ npm run lint:md
+
+ # Rode os testes unitários
+ npm run test
+
+ # Rode os testes e2e (requer que o build já tenha sido feito)
+ npm run test:e2e
+ ```
+
## 📝 Como Contribuir com Conteúdo
1. **Estrutura:** Todo o conteúdo está na pasta `roadmaps/`.
2. **Imagens:** Use a sintaxe padrão do Markdown. Para diagramas, prefira usar [Mermaid](https://mermaid.js.org/) dentro de blocos de código:
```markdown
- ```mermaid
+ ` ` `mermaid
flowchart TD
A[Start] --> B{Is it?}
B -- Yes --> C[OK]
B -- No --> D[Rethink]
- ```
+ ` ` `
```
3. **Links:** Verifique se os links que você adicionou funcionam e são relevantes.
4. **Estilo:** Mantenha um tom encorajador, prático e direto.
diff --git a/README.md b/README.md
index 8c104ba..8f7626e 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,10 @@

+
-

+
O Guia Definitivo para sua Carreira na Era da IA
Trilhas de estudo completas, desde o nível Júnior até Especialista, transformadas em um site estático moderno com VitePress.
@@ -17,7 +18,7 @@ O conteúdo deste repositório é melhor visualizado através do nosso site de d
> **[Acessar Roadmap Developer 2026](https://seu-usuario.github.io/roadmap-developer-2026/)**
>
-> *Nota: A URL acima será ativada automaticamente após o primeiro deploy via GitHub Pages. Lembre-se de substituir `seu-usuario` pelo seu username do GitHub.*
+> _Nota: A URL acima será ativada automaticamente após o primeiro deploy via GitHub Pages. Lembre-se de substituir `seu-usuario` pelo seu username do GitHub._
---
@@ -25,15 +26,15 @@ O conteúdo deste repositório é melhor visualizado através do nosso site de d
Este projeto foi atualizado para refletir o mercado de tecnologia em **2026**, focando não apenas em código, mas em Inteligência Artificial, Sustentabilidade e Arquitetura Moderna.
-* [**Trilha Comum (Base)**](./roadmaps/general/common.md): Git, IA Literacy, Prompt Engineering e Lógica.
-* [**Backend**](./roadmaps/backend/backend.md): Microsserviços, IA Engineering (RAG, Agents), Green Software e Observabilidade.
-* [**Frontend**](./roadmaps/frontend/frontend.md): Generative UI, Server Actions, WebGPU e Acessibilidade.
-* [**Full Stack**](./roadmaps/fullstack/fullstack.md): Server Components, Monorepos, Integração de IA e Arquitetura de Sistemas.
-* [**Mobile**](./roadmaps/mobile/mobile.md): On-Device AI (ExecuTorch), Kotlin Multiplatform e Superapps.
-* [**Inteligência Artificial**](./roadmaps/ai/artificial-intelligence.md): Agentes Autônomos, LLMOps, Fine-Tuning e Sistemas Compostos.
-* [**DevOps & Platform**](./roadmaps/devops/devops.md): Platform Engineering, FinOps e GitOps.
-* [**Engenharia de Dados**](./roadmaps/data/data-engineering.md): Lakehouse, Streaming e Governança.
-* [**Cybersecurity**](./roadmaps/security/cybersecurity.md): Zero Trust, DevSecOps e Segurança de IA.
+- [**Trilha Comum (Base)**](./roadmaps/general/common.md): Git, IA Literacy, Prompt Engineering e Lógica.
+- [**Backend**](./roadmaps/backend/backend.md): Microsserviços, IA Engineering (RAG, Agents), Green Software e Observabilidade.
+- [**Frontend**](./roadmaps/frontend/frontend.md): Generative UI, Server Actions, WebGPU e Acessibilidade.
+- [**Full Stack**](./roadmaps/fullstack/fullstack.md): Server Components, Monorepos, Integração de IA e Arquitetura de Sistemas.
+- [**Mobile**](./roadmaps/mobile/mobile.md): On-Device AI (ExecuTorch), Kotlin Multiplatform e Superapps.
+- [**Inteligência Artificial**](./roadmaps/ai/artificial-intelligence.md): Agentes Autônomos, LLMOps, Fine-Tuning e Sistemas Compostos.
+- [**DevOps & Platform**](./roadmaps/devops/devops.md): Platform Engineering, FinOps e GitOps.
+- [**Engenharia de Dados**](./roadmaps/data/data-engineering.md): Lakehouse, Streaming e Governança.
+- [**Cybersecurity**](./roadmaps/security/cybersecurity.md): Zero Trust, DevSecOps e Segurança de IA.
## ⚙️ Configuração do Repositório
@@ -48,6 +49,7 @@ Para usar este roadmap no seu próprio GitHub Pages:
Para rodar o site de documentação na sua máquina:
1. **Clone o repositório e instale as dependências:**
+
```bash
git clone https://github.com/seu-usuario/roadmap-developer-2026.git
cd roadmap-developer-2026
@@ -55,9 +57,11 @@ Para rodar o site de documentação na sua máquina:
```
2. **Inicie o servidor de desenvolvimento:**
+
```bash
npm run docs:dev
```
+
O site estará disponível em `http://localhost:5173`.
3. **Para gerar a versão de produção:**
@@ -66,12 +70,24 @@ Para rodar o site de documentação na sua máquina:
```
Os arquivos estáticos serão gerados na pasta `.vitepress/dist`.
+## 🚀 CI/CD e Qualidade de Código
+
+Este projeto utiliza um pipeline robusto de CI/CD para garantir a qualidade de software:
+
+- **Testes Unitários:** O utilitário `utils/link-checker.js` possui cobertura através do `vitest`.
+- **Testes E2E:** O fluxo principal é testado com `@playwright/test`.
+- **Linting:** O código é verificado com `eslint` e `markdownlint-cli`.
+- **Formatação:** Todo o repositório é formatado com `prettier`.
+- **Segurança:** As dependências são verificadas com o `npm run security` (`npm audit`).
+
+As instruções detalhadas de como rodar esses processos localmente estão no `CONTRIBUTING.md`.
+
## 📦 Deploy
Este projeto está configurado para deploy automático no **GitHub Pages** usando GitHub Actions.
-Sempre que um push for feito na branch `main`, o site será reconstruído e publicado.
+Sempre que um push for feito na branch `main`, o site será reconstruído e publicado caso os testes passem.
-Veja o arquivo de workflow em: `.github/workflows/deploy.yml`.
+Veja o arquivo de workflow em: `.github/workflows/deploy.yml` e o pipeline de CI/CD em `.github/workflows/ci.yml`.
## 🤝 Contribuição
@@ -83,4 +99,5 @@ Leia nosso [Guia de Contribuição](./CONTRIBUTING.md) para saber como ajudar.
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](./LICENSE) para detalhes.
---
-*Inspirado pelo trabalho incrível da comunidade open source e projetos como roadmap.sh.*
+
+_Inspirado pelo trabalho incrível da comunidade open source e projetos como roadmap.sh._
diff --git a/advices.md b/advices.md
index 9541b02..51c2532 100644
--- a/advices.md
+++ b/advices.md
@@ -10,7 +10,7 @@ A jornada para se tornar um(a) desenvolvedor(a) é como uma grande aventura de R
> "Alice perguntou: Gato, pode me dizer qual o caminho que eu devo tomar?
> Isso depende muito do lugar para onde você quer ir – disse o Gato."
-> \- *Alice no País das Maravilhas*
+> \- _Alice no País das Maravilhas_
O mundo do desenvolvimento é vasto. Frontend, Backend, Mobile, IA, Games... O primeiro passo não é sair correndo, mas sim olhar o mapa.
@@ -27,7 +27,7 @@ O mundo do desenvolvimento é vasto. Frontend, Backend, Mobile, IA, Games... O p
- **Feito é Melhor que Perfeito:** Não espere o "código perfeito" para colocar seus projetos no ar. O aprendizado vem da prática, do erro, da correção. Lance, receba feedback, melhore.
> "O que eu faço é uma gota no meio de um oceano. Mas sem ela, o oceano será menor."
-> \- *Madre Teresa de Calcutá*
+> \- _Madre Teresa de Calcutá_
---
@@ -35,7 +35,7 @@ O mundo do desenvolvimento é vasto. Frontend, Backend, Mobile, IA, Games... O p
Com IAs escrevendo código, o que sobra para nós? A resposta é: **tudo o que exige humanidade**.
-- **Empatia (User Centricity):** A IA entende a sintaxe, mas você entende a *dor* do usuário. Um código perfeito que resolve o problema errado é inútil. Seu trabalho é traduzir sentimentos e necessidades humanas em software.
+- **Empatia (User Centricity):** A IA entende a sintaxe, mas você entende a _dor_ do usuário. Um código perfeito que resolve o problema errado é inútil. Seu trabalho é traduzir sentimentos e necessidades humanas em software.
- **Pensamento Crítico e Estratégico:** A IA é um excelente operário, mas um péssimo gerente. Ela executa tarefas, mas não questiona "Por que estamos fazendo isso?". Cabe a você decidir a arquitetura, escolher as ferramentas certas (e não apenas as famosas) e julgar se a solução proposta pela IA faz sentido para o negócio.
- **Comunicação e Negociação:** Softwares são feitos por pessoas para pessoas. Convencer seu chefe a investir em refatoração, explicar um bug para um cliente não-técnico ou alinhar expectativas com o time de design são tarefas que exigem inteligência emocional, algo que o GPT-4 ainda não tem.
- **Curadoria > Criação:** Em 2026, codar "do zero" é raro. Sua habilidade principal migra de "escrever linhas de código" para "ler, auditar e integrar código gerado". Você se torna um editor-chefe de código.
@@ -67,4 +67,4 @@ Com IAs escrevendo código, o que sobra para nós? A resposta é: **tudo o que e
- **Seja Humilde e Peça Ajuda:** Ninguém espera que você saiba tudo. Ter dúvidas é sinal de que você está aprendendo.
- **Compartilhe o que Você Sabe:** Ensinar é uma das melhores formas de aprender. Ajude um colega, responda uma dúvida em um fórum.
-A carreira de dev não é uma corrida de 100 metros, é uma maratona. Curta a jornada, celebre as pequenas vitórias e, acima de tudo, divirta-se construindo coisas incríveis. **Que a Força esteja com você!**
\ No newline at end of file
+A carreira de dev não é uma corrida de 100 metros, é uma maratona. Curta a jornada, celebre as pequenas vitórias e, acima de tudo, divirta-se construindo coisas incríveis. **Que a Força esteja com você!**
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..25ca73b
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,21 @@
+import js from "@eslint/js";
+import globals from "globals";
+
+export default [
+ {
+ ignores: [".vitepress/dist/**", "node_modules/**"],
+ },
+ js.configs.recommended,
+ {
+ languageOptions: {
+ globals: {
+ ...globals.node,
+ ...globals.browser,
+ },
+ },
+ rules: {
+ "no-unused-vars": "warn",
+ "no-console": "off",
+ },
+ },
+];
diff --git a/index.md b/index.md
index 3f5e527..ef92b1f 100644
--- a/index.md
+++ b/index.md
@@ -54,13 +54,15 @@ features:
O mercado mudou. O que era "sênior" em 2023 é "básico" em 2026. A Inteligência Artificial não é mais um diferencial, é um pré-requisito.
Este projeto não é apenas uma lista de tecnologias. É um guia curado para formar **Engenheiros de Software Completos**, preparados para:
-* **Trabalhar com Agentes de IA** como pares.
-* **Construir Sistemas Sustentáveis** (Green Software).
-* **Focar na Experiência do Usuário e Soft Skills** enquanto a IA escreve o boilerplate.
+
+- **Trabalhar com Agentes de IA** como pares.
+- **Construir Sistemas Sustentáveis** (Green Software).
+- **Focar na Experiência do Usuário e Soft Skills** enquanto a IA escreve o boilerplate.
### 🌟 O Desenvolvedor Completo de 2026
Ser um **Desenvolvedor Completo** hoje significa transitar fluida e eficientemente entre diversas habilidades, não se limitando apenas ao código-fonte. O foco expandiu do "Como fazer?" para o "Por que fazer?" e "Como a IA pode ajudar a fazer melhor?". Um desenvolvedor de excelência deve dominar:
+
- **Tecnologias Core**: HTML, CSS, JavaScript, linguagens de back-end sólidas e arquitetura de software (Microsserviços, Serverless).
- **Inteligência Artificial Integrada**: RAG, Prompt Engineering, e uso de copilotos e agentes no workflow diário.
- **Engenharia de Cloud & DevOps**: CI/CD eficiente, uso consciente de recursos na nuvem (FinOps), e monitoramento avançado.
@@ -73,15 +75,15 @@ Neste guia, trilhamos o caminho ideal desde os fundamentos para Iniciantes (Jún
1. **[Trilha Comum (Base)](/roadmaps/general/common.md)**: Agora estruturada em níveis, do básico à gestão de carreira. **Obrigatório para todos.**
2. **Escolha sua Especialização:**
- * [Backend](/roadmaps/backend/backend.md): Para quem gosta de lógica, dados e sistemas robustos.
- * [Frontend](/roadmaps/frontend/frontend.md): Para quem ama criar interfaces incríveis e performáticas.
- * [Full Stack](/roadmaps/fullstack/fullstack.md): O pacote completo. Combine os conhecimentos de **Frontend** e **Backend** para construir produtos de ponta a ponta.
- * [Mobile](/roadmaps/mobile/mobile.md): Para quem quer colocar o mundo na palma da mão.
- * [DevOps](/roadmaps/devops/devops.md): Para os guardiões da infraestrutura e automação.
- * [Engenharia de Dados](/roadmaps/data/data-engineering.md): Para os arquitetos da informação.
- * [Cybersecurity](/roadmaps/security/cybersecurity.md): Para os guardiões digitais.
- * [Inteligência Artificial](/roadmaps/ai/artificial-intelligence.md): Para os arquitetos da nova era.
- * [QA & Testing](/roadmaps/qa/qa-testing.md): Para os guardiões da qualidade e confiança.
+ - [Backend](/roadmaps/backend/backend.md): Para quem gosta de lógica, dados e sistemas robustos.
+ - [Frontend](/roadmaps/frontend/frontend.md): Para quem ama criar interfaces incríveis e performáticas.
+ - [Full Stack](/roadmaps/fullstack/fullstack.md): O pacote completo. Combine os conhecimentos de **Frontend** e **Backend** para construir produtos de ponta a ponta.
+ - [Mobile](/roadmaps/mobile/mobile.md): Para quem quer colocar o mundo na palma da mão.
+ - [DevOps](/roadmaps/devops/devops.md): Para os guardiões da infraestrutura e automação.
+ - [Engenharia de Dados](/roadmaps/data/data-engineering.md): Para os arquitetos da informação.
+ - [Cybersecurity](/roadmaps/security/cybersecurity.md): Para os guardiões digitais.
+ - [Inteligência Artificial](/roadmaps/ai/artificial-intelligence.md): Para os arquitetos da nova era.
+ - [QA & Testing](/roadmaps/qa/qa-testing.md): Para os guardiões da qualidade e confiança.
## 💡 Conselhos de Carreira
@@ -89,6 +91,7 @@ Não sabe por onde começar? Sente que não sabe nada (Síndrome do Impostor)?
Confira nossa página de [**Conselhos**](/advices.md) para um guia mental de sobrevivência.
---
+
## Créditos
Inspirado em: [Roadmap.sh](https://roadmap.sh/)
diff --git a/netlify.toml b/netlify.toml
index 8a6dbc1..d29eb29 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1,5 +1,5 @@
[build]
- command = "npm ci && npm run docs:build"
+ command = "npm install && npm run docs:build"
publish = ".vitepress/dist"
[build.environment]
diff --git a/package-lock.json b/package-lock.json
index ba2eaef..c8a4afa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,6 +13,16 @@
"vitepress": "^1.6.4",
"vitepress-plugin-mermaid": "^2.0.17"
},
+ "devDependencies": {
+ "@eslint/js": "^9.0.0",
+ "@playwright/test": "^1.45.0",
+ "@vitest/coverage-v8": "^2.0.0",
+ "eslint": "^9.0.0",
+ "globals": "^15.0.0",
+ "markdownlint-cli": "^0.41.0",
+ "prettier": "^3.3.0",
+ "vitest": "^2.0.0"
+ },
"engines": {
"node": ">=18"
}
@@ -257,6 +267,20 @@
"node": ">= 14.0.0"
}
},
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
@@ -303,6 +327,13 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@braintree/sanitize-url": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz",
@@ -725,6 +756,202 @@
"node": ">=12"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "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/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "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/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
"node_modules/@iconify-json/simple-icons": {
"version": "1.2.71",
"resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.71.tgz",
@@ -740,12 +967,72 @@
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
"license": "MIT"
},
+ "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/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT"
},
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@mermaid-js/mermaid-mindmap": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-mindmap/-/mermaid-mindmap-9.3.0.tgz",
@@ -762,6 +1049,33 @@
"non-layered-tidy-tree-layout": "^2.0.2"
}
},
+ "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/@playwright/test": {
+ "version": "1.58.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz",
+ "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.58.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"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",
@@ -847,6 +1161,9 @@
"cpu": [
"arm"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -860,6 +1177,9 @@
"cpu": [
"arm"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -873,6 +1193,9 @@
"cpu": [
"arm64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -886,6 +1209,9 @@
"cpu": [
"arm64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -899,6 +1225,9 @@
"cpu": [
"loong64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -912,6 +1241,9 @@
"cpu": [
"loong64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -925,6 +1257,9 @@
"cpu": [
"ppc64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -938,6 +1273,9 @@
"cpu": [
"ppc64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -951,6 +1289,9 @@
"cpu": [
"riscv64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -964,6 +1305,9 @@
"cpu": [
"riscv64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -977,6 +1321,9 @@
"cpu": [
"s390x"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -1211,6 +1558,13 @@
"@types/unist": "*"
}
},
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/linkify-it": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
@@ -1279,6 +1633,162 @@
"vue": "^3.2.25"
}
},
+ "node_modules/@vitest/coverage-v8": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz",
+ "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@bcoe/v8-coverage": "^0.2.3",
+ "debug": "^4.3.7",
+ "istanbul-lib-coverage": "^3.2.2",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-lib-source-maps": "^5.0.6",
+ "istanbul-reports": "^3.1.7",
+ "magic-string": "^0.30.12",
+ "magicast": "^0.3.5",
+ "std-env": "^3.8.0",
+ "test-exclude": "^7.0.1",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@vitest/browser": "2.1.9",
+ "vitest": "2.1.9"
+ },
+ "peerDependenciesMeta": {
+ "@vitest/browser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz",
+ "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "2.1.9",
+ "@vitest/utils": "2.1.9",
+ "chai": "^5.1.2",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz",
+ "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "2.1.9",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.12"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/mocker/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz",
+ "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz",
+ "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "2.1.9",
+ "pathe": "^1.1.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz",
+ "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "2.1.9",
+ "magic-string": "^0.30.12",
+ "pathe": "^1.1.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz",
+ "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz",
+ "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "2.1.9",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
"node_modules/@vue/compiler-core": {
"version": "3.5.28",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz",
@@ -1514,6 +2024,46 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "dev": true,
+ "license": "MIT",
+ "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/algoliasearch": {
"version": "5.49.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.0.tgz",
@@ -1539,37 +2089,155 @@
"node": ">= 14.0.0"
}
},
- "node_modules/birpc": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
- "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "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/sponsors/antfu"
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
"license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "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/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
"resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
"integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
"license": "MIT",
@@ -1588,6 +2256,36 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/check-error": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
+ "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -1607,6 +2305,13 @@
"node": ">= 10"
}
},
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/copy-anything": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz",
@@ -1631,6 +2336,21 @@
"layout-base": "^1.0.0"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "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",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
@@ -2175,6 +2895,33 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delaunator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
@@ -2221,12 +2968,26 @@
"integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==",
"license": "(MPL-2.0 OR Apache-2.0)"
},
+ "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/elkjs": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",
"integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",
"license": "EPL-2.0"
},
+ "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/emoji-regex-xs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
@@ -2245,6 +3006,13 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/esbuild": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
@@ -2283,155 +3051,769 @@
"@esbuild/win32-x64": "0.21.5"
}
},
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "license": "MIT"
- },
- "node_modules/focus-trap": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz",
- "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==",
- "license": "MIT",
- "dependencies": {
- "tabbable": "^6.4.0"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "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/hast-util-to-html": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
- "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
- "license": "MIT",
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "ccount": "^2.0.0",
- "comma-separated-tokens": "^2.0.0",
- "hast-util-whitespace": "^3.0.0",
- "html-void-elements": "^3.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "property-information": "^7.0.0",
- "space-separated-tokens": "^2.0.0",
- "stringify-entities": "^4.0.0",
- "zwitch": "^2.0.4"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/hast-util-to-html/node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "license": "MIT"
- },
- "node_modules/hast-util-whitespace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
- "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/hookable": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
- "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
- "license": "MIT"
- },
- "node_modules/html-void-elements": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
- "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
- "license": "MIT",
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "url": "https://opencollective.com/eslint"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/internmap": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
- "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
- "license": "ISC",
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/is-what": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz",
- "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/mesqueeb"
+ "engines": {
+ "node": ">=0.10"
}
},
- "node_modules/katex": {
- "version": "0.16.32",
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.32.tgz",
- "integrity": "sha512-ac0FzkRJlpw4WyH3Zu/OgU9LmPKqjHr6O2BxfSrBt8uJ1BhvH2YK3oJ4ut/K+O+6qQt2MGpdbn0MrffVEnnUDQ==",
- "funding": [
- "https://opencollective.com/katex",
- "https://github.com/sponsors/katex"
- ],
- "license": "MIT",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "commander": "^8.3.0"
+ "estraverse": "^5.2.0"
},
- "bin": {
- "katex": "cli.js"
+ "engines": {
+ "node": ">=4.0"
}
},
- "node_modules/katex/node_modules/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "license": "MIT",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 12"
+ "node": ">=4.0"
}
},
- "node_modules/khroma": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
- "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "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",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/focus-trap": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz",
+ "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.4.0"
+ }
+ },
+ "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/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
+ "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "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/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/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/glob/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/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/ini": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+ "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz",
+ "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
+ "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/katex": {
+ "version": "0.16.32",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.32.tgz",
+ "integrity": "sha512-ac0FzkRJlpw4WyH3Zu/OgU9LmPKqjHr6O2BxfSrBt8uJ1BhvH2YK3oJ4ut/K+O+6qQt2MGpdbn0MrffVEnnUDQ==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/katex/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/khroma": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
},
"node_modules/kleur": {
"version": "4.1.5",
@@ -2448,19 +3830,108 @@
"integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
"license": "MIT"
},
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/lodash-es": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
"integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
"license": "MIT"
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/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==",
"license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
+ "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.25.4",
+ "@babel/types": "^7.25.4",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mark.js": {
@@ -2469,6 +3940,129 @@
"integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
"license": "MIT"
},
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/markdownlint": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz",
+ "integrity": "sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "markdown-it": "14.1.0",
+ "markdownlint-micromark": "0.1.9"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/DavidAnson"
+ }
+ },
+ "node_modules/markdownlint-cli": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.41.0.tgz",
+ "integrity": "sha512-kp29tKrMKdn+xonfefjp3a/MsNzAd9c5ke0ydMEI9PR98bOjzglYN4nfMSaIs69msUf1DNkgevAIAPtK2SeX0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "~12.1.0",
+ "get-stdin": "~9.0.0",
+ "glob": "~10.4.1",
+ "ignore": "~5.3.1",
+ "js-yaml": "^4.1.0",
+ "jsonc-parser": "~3.2.1",
+ "jsonpointer": "5.0.1",
+ "markdownlint": "~0.34.0",
+ "minimatch": "~9.0.4",
+ "run-con": "~1.3.2",
+ "smol-toml": "~1.2.0"
+ },
+ "bin": {
+ "markdownlint": "markdownlint.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/markdownlint-cli/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/markdownlint-cli/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/markdownlint-cli/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/markdownlint-micromark": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz",
+ "integrity": "sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/DavidAnson"
+ }
+ },
"node_modules/mdast-util-from-markdown": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
@@ -2625,6 +4219,13 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/mermaid": {
"version": "10.9.3",
"resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz",
@@ -3095,6 +4696,39 @@
],
"license": "MIT"
},
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "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": "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/minisearch": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
@@ -3140,6 +4774,13 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/non-layered-tidy-tree-layout": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz",
@@ -3157,6 +4798,130 @@
"regex-recursion": "^6.0.2"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "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/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "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/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
@@ -3169,10 +4934,42 @@
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
+ "node_modules/playwright": {
+ "version": "1.58.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz",
+ "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.58.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.58.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz",
+ "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/postcss": {
- "version": "8.5.6",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
"funding": [
{
"type": "opencollective",
@@ -3207,6 +5004,32 @@
"url": "https://opencollective.com/preact"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/property-information": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
@@ -3217,6 +5040,26 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
@@ -3241,6 +5084,16 @@
"integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
"license": "MIT"
},
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
@@ -3297,6 +5150,22 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/run-con": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz",
+ "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==",
+ "dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~4.1.0",
+ "minimist": "^1.2.8",
+ "strip-json-comments": "~3.1.1"
+ },
+ "bin": {
+ "run-con": "cli.js"
+ }
+ },
"node_modules/rw": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
@@ -3328,6 +5197,42 @@
"license": "MIT",
"peer": true
},
+ "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/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/shiki": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz",
@@ -3344,32 +5249,140 @@
"@types/hast": "^3.0.4"
}
},
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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/smol-toml": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.2.2.tgz",
+ "integrity": "sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"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==",
"license": "BSD-3-Clause",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/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/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "node_modules/string-width-cjs/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",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/speakingurl": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
- "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
- "license": "BSD-3-Clause",
+ "node_modules/string-width-cjs/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/string-width-cjs/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": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/stringify-entities": {
@@ -3386,6 +5399,59 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "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/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-ansi-cjs/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/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/stylis": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
@@ -3404,12 +5470,123 @@
"node": ">=16"
}
},
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/tabbable": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz",
"integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==",
"license": "MIT"
},
+ "node_modules/test-exclude": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz",
+ "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^10.4.1",
+ "minimatch": "^10.2.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/test-exclude/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/test-exclude/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/test-exclude/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/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
+ "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/trim-lines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
@@ -3429,6 +5606,26 @@
"node": ">=6.10"
}
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/unist-util-is": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
@@ -3521,6 +5718,16 @@
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
"license": "MIT"
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
@@ -3664,6 +5871,43 @@
}
}
},
+ "node_modules/vite-node": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz",
+ "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.7",
+ "es-module-lexer": "^1.5.4",
+ "pathe": "^1.1.2",
+ "vite": "^5.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/vitepress": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz",
@@ -3718,6 +5962,72 @@
"vitepress": "^1.0.0 || ^1.0.0-alpha"
}
},
+ "node_modules/vitest": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz",
+ "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "2.1.9",
+ "@vitest/mocker": "2.1.9",
+ "@vitest/pretty-format": "^2.1.9",
+ "@vitest/runner": "2.1.9",
+ "@vitest/snapshot": "2.1.9",
+ "@vitest/spy": "2.1.9",
+ "@vitest/utils": "2.1.9",
+ "chai": "^5.1.2",
+ "debug": "^4.3.7",
+ "expect-type": "^1.1.0",
+ "magic-string": "^0.30.12",
+ "pathe": "^1.1.2",
+ "std-env": "^3.8.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.1",
+ "tinypool": "^1.0.1",
+ "tinyrainbow": "^1.2.0",
+ "vite": "^5.0.0",
+ "vite-node": "2.1.9",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "@vitest/browser": "2.1.9",
+ "@vitest/ui": "2.1.9",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vue": {
"version": "3.5.28",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz",
@@ -3745,6 +6055,157 @@
"integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==",
"license": "Apache-2.0"
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/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/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index fca7309..df75374 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,13 @@
"scripts": {
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
- "docs:preview": "vitepress preview"
+ "docs:preview": "vitepress preview",
+ "lint": "eslint -c eslint.config.mjs .",
+ "lint:md": "markdownlint \"**/*.md\" --ignore node_modules --ignore .vitepress/dist",
+ "format": "prettier --write .",
+ "test": "vitest run --coverage",
+ "test:e2e": "playwright test",
+ "security": "npm audit"
},
"keywords": [
"roadmap",
@@ -28,5 +34,15 @@
"mermaid": "10.9.3",
"vitepress": "^1.6.4",
"vitepress-plugin-mermaid": "^2.0.17"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.3.0",
+ "@playwright/test": "^1.44.1",
+ "@vitest/coverage-v8": "^1.6.0",
+ "eslint": "^9.3.0",
+ "globals": "^15.3.0",
+ "markdownlint-cli": "^0.41.0",
+ "prettier": "^3.3.2",
+ "vitest": "^1.6.0"
}
}
diff --git a/playwright.config.js b/playwright.config.js
new file mode 100644
index 0000000..9167bb1
--- /dev/null
+++ b/playwright.config.js
@@ -0,0 +1,25 @@
+import { defineConfig } from "@playwright/test";
+
+export default defineConfig({
+ testDir: "./tests",
+ fullyParallel: true,
+ forbidOnly: !!process.env.CI,
+ retries: process.env.CI ? 2 : 0,
+ workers: process.env.CI ? 1 : undefined,
+ reporter: "html",
+ use: {
+ baseURL: "http://localhost:4173",
+ trace: "on-first-retry",
+ },
+ projects: [
+ {
+ name: "chromium",
+ use: { browserName: "chromium" },
+ },
+ ],
+ webServer: {
+ command: "npm run docs:preview",
+ port: 4173,
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/roadmaps/ai/artificial-intelligence.md b/roadmaps/ai/artificial-intelligence.md
index f34568f..a1d9c61 100644
--- a/roadmaps/ai/artificial-intelligence.md
+++ b/roadmaps/ai/artificial-intelligence.md
@@ -29,7 +29,9 @@ Esta trilha foi desenhada para guiar você desde os primeiros passos até os con
Aqui construímos a fundação. Sem ela, seus modelos desmoronam.
### 📐 Fundamentos Matemáticos (Essencial)
+
Não fuja da matemática! Ela é o motor debaixo do capô.
+
- **Álgebra Linear:** Entenda vetores, matrizes e tensores. É como os dados são representados.
- **Cálculo:** Derivadas e gradientes são usados para "ensinar" a rede (Backpropagation).
- **Probabilidade e Estatística:** Para entender incertezas e distribuições de dados.
@@ -38,19 +40,23 @@ Não fuja da matemática! Ela é o motor debaixo do capô.
- 📺 [3Blue1Brown - Essence of Linear Algebra](https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab)
### 🧠 Machine Learning "Clássico"
+
Antes de correr com Deep Learning, aprenda a andar com algoritmos clássicos.
+
- **Conceitos:** Aprendizado Supervisionado vs Não Supervisionado, Overfitting/Underfitting, Bias-Variance Tradeoff.
- **Algoritmos:** Regressão Linear/Logística, Árvores de Decisão, K-Means, SVM.
- **Scikit-Learn:** A biblioteca padrão para ML em Python.
- **Recursos:**
- 📖 [Scikit-Learn User Guide](https://scikit-learn.org/stable/user_guide.html)
- - 📺 [StatQuest with Josh Starmer](https://www.youtube.com/user/joshstarmer) - *Explicações incríveis!*
+ - 📺 [StatQuest with Josh Starmer](https://www.youtube.com/user/joshstarmer) - _Explicações incríveis!_
### 🐍 Python para Dados
+
- **Ferramentas:** Pandas (manipulação), NumPy (matemática), Matplotlib/Seaborn (visualização).
- **Jupyter Notebooks:** Seu caderno de laboratório interativo.
### 🛠️ Primeiro Projeto Prático
+
- **Titanic Survival Prediction (Kaggle):** O "Hello World" de Data Science.
- **Previsão de Preços de Casas:** Regressão clássica.
@@ -61,26 +67,31 @@ Antes de correr com Deep Learning, aprenda a andar com algoritmos clássicos.
Hora de usar redes neurais para resolver problemas que o código clássico não consegue (visão, texto, áudio).
### 🕸️ Deep Learning
+
- **Redes Neurais Artificiais (ANNs):** A base de tudo. Funções de ativação (ReLU, Sigmoid), Loss Functions.
- **Frameworks:**
- **PyTorch:** O favorito da pesquisa e da indústria moderna de IA generativa.
- **TensorFlow/Keras:** Ainda muito forte em produção legada e mobile.
- **Recursos:**
- - 📖 [Deep Learning for Coders (fast.ai)](https://course.fast.ai/) - *Aprenda fazendo.*
+ - 📖 [Deep Learning for Coders (fast.ai)](https://course.fast.ai/) - _Aprenda fazendo._
- 📖 [Neural Networks and Deep Learning (Michael Nielsen)](http://neuralnetworksanddeeplearning.com/)
### 👁️ Visão Computacional (CV)
+
- **CNNs (Convolutional Neural Networks):** Como o computador vê bordas e formas.
- **Arquiteturas Modernas:** Vision Transformers (ViT), YOLO (Detecção de Objetos).
- **Projetos:** Classificador de raças de cachorro, Detector de máscaras.
### 🗣️ Processamento de Linguagem Natural (NLP)
+
- **O Caminho até os LLMs:** Bag of Words -> Word2Vec -> RNNs/LSTMs -> **Transformers**.
- **Transformers:** Entenda "Attention is All You Need". Encoder vs Decoder.
- **Hugging Face:** Aprenda a usar a biblioteca `transformers` e o Hub.
### 🎨 Fundamentos de IA Generativa (GenAI)
+
Entenda como a mágica acontece. Não seja apenas um usuário de APIs.
+
- **Como funcionam os LLMs:**
- **Tokenization:** Como o texto vira números. Byte-Pair Encoding (BPE).
- **Embeddings:** O conceito de espaço semântico. Por que "Rei - Homem + Mulher = Rainha"?
@@ -93,14 +104,18 @@ Entenda como a mágica acontece. Não seja apenas um usuário de APIs.
- **Diffusion Models:** A matemática por trás da geração de imagens (Stable Diffusion, Midjourney). O processo de adicionar e remover ruído.
### 🎥 Multimodalidade (O Próximo Passo)
+
O mundo não é feito só de texto. Modelos que veem, ouvem e falam.
+
- **Audio Generation:** Text-to-Speech (TTS) e Music Generation. (ElevenLabs, Suno, Udio).
- **Video Generation:** Sora, Runway Gen-3. A complexidade da consistência temporal.
- **Vision-Language Models (VLMs):** GPT-4o, LLaVA. Como projetar embeddings de imagem no espaço de texto.
- **Vision-Language-Action (VLA) Models (Robótica em 2026):** Modelos que além de ver e entender o ambiente, processam e executam as ações mecânicas.
### ⚙️ MLOps Básico
+
Não basta treinar, tem que monitorar.
+
- **Experiment Tracking:** Use MLflow ou Weights & Biases para salvar seus experimentos.
- **Model Registry:** Onde guardar seus modelos versionados.
@@ -108,10 +123,12 @@ Não basta treinar, tem que monitorar.
## 🧙♂️ Nível Avançado (Sênior / Especialista): Escolha sua Especialização
-Neste ponto, a estrada se divide. Você vai construir os modelos (Research) ou construir *com* os modelos (Engineering)?
+Neste ponto, a estrada se divide. Você vai construir os modelos (Research) ou construir _com_ os modelos (Engineering)?
### 🔬 Caminho A: AI Research & Core ML
+
Foco em criar, treinar e otimizar novas arquiteturas. Aqui vivem os PhDs e matemáticos.
+
- **Model Training:**
- **Fine-Tuning Eficiente:** LoRA, QLoRA. Como adaptar um Llama 3 para medicina com uma única GPU.
- **Alinhamento:** RLHF (Reinforcement Learning from Human Feedback) e DPO (Direct Preference Optimization) para tornar o modelo útil e seguro.
@@ -120,18 +137,23 @@ Foco em criar, treinar e otimizar novas arquiteturas. Aqui vivem os PhDs e matem
- **Mixture of Experts (MoE):** Como funcionam modelos como o Mixtral.
### 🛠️ Caminho B: AI Engineering (O Arquiteto de Sistemas)
+
Foco em usar modelos para resolver problemas de negócio. Código robusto, infraestrutura e produto.
#### 🏗️ Sistemas de IA Compostos (Compound AI Systems)
+
O termo "RAG" ficou pequeno. Hoje construímos sistemas onde múltiplos componentes interagem.
+
- **Advanced RAG (Retrieval-Augmented Generation):**
- **GraphRAG:** Em vez de depender apenas da similaridade semântica de banco de vetores (Vector DBs), o GraphRAG constrói grafos de conhecimento (Knowledge Graphs) extraídos dos seus documentos. Isso permite à IA "entender" os relacionamentos indiretos entre entidades (ex: Empresa A comprou a Empresa B), o que a busca vetorial tradicional falha em conectar.
- - **Hybrid Search & Reranking:** Combinar busca vetorial com algoritmos de palavras-chave (BM25) e aplicar um modelo de *Cross-Encoder* no final para ranquear os melhores trechos. Isso aumenta drasticamente a precisão.
+ - **Hybrid Search & Reranking:** Combinar busca vetorial com algoritmos de palavras-chave (BM25) e aplicar um modelo de _Cross-Encoder_ no final para ranquear os melhores trechos. Isso aumenta drasticamente a precisão.
- **Query Transformation (Reescrita de Prompt):** O usuário pergunta "onde foi o evento?", a IA reescreve silenciosamente para "Qual a localização da conferência Tech2026 segundo o documento X?" antes de buscar no banco.
- **Self-RAG / Corrective RAG (CRAG):** Arquiteturas onde o modelo avalia a própria resposta. Se ele detectar que a informação extraída do banco é insuficiente ou irrelevante, ele pesquisa de novo na internet ou pede esclarecimento ao usuário, corrigindo a si mesmo.
### 🕵️ Agentes Autônomos & Agentic Workflows
-O LLM puro de 2024 ficou no passado. O futuro de 2026 é do Software de Automação Dirigida (Agentic Coding). O modelo não só conversa, ele é integrado ao ecossistema para *fazer*.
+
+O LLM puro de 2024 ficou no passado. O futuro de 2026 é do Software de Automação Dirigida (Agentic Coding). O modelo não só conversa, ele é integrado ao ecossistema para _fazer_.
+
- **Os 4 Padrões de Agentes (Agentic Design Patterns - Andrew Ng):**
- **Reflection (Reflexão):** O agente nunca entrega o primeiro rascunho. Ele avalia, critica o próprio código/texto e o refaz internamente antes da resposta.
- **Tool Use (Uso de Ferramentas / Function Calling):** Dar ao modelo APIs externas. Uma calculadora, busca na Wikipedia, um terminal bash, um banco de dados.
@@ -148,6 +170,7 @@ O LLM puro de 2024 ficou no passado. O futuro de 2026 é do Software de Automaç
- **MCP (Model Context Protocol):** Universalização da comunicação. Em 2026, você não refaz as APIs; você expõe servidores MCP que permitem que Claude, Mistral, Cursor, Llama-3 consumam suas bases corporativas imediatamente.
#### ⚖️ LLM Ops & Engenharia de IA
+
- **Evals (Unit Tests para IA):** "Minha mudança no prompt melhorou ou piorou o bot?". Use **Ragas**, **DeepEval** ou crie seu próprio dataset de "Golden Answers".
- **Observabilidade:** LangSmith, Langfuse. Monitore tokens por segundo, custo por usuário e latência.
- **Model Serving:** vLLM, TGI. Como servir modelos abertos com performance melhor que a OpenAI.
@@ -169,8 +192,9 @@ Não construa Skynet sem querer.
---
### 🧠 Soft Skills & Diferencial Humano
+
- **Ética e Responsabilidade:** Você está criando cérebros. Garanta que eles não sejam tendenciosos ou perigosos.
-- **Explicabilidade:** "O modelo disse isso" não é resposta para um banco que negou crédito. Saiba explicar o *porquê*.
+- **Explicabilidade:** "O modelo disse isso" não é resposta para um banco que negou crédito. Saiba explicar o _porquê_.
- **Ceticismo Científico:** Não caia no hype. Teste, meça e valide. Nem tudo precisa de LLM.
### 🏆 Desafios Práticos (Projetos)
@@ -186,28 +210,33 @@ Não construa Skynet sem querer.
### 🌟 Essenciais e Gratuitos
**Para o Júnior (Matemática Básica, Python, Fundamentos GenAI):**
+
- **[DeepLearning.AI (Andrew Ng)](https://www.deeplearning.ai/):**
- - *AI for Everyone:* Visão geral de negócio que todo iniciante deveria começar.
- - *Machine Learning Specialization:* Curso introdutório que o ensinará de fato os primeiros passos dos tensores antes dos LLMs.
+ - _AI for Everyone:_ Visão geral de negócio que todo iniciante deveria começar.
+ - _Machine Learning Specialization:_ Curso introdutório que o ensinará de fato os primeiros passos dos tensores antes dos LLMs.
- **[Fast.ai (Practical Deep Learning)](https://course.fast.ai/):** A melhor forma de começar "top-down". Codifique primeiro, estude a teoria depois.
**Para o Pleno (Machine Learning, RAG, NLP e Visão Computacional):**
+
- **[Hugging Face Courses](https://huggingface.co/learn):**
- - *NLP Course:* Domine Transformers.
- - *Deep RL Course:* Aprendizado por Reforço.
+ - _NLP Course:_ Domine Transformers.
+ - _Deep RL Course:_ Aprendizado por Reforço.
- **[Cohere LLM University](https://llm.university/):** Ótimo para entender a teoria completa dos embeddings, distâncias vetoriais e busca semântica para RAG.
-- **[DeepLearning.AI Short Courses (Grátis)](https://www.deeplearning.ai/short-courses/):** Para aprender *Prompt Engineering for Developers* com OpenAI API de ponta a ponta na prática.
+- **[DeepLearning.AI Short Courses (Grátis)](https://www.deeplearning.ai/short-courses/):** Para aprender _Prompt Engineering for Developers_ com OpenAI API de ponta a ponta na prática.
**Para o Sênior/Especialista (LLMOps, Multi-Agents, DSPy, Local-First Models):**
-- **[LangChain Academy](https://academy.langchain.com/):** O curso aprofundado para aprender grafos baseados em estado para orquestrar *Agentic Workflows* através do LangGraph.
+
+- **[LangChain Academy](https://academy.langchain.com/):** O curso aprofundado para aprender grafos baseados em estado para orquestrar _Agentic Workflows_ através do LangGraph.
- **[Full Stack Deep Learning (LLM Bootcamp)](https://fullstackdeeplearning.com/llm-bootcamp/):** O curso definitivo para arquitetura corporativa em MLOps e colocar LLMs massivos em produção usando servidores de inferência (vLLM).
- **[DeepLearning.AI: AI Agentic Design Patterns with AutoGen](https://www.deeplearning.ai/short-courses/ai-agentic-design-patterns-with-autogen/):** Entenda os padrões de agentes (Planning, Tool Use, Reflection) na prática recomendados pelo próprio Andrew Ng.
-- **[Anthropic Prompt Engineering Tutorial](https://github.com/anthropics/courses):** Muito avançado, ensina *Few-shot*, *Chain of Thought* forçados e técnicas obscuras em 2026 para dominar os modelos Claude 3.5 Sonnet.
+- **[Anthropic Prompt Engineering Tutorial](https://github.com/anthropics/courses):** Muito avançado, ensina _Few-shot_, _Chain of Thought_ forçados e técnicas obscuras em 2026 para dominar os modelos Claude 3.5 Sonnet.
### 🎧 Podcasts e Mídia (Engenharia Real)
+
- **[Latent Space](https://www.latent.space/):** O melhor podcast de Engenharia de IA. Discussões profundas com os criadores das ferramentas.
### 📚 Livros de Cabeceira
+
- **"The Little Book of Deep Learning" (François Fleuret):** [PDF Gratuito](https://fleuret.org/francois/lbdl.html). Conciso e matemático.
- **"Deep Learning" (Ian Goodfellow):** A bíblia teórica (avançado).
- **"Designing Machine Learning Systems" (Chip Huyen):** A bíblia da engenharia de produção.
@@ -222,7 +251,8 @@ Não construa Skynet sem querer.
- **Arxiv Sanity Preserver:** Para encontrar os papers que importam no meio do barulho.
---
+
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/backend/backend.md b/roadmaps/backend/backend.md
index c432c19..613aaae 100644
--- a/roadmaps/backend/backend.md
+++ b/roadmaps/backend/backend.md
@@ -30,11 +30,13 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é construir uma base sólida. Você precisa entender como a web funciona, dominar uma linguagem e conseguir criar APIs simples.
### 🏛️ Paradigmas de Programação
+
- **Programação Orientada a Objetos (POO):** Classes, Objetos, Herança e Polimorfismo. Pense em LEGO: blocos reutilizáveis que formam estruturas maiores.
- **Recursos:**
- 📖 [Refactoring Guru: Padrões de Projeto](https://refactoring.guru/pt-br/design-patterns)
### 🛠️ Linguagens e Frameworks (Escolha Um)
+
Não tente aprender tudo de uma vez. Escolha uma stack e aprofunde-se.
- **Node.js (JavaScript/TypeScript):**
@@ -53,15 +55,17 @@ Não tente aprender tudo de uma vez. Escolha uma stack e aprofunde-se.
- **Foco:** Performance extrema, segurança de memória e ferramentas de infraestrutura. A escolha para quem quer o máximo de controle.
### 🔌 APIs RESTful
+
- Entenda os verbos HTTP (GET, POST, PUT, DELETE).
- Status Codes (200 OK, 404 Not Found, 500 Internal Error).
- JSON como formato padrão de troca de dados.
### 🗄️ Banco de Dados (O Básico)
+
- **SQL (Relacional):** Aprenda a criar tabelas e fazer consultas (SELECT, INSERT, UPDATE, JOINs).
- - *Ferramentas:* PostgreSQL ou MySQL.
+ - _Ferramentas:_ PostgreSQL ou MySQL.
- **NoSQL (Documentos):** Entenda quando usar (flexibilidade de schema).
- - *Ferramentas:* MongoDB.
+ - _Ferramentas:_ MongoDB.
---
@@ -70,24 +74,30 @@ Não tente aprender tudo de uma vez. Escolha uma stack e aprofunde-se.
Aqui você deixa de apenas "fazer funcionar" e começa a "fazer bem feito", com segurança, testes e escala.
### 🔑 Autenticação e Segurança
+
- **OAuth 2.0 & OpenID Connect:** Delegar autenticação para Google/GitHub.
- **JWT (JSON Web Token):** Autenticação stateless para APIs modernas.
- **OWASP Top 10:** Conheça e previna as falhas de segurança mais comuns.
### 🧪 Testes Automatizados (O Oráculo)
+
- **Testes de Unidade:** Jest, JUnit, PyTest. Teste a menor parte do código.
- **Testes de Integração:** Usando **Testcontainers** para subir bancos reais em Docker durante os testes, evitando mocks frágeis.
### 🐳 DevOps Básico
+
- **Docker:** Como criar imagens e rodar sua aplicação em containers, garantindo que "funcione na minha máquina" e em produção.
- **CI/CD:** Pipelines de deploy automático (GitHub Actions). A esteira de produção do Tony Stark.
### 📨 Mensageria e Assincronismo
+
Sistemas distribuídos precisam conversar sem travar.
+
- **Conceitos:** Filas (Queues), Tópicos (Pub/Sub), Dead Letter Queues.
- **Ferramentas:** RabbitMQ (Filas tradicionais), Redis (Cache e PubSub rápido).
### 💾 Banco de Dados Intermediário
+
- **ORM vs Query Builders:** Prisma, TypeORM, Hibernate, Drizzle.
- **Modelagem de Dados:** Normalização, Índices para performance e Transações (ACID).
@@ -98,6 +108,7 @@ Sistemas distribuídos precisam conversar sem travar.
Onde você projeta sistemas complexos, escaláveis e inteligentes.
### 🏗️ Arquitetura de Software e Alta Performance
+
- **Rust & Go para Microsserviços (Green Software):** O uso de linguagens compiladas não é mais só para startups tech; grandes empresas estão migrando microsserviços pesados de Node/Java para Rust/Go, visando redução de custos na nuvem e menor uso de CPU/Memória (FinOps e Sustentabilidade).
- **WebAssembly (Wasm) no Backend:** O Wasm permite escrever módulos seguros, isolados em sandboxes e super rápidos. Ferramentas como Wasmtime ou Spin rodam nativamente no Edge sem o peso de um container Docker, resolvendo o problema de "Cold Start".
- **Microsserviços e Modular Monoliths:** Saber quando quebrar a aplicação (microsserviços) e quando usar um monolito modular bem escrito (com namespaces claros), uma tendência forte em 2026 para evitar complexidade prematura de deploy.
@@ -106,32 +117,41 @@ Onde você projeta sistemas complexos, escaláveis e inteligentes.
- **Event-Driven Architecture:** Kafka, Redpanda e RabbitMQ. Sistemas totalmente assíncronos e orientados a eventos.
### 📊 Engenharia de Dados para Devs
+
O Backend moderno lida com pipelines de dados, não apenas CRUD.
+
- **ETL vs ELT:** Extrair, Transformar e Carregar. Ferramentas como **dbt** (data build tool) são padrão de mercado.
- **Data Warehouses:** Snowflake, BigQuery. Entenda a diferença para um banco tradicional (OLTP vs OLAP).
- **Data Lakes:** Onde jogamos dados brutos (S3, Parquet) para a IA consumir depois.
### 🔭 Observabilidade (OpenTelemetry) e LLMOps
+
O "Olho de Sauron" para o bem, agora com foco em IA.
+
- **Pilares Tradicionais:** Logging, Métricas e Tracing Distribuído.
- **Ferramentas Clássicas:** Prometheus, Grafana, Jaeger, Datadog.
-- **LLMOps e Tracing de Agentes:** Monitorar o Backend mudou. Você precisa saber *por que* um agente alucinou ou quanto custou uma chamada de RAG.
+- **LLMOps e Tracing de Agentes:** Monitorar o Backend mudou. Você precisa saber _por que_ um agente alucinou ou quanto custou uma chamada de RAG.
- **Ferramentas:** **LangSmith** (excelente integração com LangChain) ou **Arize Phoenix**.
- **Métricas Chave:** Latência (Time to First Token - TTFT), Custo por Token, e Score de Relevância (RAG Evaluation).
### 🌿 Green Software & FinOps
+
Sustentabilidade e eficiência de custos caminham juntas.
+
- **FinOps:** Monitoramento contínuo de custos de nuvem. Use Tags e Alertas para não ter surpresas na conta da AWS/Azure.
- **Green Coding:** Otimizar algoritmos para reduzir consumo de CPU e memória, diminuindo a pegada de carbono do software.
- **Ferramentas:** Cloud Carbon Footprint.
### 🌐 Web3 & Blockchain (A Arquitetura Descentralizada)
+
Apesar do "inverno cripto", a adoção corporativa de blockchain em 2026 amadureceu, indo além da especulação para solucionar problemas reais de confiança e infraestrutura distribuída.
+
- **Smart Contracts (Contratos Inteligentes):** Código auto-executável na rede. Solidity (para a EVM, a máquina virtual da Ethereum) e Rust (para Solana/Polkadot) são cruciais.
- **Wallets & Autenticação:** Login via Web3 (Sign-In with Ethereum) como substituto ou complemento ao OAuth tradicional.
- **Decentralized Storage:** Uso de IPFS ou Arweave para hospedagem imutável de dados em vez do S3.
### 🤖 IA Engineering para Backend (O Diferencial de 2026)
+
O Backend evoluiu de servir apenas JSON para orquestrar "cérebros" de forma confiável. Em 2026, você precisa construir Sistemas Compostos de IA (Compound AI Systems).
- **Orquestração de Agentes e Fluxos Autônomos:**
@@ -146,28 +166,32 @@ O Backend evoluiu de servir apenas JSON para orquestrar "cérebros" de forma con
- Não confie só em "busca vetorial simples" (Naive RAG).
- **Vector Databases Especializados:** Dominar `pgvector`, Pinecone ou Qdrant.
- **Advanced RAG Patterns:**
- - **Hybrid Search & Reciprocal Rank Fusion (RRF):** Unir Keyword Search (BM25) com Busca Semântica (Embeddings) e usar um modelo de *Re-ranker* (Cohere) no final para extrair a resposta mais relevante.
+ - **Hybrid Search & Reciprocal Rank Fusion (RRF):** Unir Keyword Search (BM25) com Busca Semântica (Embeddings) e usar um modelo de _Re-ranker_ (Cohere) no final para extrair a resposta mais relevante.
- **GraphRAG:** Utilizar Grafos de Conhecimento (Knowledge Graphs, ex: Neo4j) extraídos de relatórios em vez de meros chunks vetoriais. Permite responder a conexões intrínsecas (ex: "Empresa X é subsidiária de quem?").
- **Corrective RAG (CRAG) & Self-RAG:** Agentes que testam a própria resposta, descartam contexto ruim e buscam no Google ou Wikipedia autonomamente se os dados do Vector DB forem insuficientes.
- **Inference Servers, MLOps e Modelos Locais (SLMs):**
- Servir modelos em GPU não é tarefa do Data Scientist, é do Engenheiro de Backend.
- Como entregar latência (Tokens/Segundo) usando **vLLM** ou **TGI (Text Generation Inference)**.
- - Economia na Cloud: Rodar *Small Language Models* (SLMs, ex: Llama 3 8B, Phi-3) com **Ollama** via APIs Dockerizadas internamente em instâncias mais baratas ao invés de depender cegamente do faturamento estratosférico da OpenAI API.
+ - Economia na Cloud: Rodar _Small Language Models_ (SLMs, ex: Llama 3 8B, Phi-3) com **Ollama** via APIs Dockerizadas internamente em instâncias mais baratas ao invés de depender cegamente do faturamento estratosférico da OpenAI API.
### 📚 Livros e Leituras Obrigatórias (Sênior)
+
Para chegar ao nível especialista, a prática não basta. Você precisa de teoria sólida.
+
- **"Designing Data-Intensive Applications" (Martin Kleppmann):** A bíblia dos sistemas distribuídos. Entenda como bancos de dados realmente funcionam (B-Trees, SSTables, Replication, Partitioning).
- **"System Design Primer":** O guia definitivo para entender como projetar sistemas que aguentam milhões de usuários.
### 📺 Canais de System Design (YouTube)
+
- **[ByteByteGo (Alex Xu)](https://www.youtube.com/@ByteByteGo):** As melhores explicações visuais de sistemas complexos (YouTube e Newsletter).
- **[Hussein Nasser](https://www.youtube.com/@hnasr):** Engenharia de Backend pura e profunda (Protocolos, Database Internals).
- **[Arpit Bhayani](https://www.youtube.com/@ArpitBhayani):** System Design para o mundo real e alta escala.
### 🧠 Soft Skills & Diferencial Humano
+
- **Negociação com Stakeholders:** Você será pressionado por prazos. Aprenda a explicar "Débito Técnico" como uma dívida financeira: "Se não pagarmos agora, os juros (bugs e lentidão) vão inviabilizar o projeto".
-- **Comunicação com Frontend:** Não jogue o JSON por cima do muro. Combine o contrato da API (Swagger/OpenAPI) *antes* de começar a codar.
+- **Comunicação com Frontend:** Não jogue o JSON por cima do muro. Combine o contrato da API (Swagger/OpenAPI) _antes_ de começar a codar.
- **Pragmatismo:** Nem tudo precisa ser microsserviços. Nem tudo precisa ser Kubernetes. A solução mais simples que resolve o problema é a melhor.
### 🏆 Desafios Práticos (Projetos)
@@ -183,16 +207,19 @@ Para chegar ao nível especialista, a prática não basta. Você precisa de teor
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos e Bases):**
+
- **[Boot.dev](https://www.boot.dev/):** Plataforma incrível gamificada focada no backend (Python, Go, algoritmos e estruturas de dados).
- **[FreeCodeCamp - Back End Development and APIs](https://www.freecodecamp.org/):** Excelente curso prático e gratuito sobre Node.js e MongoDB.
- **Documentações Oficiais:** Ler os guias iniciais do Express.js, FastAPI, Spring Boot ou [Go](https://go.dev/) é o primeiro passo de ouro.
**Para o Pleno (Arquitetura, Bancos e Testes):**
+
- **[Hussein Nasser (YouTube)](https://www.youtube.com/@hnasr):** O melhor canal para aprender como os bancos de dados (Postgres, Redis, Kafka) e protocolos (TCP/UDP, HTTP/2/3) funcionam por baixo dos panos.
- **[Test-Driven Development with Python (Harry Percival)](https://www.obeythetestinggoat.com/):** Livro clássico (disponível de graça online) que ensina TDD de verdade com Django.
- **[Full Cycle](https://fullcycle.com.br/):** Referência nacional para entender Docker, microsserviços, RabbitMQ e arquiteturas modernas para empresas.
**Para o Sênior/Especialista (System Design, Rust, AI Engineering):**
+
- **[Designing Data-Intensive Applications (Martin Kleppmann)](https://dataintensive.net/):** A bíblia absoluta do engenheiro de backend sênior. Ensina Replicação, Particionamento e Consenso.
- **[ByteByteGo (Alex Xu)](https://bytebytego.com/):** O curso e livro definitivos sobre System Design ("System Design Interview"). Acompanhe também o canal no YouTube.
- **[Arpit Bhayani (YouTube e Cursos)](https://www.youtube.com/@ArpitBhayani):** Focado em engenharia de altíssima escala e otimizações de nível de Kernel.
@@ -203,5 +230,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/data/data-engineering.md b/roadmaps/data/data-engineering.md
index 4988262..ea53d91 100644
--- a/roadmaps/data/data-engineering.md
+++ b/roadmaps/data/data-engineering.md
@@ -28,22 +28,27 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é dominar as ferramentas básicas de manipulação e consulta de dados.
### 🐍 Python para Dados
+
- **Pandas:** A biblioteca essencial para manipulação tabular.
- **Scripting:** Automação de tarefas simples (mover arquivos, limpar CSVs).
- **APIs:** Consumir dados de APIs REST (biblioteca `requests`).
### 🗄️ SQL Avançado (A Língua Franca)
+
Não basta saber `SELECT *`.
+
- **Window Functions:** `RANK()`, `LEAD()`, `LAG()`, `ROW_NUMBER()`.
- **CTEs (Common Table Expressions):** Organizar queries complexas com `WITH`.
- **Performance:** Entender índices e planos de execução (Explain Analyze).
### 🏗️ Modelagem de Dados
+
- **Relacional (OLTP):** Normalização (3NF).
- **Dimensional (OLAP):** Star Schema vs Snowflake Schema. Fatos e Dimensões.
- **Conceitos:** Data Lake vs Data Warehouse.
### 🐧 Linux & Bash
+
- Manipulação de arquivos grandes via terminal (`awk`, `sed`, `grep`).
- Agendamento básico com `cron`.
@@ -54,21 +59,27 @@ Não basta saber `SELECT *`.
Aqui você constrói pipelines robustos e escaláveis na nuvem.
### 🔄 ETL vs ELT
+
- **ETL (Extract, Transform, Load):** Transformar antes de carregar (Legado/Segurança).
- **ELT (Extract, Load, Transform):** Carregar bruto e transformar no destino (Modern Data Stack). Ferramenta padrão: **dbt (data build tool)**.
### ☁️ Cloud Data Warehouses
+
Escolha um e domine:
+
- **Snowflake:** Separação de Compute e Storage. Zero-copy cloning.
- **Google BigQuery:** Serverless e escalabilidade massiva.
- **AWS Redshift:** O clássico da AWS.
### 🎼 Orquestração de Pipelines
+
Não use crontab para tudo.
+
- **Apache Airflow:** O padrão da indústria (Python-based). Entenda DAGs, Operators e Sensors.
- **Prefect / Dagster:** Alternativas modernas com foco em experiência do desenvolvedor.
### 🐳 Containerização
+
- **Docker:** Rodar seus pipelines e bancos de dados localmente de forma isolada.
---
@@ -78,31 +89,40 @@ Não use crontab para tudo.
Onde você lida com Big Data real, streaming e arquitetura de dados corporativa.
### 🐘 Processamento Distribuído (Big Data)
+
Quando o Pandas trava por falta de memória RAM.
+
- **Apache Spark:** Processamento em memória distribuído. (PySpark).
- **Databricks:** A plataforma unificada para dados e IA baseada em Spark.
### 🌊 Real-time Streaming
+
Dados que perdem valor em segundos (fraude, IoT, mercado financeiro).
+
- **Apache Kafka:** O backbone de mensagens. Tópicos, Partições, Offsets.
- **Stream Processing:** Kafka Streams, Apache Flink ou Spark Structured Streaming.
### 🏠 Arquitetura de Dados em 2026: Lakehouse, Data Mesh e Data Fabric
+
A arquitetura de dados não é mais um "monolito de DW onde os dados vão para morrer". Ela deve focar na distribuição, governança autônoma e em servir de combustível para GenAI.
+
- **Lakehouse Architecture (O Padrão Ouro):** A união entre a escalabilidade e o baixo custo de armazenamento (Data Lakes no S3/Blob) com a robustez e transações ACID dos bancos de dados tradicionais.
- Formatos Open Table: **Apache Iceberg**, **Delta Lake**, **Apache Hudi**. Usar o formato correto evita a dependência de fornecedores (Vendor Lock-in).
- - Arquitetura Medalhão: A evolução passo a passo dos dados: *Bronze* (Dado Raw/Bruto como o JSON da API), *Prata* (Dado limpo, padronizado com schema, ex: data convertida de String para Timestamp) e *Ouro* (Agregações corporativas prontas para consumo e dashboards do PowerBI).
+ - Arquitetura Medalhão: A evolução passo a passo dos dados: _Bronze_ (Dado Raw/Bruto como o JSON da API), _Prata_ (Dado limpo, padronizado com schema, ex: data convertida de String para Timestamp) e _Ouro_ (Agregações corporativas prontas para consumo e dashboards do PowerBI).
- **Data Mesh (Malha de Dados):** Paradigma cultural e arquitetural. Pare de ter um "time centralizado de dados" que vira gargalo na empresa. Trate "Dados como Produto", onde a equipe de RH gerencia e publica os dados do RH num formato padronizado na malha para as outras equipes consumirem por self-service.
- **Data Fabric:** O uso de IA e Machine Learning para descobrir e conectar padrões de metadados em toda a empresa automaticamente (automação extrema de governança e mapeamento).
### 👮 Governança, DataOps e Data Contracts
+
Dados com bugs geram modelos de IA perigosos. "Garbage in, Garbage out".
+
- **Catálogo de Dados (Data Discovery):** DataHub ou Collibra. Onde está o dado? Quem é o dono dele? Quando foi atualizado a última vez?
-- **Qualidade de Dados & Data Contracts:** A evolução suprema do ETL. Um *Data Contract* é um acordo técnico assinado em código entre os Devs de Software e os Eng de Dados. Se o dev alterar a tabela de vendas retirando a coluna "Preço", a esteira CI/CD barra o deploy dele, pois quebrou o contrato que o Engenheiro de Dados validava no pipeline de consumo. Ferramentas: **Great Expectations**, **Soda**.
+- **Qualidade de Dados & Data Contracts:** A evolução suprema do ETL. Um _Data Contract_ é um acordo técnico assinado em código entre os Devs de Software e os Eng de Dados. Se o dev alterar a tabela de vendas retirando a coluna "Preço", a esteira CI/CD barra o deploy dele, pois quebrou o contrato que o Engenheiro de Dados validava no pipeline de consumo. Ferramentas: **Great Expectations**, **Soda**.
- **Privacidade e Governança:** Mascaramento dinâmico de dados sensíveis em tempo real (PII - Personally Identifiable Information). LGPD/GDPR by design.
- **Vector Engineering (Data para GenAI):** Criar os pipelines automáticos (ETL vetorial) que transformam os Pdfs financeiros diários da empresa em Embeddings para popular os Vector Databases do time de Inteligência Artificial.
### 🧠 Soft Skills & Diferencial Humano
+
- **Data Storytelling:** Um CSV gigante não convence ninguém. Aprenda a contar a história por trás dos números para a diretoria.
- **Ética e Privacidade:** Você tem acesso a dados sensíveis. Seja o guardião da privacidade do usuário, não apenas quem move bytes.
- **Tradutor de Negócios:** Entenda que "quero ver as vendas" pode significar 10 métricas diferentes. Pergunte "para que decisão você precisa desse dado?".
@@ -120,15 +140,18 @@ Dados com bugs geram modelos de IA perigosos. "Garbage in, Garbage out".
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (SQL, Python, Modelagem Básico):**
+
- **[DataCamp](https://www.datacamp.com/):** O lugar ideal (interativo no browser) para quem quer pegar intimidade prática com SQL, Python (Pandas/NumPy) e os primeiros passos para dados estruturados.
- **[Kaggle](https://www.kaggle.com/):** A comunidade onde habitam os datasets. Baixe CSVs (filmes, temperatura do mundo, dados criminais), suba no Postgres/Colab e aprenda limpando a "sujeira" do mundo real.
**Para o Pleno (ETL, dbt, Airflow e Warehouses):**
+
- **[dbt Learn (Fundamentals)](https://courses.getdbt.com/):** O dbt (data build tool) é obrigatório hoje, e este curso oficial e gratuito de 5 horas ensina do zero o conceito do Analytics Engineering e ELT.
- **[Marc Lamberti (Udemy/YouTube)](https://www.youtube.com/@marclamberti):** A referência suprema quando o assunto é Apache Airflow (orquestração corporativa).
- **Livro: "Data Warehouse Toolkit" (Ralph Kimball):** Um livro das antigas, mas a modelagem dimensional (Star Schema) ainda dita as regras em ambientes BigQuery/Snowflake.
**Para o Sênior/Especialista (Big Data, Lakehouse, Streaming e Governança):**
+
- **[Data Engineering Zoomcamp (DataTalks.Club)](https://github.com/DataTalksClub/data-engineering-zoomcamp):** Bootcamp intensivo, de código aberto e comunitário do GitHub abrangendo Airflow, Kafka, Spark, Terraform e GCP/AWS. Absolutamente fantástico.
- **[Designing Data-Intensive Applications (Martin Kleppmann)](https://dataintensive.net/):** A leitura definitiva sobre bancos de dados distribuídos e transações, recomendada igualmente para Devs de Backend.
- **Livro: "Data Mesh: Delivering Data-Driven Value at Scale" (Zhamak Dehghani):** A criadora do conceito ensina arquiteturas descentralizadas corporativas focadas em escalabilidade e cultura.
@@ -138,5 +161,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/devops/devops.md b/roadmaps/devops/devops.md
index 236540b..196592d 100644
--- a/roadmaps/devops/devops.md
+++ b/roadmaps/devops/devops.md
@@ -30,16 +30,19 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é sair da interface gráfica e dominar a linha de comando e os fundamentos da infraestrutura.
### 🐧 Linux e Terminal (O Habitat Natural)
+
- **Shell Scripting:** Bash/Zsh. Automatize tarefas repetitivas. Se você faz algo mais de duas vezes, faça um script.
- **Permissões:** `chmod`, `chown`. Entenda quem pode fazer o que.
- **Networking Básico:** SSH (chaves, não senhas!), DNS, HTTP/S, Firewalls (iptables/ufw).
### 🐳 Containers (O Novo Binário)
+
- **Docker:** Como criar `Dockerfile` eficientes (Multi-stage builds).
- **Docker Compose:** Orquestrar múltiplos containers localmente.
- **Conceito:** Imutabilidade. Uma vez construída, a imagem não muda.
### 📜 Git Avançado
+
- **Branching Strategies:** Git Flow, Trunk Based Development.
- **Hooks:** Automatizar checagens antes do commit (Pre-commit hooks).
@@ -50,26 +53,34 @@ O foco aqui é sair da interface gráfica e dominar a linha de comando e os fund
Aqui você começa a tratar infraestrutura como código e automatizar o ciclo de vida do software.
### 🔄 CI/CD (Integração e Entrega Contínuas)
+
- **GitHub Actions / GitLab CI:** Pipelines que testam, buildam e deployam seu código automaticamente a cada push.
- **Conceitos:** Linting, SAST (Static Application Security Testing), Artifact Management.
### ☁️ Cloud Providers (A Nuvem)
+
Escolha uma principal, mas entenda os conceitos universais (Compute, Storage, Networking).
+
- **AWS:** EC2, S3, RDS, Lambda, VPC.
- **Azure/GCP:** Equivalentes (VMs, Blob Storage, Cloud Functions).
- **IAM:** Gerenciamento de identidade e permissões (Princípio do Menor Privilégio).
### 🏗️ Infrastructure as Code (IaC)
+
Nunca configure servidores manualmente (ClickOps).
+
- **Terraform / OpenTofu:** O padrão da indústria para provisionar infraestrutura. Entenda State Files e Modules.
- **Ansible:** Para configuração de servidores (Configuration Management).
### ☸️ Kubernetes (O Capitão)
+
- **Conceitos:** Pods, Deployments, Services, Ingress, ConfigMaps, Secrets.
- **Gerenciamento:** `kubectl`, Helm Charts (o "npm" do Kubernetes).
### ☁️ Cloud Native & Serverless
+
A evolução natural de Containers.
+
- **Serverless Containers:** AWS Fargate, Google Cloud Run ou Azure Container Apps. Execute containers sem gerenciar as máquinas (EC2/Nodes).
- **Service Mesh:** Istio ou Linkerd. Desacoplar a lógica de rede, TLS, métricas e retentativas (retries) do código da aplicação, colocando tudo num "sidecar" ou via eBPF.
@@ -80,38 +91,50 @@ A evolução natural de Containers.
Onde você constrói plataformas para outros desenvolvedores e garante a estabilidade de sistemas globais.
### 🔭 Observabilidade Avançada (AI Ops & eBPF)
+
Em arquiteturas de milhões de reqs/s, você não pode inspecionar logs manualmente.
+
- **eBPF (Extended Berkeley Packet Filter):** A revolução da infraestrutura em 2026. A habilidade de rodar programas ultra rápidos e seguros dentro do Kernel do Linux sem alterar o código-fonte da aplicação ou adicionar pesados "sidecars". Ferramentas como **Cilium** controlam a rede, balanceamento de carga e observabilidade em altíssima performance.
- **OpenTelemetry (OTel):** A padronização de dados corporativos. Uma API unificada que processa Traces, Metrics, e Logs para sistemas backend complexos em Golang, Rust, Node, e AI Engines, injetando tudo de maneira diagnóstica.
- **AIOps:** Usar Agentes de Inteligência Artificial para não apenas criar "alertas do PagerDuty", mas para resolver automaticamente as panes e diagnosticar anomalias no Grafana/Prometheus (Self-healing).
### 🐙 GitOps (Controle de Versão Declarativo)
+
- **ArgoCD e Flux:** A infraestrutura nunca é "apertada num botão na nuvem". Todo e qualquer estado (bancos de dados, ingressos, certificados de Kubernetes) é um código YAML/HCL dentro de um repositório Git. O ArgoCD monitora o Git 24/7.
- **Drift Detection e Reconciliação Contínua:** Se um desenvolvedor manualmente alterar um servidor de 2GB de RAM para 8GB na interface web da nuvem (o famoso "Drift"), o ArgoCD detecta a anomalia e, em segundos, forçará a volta para 2GB, pois a "Fonte da Verdade" (o GitHub) não contém a modificação. O "Deploy" vira, puramente, o ato de aprovar e dar merge num PR.
### 🏗️ Platform Engineering (Engenharia de Plataforma)
+
A cultura DevOps evolui para a Engenharia de Plataforma. Não seja a "equipe de suporte que faz o deploy", seja a equipe que constrói o Produto (A Nuvem) pros Devs.
+
- **Internal Developer Platforms (IDPs):** Criar Portais unificados como **Backstage (Spotify)** ou **Port**.
- **Golden Paths (Caminhos Pavimentados):** O engenheiro júnior no seu primeiro dia de emprego preenche um formulário no IDP com o nome de sua "API de Vendas". Em 1 minuto, o Backstage roda o Terraform e cria um Repositório Git, pipelines de CI/CD, banco de dados isolado no ambiente dev, dashboards no Grafana e políticas de segurança, devolvendo a URL pronta pra ele codar. Isso zera a sobrecarga cognitiva do time de Dev e reduz gargalos absurdos.
### 🛡️ DevSecOps & Supply Chain Security
+
A fronteira de segurança não é o firewall, é o "NPM Install" que o dev júnior roda.
+
- **Software Bill of Materials (SBOM) & Sigstore:** O projeto gera uma "Nota Fiscal" (`syft`) com a lista exata de cada lib open source utilizada, garantindo que código adulterado por ataques à cadeia de suprimentos seja bloqueado via assinaturas (`Cosign`).
-- **Policy as Code (OPA & Kyverno):** Todo Pull Request no Kubernetes passa por um Agente Validador de Segurança. Se o container for rodar como usuário root, ou não tiver *Resource Limits*, o deploy é bloqueado por uma falha na validação da política de segurança, não importa quem o solicitou.
+- **Policy as Code (OPA & Kyverno):** Todo Pull Request no Kubernetes passa por um Agente Validador de Segurança. Se o container for rodar como usuário root, ou não tiver _Resource Limits_, o deploy é bloqueado por uma falha na validação da política de segurança, não importa quem o solicitou.
- **Container Scanning Contínuo:** Trivy, Grype ou Clair escaneiam imagens em tempo de build, parando a esteira caso se detecte as graves vulnerabilidades de dia zero (CVE).
### 💰 FinOps & Green Software
+
A nuvem é a coisa mais fácil do mundo de se pagar caro. A fatura mensal tem que ser monitorada pela infra.
+
- **Kubecost:** Transparência financeira. O IDP mostra para a equipe comercial exatamente quantos dólares aquela "API de Pagamentos" está custando aos cofres na AWS. Se passar de 20%, gera alerta.
-- **Green Software Foundation e Sustentabilidade:** Cortar desperdício é ajudar o planeta. Aplicar ferramentas como *Karpenter* no AWS EKS garante *Node Auto-provisioning* perfeito: A máquina do servidor só é alugada com as exatas vCPUs pedidas. Destruir VMs durante madrugadas ociosas via cronjobs.
+- **Green Software Foundation e Sustentabilidade:** Cortar desperdício é ajudar o planeta. Aplicar ferramentas como _Karpenter_ no AWS EKS garante _Node Auto-provisioning_ perfeito: A máquina do servidor só é alugada com as exatas vCPUs pedidas. Destruir VMs durante madrugadas ociosas via cronjobs.
### 📚 Livros e Cultura (Leitura Obrigatória)
+
DevOps é cultura, e cultura se aprende com histórias e práticas.
+
- **["The Phoenix Project" (Gene Kim)](https://itrevolution.com/product/the-phoenix-project/):** Um romance (sim, uma história!) que explica porque o trabalho de TI costuma ser caótico e como o DevOps resolve isso. Leitura leve e essencial.
- **["The DevOps Handbook"](https://itrevolution.com/product/the-devops-handbook/):** O manual prático que segue o "Phoenix Project".
- **["Site Reliability Engineering" (Google)](https://sre.google/books/):** Como o Google mantém seus sistemas no ar. O nascimento do conceito de SRE.
### 🧠 Soft Skills & Diferencial Humano
+
- **Cultura Sem Culpa (Blameless):** Quando algo quebra, não procure o culpado, procure a causa raiz. Se um dev derrubou a produção, é porque o pipeline permitiu.
- **Evangelista de Automação:** Seu trabalho é eliminar o seu próprio trabalho manual. Ensine os times de desenvolvimento a serem autônomos.
- **Gestão de Crise:** Manter a calma quando o Slack está pegando fogo é a sua habilidade mais valiosa.
@@ -129,16 +152,19 @@ DevOps é cultura, e cultura se aprende com histórias e práticas.
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos, Linux, Docker):**
+
- **[KodeKloud](https://kodekloud.com/):** A melhor plataforma hands-on (prática no terminal) para aprender Linux, Docker e Git, com cenários simulados fantásticos.
- **[NetworkChuck (YouTube)](https://www.youtube.com/@NetworkChuck):** Canal muito didático e acessível para quem precisa começar no mundo das redes, subnetting, e roteadores.
- **[ACloudGuru (agora Pluralsight)](https://www.pluralsight.com/cloud-guru):** O clássico absoluto para certificações Cloud Practitioner da AWS, GCP e Azure.
**Para o Pleno (Cloud, CI/CD, Terraform e Kubernetes):**
+
- **[Nana Janashia (TechWorld with Nana)](https://www.youtube.com/@TechWorldwithNana):** Um canal essencial. Os "Crash Courses" gratuitos sobre Terraform, Ansible, Docker e Kubernetes são de ouro.
- **[KubeAcademy (VMware)](https://kube.academy/):** Cursos curtos e gratuitos e bem desenhados focados nos mínimos detalhes do ecossistema Kubernetes.
- **[AWS Skill Builder](https://explore.skillbuilder.aws/):** Utilize a plataforma oficial da AWS e seu lab guiado para aprender a conectar lambdas com redes sem medo.
**Para o Sênior/Especialista (eBPF, FinOps, GitOps e IDPs):**
+
- **[The Phoenix Project / The DevOps Handbook (Livros)](https://itrevolution.com/):** Não subestime a parte humana e cultural, estas são as "Bíblias" que orientam Staff Engineers na jornada de DevOps corporativa.
- **[eBPF.io - O portal oficial do eBPF](https://ebpf.io/):** Documentação profunda, papers de arquitetura, e exemplos de programação em Rust/C para criar os próximos programas do kernel.
- **[ArgoCD / Flux Docs](https://argo-cd.readthedocs.io/):** O guia mais atualizado para escalar GitOps real e contínuo.
@@ -148,5 +174,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/frontend/frontend.md b/roadmaps/frontend/frontend.md
index fddfb03..53f2674 100644
--- a/roadmaps/frontend/frontend.md
+++ b/roadmaps/frontend/frontend.md
@@ -28,6 +28,7 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é dominar a tríade sagrada da web e começar a usar frameworks modernos.
### 🦴 HTML, CSS e JavaScript (A Base)
+
- **HTML:** Semântica (SEO) e Acessibilidade (a11y) - garantir que todos possam usar seu site.
- **CSS:** Flexbox, Grid e Responsividade (Mobile First). O básico para layout.
- **JavaScript:** Manipulação do DOM, `fetch` API para consumir dados e ES6+ (Arrow Functions, Destructuring).
@@ -35,12 +36,14 @@ O foco aqui é dominar a tríade sagrada da web e começar a usar frameworks mod
- 📖 [MDN Web Docs](https://developer.mozilla.org/)
### 🛠️ Frameworks Modernos (Escolha Um)
+
- **React:** O padrão da indústria. Entenda Hooks (`useState`, `useEffect`) e Componentes Funcionais.
- - *Next.js:* Aprenda o básico de Server-Side Rendering (SSR) e roteamento.
+ - _Next.js:_ Aprenda o básico de Server-Side Rendering (SSR) e roteamento.
- **Vue.js:** Curva de aprendizado suave e excelente documentação.
- **Angular:** Estrutura completa para grandes empresas (Google).
### 📦 Ferramentas Básicas
+
- **Git:** Como salvar e compartilhar seu código.
- **NPM/Yarn/PNPM:** Como instalar bibliotecas de terceiros.
@@ -51,26 +54,33 @@ O foco aqui é dominar a tríade sagrada da web e começar a usar frameworks mod
Aqui você garante qualidade, escalabilidade e performance. O "funciona" não é mais suficiente.
### 🛡️ TypeScript
+
- **Por que usar?** O JavaScript com "superpoderes" (tipagem estática). Evita 80% dos bugs comuns.
- **Conceitos:** Interfaces, Types, Generics e Utility Types.
### 🧠 Gerenciamento de Estado
+
Quando passar props de pai para filho fica insustentável.
+
- **Redux Toolkit:** O veterano robusto.
- **Zustand:** Minimalista e direto ao ponto.
- **React Query (TanStack Query):** Essencial para gerenciar estado assíncrono (API calls, cache, loading).
### 🧪 Testes no Frontend
+
- **Jest / Vitest:** Para lógica de negócios e funções puras.
- **React Testing Library:** Testar componentes como o usuário os vê (cliques, textos).
- **Cypress / Playwright:** Testes E2E (Ponta a Ponta) que simulam o navegador real.
### 🎨 Estilização Avançada
+
- **Tailwind CSS:** O padrão moderno de estilização utilitária.
- **Component Libraries:** Não reinvente a roda. Use **shadcn/ui** ou **Radix UI** para componentes acessíveis e bonitos.
### ♿ Acessibilidade Web (a11y)
+
A internet deve ser para todos.
+
- **Semântica HTML:** `button` é botão, `div` não é botão. O básico que muitos erram.
- **WAI-ARIA:** Quando o HTML não basta, use atributos ARIA (`aria-label`, `role`) para guiar leitores de tela.
- **Ferramentas de Auditoria:**
@@ -85,6 +95,7 @@ A internet deve ser para todos.
Onde a engenharia de software encontra a arte e a inteligência artificial.
### 🏗️ Arquitetura de Frontend
+
- **Micro-frontends:** Module Federation. Como dividir um sistema gigante em partes menores.
- **Server Components (RSC) e Next.js 15+:** O paradigma moderno de renderização mista de páginas web.
- **Partial Prerendering (PPR):** Combinar uma página estática super rápida com pedaços dinâmicos renderizados via stream, com suspenses.
@@ -92,36 +103,44 @@ Onde a engenharia de software encontra a arte e a inteligência artificial.
- **Server-Driven UI (HTMX):** A alternativa radical às SPAs complexas. Retornar HTML do servidor em vez de JSON, ideal para aplicações "dashboard-like" e redução de complexidade.
### ⚡ Performance & Core Web Vitals
+
Performance é UX. Ninguém gosta de site lento.
+
- **LCP (Largest Contentful Paint):** Quanto tempo demora para o "conteúdo principal" aparecer? Meta: < 2.5s.
- **INP (Interaction to Next Paint):** O site trava quando clico? Substituiu o FID. Meta: < 200ms.
- **CLS (Cumulative Layout Shift):** As coisas mudam de lugar sozinhas? Evite layout instável.
- **Técnicas:** Code Splitting, Lazy Loading de imagens, otimização de fontes e uso correto de Cache-Control.
### 🤖 IA Engineering no Frontend (O Diferencial de 2026)
+
A revolução da IA também acontece no lado do cliente.
+
- **Vercel AI SDK:** A ponte definitiva entre seu frontend e os LLMs. Domine o streaming não apenas de texto, mas de estados complexos (Stateful Streaming) e chamadas de ferramentas (`tool calling`). Diferencie o uso do `AI SDK Core` (para lógica) e `AI SDK UI` (para ganchos como `useChat`).
- **Generative UI (Runtime):** A IA não deve retornar apenas Markdown. Usando ferramentas como Vercel AI SDK (`streamUI`), ela gera componentes React on-the-fly (``, ``). A interface se adapta à intenção do usuário no tempo de execução.
- **Generative UI (DevTime):** Ferramentas como **v0.dev**, **Lovable** ou **Bolt.new** geram código de interface (React + Tailwind) pronto para uso. O fluxo de trabalho de um Sênior muda de "codar do zero" para "prompting arquitetural, curadoria e refino".
-- **Streaming UI:** O usuário não pode esperar a API responder completamente. Renderizar a interface *token por token* e montar esqueletos dinâmicos é a regra para reter atenção.
+- **Streaming UI:** O usuário não pode esperar a API responder completamente. Renderizar a interface _token por token_ e montar esqueletos dinâmicos é a regra para reter atenção.
- **Local First AI & WebNN:** O avanço além do WebGPU. Ferramentas como **ONNX Runtime Web** e a API **WebNN** permitem que o navegador acesse diretamente a NPU (Neural Processing Unit) do computador. Modelos (Llama 3, Phi-3, Whisper) rodam direto na máquina do usuário via **WebLLM** e **Transformers.js**. Isso traz **Privacidade Total** e **Zero Custo de Servidor (Inference Cost = 0)**.
### 🚀 Tópicos Especializados e React Server Components (RSC)
+
- **WebAssembly (Wasm) e Edge Computing:** Escrever e compilar códigos nativos C++/Rust/Go rodando com performance de desktop no browser via Wasm. Compartilhar a mesma biblioteca criptográfica ou algoritmo pesado entre o seu servidor Rust e o navegador do cliente.
- **Server Components (RSC) e Arquitetura Next.js 15:** Entender a fronteira difusa entre servidor e cliente (ex: Next.js App Router).
- **Streaming SSR:** Enviar o HTML progressivamente enquanto o banco de dados ainda está processando.
- **React Compiler (React 19):** O fim do `useMemo` e `useCallback` manuais. Entenda como o compilador otimiza re-renders automaticamente.
- **Funcionamento Principal:** Componentes de servidor processam o que é pesado e só entregam a interface limpa via HTML pro cliente, com "Server Actions" substituindo endpoints de API separados para mutations.
-- **Micro-Frontends e Module Federation (Avançado):** A forma correta de escalar times gigantes (escala Enterprise). Repositórios independentes publicam "pedaços" da aplicação que são injetados em tempo de execução no *shell* principal.
+- **Micro-Frontends e Module Federation (Avançado):** A forma correta de escalar times gigantes (escala Enterprise). Repositórios independentes publicam "pedaços" da aplicação que são injetados em tempo de execução no _shell_ principal.
- **Segurança Avançada:** Content Security Policy (CSP) rigorosas (usando nonces para RSCs), proteção contra XSS (especialmente ao renderizar saídas de IA/Markdown) e estratégias avançadas de mitigação de CSRF.
### 🌿 Green Frontend & Sustentabilidade
+
A web consome energia. Você pode ajudar a reduzir isso.
+
- **Peso da Página:** Imagens otimizadas (AVIF/WebP) e bundle JS reduzido significam menos transferência de dados e menos energia.
- **Renderização Eficiente:** Evite re-renders desnecessários que gastam CPU do dispositivo do usuário.
- **Dark Mode:** Em telas OLED, pixels pretos estão desligados e economizam bateria.
### 🧠 Soft Skills & Diferencial Humano
+
- **Empatia com Design:** Não diga "isso é impossível". Diga "isso é custoso, podemos simplificar assim?". Entenda que o pixel perfect importa para a marca.
- **Advogado do Usuário:** Você é a última linha de defesa antes do usuário. Se o fluxo está confuso, levante a mão. Não implemente cegamente telas ruins.
- **Colaboração com Backend:** Entenda as limitações da API. Negocie payloads menores e estratégias de cache para melhorar a performance.
@@ -139,16 +158,19 @@ A web consome energia. Você pode ajudar a reduzir isso.
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos e Bases):**
+
- **[MDN Web Docs](https://developer.mozilla.org/):** A bíblia do desenvolvimento web. Sempre consulte a MDN antes do StackOverflow.
- **[FreeCodeCamp - Responsive Web Design](https://www.freecodecamp.org/):** Excelente para fixar HTML e CSS na prática.
- **[JavaScript.info](https://javascript.info/):** O guia mais completo para entender o JS moderno a fundo.
**Para o Pleno (Arquitetura e TypeScript):**
+
- **[Total TypeScript](https://www.totaltypescript.com/):** O curso definitivo para parar de brigar com o compilador e entender TypeScript avançado (Matt Pocock).
- **[Frontend Masters](https://frontendmasters.com/):** Cursos aprofundados sobre performance, acessibilidade e algoritmos no frontend.
- **[Epic React](https://epicreact.dev/) / [React.dev](https://react.dev/):** Domine os padrões do React, concorrência e o novo React Compiler.
**Para o Sênior/Especialista (Generative UI, Performance e WebGPU):**
+
- **[web.dev (Google Chrome Developers)](https://web.dev/):** Acompanhe as métricas vitais (Core Web Vitals), novidades de CSS e arquitetura moderna.
- **[Vercel AI SDK Documentation](https://sdk.vercel.ai/docs):** Essencial para implementar Generative UI e integrar RAG no Frontend via React Server Components.
- **[Patterns.dev](https://www.patterns.dev/):** O guia moderno definitivo para padrões de design (Design Patterns) em JavaScript e React, focado em performance.
@@ -158,5 +180,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/fullstack/fullstack.md b/roadmaps/fullstack/fullstack.md
index 7dc0a3b..05f4d8c 100644
--- a/roadmaps/fullstack/fullstack.md
+++ b/roadmaps/fullstack/fullstack.md
@@ -28,6 +28,7 @@ Esta trilha assume que você já tem uma base sólida em [Frontend](../frontend/
O foco aqui é conseguir construir uma aplicação completa (CRUD) sozinho, do banco de dados à tela.
### 🌐 O Elo Perdido: Integração Client-Server
+
- **HTTP & REST:** Entenda profundamente Headers, Status Codes, Cookies vs LocalStorage.
- **CORS (Cross-Origin Resource Sharing):** O pesadelo de todo júnior. Entenda por que o browser bloqueia requisições e como configurar o backend corretamente.
- **Data Fetching:**
@@ -35,12 +36,16 @@ O foco aqui é conseguir construir uma aplicação completa (CRUD) sozinho, do b
- **Server-Side:** Como buscar dados antes de renderizar a página (SSR).
### 🗄️ Banco de Dados para Fullstack
+
Você não precisa ser um DBA, mas precisa saber guardar dados.
+
- **ORMs Modernos:** Prisma (Node/TS), Drizzle, Django ORM (Python). Eles facilitam a conversa entre seu código e o SQL.
- **Modelagem Básica:** Relacionamentos 1:N e N:N. Chaves Estrangeiras.
### 🚀 Frameworks Fullstack (Meta-Frameworks)
+
A forma moderna de construir web.
+
- **Next.js (React):** O padrão da indústria. Aprenda App Router, Server Components e Server Actions.
- **Nuxt (Vue):** A experiência de desenvolvimento incrível do Vue com poderes de servidor.
- **Laravel (PHP) ou Rails (Ruby):** Os veteranos "baterias inclusas" que ainda dominam o mercado de freelas e MVPs rápidos.
@@ -52,20 +57,25 @@ A forma moderna de construir web.
Aqui você escala, protege e organiza seu código.
### 🔐 Autenticação & Sessão
+
- **Auth de Verdade:** Não faça sua própria auth. Use **Auth.js (NextAuth)**, **Clerk** ou **Supabase Auth**.
- **JWT vs Session Cookies:** Entenda os trade-offs de segurança (XSS vs CSRF).
- **Role-Based Access Control (RBAC):** Proteger rotas de admin (`/admin`) no middleware e no frontend.
### 📦 Gerenciamento de Estado Global (Server + Client)
+
- **TanStack Query (React Query):** Sincronizar estado do servidor com o cliente. Cache, revalidação e loading states automáticos.
- **Zustand / Pinia:** Para estado puramente client-side (ex: carrinho de compras, modal aberto).
### 🏗️ Monorepos & Workspace
+
Gerenciar múltiplos projetos (Web, Admin, Mobile, API) no mesmo repositório.
+
- **Ferramentas:** Turborepo, Nx, pnpm workspaces.
- **Compartilhamento de Código:** Como ter uma pasta `packages/ui` ou `packages/utils` compartilhada entre frontend e backend.
### ☁️ Deploy & Infraestrutura (PaaS)
+
- **Vercel / Netlify:** Deploy de frontend e serverless functions com git push.
- **Railway / Render / Fly.io:** Para rodar containers Docker, bancos de dados e workers de fundo.
- **Bancos Gerenciados:** Neon (Serverless Postgres), PlanetScale (MySQL), Supabase (Postgres + Realtime).
@@ -77,18 +87,23 @@ Gerenciar múltiplos projetos (Web, Admin, Mobile, API) no mesmo repositório.
Onde você desenha sistemas resilientes e integra Inteligência Artificial.
### 📐 Arquitetura de Sistemas (System Design) Avançada
-- **BFF (Backend for Frontend):** Você não expõe sua base de dados diretamente para a web/mobile. Um BFF é uma fina camada de API customizada para a UI de cada cliente (Ex: BFF Mobile, BFF Web). No ecossistema React/Next.js, os *Server Components* e as *Server Actions* são o substituto natural e moderno de um BFF externo.
+
+- **BFF (Backend for Frontend):** Você não expõe sua base de dados diretamente para a web/mobile. Um BFF é uma fina camada de API customizada para a UI de cada cliente (Ex: BFF Mobile, BFF Web). No ecossistema React/Next.js, os _Server Components_ e as _Server Actions_ são o substituto natural e moderno de um BFF externo.
- **Serverless, Edge Computing & Wasm:** Rodar funções muito baratas em Data Centers próximos do usuário (Cloudflare Workers, Deno Deploy) garantindo latência quase zero. Em 2026, Edge + WebAssembly (Wasm) traz binários leves de linguagens como Rust integrados nativamente ao JavaScript via V8 Isolates, oferecendo poder computacional massivo a custos irrisórios.
- **Mensageria e Filas (Message Brokers):** Sistemas distribuídos. Remover tarefas pesadas (envios em lote, processamento de relatórios gerados por IA, Webhooks) do fluxo do usuário e colocar em Redis (BullMQ), AWS SQS, ou Apache Kafka para resiliência.
### 🌍 Local-First Architecture e Sincronização
+
Em 2026, conexões instáveis não são desculpa para a interface travar. Local-First virou o paradigma de escolha para UX premium.
+
- **O Fim das Telas de Carregamento (Loading Spinners):** O usuário deve abrir a aplicação e ver os dados instantaneamente sem dependência direta de redes externas.
- **CRDTs (Conflict-free Replicated Data Types):** O pilar do Local-First. É uma estrutura matemática que permite que dois ou mais dispositivos offline (Client A e B) realizem edições num mesmo JSON ou texto. Quando ficam online, o CRDT mescla o estado perfeitamente de forma determinística, garantindo colaboração em tempo real estilo Google Docs.
- **Ecossistema:** Bancos de dados integrados como PowerSync, ElectricSQL, RxDB. Bibliotecas core de sincronização como **Yjs**, **Automerge** ou **Loro** rodam diretamente no cliente/Edge em Wasm, trocando de paradigma (a UI lê do banco local como fonte da verdade, e a sincronização com o servidor é automática).
### 🤖 Fullstack AI Engineering
+
A integração profunda de modelos de IA no produto.
+
- **Vercel AI SDK:** O padrão para construir interfaces de chat e streaming de texto/componentes.
- **RAG na Prática:**
- Ingerir documentos (PDF/MD) no build time ou runtime.
@@ -97,11 +112,13 @@ A integração profunda de modelos de IA no produto.
- **Function Calling:** Fazer o LLM acionar funções do seu backend (ex: "Adicionar item ao carrinho").
### 🌿 Green Fullstack
+
- **Static Generation (SSG):** Se o dado não muda, gere HTML estático. É mais rápido e gasta zero computação no request.
- **Incremental Static Regeneration (ISR):** Atualizar estáticos sob demanda.
- **Otimização de Imagens:** Uso de CDNs de imagem e formatos modernos (AVIF).
### 🧠 Soft Skills & Diferencial Humano
+
- **Visão de Produto:** Você entende as limitações técnicas e de design. Ajude a definir o MVP (Minimum Viable Product).
- **Estimativa de Tempo:** Como você conhece os dois lados, sabe onde os gargalos podem aparecer.
- **Trade-offs:** Saber escolher entre "fazer rápido" (tech debt) e "fazer escalável" dependendo da fase da empresa.
@@ -119,15 +136,18 @@ A integração profunda de modelos de IA no produto.
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos e Bases):**
+
- **[The Odin Project](https://www.theodinproject.com/):** O melhor currículo gratuito e guiado por projetos para full stack (Ruby on Rails ou Node.js).
- **[Full Stack Open (Universidade de Helsinque)](https://fullstackopen.com/):** Curso maravilhoso focado em React, Redux, Node.js, MongoDB, GraphQL e TypeScript.
**Para o Pleno (Next.js, Arquitetura e Monorepos):**
+
- **[Next.js Learn (Curso Oficial)](https://nextjs.org/learn):** A documentação da Vercel tem um curso passo a passo criando um dashboard full stack. Imperdível.
- **[Prisma / Drizzle Docs](https://www.prisma.io/docs):** Aprenda ORMs modernos lendo os guias iniciais e tutorias práticos em seus sites oficiais.
- **[Joy of React (Josh Comeau)](https://joyofreact.com/):** Uma profunda exploração das fundações do React, excelente para consolidar conceitos antes de tentar construir apps complexos.
**Para o Sênior/Especialista (Edge Computing, Local-First e IA):**
+
- **[Vercel AI SDK & Next.js AI Chatbot](https://github.com/vercel/ai-chatbot):** Estude o código-fonte desse repositório para entender como arquitetar e deployar o que há de mais moderno em GenUI com Server Actions.
- **[Local-First Web Development (Automerge / Yjs Docs)](https://localfirstweb.dev/):** Este manifesto explica a arquitetura necessária para as aplicações offline-first premium de 2026. Leia e acompanhe projetos como o PowerSync.
- **[Turborepo](https://turbo.build/) e [Nx](https://nx.dev/) Docs:** O padrão para criar monorepos eficientes, essenciais para dividir componentes entre projetos Admin, API e App Cliente.
@@ -137,5 +157,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/general/2026-specialist-patterns.md b/roadmaps/general/2026-specialist-patterns.md
index b73e29d..21846f6 100644
--- a/roadmaps/general/2026-specialist-patterns.md
+++ b/roadmaps/general/2026-specialist-patterns.md
@@ -23,36 +23,36 @@ Chegar ao nível de Especialista (ou Arquiteto Principal / Staff Engineer) em 20
O backend moderno não vive mais apenas em containers dentro de um datacenter centralizado. O Wasm democratizou a capacidade de rodar código compilado (Rust, Go, C++) no Edge (na borda, mais perto do usuário) e dentro do próprio navegador, de forma segura e quase nativa.
-* **Por que importa?** Tempos de inicialização de milissegundos (Cold Starts mínimos). Execução segura em sandboxes. Reuso de código pesado entre Frontend e Backend.
-* **O que dominar:** Cloudflare Workers, Wasmtime, Spin, e integração de módulos Wasm com Node.js e Deno.
+- **Por que importa?** Tempos de inicialização de milissegundos (Cold Starts mínimos). Execução segura em sandboxes. Reuso de código pesado entre Frontend e Backend.
+- **O que dominar:** Cloudflare Workers, Wasmtime, Spin, e integração de módulos Wasm com Node.js e Deno.
## 🦀 2. Rust no Backend e Infraestrutura
A era de "memória infinita e instâncias gigantes" na nuvem está acabando por causa dos custos. Linguagens com gerenciamento automático (Garbage Collection), como Java e Node, estão sendo substituídas em serviços críticos (core) por Rust e Go.
-* **Por que importa?** Rust oferece segurança de memória sem Garbage Collector, resultando em previsibilidade de CPU e economia financeira massiva na AWS/GCP (FinOps).
-* **O que dominar:** Axum, Actix, Tauri (para Desktop) e reescrita de microsserviços pesados visando economia de computação (Green Software).
+- **Por que importa?** Rust oferece segurança de memória sem Garbage Collector, resultando em previsibilidade de CPU e economia financeira massiva na AWS/GCP (FinOps).
+- **O que dominar:** Axum, Actix, Tauri (para Desktop) e reescrita de microsserviços pesados visando economia de computação (Green Software).
## 🤖 3. Arquitetura de Sistemas Multi-Agentes
-LLMs sozinhos são apenas calculadoras de palavras. O valor real em 2026 vem de *Sistemas Compostos de IA*, onde múltiplos agentes autônomos colaboram entre si.
+LLMs sozinhos são apenas calculadoras de palavras. O valor real em 2026 vem de _Sistemas Compostos de IA_, onde múltiplos agentes autônomos colaboram entre si.
-* **Por que importa?** Um agente pode falhar ou ter alucinações. Um sistema com um agente planejador, um agente codificador, um agente revisor e um agente executivo (com acesso ao terminal) alcança uma taxa de sucesso imensamente maior.
-* **O que dominar:** LangGraph, AutoGen, CrewAI, DSPy (compilação e otimização de prompts ao invés de hardcoding), e MCP (Model Context Protocol).
+- **Por que importa?** Um agente pode falhar ou ter alucinações. Um sistema com um agente planejador, um agente codificador, um agente revisor e um agente executivo (com acesso ao terminal) alcança uma taxa de sucesso imensamente maior.
+- **O que dominar:** LangGraph, AutoGen, CrewAI, DSPy (compilação e otimização de prompts ao invés de hardcoding), e MCP (Model Context Protocol).
## 📡 4. Arquitetura Local-First e CRDTs
Os usuários de 2026 não toleram mais telas de "carregando" (spinners). A aplicação deve funcionar instantaneamente e offline, sincronizando com a nuvem apenas em background.
-* **Por que importa?** Garante UX perfeita (latência zero percebida). Reduz a carga brutal nos servidores. Permite colaboração em tempo real estilo Google Docs.
-* **O que dominar:** Conflict-free Replicated Data Types (CRDTs), Yjs, Automerge, PWA avançado, IndexedDB, SQLite no navegador via Wasm.
+- **Por que importa?** Garante UX perfeita (latência zero percebida). Reduz a carga brutal nos servidores. Permite colaboração em tempo real estilo Google Docs.
+- **O que dominar:** Conflict-free Replicated Data Types (CRDTs), Yjs, Automerge, PWA avançado, IndexedDB, SQLite no navegador via Wasm.
## 🌿 5. Green Coding e FinOps Avançado
Em 2026, código ruim não apenas trava, mas custa milhares de dólares e emite toneladas de carbono.
-* **Por que importa?** "Desenvolvimento Sustentável" tornou-se uma métrica de engenharia (DevSecFinOps). O Especialista sabe exatamente quanto um loop O(n^2) custa no final do mês.
-* **O que dominar:** Profiling de memória avançado, redução de pacotes de rede (gRPC em vez de REST para serviços internos), cache agressivo (Edge Caching, ISR/SSG) e monitoramento de Cloud Carbon Footprint.
+- **Por que importa?** "Desenvolvimento Sustentável" tornou-se uma métrica de engenharia (DevSecFinOps). O Especialista sabe exatamente quanto um loop O(n^2) custa no final do mês.
+- **O que dominar:** Profiling de memória avançado, redução de pacotes de rede (gRPC em vez de REST para serviços internos), cache agressivo (Edge Caching, ISR/SSG) e monitoramento de Cloud Carbon Footprint.
---
@@ -60,12 +60,14 @@ Em 2026, código ruim não apenas trava, mas custa milhares de dólares e emite
**O Projeto Final:**
Arquitetar (System Design) um "Sistema de Suporte ao Cliente Autônomo e Resiliente".
+
- Ele deve rodar primariamente no Edge (Cloudflare Workers via Wasm).
- Usar uma arquitetura RAG Avançada (GraphRAG) conectada ao banco de conhecimento corporativo.
-- Integrar um sistema Multi-Agente (LangGraph/CrewAI) em que o "Agente Triagem" categoriza, e o "Agente Solução" acessa as APIs internas via *Function Calling* para emitir reembolsos ou gerar links.
+- Integrar um sistema Multi-Agente (LangGraph/CrewAI) em que o "Agente Triagem" categoriza, e o "Agente Solução" acessa as APIs internas via _Function Calling_ para emitir reembolsos ou gerar links.
- O Frontend do operador humano deve ser Local-First (usando Yjs/CRDT) para que o gerente possa revisar as ações do Agente mesmo se o Wi-Fi da empresa cair.
---
+
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
+- [**Voltar para o Início**](../../index.md)
diff --git a/roadmaps/general/common.md b/roadmaps/general/common.md
index 375d2e7..8546eb9 100644
--- a/roadmaps/general/common.md
+++ b/roadmaps/general/common.md
@@ -126,17 +126,20 @@ Com a IA escrevendo código, suas habilidades humanas valem ouro.
Para garantir uma formação completa (Júnior ao Especialista), separamos os conteúdos de altíssima qualidade recomendados:
**Júnior (Começando a Jornada):**
+
- **[FreeCodeCamp](https://www.freecodecamp.org/):** O melhor lugar para começar do zero de forma **gratuita**. Cursos interativos e projetos práticos (Front, Back, Data).
- **[The Odin Project](https://www.theodinproject.com/):** O currículo open-source mais respeitado para Full Stack. Foca em fundamentos reais do zero ao deploy, sem pular etapas difíceis (Gratuito).
- **[CS50 (Harvard)](https://pll.harvard.edu/course/cs50-introduction-computer-science):** O melhor curso de introdução à ciência da computação do mundo (Gratuito no YouTube/edX).
- **[Microsoft: Generative AI for Beginners](https://github.com/microsoft/generative-ai-for-beginners):** Curso completo e gratuito no GitHub focado em IA Generativa, essencial para os primeiros passos na era da IA.
**Pleno (Aprofundamento e Prática Contínua):**
+
- **[Frontend Masters](https://frontendmasters.com/):** Considerada a plataforma com a mais **alta qualidade técnica** de ensino para Frontend, Fullstack e TypeScript do mercado (Pago).
- **[DeepLearning.AI](https://www.deeplearning.ai/):** A referência máxima para aprender IA de verdade. Desde cursos curtos gratuitos (Short Courses) sobre LangChain e RAG, até a especialização completa de Machine Learning de Andrew Ng.
- **[Roadmap.sh](https://roadmap.sh/):** Guias visuais incrivelmente detalhados para nivelar seus conhecimentos em diversas áreas de carreira tech.
**Sênior e Especialista (Arquitetura e Escala):**
+
- **[Pluralsight](https://www.pluralsight.com/) & [O'Reilly](https://www.oreilly.com/):** Excelentes plataformas para estudos corporativos profundos, nuvem, SRE, e arquitetura de software avançada (Pago).
- **[ByteByteGo (YouTube)](https://www.youtube.com/@ByteByteGo):** Canal essencial e de altíssima qualidade visual para aprender sobre Design e Arquitetura de Sistemas (System Design). Excelente para consolidar conceitos de sistema distribuído exigidos em entrevistas de Staff e Especialistas.
@@ -147,22 +150,25 @@ Para garantir uma formação completa (Júnior ao Especialista), separamos os co
- **Nível 3 (Profissional Completo):** Leia um artigo técnico em inglês, aplique a técnica Pomodoro para focar por 2 horas nos estudos, e escreva um pequeno resumo no GitHub explicando o que aprendeu. Reflita sobre sua comunicação em interações passadas.
---
+
## 📚 Aprofunde seus Estudos
Para maximizar seu aprendizado e entender exatamente o que focar em cada etapa da sua carreira, confira nosso guia detalhado:
-* [**Guia de Estudos 2026: Do Júnior ao Especialista**](./study-guide.md)
+
+- [**Guia de Estudos 2026: Do Júnior ao Especialista**](./study-guide.md)
---
+
## 🚦 Próximos Passos
Agora que você tem a base, escolha sua especialização:
-* [**Backend**](../backend/backend.md)
-* [**Frontend**](../frontend/frontend.md)
-* [**Full Stack**](../fullstack/fullstack.md)
-* [**Mobile**](../mobile/mobile.md)
-* [**DevOps**](../devops/devops.md)
-* [**Engenharia de Dados**](../data/data-engineering.md)
-* [**Cybersecurity**](../security/cybersecurity.md)
-* [**Inteligência Artificial**](../ai/artificial-intelligence.md)
-* [**QA & Testing (Qualidade de Software)**](../qa/qa-testing.md)
+- [**Backend**](../backend/backend.md)
+- [**Frontend**](../frontend/frontend.md)
+- [**Full Stack**](../fullstack/fullstack.md)
+- [**Mobile**](../mobile/mobile.md)
+- [**DevOps**](../devops/devops.md)
+- [**Engenharia de Dados**](../data/data-engineering.md)
+- [**Cybersecurity**](../security/cybersecurity.md)
+- [**Inteligência Artificial**](../ai/artificial-intelligence.md)
+- [**QA & Testing (Qualidade de Software)**](../qa/qa-testing.md)
diff --git a/roadmaps/general/study-guide.md b/roadmaps/general/study-guide.md
index 7b625e9..c78862a 100644
--- a/roadmaps/general/study-guide.md
+++ b/roadmaps/general/study-guide.md
@@ -13,7 +13,7 @@ flowchart TD
style Mastery fill:#bbf,stroke:#333,stroke-width:2px
```
-O mercado de tecnologia em 2026 não tolera mais desenvolvedores que apenas "escrevem código". Com a ascensão dos agentes autônomos de IA e ferramentas como Copilot e Cursor, a habilidade de *pensar* e *arquitetar* tornou-se mais valiosa do que a habilidade de *digitar*.
+O mercado de tecnologia em 2026 não tolera mais desenvolvedores que apenas "escrevem código". Com a ascensão dos agentes autônomos de IA e ferramentas como Copilot e Cursor, a habilidade de _pensar_ e _arquitetar_ tornou-se mais valiosa do que a habilidade de _digitar_.
Este guia foi desenhado para maximizar seu tempo e garantir que você estude **o que realmente importa**.
@@ -24,15 +24,17 @@ Este guia foi desenhado para maximizar seu tempo e garantir que você estude **o
O objetivo desta fase não é criar a arquitetura perfeita, mas sim **fazer funcionar de forma previsível e entender os fundamentos**. Você deve dominar a base antes de tentar escalar.
### 🎯 Foco Principal:
+
- **Lógica e Estruturas de Dados:** Compreender Big O Notation básico. Saber quando usar um Array vs um Map (Dicionário).
- **A Linguagem (Sua Ferramenta de Trabalho):** Escolha UMA linguagem (ex: JavaScript/TypeScript, Python, Go) e entenda como ela funciona por baixo dos panos (Event Loop, Garbage Collection).
- **Git & Versionamento:** Commits atômicos, branch management e como resolver conflitos sem pânico.
-- **Alfabetização em IA (Obrigatório):** Aprender a escrever prompts estruturados (*Zero-Shot*, *Few-Shot*) para que a IA gere código boilerplate, testes simples ou explique mensagens de erro.
+- **Alfabetização em IA (Obrigatório):** Aprender a escrever prompts estruturados (_Zero-Shot_, _Few-Shot_) para que a IA gere código boilerplate, testes simples ou explique mensagens de erro.
### 📅 Rotina Sugerida (1 a 2 horas/dia):
+
1. **Teoria (30%):** Assista a uma aula de CS50 ou leia documentações oficiais (MDN, docs de frameworks).
2. **Prática Focada (50%):** Resolva problemas no LeetCode (foco em Easy/Medium) ou implemente pequenos scripts.
-3. **Revisão com IA (20%):** Peça para o ChatGPT/Claude revisar seu código: *"Este código funciona, mas existe uma forma mais idiomática ou eficiente de escrevê-lo nesta linguagem?"*
+3. **Revisão com IA (20%):** Peça para o ChatGPT/Claude revisar seu código: _"Este código funciona, mas existe uma forma mais idiomática ou eficiente de escrevê-lo nesta linguagem?"_
---
@@ -41,12 +43,14 @@ O objetivo desta fase não é criar a arquitetura perfeita, mas sim **fazer func
Você já consegue entregar features. Agora, o desafio é entregar features **rápidas, seguras, testáveis e sustentáveis**.
### 🎯 Foco Principal:
+
- **Testes Automatizados & TDD:** Você não testa apenas para achar bugs, mas para documentar o comportamento esperado. O Padrão de 2026 é o **Test-Driven Agentic Workflow (TDAW)**: você escreve o teste falho e pede para o Agente de IA implementar a lógica até o teste passar.
- **Banco de Dados (Avançado):** Sair do CRUD básico. Entender Índices, Transações (ACID), N+1 Queries e quando usar SQL vs NoSQL.
- **CI/CD & Docker:** Sua máquina não importa. O código tem que rodar de forma idêntica em produção. Domine o básico de GitHub Actions e containerização.
- **System Design (Básico):** Como dois microsserviços conversam? (REST vs gRPC vs Mensageria/RabbitMQ).
### 📅 Rotina Sugerida (2 a 3 horas/dia):
+
1. **Refatoração (30%):** Pegue um projeto antigo seu e aplique princípios SOLID ou Clean Architecture.
2. **Infraestrutura Prática (40%):** Crie pipelines de deploy. Suba um banco de dados real no Docker, integre no seu pipeline (Testcontainers).
3. **Estudo de Casos reais (30%):** Leia blogs de engenharia de grandes empresas (Uber, Netflix, Discord) para entender os problemas que eles enfrentam ao escalar.
@@ -58,12 +62,14 @@ Você já consegue entregar features. Agora, o desafio é entregar features **r
Aqui, o código é a parte mais fácil do seu dia. Seu trabalho é **tomar decisões que afetam o negócio, os custos da empresa e a equipe como um todo**.
### 🎯 Foco Principal:
+
- **Sistemas Multi-Agente & RAG Avançado:** Integrar LLMs não é apenas chamar uma API. É criar sistemas onde múltiplos agentes validam as respostas uns dos outros (GraphRAG, LangGraph).
- **Green Coding & FinOps:** Escolher entre Node.js e Rust/Go não é mais apenas preferência, é uma decisão financeira. Entender o custo de CPU/Memória na nuvem e otimizar para reduzir a pegada de carbono.
- **Local-First & Edge Computing:** Arquitetar aplicações que funcionam perfeitamente offline (via CRDTs/Yjs) e rodam no Edge (Cloudflare Workers, Wasm) para latência zero global.
- **Mentoria e Liderança Técnica:** Desenvolver Soft Skills. Um Sênior que não consegue explicar decisões complexas de forma simples para um Product Manager ou mentorar um Júnior não é Sênior de verdade.
### 📅 Rotina Sugerida (Foco em Profundidade):
+
1. **Provas de Conceito (PoC) (40%):** Teste tecnologias emergentes (ex: WebAssembly, novos modelos locais com Ollama) antes de colocá-las em produção.
2. **Arquitetura (40%):** Estude padrões complexos (Event-Sourcing, CQRS, Data Mesh) e pratique desenhos de arquitetura de sistemas distribuídos.
3. **Mentoria & Comunicação (20%):** Escreva RFCs (Request for Comments) detalhando suas propostas arquiteturais, dê palestras internas na sua empresa ou crie conteúdo técnico.
@@ -75,12 +81,14 @@ Aqui, o código é a parte mais fácil do seu dia. Seu trabalho é **tomar decis
Para garantir que você tenha a melhor base teórica e prática em 2026, selecionamos os melhores materiais divididos por nível, abrangendo todo o espectro de um **Desenvolvedor Completo** (Frontend, Backend, IA, DevOps, Mobile, Dados e Segurança):
### 🐣 Para Nível Júnior (A Base)
+
- **Cursos:** [CS50 (Harvard)](https://pll.harvard.edu/course/cs50-introduction-computer-science) (Ciência da Computação Base), [FreeCodeCamp](https://www.freecodecamp.org/) (Prática de Código), [The Odin Project](https://www.theodinproject.com/) (Full Stack).
-- **Livros:** "Código Limpo" (Robert C. Martin) - *Foque nos primeiros capítulos*, "Entendendo Algoritmos" (Aditya Y. Bhargava).
+- **Livros:** "Código Limpo" (Robert C. Martin) - _Foque nos primeiros capítulos_, "Entendendo Algoritmos" (Aditya Y. Bhargava).
- **IA Literacy:** [Microsoft: Generative AI for Beginners](https://github.com/microsoft/generative-ai-for-beginners).
- **Canais Recomendados:** [Fireship](https://www.youtube.com/@Fireship) (Para entender conceitos complexos em 100 segundos e se manter atualizado nas trends de Frontend/Backend).
### 🚀 Para Nível Pleno (Otimização, Arquitetura e Cloud)
+
- **Cursos (Frontend/Backend):** [Frontend Masters](https://frontendmasters.com/) (Especialmente os cursos de Performance, RSCs e TypeScript avançado).
- **IA e Prompt Engineering:** [Anthropic Prompt Engineering Interactive Tutorial](https://github.com/anthropics/courses) (Aprenda a estruturar prompts avançados de verdade, além do básico) e [DeepLearning.AI](https://www.deeplearning.ai/) (Cursos curtos sobre LangChain e RAG).
- **Cloud e DevOps:** [AWS Skill Builder](https://explore.skillbuilder.aws/) (Trilhas oficiais e laboratórios focados em Serverless e Containers).
@@ -88,6 +96,7 @@ Para garantir que você tenha a melhor base teórica e prática em 2026, selecio
- **Plataformas de Prática:** [LeetCode](https://leetcode.com/) (Foco em Medium), [SystemDesignPrimer](https://github.com/donnemartin/system-design-primer).
### 🏛️ Para Nível Sênior/Especialista (Maestria, Liderança e IA Avançada)
+
- **Cursos de Arquitetura Corporativa e DevOps:** Recomenda-se o [Full Cycle](https://fullcycle.com.br/) (Essencial para arquitetura de software avançada, microsserviços, Kubernetes, Service Mesh e Go/Rust). Para aprendizado contínuo, considere assinaturas corporativas como [O'Reilly](https://www.oreilly.com/) e [Pluralsight](https://www.pluralsight.com/).
- **IA Engineering Avançada:** [Hugging Face NLP Course](https://huggingface.co/learn/nlp-course) (Mergulhe fundo em Transformers, Fine-Tuning e modelos locais além da API da OpenAI).
- **Canais / Blogs:** [ByteByteGo (YouTube)](https://www.youtube.com/@ByteByteGo) (System Design de Alto Nível), Blogs de Engenharia da [Uber](https://eng.uber.com/), [Netflix](https://netflixtechblog.com/) e [Cloudflare](https://blog.cloudflare.com/).
@@ -100,11 +109,12 @@ Para garantir que você tenha a melhor base teórica e prática em 2026, selecio
Com novas ferramentas de IA saindo a cada semana, decorar sintaxe tornou-se inútil. Desenvolva as seguintes meta-habilidades:
1. **Leitura Dinâmica de Documentação:** Vá direto para a seção de "Getting Started" e depois para "Architecture/Concepts".
-2. **Pensamento Crítico:** Não aceite o primeiro código gerado pela IA. Entenda *por que* ela escolheu aquela abordagem.
+2. **Pensamento Crítico:** Não aceite o primeiro código gerado pela IA. Entenda _por que_ ela escolheu aquela abordagem.
3. **Inglês Técnico:** A vanguarda da tecnologia é documentada primeiro em inglês. Não dependa de traduções que demoram meses para sair.
---
+
## ↩️ Navegação
-* [**Voltar para a Trilha Comum**](./common.md)
-* [**Voltar para o Início**](../../index.md)
+- [**Voltar para a Trilha Comum**](./common.md)
+- [**Voltar para o Início**](../../index.md)
diff --git a/roadmaps/mobile/mobile.md b/roadmaps/mobile/mobile.md
index 63a6388..fec2fe5 100644
--- a/roadmaps/mobile/mobile.md
+++ b/roadmaps/mobile/mobile.md
@@ -29,6 +29,7 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
Comece entendendo como os apps funcionam e publique seu primeiro "Hello World".
### 🎯 Escolha sua Jornada (Nativo vs. Híbrido)
+
- **Nativo (Especialista):**
- **Android (Kotlin):** O padrão moderno do Google.
- **iOS (Swift):** A linguagem elegante da Apple.
@@ -38,11 +39,13 @@ Comece entendendo como os apps funcionam e publique seu primeiro "Hello World".
- **Kotlin Multiplatform (KMP):** Compartilhe a lógica de negócios (e até UI com Compose Multiplatform) mantendo a performance 100% nativa.
### 🧩 Fundamentos de UI/UX Mobile
+
- **Layouts:** Flexbox (React Native), Rows/Columns (Flutter) ou AutoLayout (iOS). Como criar telas responsivas.
- **Navegação:** Stack, TabBar, Drawer. Como o usuário vai de A para B.
- **Ciclo de Vida:** Entenda quando a tela é criada, pausada (background) e destruída.
### 🌐 Conectividade Básica
+
- Consumo de APIs REST (GET, POST).
- Tratamento de estados de carregamento (Loading) e erro (Error handling).
@@ -53,20 +56,24 @@ Comece entendendo como os apps funcionam e publique seu primeiro "Hello World".
Construa apps robustos, que funcionam offline e encantam o usuário.
### 🧠 Gerenciamento de Estado
+
- **React Native:** Context API, Redux Toolkit, Zustand.
- **Flutter:** Provider, Riverpod, BLoC (Business Logic Component).
- **Nativo:** ViewModel, LiveData/StateFlow (Android), Combine (iOS).
### 🗄️ Persistência de Dados (Offline-First)
+
- **Bancos Locais:** SQLite, Room, Realm ou WatermelonDB.
- **Estratégia Offline:** O app deve funcionar sem internet e sincronizar quando a conexão voltar.
### 📲 Recursos do Dispositivo
+
- **Sensores:** Câmera, GPS, Acelerômetro.
- **Notificações Push:** Engajamento com Firebase Cloud Messaging (FCM).
- **Biometria:** Login com FaceID ou TouchID.
### 🚢 Publicação e CI/CD
+
- **Lojas:** Google Play Console e Apple App Store Connect.
- **Fastlane:** Automatize a geração de prints, assinaturas digitais e o upload para a loja.
@@ -77,18 +84,22 @@ Construa apps robustos, que funcionam offline e encantam o usuário.
Otimização extrema, arquitetura limpa e Inteligência Artificial no dispositivo.
### 🏗️ Arquitetura Mobile Avançada
+
- **Compose Multiplatform (Avançado):** Levar a UI declarativa do Kotlin para além do Android e iOS, compilando telas nativas para Desktop (Mac/Windows) e WebAssembly a partir do mesmo código.
- **Clean Architecture:** Separação de responsabilidades (Domain, Data, Presentation).
- **MVVM / MVI:** Padrões unidirecionais para interfaces reativas e testáveis.
- **Modularização:** Dividir o app em múltiplos pacotes/módulos para acelerar o build e escalar times grandes.
### ⚡ Performance e Segurança
+
- **Profiling:** Ferramentas para detectar memory leaks e gargalos de renderização (60fps é a lei).
- **Segurança:** Obfuscação (ProGuard/R8), Certificate Pinning e uso seguro do Keychain/Keystore.
### 📱 IA no Mobile (On-Device AI & NPU Acceleration)
+
A IA não precisa mais apenas da Nuvem, ela cabe no seu bolso.
-- **Small Language Models (SLMs) e Quantização:** Aprender a usar *Quantization* (4-bit/8-bit) para espremer modelos como Phi-3, Gemma, ou Mistral na RAM limitada do celular sem perder raciocínio lógico.
+
+- **Small Language Models (SLMs) e Quantização:** Aprender a usar _Quantization_ (4-bit/8-bit) para espremer modelos como Phi-3, Gemma, ou Mistral na RAM limitada do celular sem perder raciocínio lógico.
- **Frameworks de IA Nativos:**
- **ExecuTorch:** O sucessor do PyTorch Mobile. Permite carregar modelos grandes otimizados nativamente para iOS/Android consumindo a menor memória e bateria possível.
- **Apple CoreML (Avançado):** Utilizar o Apple Neural Engine (ANE) e o formato de pesos `.mlmodelc` em Swift.
@@ -97,26 +108,34 @@ A IA não precisa mais apenas da Nuvem, ela cabe no seu bolso.
- **RAG com Privacidade Local (Local RAG):** Conectar os SLMs com os dados privados do usuário (contatos, fotos, SQLite app) gerando insights hiper-personalizados na nuvem do bolso, sem enviar um único byte via internet e facilitando a conformidade com leis complexas como a GDPR.
### 📡 Arquitetura Local-First (Sincronização Avançada de 2026)
+
Uma API REST não é a forma que se entrega uma experiência 5 estrelas. Apps móveis modernos não podem sofrer por causa de Wi-Fi de metrô ou zonas sem sinal.
+
- **Reatividade e "UI de Latência Zero":** Todo dado é primeiramente modificado na memória cache ou no Banco SQLite local (`Room` no Android, `CoreData` no iOS). O sistema devolve o resultado em 1 milissegundo para o Reactivity (Compose / SwiftUI).
- **CRDTs e Resolução de Conflitos em Background:** Quando você modifica o nome de um "Task" offline, e outro amigo faz o mesmo com sua conta num tablet sincronizado, ocorrem conflitos. A sincronização em 2026 utiliza os **Conflict-Free Replicated Data Types** (CRDT) embarcados em soluções como PowerSync, Realm, ou Ditto para resolver automaticamente sem intervenção, mantendo consistência eventual invisível ao usuário final.
### 🗣️ Interfaces Naturais
+
- **Voice UI:** Integração com Whisper local para comandos de voz rápidos.
- **Multimodalidade:** Usar a câmera para analisar objetos e textos em tempo real.
### 🎓 Recursos Oficiais (A Verdade Direta da Fonte)
+
Em mobile, as coisas mudam todo ano nas conferências oficiais. Acompanhe:
-- **[Android Developers (YouTube)](https://www.youtube.com/user/androiddevelopers):** O canal oficial. Assista aos vídeos da *Google I/O* todo ano.
-- **[Apple Developer (WWDC)](https://developer.apple.com/wwdc/):** Instale o app "Developer" da Apple. Assista às sessões da *WWDC* para saber o que há de novo no Swift e SwiftUI.
+
+- **[Android Developers (YouTube)](https://www.youtube.com/user/androiddevelopers):** O canal oficial. Assista aos vídeos da _Google I/O_ todo ano.
+- **[Apple Developer (WWDC)](https://developer.apple.com/wwdc/):** Instale o app "Developer" da Apple. Assista às sessões da _WWDC_ para saber o que há de novo no Swift e SwiftUI.
### 🌿 Green Mobile Development
+
Apps mal otimizados matam a bateria e geram lixo eletrônico (troca de aparelhos).
+
- **Eficiência Energética:** Evite wake-locks desnecessários e polling contínuo de rede.
- **Tamanho do App:** Apps menores são baixados mais rápido (menos dados) e ocupam menos espaço.
- **Retrocompatibilidade:** Suportar aparelhos antigos evita que eles virem lixo precocemente.
### 🧠 Soft Skills & Diferencial Humano
+
- **Contexto de Uso:** O usuário usa seu app na fila do banco, no ônibus, com sol na tela. Desenvolva pensando nessas condições (contraste, áreas de toque grandes, modo offline).
- **Respeito aos Recursos:** Não drene a bateria do usuário com processos em background desnecessários. Isso gera desinstalação imediata.
- **Paciência com as Lojas:** A Apple e o Google vão rejeitar seu app por motivos aleatórios. Respire fundo, leia a guideline e tente de novo.
@@ -134,16 +153,19 @@ Apps mal otimizados matam a bateria e geram lixo eletrônico (troca de aparelhos
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos e Bases):**
+
- **Cursos Oficiais Android e iOS:** As plataformas de documentação da [Apple (Swift Playgrounds)](https://developer.apple.com/swift/) e [Google (Android Codelabs)](https://developer.android.com/courses) são os melhores lugares absolutos para iniciar.
- **[Flutter.dev (Documentação Oficial)](https://flutter.dev/):** Considerado o melhor guia para entrar no mundo Mobile Híbrido, repleto de "Codelabs" práticos.
- **[React Native - Core Components](https://reactnative.dev/docs/components-and-apis):** Se você veio do mundo React, a documentação oficial sobre componentes principais vai acelerar seus estudos.
**Para o Pleno (Arquitetura, Gerenciamento e Conexão):**
+
- **[Philipp Lackner (YouTube)](https://www.youtube.com/@PhilippLackner):** Excelente para aprender Kotlin moderno, Jetpack Compose e as melhores práticas do Android.
- **[Vanderbilt University - Coursera (Android App Development)](https://www.coursera.org/specializations/android-app-development):** Uma base estruturada maravilhosa.
- **[Andrea Bizzotto (Flutter)](https://codewithandrea.com/):** O melhor material avançado e atualizado sobre arquitetura no Flutter (Riverpod, Clean Architecture).
**Para o Sênior/Especialista (On-Device AI, NPU, Compose Multiplatform):**
+
- **[ExecuTorch Docs (PyTorch)](https://pytorch.org/executorch):** Aprenda como preparar grandes modelos LLM/SLM e rodar de forma leve nos dispositivos móveis.
- **[Hugging Face Spaces - Local/On-Device AI](https://huggingface.co/spaces):** Acompanhe modelos como o Llama.cpp adaptado para iOS/Android e WebNN, além do Transformers.js rodando em React Native.
- **[Kotlin Multiplatform (KMP) by JetBrains](https://kotlinlang.org/docs/multiplatform.html):** Documentação técnica que explica como compartilhar lógicas de negócio C++/Kotlin entre iOS/Android em larga escala.
@@ -153,5 +175,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/qa/qa-testing.md b/roadmaps/qa/qa-testing.md
index 99c391f..7561512 100644
--- a/roadmaps/qa/qa-testing.md
+++ b/roadmaps/qa/qa-testing.md
@@ -28,6 +28,7 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é entender o ciclo de vida do bug, como reportá-lo de forma eficiente e iniciar na automação básica.
### 📚 Fundamentos de Teste (A Teoria Necessária)
+
- **Pirâmide de Testes:** Unidade (rápido, barato) > Integração > E2E (lento, caro).
- **Tipos de Testes:** Funcionais, Não Funcionais (Usabilidade, Performance), Regressão, Smoke Tests.
- **BDD e TDD:** Entenda o Desenvolvimento Orientado a Comportamento (Gherkin: `Dado`, `Quando`, `Então`).
@@ -35,10 +36,12 @@ O foco aqui é entender o ciclo de vida do bug, como reportá-lo de forma eficie
- 📖 [Syllabus CTFL (ISTQB)](https://bstqb.org.br/) - A base teórica global para QA.
### 🕵️ Testes Manuais e Exploratórios
+
- **Reporte de Bugs:** Um bom bug report tem: Título claro, Passos para reproduzir, Resultado Esperado vs. Resultado Atual e Anexos (Screenshots/Logs).
- **Testes Heurísticos e Exploratórios:** Aprenda a "quebrar" o sistema pensando fora da caixa, além do que está no roteiro.
### 🌐 Ferramentas de API (O Básico)
+
- **Postman / Insomnia:** Como enviar requisições (GET, POST), ler o JSON de resposta e validar Status Codes (200, 400, 500).
---
@@ -48,20 +51,26 @@ O foco aqui é entender o ciclo de vida do bug, como reportá-lo de forma eficie
Deixar de ser um testador manual para se tornar um Engenheiro de Automação.
### 🤖 Automação E2E (End-to-End) para Web
+
Em 2026, o Selenium perdeu muito espaço para ferramentas mais rápidas e modernas.
+
- **Playwright (Microsoft):** O padrão absoluto da indústria atual. Suporte nativo a múltiplos browsers, interceptação de rede (Mocking) e execução paralela veloz.
- **Cypress:** Excelente experiência de desenvolvedor (DX) e comunidade gigante para testes puramente em JavaScript/TypeScript.
- **Padrão Page Object Model (POM):** Como organizar seu código de teste para não virar espaguete quando a aplicação crescer.
### 🔌 Automação de APIs
+
- **Ferramentas Code-Based:** Supertest (Node.js), RestAssured (Java), PyTest (Python).
- **Validação de Contratos:** Garantir que o backend não mudou a estrutura do JSON silenciosamente (ex: Pact).
### 🗃️ Bancos de Dados para QA
+
- **SQL Básico:** Você precisa saber verificar no banco se o "Cadastro Realizado com Sucesso" realmente salvou os dados (`SELECT`, `JOIN`), além de manipular a massa de dados para os testes (`INSERT`, `UPDATE`, `DELETE`).
### ⚙️ CI/CD (Integração Contínua)
+
Seu teste não serve de nada rodando só na sua máquina.
+
- **GitHub Actions / GitLab CI:** Como fazer seus testes rodarem automaticamente toda vez que um desenvolvedor abre um Pull Request (PR).
---
@@ -71,17 +80,22 @@ Seu teste não serve de nada rodando só na sua máquina.
Onde você projeta a estratégia global de qualidade (Quality Engineering), garantindo performance, segurança e utilizando IA ao seu favor.
### ⚡ Testes de Performance e Carga
+
- **k6 (Grafana):** Escrever testes de carga em JavaScript que rodam no terminal usando Go por baixo dos panos. É o substituto moderno do JMeter.
- **Gatilhos de Alerta:** "Se 95% das requisições demorarem mais de 500ms com 1000 usuários simultâneos, o teste falha."
### 🛡️ Shift-Left Testing & DevSecOps
+
"Shift-Left" significa mover os testes para a esquerda (o mais cedo possível no ciclo de desenvolvimento).
+
- **Revisão de Arquitetura:** O QA Sênior atua na fase de requisitos, dizendo "Essa arquitetura vai gerar gargalos no banco" antes de qualquer linha de código ser escrita.
- **Acessibilidade (a11y):** Automação de testes de leitores de tela e contraste usando `axe-core`.
- **Segurança Básica (DAST):** Integrar scans de segurança no pipeline (ex: OWASP ZAP) para evitar vulnerabilidades triviais como XSS e SQLi.
### 🧠 IA-Assisted QA (A Revolução de 2026)
+
O QA não será substituído pela IA, mas o QA que usa IA substituirá o que não usa.
+
- **Geração de Casos de Teste com LLMs:** Usar GPT-4o ou Claude para ler uma história de usuário (Jira) e gerar 20 cenários de borda (Edge Cases) em segundos.
- **Auto-Healing Tests:** Ferramentas modernas (ex: Healenium, Testim.io, Mabl) que percebem quando um `id` ou `class` de um botão mudou no frontend e corrigem o seletor do teste dinamicamente, sem intervenção humana (evitando o inferno dos testes frágeis/flaky).
- **Copilotos de Código:** Usar Cursor ou GitHub Copilot para acelerar drasticamente a escrita de scripts Playwright usando TypeScript.
@@ -100,15 +114,18 @@ O QA não será substituído pela IA, mas o QA que usa IA substituirá o que nã
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Fundamentos e Teste Manual):**
+
- **[Syllabus CTFL (ISTQB)](https://bstqb.org.br/):** O currículo oficial de certificação internacional, fornecendo a teoria base em testes de qualidade que vai diferenciar a base do júnior.
- **[FreeCodeCamp - Software Testing Course](https://www.freecodecamp.org/):** Excelente curso prático gratuito com vídeos sobre o ciclo de vida do software e tipos de teste para um testador iniciante.
**Para o Pleno (Automação Web E2E, APIs):**
+
- **[Documentação Oficial do Playwright](https://playwright.dev/):** A melhor documentação entre as ferramentas de QA atuais. Leia o "Getting Started" e os guias fundamentais (Locators e Assertions).
- **[Cypress Real World App (Repo GitHub)](https://github.com/cypress-io/cypress-realworld-app):** A Cypress forneceu este repositório de um App clone inteiro com os melhores exemplos práticos de como automatizar pagamentos e criar testes escaláveis.
- **[Ministry of Testing (MoT)](https://www.ministryoftesting.com/):** Uma comunidade mundial riquíssima que aborda os desafios práticos do engenheiro QA além do código.
**Para o Sênior/Especialista (Testes de Performance, IA e Shift-Left):**
+
- **[Grafana k6 Docs](https://k6.io/docs/):** A ferramenta moderna baseada em JavaScript/Go para aplicar carga, picos massivos e verificar "Testes de Stress" contra APIs da arquitetura Backend.
- **[Test Automation University (Applitools)](https://testautomationu.applitools.com/):** Uma infinidade de cursos gratuitos, avançados (em Java/Python/JavaScript), sobre testes visuais impulsionados por IA (Visual AI).
- **[The Pragmatic Engineer (Newsletter/Blog)](https://blog.pragmaticengineer.com/):** Ótimo para um QA Sênior entender as estratégias massivas que empresas (Uber, Stripe) tomam sobre "Engineering Productivity" em vez de apenas achar bugs.
@@ -117,5 +134,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/roadmaps/security/cybersecurity.md b/roadmaps/security/cybersecurity.md
index 7503485..02755c0 100644
--- a/roadmaps/security/cybersecurity.md
+++ b/roadmaps/security/cybersecurity.md
@@ -28,17 +28,21 @@ Esta trilha está dividida em níveis para guiar sua evolução profissional.
O foco aqui é entender como os computadores conversam e como trancar as portas digitais.
### 🌐 Redes e Protocolos (A Base de Tudo)
+
Você não pode proteger o que não entende.
+
- **Modelo OSI/TCP-IP:** Camadas de transporte, rede e aplicação.
- **Protocolos:** DNS (e DNS Sec), HTTP vs HTTPS (TLS/SSL), SSH, FTP.
- **Ferramentas:** Wireshark (analisar pacotes), Nmap (scan de portas).
### 🐧 Sistemas Operacionais & Hardening
+
- **Linux:** Permissões, logs (`/var/log`), firewall (`iptables`/`ufw`).
- **Windows:** Active Directory, Group Policies (GPO), PowerShell.
- **Hardening:** O processo de fechar brechas padrão (desabilitar serviços inúteis, fechar portas).
### 🔑 Criptografia Básica
+
- **Simétrica vs Assimétrica:** Chaves públicas e privadas.
- **Hashing:** Entenda que MD5/SHA-1 estão mortos. Use SHA-256 ou Argon2 para senhas.
- **Certificados Digitais:** Como funciona a confiança na web (PKI).
@@ -50,16 +54,20 @@ Você não pode proteger o que não entende.
Aqui você começa a atacar (para testar) e defender sistemas reais.
### 🕸️ Web Security (AppSec)
+
- **OWASP Top 10:** A bíblia das vulnerabilidades. SQL Injection, XSS, Broken Access Control.
- **Ferramentas:** Burp Suite (Proxy de interceptação), OWASP ZAP.
### ☁️ Cloud Security
+
A nuvem é o novo perímetro.
+
- **IAM (Identity and Access Management):** Princípio do Menor Privilégio. Nunca use chaves de root.
- **Segurança de Infra:** Security Groups, WAF (Web Application Firewall), VPCs privadas.
- **Compliance:** CIS Benchmarks para AWS/Azure.
### ⚔️ Pentesting Básico (Red Team)
+
- **Reconhecimento (Recon):** OSINT (Open Source Intelligence).
- **Exploração:** Metasploit Framework.
- **Escalação de Privilégio:** Como virar admin depois de entrar.
@@ -71,30 +79,39 @@ A nuvem é o novo perímetro.
Onde você projeta arquiteturas resilientes e lidera a resposta a incidentes.
### 🛡️ DevSecOps & Pipeline Security
+
Segurança automatizada no ciclo de desenvolvimento.
+
- **SAST/DAST:** SonarQube, Snyk. Achar bugs antes do deploy.
- **Dependency Scanning:** Evitar vulnerabilidades em bibliotecas de terceiros (Log4Shell).
- **Container Security:** Trivy para scannear imagens Docker.
### 🚫 Zero Trust Architecture
+
"Nunca confie, sempre verifique."
+
- **Conceitos:** Micro-segmentação, autenticação contínua, acesso condicional.
- **BeyondCorp:** O modelo do Google que matou a VPN corporativa.
### 🚨 Blue Team & Incident Response
+
- **SIEM (Security Information and Event Management):** Splunk, Elastic Security. Centralizar logs para achar anomalias.
- **Threat Hunting:** Procurar ativamente por ameaças que passaram pelas defesas.
- **Forensics:** Analisar memória e disco para entender o que o atacante fez.
### ⚛️ Criptografia Pós-Quântica (PQC)
+
Computadores quânticos vão quebrar RSA e ECC em breve. Prepare-se agora.
+
- **Ameaça "Harvest Now, Decrypt Later":** Atacantes estão salvando dados criptografados hoje para quebrar no futuro.
- **Novos Padrões NIST:** Migre para algoritmos resistentes a ataques quânticos.
- **Kyber (ML-KEM):** Para troca de chaves (Key Encapsulation).
- **Dilithium (ML-DSA):** Para assinaturas digitais.
### 🤖 AI Security & AI Red Teaming (O Novo Front de 2026)
+
Onde há código, há vulnerabilidade. A Inteligência Artificial trouxe um oceano inteiro de novas superfícies de ataque para 2026.
+
- **OWASP Top 10 para LLMs:** A extensão natural das vulnerabilidades tradicionais aplicadas para a era GenAI.
- **Prompt Injection e Jailbreaking (Avançado):** Usuários forçando modelos corporativos a exfiltrarem chaves de banco de dados e senhas via injeção de comandos maliciosos disfarçados de linguagem natural.
- **Data Poisoning & Supply Chain Attacks (HuggingFace):** Risco de corromper o output de um modelo de IA ao importar pesos infectados do HuggingFace ou ao usar dados maliciosos durante o Fine-Tuning.
@@ -102,6 +119,7 @@ Onde há código, há vulnerabilidade. A Inteligência Artificial trouxe um ocea
- **Model Theft (Roubo de Pesos):** Proteger o segredo industrial, o intelecto treinado do seu modelo LLM privado, contra vazamentos de instâncias.
### 🧠 Soft Skills & Diferencial Humano
+
- **Paranoia Saudável vs Usabilidade:** Segurança que impede o trabalho será contornada. Encontre o equilíbrio.
- **Comunicação sob Pressão:** Durante um ataque, a diretoria vai querer respostas. Aprenda a comunicar fatos sem causar pânico.
- **Curiosidade Infinita:** O hacker só precisa acertar uma vez; você precisa acertar sempre. Estude as novas técnicas de ataque antes que elas cheguem em você.
@@ -119,17 +137,20 @@ Onde há código, há vulnerabilidade. A Inteligência Artificial trouxe um ocea
Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos e teóricos:
**Para o Júnior (Redes, Linux e Fundamentos de Cyber):**
+
- **[TryHackMe](https://tryhackme.com/):** A forma mais didática do mundo para aprender e praticar Redes (Nmap, Wireshark), Linux e as técnicas ofensivas/defensivas gamificadas. É mandatório para o Júnior.
- **[Professor Messer (CompTIA Security+ / Network+)](https://www.youtube.com/@professormesser):** Cursos gratuitos incríveis que englobam todo o syllabus fundamental da teoria e jargões da segurança em nuvem, encriptação e hardware.
- **[OverTheWire (Bandit)](https://overthewire.org/wargames/bandit/):** Um wargame muito querido na comunidade, ensina o aluno a utilizar um terminal bash com confiança para as etapas mais avançadas.
**Para o Pleno (AppSec, Pentesting e Cloud):**
+
- **[HackTheBox](https://www.hackthebox.com/):** A principal arena focada em atacar caixas (servidores virtuais). Exige esforço e persistência. Comece através dos tutoriais do HTB Academy antes.
-- **[PortSwigger Web Security Academy](https://portswigger.net/web-security):** Criado pelos desenvolvedores do famosíssimo *Burp Suite*. É o lugar definitivo para aprender exploração Web moderna baseada nos Top 10 vulnerabilidades.
+- **[PortSwigger Web Security Academy](https://portswigger.net/web-security):** Criado pelos desenvolvedores do famosíssimo _Burp Suite_. É o lugar definitivo para aprender exploração Web moderna baseada nos Top 10 vulnerabilidades.
- **[OWASP Top 10 (Site Oficial)](https://owasp.org/www-project-top-ten/):** Aprenda detalhadamente os defeitos corporativos comuns que mais causam roubo de informações confidenciais do servidor aos cookies no Browser.
**Para o Sênior/Especialista (AI Red Teaming, Pós-Quântica, DevSecOps):**
-- **[OWASP Top 10 for Large Language Models](https://owasp.org/www-project-top-10-for-large-language-models/):** Leitura de suma importância se você quer proteger prompts e gerenciar *data poisoning* no Backend da IA Corporativa do seu time.
+
+- **[OWASP Top 10 for Large Language Models](https://owasp.org/www-project-top-10-for-large-language-models/):** Leitura de suma importância se você quer proteger prompts e gerenciar _data poisoning_ no Backend da IA Corporativa do seu time.
- **[NIST Post-Quantum Cryptography Guidelines](https://csrc.nist.gov/projects/post-quantum-cryptography):** Entenda as padronizações FIPS oficiais do governo americano de 2024 que os sistemas bancários em 2026 são ordenados a utilizar para impedir espionagem retroativa.
- **[Snyk (DevSecOps Platform) / Trivy Documentation](https://snyk.io/learn/):** Plataforma incrível para entender "Shift-Left", containers, infraestrutura de vulnerabilidades em repositórios Git, mitigando o NPM falso e vazamentos do GitHub.
- **[PicoCTF (Carnegie Mellon University)](https://picoctf.org/):** Jogue Capture The Flag de alta classe universitária e foque intensamente em "Reverse Engineering", "Binary Exploitation" e Criptografia.
@@ -138,5 +159,5 @@ Para atingir a excelência em 2026, recomendamos os seguintes recursos práticos
## ↩️ Navegação
-* [**Voltar para o Início**](../../index.md)
-* [**Ver Conselhos de Carreira**](../../advices.md)
+- [**Voltar para o Início**](../../index.md)
+- [**Ver Conselhos de Carreira**](../../advices.md)
diff --git a/tests/e2e.spec.js b/tests/e2e.spec.js
new file mode 100644
index 0000000..47df20e
--- /dev/null
+++ b/tests/e2e.spec.js
@@ -0,0 +1,46 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("VitePress Site E2E Tests", () => {
+ test("should display the correct homepage title", async ({ page }) => {
+ // Navigate to the local VitePress build preview
+ await page.goto("/");
+
+ // Check if the title is correct
+ await expect(page).toHaveTitle(/Roadmap Developer 2026/);
+ });
+
+ test("should navigate to a roadmap from the homepage", async ({ page }) => {
+ await page.goto("/");
+
+ // Assuming there's a link to the Frontend roadmap
+ const frontendLink = page.getByRole("link", {
+ name: "Frontend",
+ exact: true,
+ });
+
+ // We expect the link to exist, and we will click it
+ if ((await frontendLink.count()) > 0) {
+ await frontendLink.click();
+
+ // We should be on a page with "Frontend" in the heading or title
+ await expect(page).toHaveURL(/frontend/);
+ await expect(page.locator("h1").first()).toContainText("Frontend");
+ }
+ });
+
+ test("should render the top navigation correctly", async ({ page }) => {
+ await page.goto("/");
+
+ // Verify main nav elements are visible
+ const navBar = page.locator(".VPNavBar");
+ await expect(navBar).toBeVisible();
+
+ // The "Guia de Estudos" link should be in the nav
+ const guideLink = page.locator(".VPNavBarMenuLink", {
+ hasText: "Guia de Estudos",
+ });
+ if ((await guideLink.count()) > 0) {
+ await expect(guideLink).toBeVisible();
+ }
+ });
+});
diff --git a/utils/link-checker.js b/utils/link-checker.js
new file mode 100644
index 0000000..5809189
--- /dev/null
+++ b/utils/link-checker.js
@@ -0,0 +1,88 @@
+/**
+ * Utility to parse and validate markdown links
+ * A valid link in this context means it's correctly formatted and has a valid target structure.
+ */
+
+/**
+ * Extracts links from markdown content without using complex regex to avoid ReDoS
+ * @param {string} markdownContent The markdown text to parse
+ * @returns {Array<{text: string, url: string}>} Array of extracted links
+ */
+export function extractLinks(markdownContent) {
+ if (!markdownContent) return [];
+
+ const links = [];
+ let index = 0;
+
+ while (index < markdownContent.length) {
+ // Find the start of a link text
+ const bracketStart = markdownContent.indexOf("[", index);
+ if (bracketStart === -1) break; // No more links
+
+ // Find the end of the link text
+ const bracketEnd = markdownContent.indexOf("](", bracketStart);
+ if (bracketEnd === -1) {
+ index = bracketStart + 1;
+ continue;
+ }
+
+ // Find the end of the URL
+ const parenEnd = markdownContent.indexOf(")", bracketEnd + 2);
+ if (parenEnd === -1) {
+ index = bracketEnd + 2;
+ continue;
+ }
+
+ // Extract text and url
+ const text = markdownContent.substring(bracketStart + 1, bracketEnd);
+ const url = markdownContent.substring(bracketEnd + 2, parenEnd);
+
+ // Filter out edge cases (e.g., nested brackets, though simplistic)
+ if (!text.includes("]") && !url.includes(" ")) {
+ links.push({ text, url });
+ }
+
+ // Move index past the current link
+ index = parenEnd + 1;
+ }
+
+ return links;
+}
+
+/**
+ * Validates an array of links
+ * @param {Array<{text: string, url: string}>} links Array of links to validate
+ * @returns {Array<{url: string, isValid: boolean, error?: string}>} Validation results
+ */
+export function validateLinks(links) {
+ if (!Array.isArray(links)) return [];
+
+ return links.map((link) => {
+ // Empty URLs are invalid
+ if (!link.url || link.url.trim() === "") {
+ return { url: link.url, isValid: false, error: "Empty URL" };
+ }
+
+ // Valid HTTP/HTTPS URLs
+ if (link.url.startsWith("http://") || link.url.startsWith("https://")) {
+ return { url: link.url, isValid: true };
+ }
+
+ // Valid relative markdown paths
+ if (
+ link.url.endsWith(".md") ||
+ link.url.startsWith("/") ||
+ link.url.startsWith("../") ||
+ link.url.startsWith("./")
+ ) {
+ return { url: link.url, isValid: true };
+ }
+
+ // Valid anchors
+ if (link.url.startsWith("#")) {
+ return { url: link.url, isValid: true };
+ }
+
+ return { url: link.url, isValid: false, error: "Invalid URL format" };
+ });
+}
diff --git a/utils/link-checker.test.js b/utils/link-checker.test.js
new file mode 100644
index 0000000..2822281
--- /dev/null
+++ b/utils/link-checker.test.js
@@ -0,0 +1,110 @@
+import { describe, it, expect } from "vitest";
+import { extractLinks, validateLinks } from "./link-checker";
+
+describe("Link Checker Utility", () => {
+ describe("extractLinks", () => {
+ it("should return empty array for empty content", () => {
+ expect(extractLinks("")).toEqual([]);
+ expect(extractLinks(null)).toEqual([]);
+ });
+
+ it("should extract a single markdown link correctly", () => {
+ const content = "This is a [test link](https://example.com) in text.";
+ const expected = [{ text: "test link", url: "https://example.com" }];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+
+ it("should extract multiple markdown links correctly", () => {
+ const content =
+ "Link 1: [Google](https://google.com), Link 2: [GitHub](https://github.com)";
+ const expected = [
+ { text: "Google", url: "https://google.com" },
+ { text: "GitHub", url: "https://github.com" },
+ ];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+
+ it("should skip malformed opening brackets", () => {
+ const content =
+ "Missing closing parens [link](http://example.com Missing bracket text link](http://example.com)";
+ const expected = [];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+
+ it("should skip unclosed bracket", () => {
+ const content = "Just a bracket [ and nothing else";
+ const expected = [];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+
+ it("should skip missing ending parens or intermediate brackets", () => {
+ const content = "Incomplete [link text missing paren [another one](";
+ const expected = [];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+
+ it("should handle empty link text or urls", () => {
+ const content = "Empty URL [link]() Empty Text [](http://example.com)";
+ const expected = [
+ { text: "link", url: "" },
+ { text: "", url: "http://example.com" },
+ ];
+ expect(extractLinks(content)).toEqual(expected);
+ });
+ });
+
+ describe("validateLinks", () => {
+ it("should return empty array for invalid input", () => {
+ expect(validateLinks(null)).toEqual([]);
+ expect(validateLinks(undefined)).toEqual([]);
+ expect(validateLinks({})).toEqual([]);
+ });
+
+ it("should mark valid HTTP/HTTPS links as valid", () => {
+ const links = [
+ { text: "Google", url: "https://google.com" },
+ { text: "Example", url: "http://example.com" },
+ ];
+ const result = validateLinks(links);
+ expect(result).toHaveLength(2);
+ expect(result[0].isValid).toBe(true);
+ expect(result[1].isValid).toBe(true);
+ });
+
+ it("should mark empty URLs as invalid", () => {
+ const links = [
+ { text: "Empty", url: "" },
+ { text: "Spaces", url: " " },
+ ];
+ const result = validateLinks(links);
+ expect(result[0].isValid).toBe(false);
+ expect(result[0].error).toBe("Empty URL");
+ expect(result[1].isValid).toBe(false);
+ expect(result[1].error).toBe("Empty URL");
+ });
+
+ it("should mark valid relative markdown paths as valid", () => {
+ const links = [
+ { text: "Doc", url: "doc.md" },
+ { text: "Root", url: "/index.md" },
+ { text: "Parent", url: "../parent.md" },
+ { text: "Current", url: "./current.md" },
+ ];
+ const result = validateLinks(links);
+ result.forEach((r) => expect(r.isValid).toBe(true));
+ });
+
+ it("should mark anchors as valid", () => {
+ const links = [{ text: "Section", url: "#section-1" }];
+ const result = validateLinks(links);
+ expect(result[0].isValid).toBe(true);
+ });
+
+ it("should mark arbitrary strings as invalid", () => {
+ const links = [{ text: "Random", url: "random-string-no-extension" }];
+ const result = validateLinks(links);
+ expect(result[0].isValid).toBe(false);
+ expect(result[0].error).toBe("Invalid URL format");
+ });
+ });
+});
diff --git a/vitest.config.js b/vitest.config.js
new file mode 100644
index 0000000..efef71a
--- /dev/null
+++ b/vitest.config.js
@@ -0,0 +1,13 @@
+import { defineConfig } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ include: ["utils/**/*.test.js"],
+ coverage: {
+ provider: "v8",
+ reporter: ["text", "json", "html"],
+ include: ["utils/**/*.js"],
+ },
+ environment: "node",
+ },
+});