Servent-SSR — Extensão VS Code
Gerador de estrutura, highlight EJS e snippets para o padrão Servent-SSR v7.0 (Fastify)
Crie módulos completos, components encapsulados, pages, partials e testes E2E O que é o Servent-SSRServent-SSR é um padrão arquitetural para aplicações MPA (Multi-Page Application) construídas com Node.js + Fastify + EJS. A arquitetura organiza o projeto em camadas bem definidas (Shell, Page, Component, Partial) e estabelece convenções explícitas de nomenclatura, encapsulamento e separação de responsabilidades. A extensão é o braço operacional da plataforma: ela transforma as convenções arquiteturais em código concreto, eliminando trabalho manual repetitivo e garantindo conformidade automática com o padrão.
✨ O que a Extensão Faz
📦 InstalaçãoVia VSIX (recomendado)
Via MarketplacePesquise por "Servent-SSR" no painel de extensões do VS Code ( Requisitos
🚀 Primeiros Passos1. Inicializar um projeto do zero
2. Instalar dependências e rodar
3. Criar o primeiro módulo
Passo 1 — Nome do módulo:
Passo 2 — Pages a criar (multi-select):
Passo 3 — Components a criar (multi-select):
Resultado gerado:
🧩 Comandos CompletosTodos os comandos estão disponíveis via
🗂️ Arquitetura Shell · Page · Component · Partial
Regras de cada camada
Derivação automática de convenções
🎨 Highlight EJSA extensão registra o EJS como linguagem própria com uma grammar TextMate completa. Não é necessária nenhuma configuração adicional.
Antes da extensão:
Depois da extensão:
O autoclose está configurado: ao digitar ✅ Validador e Code ActionsO validador analisa arquivos Servent-SSR ao abrir e ao salvar, exibindo diagnósticos diretamente no editor.
Code Actions — Correções com um clique (💡)
🔍 Hover e Go to DefinitionHover (passe o mouse)Em
Em
Go to Definition (
|
| Contexto | Comportamento |
|---|---|
include('./components/modals/detail/index.ejs') |
Abre o arquivo incluído |
include('./partials/_page-header.ejs') |
Abre o partial |
window.Servent.Modals.Detail |
Abre o script.js na linha da API pública |
window.Servent.Sidebars.UserNew |
Localiza e abre o script.js da sidebar |
🧪 Gerador de Teste E2E
Com qualquer index.ejs de component ou page aberto:
Ctrl+Shift+P → Servent-SSR: Gerar Teste E2E 🧪
A extensão extrai automaticamente do template:
- IDs de elementos →
page.locator('#id') data-attributes→page.locator('[data-*]')- Classes
.srv-*→page.locator('.srv-*') - Campos de formulário →
page.fill('[name="campo"]', ...) - Namespace
window.Servent→ chamadas diretas no teste
Testes gerados por tipo:
| Tipo | Casos de teste gerados |
|---|---|
| Modal | Oculto por padrão, open(), close(), ESC, clique no backdrop |
| Sidebar | Oculto por padrão, open(), close(), ESC, botão de fechar |
| Page | Renderização, submit de formulário, clique em item de lista |
| Component | Presença no DOM com seletores comentados |
O arquivo é salvo em tests/e2e/ espelhando o caminho do artefato e aberto automaticamente no editor.
📦 SpecForge — Importar arquivo .spec
O SpecForge é a ferramenta de especificação do ecossistema Servent-SSR. Ele exporta arquivos .spec (ZIPs renomeados) contendo .claude/skills/, .specs/changes/ e docs/.
Ctrl+Shift+P → Servent-SSR: Inicializar Projeto → 📦 Importar arquivo .spec
O file picker filtra apenas arquivos .spec. Após a extração, o .spec é deletado automaticamente — nenhum rastro fica no projeto.
Estrutura extraída:
projeto/
├── .claude/skills/ ← Skills de arquitetura para o agente AI
├── .specs/
│ ├── changes/ ← Changes prontos para execução
│ └── executar_todas.md ← Cole no Claude para iniciar
└── docs/ ← Documentação do projeto
🧪 Gerar Teste Playwright
Botão direito na pasta do componente → Servent-SSR: Gerar Teste Playwright
A extensão lê o script.js, extrai os métodos da API pública e gera um .spec.ts completo em tests/e2e/components/[categoria]/[nome].spec.ts.
Exemplo — dado este script.js:
window.Servent.Modals.Detalhe = {
open: open,
close: close,
reload: reload,
};
Gera automaticamente:
- Teste de renderização do elemento raiz (
#srv-modal-detalhe) - Teste de registro do namespace
window.Servent.Modals.Detalhe - Um teste para cada método:
open(),close(),reload()
Com módulo de domínio (para evitar conflito entre módulos):
User → window.Servent.User.Modals.Detalhe
Pedidos → window.Servent.Pedidos.Modals.Detalhe
Para rodar os testes:
npm run dev # servidor deve estar rodando
npm run test:e2e # headless
npm run test:e2e:ui # modo visual
npm run test:e2e:headed # browser visível
O playwright.config.ts é gerado com baseURL lida automaticamente do .env (sem configuração manual).
🔒 Linter Embutido
O projeto gerado inclui plugins de linting que rodam ao salvar, exibindo erros no painel Problems com sublinhados no código.
ESLint — Regras Servent-SSR
| Regra | O que detecta | Severidade |
|---|---|---|
servent-ssr/iife |
script.js sem IIFE ou sem 'use strict' |
🔴 Erro |
servent-ssr/namespace |
Namespace errado, guard ausente, window.X fora do window.Servent |
🔴 Erro |
Stylelint — Regras Servent-SSR
| Regra | O que detecta | Severidade |
|---|---|---|
servent-ssr/css-prefix |
Classe CSS sem o prefixo .srv-[categoria]-[nome] |
🔴 Erro |
npm run lint # ESLint nos script.js de componentes
npm run lint:css # Stylelint nos style.css de componentes
Os plugins ficam em tools/eslint-plugin-servent-ssr/ e tools/stylelint-plugin-servent-ssr/ — embutidos no projeto, sem dependência externa.
📝 Snippets EJS
Digite o prefixo em qualquer arquivo .ejs e pressione Tab.
| Prefixo | O que gera |
|---|---|
srv-shell |
Shell HTML completo com head, body, CSS/JS globais e include(pageComponent) |
srv-page |
Page com include de style.css e script.js, div com prefixo |
srv-component |
Component encapsulado com role e aria-label |
srv-modal |
Modal completo: backdrop, container, header, body, footer |
srv-sidebar |
Sidebar/offcanvas: backdrop, panel, header, body, botão de fechar |
srv-include |
<%- include('caminho', { chave: valor }) %> com placeholders |
srv-partial |
<%- include('partials/_nome', { dados }) %> |
srv-each |
<% items.forEach(function(item) { %> ... <% }); %> |
srv-if |
<% if (condition) { %> ... <% } else { %> ... <% } %> |
srv-local |
<% if (locals.variavel) { %> ... <% } %> |
srv-flash |
Bloco completo de flash messages (success, error, info) |
srv-empty |
Condicional de empty state com include do partial |
srv-pagination |
Include do partial de paginação com currentPage e totalPages |
📝 Snippets JavaScript
Digite o prefixo em qualquer arquivo .js e pressione Tab.
| Prefixo | O que gera |
|---|---|
srv-iife |
IIFE base com window.Servent, getElementById, funções privadas e API pública |
srv-iife-modal |
IIFE completa de modal: open(data), close(), ESC, backdrop, CustomEvents |
srv-iife-sidebar |
IIFE completa de sidebar: open(), close(), ESC, botões |
srv-iife-page |
IIFE base de page com window.Servent.Pages.[Nome] e refresh() |
srv-dispatch |
document.dispatchEvent(new CustomEvent('comp:acao', { detail })) |
srv-listen |
document.addEventListener('comp:acao', function(e) { }) |
srv-service |
Método async com try/catch e retorno { kind, status, body } |
srv-ok |
return { kind: 'json', status: 200, body: { data } } |
srv-err |
return { kind, status: 4xx/5xx, body: { erro } } com seleção de status |
srv-controller |
Handler SSR Fastify com verificação de out.status, flash e reply.render() |
srv-api |
Handler JSON Fastify com reply.status(out.status).send(out.body) |
srv-plugin |
Two-Plugin Factory completo: viewPlugin + apiPlugin + guard hook |
srv-repo |
Método de Repository com Sequelize findAll, where e order |
srv-migration |
Migration Umzug com up/down e seleção de operação SQL |
srv-migration-table |
Migration createTable completa com id, coluna, timestamps |
srv-migration-col |
Migration addColumn com tipo, allowNull, defaultValue |
srv-fetch-modal |
fetch() + window.Servent.Modals.[Nome].open() com tratamento de erro |
srv-e2e |
Teste E2E Playwright base com beforeAll, afterAll e it() |
srv-e2e-modal |
Teste E2E completo de modal com casos reais |
📊 Servent Explorer
Um painel dedicado na Activity Bar do VS Code com mapa visual do projeto.
SERVENT EXPLORER
├── 📄 Pages
│ ├── auth
│ │ └── login
│ │ ├── index.ejs ← clicável
│ │ ├── style.css ← clicável
│ │ └── script.js ← clicável
│ └── operators
│ ├── list → .srv-page-operators-list
│ └── detail → .srv-page-operators-detail
│
├── 🧩 Components
│ ├── menus
│ ├── modals
│ │ └── detail → .srv-modal-detail
│ └── sidebars
│ └── new → .srv-sidebar-new
│
└── 🧱 Partials
├── _page-header.ejs
├── _empty-state.ejs
├── _pagination.ejs
└── _alert-flash.ejs
O painel atualiza automaticamente ao salvar, criar ou deletar arquivos. O botão ✨ no header abre o Wizard diretamente.
🏗️ Casos de Uso
| Tipo de projeto | Como a extensão ajuda |
|---|---|
| Sistema administrativo | Wizard gera cada módulo CRUD em < 1 min; guard por role pronto para usar |
| Portal SSR corporativo | Shell único, partials reutilizáveis, Servent Explorer para navegação |
| E-commerce | Módulos independentes por domínio; modal de detalhe e sidebar de filtro prontos |
| API Enterprise | Two-Plugin Factory separa rotas SSR e JSON no mesmo módulo |
| Sistema governamental | requireRole() por feature; ARIA completo nos components gerados |
| SaaS multi-tenant | Chaves srvt_local/dev/hmg/prd geradas por ambiente |
⚙️ Configurações
| Configuração | Valores | Padrão |
|---|---|---|
servent-ssr.framework |
fastify | express |
fastify |
📋 Changelog
v3.1.0
- ✅ Gerar Teste Playwright — botão direito na pasta do componente gera
.spec.tscom testes por método - ✅ Importar arquivo .spec — integração com SpecForge no comando Inicializar Projeto
- ✅ Playwright configurado —
playwright.config.tsgerado combaseURLlida do.env - ✅ Scripts npm E2E —
test:e2e,test:e2e:ui,test:e2e:headedadicionados - ✅ Linter CSS embutido — Stylelint com regra
servent-ssr/css-prefix - ✅ Linter JS embutido — ESLint com regras
servent-ssr/namespaceeservent-ssr/iife - ✅ Namespace com módulo de domínio — suporte a
window.Servent.User.Modals.Detalhe - ✅ SQL injection corrigido —
Repository.jsvalidatableNameno construtor - ✅ Umzug + Sequelize — adicionados ao
package.jsongerado - ✅
write()com aviso — alerta quando arquivo já existe em vez de ignorar silenciosamente
v3.0.2
- ✅ EJS Formatter —
Shift+Alt+Fformata.ejspreservando tags EJS intactas - ✅ Code Actions (💡) — correções automáticas para todos os diagnósticos
- ✅ Gerador de Teste E2E — Playwright gerado a partir do template
.ejs - ✅ Hover com documentação — assinatura de components e
window.Servent.* - ✅ Go to Definition —
Ctrl+Clickeminclude()ewindow.Servent.* - ✅ Novos snippets:
srv-e2e,srv-e2e-modal
v2.2.0
- ✅ Servent Explorer — painel lateral com mapa visual arquitetural
- ✅ Wizard de módulo completo — fluxo guiado com seleção de pages e components
- ✅ Snippets de migration:
srv-migration,srv-migration-table,srv-migration-col - ✅ Novo comando:
Servent-SSR: Novo Partial
v2.1.0
- ✅ Validador em tempo real —
DiagnosticCollectioncom regras de conformidade - ✅ Highlight EJS — grammar TextMate própria para
.ejs - ✅ Novo comando:
Servent-SSR: Validar Arquivo
v2.0.0
- ✅ Estrutura atualizada para Servent-SSR v7.0 (Fastify)
- ✅ Inicializar Projeto gera auth JWT completo com módulo, model, migration e seeder
- ✅ Chaves de ambiente geradas dinamicamente:
srvt_local_*,srvt_dev_*,srvt_hmg_*,srvt_prd_* - ✅ 14 snippets EJS e 17 snippets JS
- ✅ Plugin factory, controllers, services, repositories e domain gerados
- ✅ Novo comando:
Servent-SSR: Novo Partial
v1.0.0
- ✅ Comandos básicos:
Inicializar Projeto,Novo Módulo,Novo Componente,Nova Page - ✅ Geração de Plugin Factory, Controller, Service, Repository, Domain
- ✅ Suporte a Express