@vibe2founder/tests2dialects 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/examples/imperative.spec.d.ts +1 -0
  2. package/dist/examples/imperative.spec.js +46 -0
  3. package/dist/examples/math.spec.d.ts +1 -0
  4. package/dist/examples/math.spec.js +39 -0
  5. package/dist/examples/narrative.spec.d.ts +1 -0
  6. package/dist/examples/narrative.spec.js +47 -0
  7. package/dist/examples/polyglot-shopping-cart.spec.d.ts +11 -0
  8. package/dist/examples/polyglot-shopping-cart.spec.js +161 -0
  9. package/dist/examples/sanity.spec.d.ts +1 -0
  10. package/dist/examples/sanity.spec.js +39 -0
  11. package/dist/examples/showcase-api.spec.d.ts +1 -0
  12. package/dist/examples/showcase-api.spec.js +62 -0
  13. package/dist/examples/test-api.d.ts +1 -0
  14. package/dist/examples/test-api.js +32 -0
  15. package/dist/packages/api-test-dialect/index.d.ts +28 -0
  16. package/dist/packages/api-test-dialect/index.js +102 -0
  17. package/dist/packages/reqify/index.d.ts +12 -0
  18. package/dist/packages/reqify/index.js +24 -0
  19. package/dist/src/cli.d.ts +6 -0
  20. package/dist/src/cli.js +330 -0
  21. package/dist/src/index.d.ts +134 -0
  22. package/dist/src/index.js +374 -0
  23. package/dist/src/semantic/core.d.ts +24 -0
  24. package/dist/src/semantic/core.js +16 -0
  25. package/{types/api-types.ts → dist/types/api-types.d.ts} +6 -11
  26. package/dist/types/api-types.js +1 -0
  27. package/package.json +59 -35
  28. package/packages/api-test-dialect/index.ts +132 -132
  29. package/readme.md +58 -58
  30. package/src/cli.ts +1 -1
  31. package/src/index.ts +19 -16
  32. package/src/semantic/core.ts +26 -0
  33. package/CHANGELOG.md +0 -73
  34. package/bun.lock +0 -22
  35. package/bunfig.toml +0 -2
  36. package/critica.md +0 -77
  37. package/docs/4-ideias.md +0 -66
  38. package/docs/api-api.md +0 -93
  39. package/docs/api-imperativo.md +0 -125
  40. package/docs/api-matematico.md +0 -145
  41. package/docs/api-narrativo.md +0 -181
  42. package/docs/guia-rapido.md +0 -189
  43. package/docs/whitepaper.md +0 -21
  44. package/examples/imperative.spec.ts +0 -58
  45. package/examples/math.spec.ts +0 -52
  46. package/examples/narrative.spec.ts +0 -61
  47. package/examples/polyglot-shopping-cart.spec.ts +0 -212
  48. package/examples/sanity.spec.ts +0 -54
  49. package/examples/showcase-api.spec.ts +0 -70
  50. package/examples/test-api.ts +0 -36
  51. package/infograficos/detalhado.png +0 -0
  52. package/infograficos/mobile.png +0 -0
  53. package/infograficos/normal.png +0 -0
  54. package/landing-page/README.md +0 -38
  55. package/landing-page/bun.lock +0 -609
  56. package/landing-page/eslint.config.js +0 -23
  57. package/landing-page/index.html +0 -17
  58. package/landing-page/package-lock.json +0 -2962
  59. package/landing-page/package.json +0 -34
  60. package/landing-page/postcss.config.js +0 -6
  61. package/landing-page/public/vite.svg +0 -1
  62. package/landing-page/src/App.tsx +0 -358
  63. package/landing-page/src/assets/react.svg +0 -1
  64. package/landing-page/src/index.css +0 -34
  65. package/landing-page/src/main.tsx +0 -10
  66. package/landing-page/tailwind.config.js +0 -59
  67. package/landing-page/tsconfig.app.json +0 -28
  68. package/landing-page/tsconfig.json +0 -7
  69. package/landing-page/tsconfig.node.json +0 -26
  70. package/landing-page/vite.config.ts +0 -7
  71. package/logo.png +0 -0
  72. package/output.log +0 -60
  73. package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.json +0 -0
  74. package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.md +0 -0
  75. package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
  76. package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
  77. package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o_(7_words__covers_t.md +0 -1
  78. package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o__7_words__covers_t.ogg +0 -0
  79. package/podcast/critica2-Sil/303/252ncio_estrat/303/251gico_e_sobrecarga_em_READMEs.ogg +0 -0
  80. package/podcast/critica2.json +0 -3191
  81. package/podcast/critica2.md +0 -1
  82. package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
  83. package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
  84. package/reports/01-01-2026_00-45.md +0 -40
  85. package/reports/01-01-2026_02-30.md +0 -37
  86. package/reports/03-02-2026_10-55.md +0 -8
  87. package/reports/03-02-2026_11-45.md +0 -13
  88. package/reports/03-02-2026_11-50.md +0 -10
  89. package/reports/26-01-2026_16-25.md +0 -31
  90. package/reports/26-01-2026_19-20.md +0 -27
  91. package/reports/31-12-2025_22-35.md +0 -25
  92. package/reports/31-12-2025_22-45.md +0 -15
  93. package/slides/Dialetos_de_Teste_Um_Executor_M/303/272ltiplos_Vocabul/303/241rios.pdf +0 -0
  94. package/tabela.html +0 -350
  95. package/tsconfig.json +0 -22
  96. package/www/index.html +0 -1344
@@ -1 +0,0 @@
1
- Hoje a gente analisa o Readme da One Proof for All, uma biblioteca de testes que propõe dialetos diferentes para cada tipo de problema. O material já faz um ótimo trabalho. Ele apresenta um conceito que é complexo de uma forma bem segmentada. Sim, a clareza é um ponto alto, sem dúvida. A estrutura é bem lógica. Mas eu sinto que dá para ir além. Vamos ver como a gente pode, talvez, elevar a narrativa para que a adoção da ferramenta se torne não só interessante, mas meio que inevitável para o leitor certo. Perfeito. O ponto de partida já me chamou a atenção. A primeira sessão do documento captura o leitor na hora, com a pergunta cansado de descrever quando quer provar, e logo em seguida já joga um quick start de 5 minutos na tela. É uma abordagem que, tipo, valoriza o tempo do desenvolvedor, né? É direta, e eu aprecio isso. Mas, ao pular direto para o como, eu me pergunto se a gente não está perdendo a chance de solidificar o porquê. Principalmente para um público mais sênior, mais cético. O porquê, certo? Exato. O maior diferencial, a tal da filosofia aditiva, que ataca de frente o maior medo de qualquer time. O código legado. Isso, o código legado. Essa filosofia é mencionada quase de passagem e jogada para um link externo. Entendi o que você quer dizer. É como dizer, a solução para o seu maior problema está aqui, mas aí você coloca um obstáculo, mesmo que seja só um clique, na frente dela. Exatamente. Você pede para o leitor sair da página principal para se convencer do argumento mais importante bem no momento em que o ceticismo dele está no auge. Perfeito. A fraqueza, para mim, é que a promessa de segurança e compatibilidade ela não é estabelecida com força suficiente antes de se pedir para o usuário, bom, está lá e rodar um novo pacote. A confiança não foi totalmente construída. O argumento de venda mais poderoso, que é a coexistência pacífica com o legado, ele é mencionado, mas não é provado ali na cara na sessão de abertura. O que é uma chance de ouro perdida? Então a sugestão é trazer a essência da filosofia aditiva para o centro do palco logo no início, transformar a principal objeção do leitor na sua maior fortaleza, tantes mesmo de apresentar a solução técnica. Mas como fazer isso sem deixar a introdução pesada e longa? A gente corre o risco de assustar o leitor com muito texto teórico antes do código. É um equilíbrio delicado, concordo. Não se trata de copiar e colar o documento inteiro da filosofia ali. A chave é mostrar, não contar. Em vez de só dizer que o legado funciona, mostra, traz aquele exemplo de código de coexistência que talvez esteja escondido em outra página para o topo. Ah, boa! Imagina um bloco de código com o Describe do Jest, que todo mundo conhece, e o novo Axion da OneSpecForAll lado a lado, rodando num mesmo arquivo, com um cheque verde gigante em cada um. Isso prova visualmente em três segundos que não tem quebra. A mensagem é instantânea. Não viemos para destruir seu trabalho, viemos para complementar. Exatamente. Gosto muito disso. É visual, é imediato. Elimina a necessidade de um parágrafo longo de explicação. O código fala por si. E para a parte conceitual, a ideia de que o framework é poliglota, mas o deve não precisa ser Isso pode ser uma chamada de uma linha poderosa e tranquilizadora logo depois do exemplo visual Algo como a proposta n que todos aprendam tr idiomas A proposta que seu cientista de dados foque no dialeto matemático e ignore o resto. O framework é poliglota para que seu time não precise ser. Nossa, essa frase muda tudo. Muda. Combinada com a prova visual, muda completamente o enquadramento psicológico. O leitor passa de Ah, é mais uma coisa para aprender para Nossa, isso foi feito para simplificar a vida do meu time. Só então, com essa confiança estabelecida, você apresenta o Quick Start. E a chance dele rodar o NPM em install aumenta exponencialmente. Com certeza. Faz todo sentido. É uma pequena inversão na ordem que tem um impacto enorme na percepção. Primeiro você acalma o medo, depois você apresenta a novidade. Ok, isso resolve a abertura. Mas essa ideia de sobrecarga me leva ao segundo ponto. O documento introduz o conceito dos três dialetes com um diagrama claro de qual dialeto é para você. Eu adorei essa parte. O diagrama é fantástico. É uma ferramenta de navegação brilhante. Ele cria a expectativa de uma jornada personalizada. Tipo, um escolha a sua própria aventura. Sim. O problema é que logo depois de você escolher a sua aventura, o livro te força a ler todos os finais possíveis, um atrás do outro. É uma ótima analogia. Exatamente. Depois do diagrama, o documento descarrega o conteúdo completo dos três caminhos. Cada dialeto vem com sua filosofia, exemplos e uma tabela de API gigantesca. A instrução, você não precisa aprender os três, está lá, mas ela briga diretamente com o layout da página, que te força a rolar por tudo. É uma dissonância cognitiva. A mensagem de simplicidade e especialização é contradita por uma parede de texto que grita complexidade. A riqueza de detalhes apresentada de uma só vez gera o efeito paradoxal de fazer a ferramenta parecer muito mais complicada do que ela realmente é por causa de uso de um único leitor. Com certeza. O David Frontiand, que só precisa do dialeto imperativo, olha para as tabelas do matemático e do narrativo e pensa meu Deus, olha o tamanho dessa ferramenta. Exato. Certo. Então, a fraqueza é a sobrecarga de informação que sabota a própria proposta de valor da ferramenta. A sugestão, imagino, é alinhar a estrutura da documentação com a promessa do diagrama. Aplicar o princípio de revelação progressiva. Na mosca, dê ao leitor o controle para explorar só o que é relevante para ele. E tem várias maneiras de fazer isso, umas mais simples, outras mais elegantes. Tipo? A mais comum e eficaz seria usar componentes interativos. Imagine, logo após o diagrama, três abas. Matemático, narrativo e imperativo. Por padrão, tudo fechado. O leitor clica no dialeto que lhe interessa e só essa seção se expande. As outras, ocultas. Ah, sim. Isso limpa a interface, reduz a ansiedade e dá ao usuário uma sensação de controle e foco. Isso. Eu já vi isso funcionar muito bem em documentações como a do Vue.js, por exemplo. mas também já vi falhar quando o conteúdo dentro de cada aba ainda é muito denso. O segredo talvez não seja só esconder, mas também garantir o que é mostrado inicialmente seja o essencial. Exato Uma alternativa talvez at mais simples de implementar num Readme de GitHub seria usar o QuickStart como fio condutor Certo Como o primeiro exemplo pr usa o dialeto imperativo por que não expandir completamente essa seção no Readme principal? Ela dá continuidade à jornada do leitor. Entendi. E os outros dois? Para os outros dois, você mostra só o aperitivo, a dor que ele resolve, um exemplo de código matador e então um linte claro. Fascinado pelo dialeto matemático, explore sua API completa e exemplos avançados aqui. Isso move a complexidade para uma camada secundária. A página principal fica enxuta, focada na jornada mais comum, mas sem perder a riqueza para quem quer se aprofundar. Gosto dessa segunda opção porque ela cria um caminho feliz bem definido. O leitor iniciante é guiado de ponta a ponta sem distrações, enquanto explorador avançado tem as portas de saída claramente sinalizadas. Ambas as sugestões, no fundo, respeitam o foco e o tempo do leitor, o que é sempre uma boa prática. E essa ideia de respeitar diferentes leitores me leva a pensar. A gente está focando muito no desenvolvedor que vai escrever o código. E o documento faz isso brilhantemente. As sessões A Dor que Resolvemos para cada dialeto criam uma empatia enorme. Sim, elas são ótimas. Mas, e a outra persona? Talvez a mais importante para a adoção da ferramenta. O tomador de decisão, o tech lead, o arquiteto, o gerente de engenharia que precisa aprovar a inclusão de uma nova dependência no package.json. Você tem razão, não tem nada ali para ele. Exato. O documento fala a língua do executor, mas ignora a língua do estrategista. Em muitas equipes, a adoção de uma nova dependência de teste não é uma decisão individual. E essa pessoa que aprova tem um conjunto diferente de perguntas na cabeça. Não é qual sintaxe dessa função, mas sim qual o custo de manutenção disso. Isso vai acelerar ou atrasar meu time? Como isso se alinha com nossos objetivos de negócio? O Readme atual não tem uma sessão que responda essas perguntas de forma concisa. É uma falha crítica. A ausência de um sumário executivo que traduz os benefícios técnicos individuais em vantagens estratégicas para a equipe. Isso pode ser um obstáculo intransponível para a adoção em organizações maiores. Um desenvolvedor pode amar a ferramenta, mas se ele não souber vender a ideia para a liderança, a ferramenta morre na praia. Lembro de uma vez que tentei convencer o meu time a adotar uma ferramenta de LinkedIn nova. Eu passei uma hora na reunião falando sobre como a sentasse era elegante e como as regras eram melhores para mim. No final, meu gerente perguntou, ok, mas como isso nos ajuda a entregar o projeto X mais rápido? E aí? Eu gaguejei. Não tinha resposta. Eu não tinha o argumento estratégico. É uma história clássica. A gente se apaixona pela ferramenta e esquece de construir a ponte para o valor de negócio. Então, a sugestão é clara. Criar uma sessão dedicada a essa persona. Talvez algo como por que adotar no seu time ou o valor estratégico do One Proof for All. Isso. Uma sessão concisa e direta, talvez logo após o Quick Start, que sirva como um arsenal de argumentos. O desenvolvedor que amou a ferramenta pode simplesmente copiar e colar esses pontos no e-mail para o seu líder. E o conteúdo precisa falar a língua da gestão. ROI, risco, produtividade, alinhamento. Exato. Certo Vamos rascunhar como seriam esses argumentos Que tipo de pilares a gente poderia ter nessa sess Eu imagino tr pilares principais O primeiro o ROI de comunica Em vez de s dizer que os testes são legíveis por PMs, enquadra isso como um benefício de negócio. Reduza o ciclo de validação de regras. Com o dialeto narrativo, seus testes se tornam a especificação viva que o time de produto pode aprovar de forma síncrona. Menos reuniões, menos ambiguidade, menos retrabalho. Isso, direto ao ponto. O benefício é quantificável, tempo economizado. O segundo pilar poderia ser sobre a eficiência do time. Exato, produtividade e on-board. Poderíamos falar sobre o custo de capacitação, aceleré à contribuição de novos membros do time. Um cientista de dados júnior pode escrever provas matemáticas robustas em uma semana com o dialeto matemático, sem precisar gastar um mês aprendendo todo o ecossistema de moxistubs do seu front-end. A mensagem é, especialização da ferramenta gera especialização e foco no time, o que leva à produtividade. Perfeito. E o terceiro pilar, para fechar, tem que ser sobre o maior medo de qualquer líder, o risco. Perfeito. O pilar da saúde do código e risco zero. Aqui a gente conecta com o nosso primeiro ponto, a filosofia aditiva, e dá a ela um verniz estratégico. Boa. Adote com risco zero e custo zero. A integração incremental significa que você melhora a clareza de novas funcionalidades imediatamente, sem acumular dívida técnica ou embarcar numa reescrita cara e arriscada dos seus 5 mil testes existentes. Isso é música para os ouvidos de qualquer gerente de engenharia. Sem dúvida. Fantástico. Com uma sessão dessas, o Readme deixa de ser só uma documentação técnica e se torna também uma poderosa ferramenta de vendas internas. Ele equipa o desenvolvedor para ser um campeão da ferramenta dentro da sua organização. É essa a transformação. Um bom Readme ensina a usar. Um ótimo Readme convence a adotar. Para resumir nossa conversa de hoje, então, a estrutura e o conteúdo do Readme da OneSpec for All já são muito fortes. Nossas sugestões focam em refinar a narrativa para maximizar o impacto e principalmente a taxa de adoção. Exato! Primeiro, fortalecer o porquê antes de apresentar o como. Isso significa trazer a prova da filosofia aditiva para o início do documento de forma visual e imediata, em vez de delegá-la a um link. É construir confiança antes de pedir uma ação. Segundo, reduzir a carga cognitiva na apresentação dos dialetos. Alinhar o design da informação com a promessa de especialização, usando um padrão de revelação progressiva para não sobrecarregar o leitor com o conteúdo que é irrelevante para ele. E por fim, adicionar uma nova sessão com foco nos benefícios estratégicos para o time. Criar um argumento poderoso para os tomadores de decisão, falando a língua deles e abordando diretamente suas preocupações com custo, risco e produtividade. São três mudanças que, juntas, podem transformar um ótimo Readme em uma ferramenta de conversão irresistível. Adoraríamos ver a próxima versão deste material e analisar os resultados.
@@ -1,40 +0,0 @@
1
- # Relatório de Reestruturação do README
2
-
3
- **Data:** 01/01/2026
4
- **Hora:** 00:45
5
-
6
- ## O que foi feito
7
-
8
- Reestruturação completa do `readme.md` seguindo as três ações recomendadas no podcast de crítica:
9
-
10
- ### 1. Unificação da Filosofia com a Prática
11
-
12
- - Adicionei uma **nova seção de abertura** ("Cansado de Descrever Quando Quer Provar?") que conecta imediatamente a frustração real do desenvolvedor com a solução do framework.
13
- - A mensagem da **Filosofia Aditiva** foi trazida do `critica.md` para o topo do README, garantindo que o usuário entenda o "porquê" antes do "como".
14
-
15
- ### 2. Articulação da Dor Que Cada Dialeto Resolve
16
-
17
- Cada dialeto agora começa com uma seção **"A Dor Que Resolvemos"**, que enquadra o problema antes de apresentar a solução:
18
-
19
- - **📐 Matemático:** "Você está testando uma função de criptografia pura... Escrever `describe` e `it` soa informal e impreciso."
20
- - **📖 Narrativo:** "Seu PM precisa validar as regras de negócio, mas não consegue ler seus testes."
21
- - **🛡️ Imperativo:** "A linguagem do teste não impõe o respeito que o contrato exige."
22
-
23
- Isso cria um **gancho emocional** e faz o leitor pensar: "Nossa, sim, eu odeio fazer isso!"
24
-
25
- ### 3. Caminho de Onboarding Guiado
26
-
27
- - **Quick Start em 5 minutos:** Adicionei uma seção no topo para uma "primeira vitória" imediata. O usuário copia, cola, roda e passa. Em 5 minutos ele já está usando o framework.
28
- - **Fluxograma "Qual Dialeto é Para Você?":** Um diagrama ASCII visual que guia a escolha do dialeto de forma simples.
29
- - **Tópicos Avançados no final:** A Tabela Rosetta e o Modo Poliglota foram movidos para o final, numa seção de "Tópicos Avançados", limpando o caminho principal para o novato.
30
- - **Seção de Migração:** Um guia mostrando como adotar o framework gradualmente em uma codebase existente com testes Jest/Mocha.
31
-
32
- ## Por que foi feito
33
-
34
- O podcast de crítica (`critica-Unificar_filosofia_e_prática_na_documentação_...`) identificou três pontos cruciais:
35
-
36
- 1. A filosofia do Crítica e Esclarecimento estava desconectada do README.
37
- 2. Os dialetos eram apresentados sem articular a "dor" que resolvem.
38
- 3. O README funcionava como enciclopédia, não como tutor de onboarding.
39
-
40
- A nova estrutura transforma a documentação de um **manual de referência** para uma **ferramenta de conversão**, guiando o usuário do interesse à adoção de forma fluida e gratificante.
@@ -1,37 +0,0 @@
1
- # Relatório de Finalização: Core Engine & Exemplos Poliglotas
2
-
3
- ## O que foi feito?
4
-
5
- 1. **Aprimoramento do Motor de Mocks (AtomicMock):**
6
-
7
- - Implementação de **Deep Proxies**: Agora os mocks criados com `standIn`, `stub` ou `arbitrary` suportam acesso automático a propriedades e métodos inexistentes, criando sub-mocks sob demanda.
8
- - **Call Bubbling**: Chamadas a métodos de um objeto-mock (ex: `cart.add()`) agora notificam o mock pai, permitindo asserções genéricas como `to(cart).wasCalled()`.
9
- - **Data Object Mocking**: O Proxy agora respeita retornos configurados via `respondsWith`/`forceReturn`. Se o mock retornar um objeto real, o acesso a propriedades desse objeto funciona normalmente antes de tentar criar um sub-mock.
10
-
11
- 2. **Correção do Ciclo de Vida (AtomicCore):**
12
-
13
- - Corrigida a execução dos hooks `beforeAll` (`initAll`, `background`, `postulate`) e `afterAll`. Antes, o runner simplificado ignorava esses blocos de configuração persistente.
14
-
15
- 3. **Refinação da API de Asserções:**
16
-
17
- - Adição de aliases solicitados e implícitos nos exemplos: `.be()` (Narrativo) e `.uploaded()` (Narrativo).
18
- - Implementação de `.clear()` (limpar chamadas) vs `.reset()` (limpar tudo) para permitir limpeza de histórico entre testes sem perder configurações de baseline feitas no `initAll`.
19
-
20
- 4. **Estabilização dos Exemplos:**
21
- - Todos os exemplos na pasta `/examples` foram atualizados para usar caminhos relativos, permitindo a execução local imediata via CLI.
22
- - O exemplo poliglota de carrinho de compras foi logicamente conectado para garantir que as interações entre mocks (ex: `cart` chamando `coupon`) sejam verificadas corretamente.
23
- - **Resultado**: 100% de sucesso na execução dos testes (5 arquivos, 28 testes).
24
-
25
- ## Por que foi feito?
26
-
27
- Para garantir que a promessa da documentação ("Simple, Semantic, Polyglot") seja sustentada por uma implementação técnica robusta. Os usuários esperam que mocks de objetos funcionem intuitivamente (Deep Mocking) e que o modo poliglota seja prático e confiável.
28
-
29
- ## Como testar?
30
-
31
- Execute o comando no terminal (via WSL):
32
-
33
- ```bash
34
- bun run src/cli.ts
35
- ```
36
-
37
- Você verá o output estilo Vitest com todos os testes passando com sucesso.
@@ -1,8 +0,0 @@
1
- # Relatório de Execução
2
-
3
- ## O que foi feito
4
- - Adicionada seção "Running API Tests" no `README.md` detalhando como criar e executar testes de API usando o dialeto específico.
5
- - Atualizado `CHANGELOG.md` com a nova versão `v0.4.1`.
6
-
7
- ## Por que foi feito
8
- - Para atender à solicitação de documentar claramente a forma de testar APIs no projeto, facilitando o uso do `ApiSpec`.
@@ -1,13 +0,0 @@
1
- # Relatório de Execução - Showcase de Funcionalidades
2
-
3
- ## O que foi feito
4
- - Criado o arquivo `examples/showcase-api.spec.ts` que demonstra o uso completo do Dialeto de API.
5
- - Testadas e validadas as seguintes funcionalidades:
6
- - Métodos HTTP: `GET`, `POST`, `PUT`, `DELETE`.
7
- - Envio de `Headers` customizados.
8
- - Validação de `Status Code`.
9
- - Validação de `Schema` (cheking de tipos e existência de chaves).
10
- - Execução realizada com sucesso via `bun` contra a API pública JSONPlaceholder.
11
-
12
- ## Por que foi feito
13
- - Para fornecer um exemplo prático "fim-a-fim" que serve tanto como teste de sanidade para o dialeto quanto como documentação viva para o usuário final.
@@ -1,10 +0,0 @@
1
- # Relatório de Execução - Padronização da Documentação
2
-
3
- ## O que foi feito
4
- - Criado o arquivo `docs/api-api.md` contendo a especificação completa do Dialeto de API.
5
- - O conteúdo foi expandido para incluir tabelas de estrutura, configuração, asserções e um exemplo completo, seguindo o padrão visual e de profundidade dos outros dialetos (`api-matematico`, `api-narrativo`, `api-imperativo`).
6
- - O arquivo anterior `docs/api-teste-api.md` foi removido (renomeado).
7
- - Todas as referências no `README.md` foram atualizadas para apontar para `docs/api-api.md`.
8
-
9
- ## Por que foi feito
10
- - Para garantir a consistência técnica e visual da documentação do projeto, tratando o Dialeto de API com o mesmo nível de detalhamento dos demais.
@@ -1,31 +0,0 @@
1
- # Relatório Técnico: Dialeto de Testes de API
2
-
3
- **Data:** 26-01-2026
4
- **Objetivo:** Implementação de um dialeto (DSL) fluído para testes de API utilizando padrões @vibe2founder.
5
-
6
- ## O que foi feito
7
- 1. **Tipagem Semântica Nominal**: Criação de tipos específicos em `types/api-types.ts` para garantir que primitivos não sejam usados arbitrariamente.
8
- 2. **Implementação do @vibe2founder/request2http (Local)**: Wrapper minimalista sobre o `fetch` nativo do Bun, evitando dependências externas como Axios, conforme as regras do projeto.
9
- 3. **DSL de Testes (ApiSpec)**: Implementação da classe `ApiTestDialect` que permite a definição de testes de forma declarativa e legível (Given/When/Then pattern).
10
- 4. **Validação de Schema**: Sistema local básico para validação de estrutura de resposta sem bibliotecas externas.
11
- 5. **Demonstração**: Script em `examples/test-api.ts` validando o funcionamento contra a API JSONPlaceholder.
12
-
13
- ## Por que foi feito
14
- A criação de um dialeto específico simplifica a escrita de testes de integração, tornando-os autodocumentados e garantindo que sigam as premissas de invariantes do sistema. O uso de implementações locais e tipos nominais reforça a segurança e a manutenibilidade do código, evitando "leakage" de dependências externas e garantindo que os dados trafegados nas APIs sejam semanticamente corretos.
15
-
16
- ## Como funciona
17
- O dialeto utiliza encadeamento de métodos (chaining):
18
- ```typescript
19
- await ApiSpec.define("Nome do Teste")
20
- .from("URL_BASE")
21
- .get("/rota")
22
- .shouldReturn(200)
23
- .matchingSchema({ chave: "tipo" })
24
- .run();
25
- ```
26
-
27
- ## Como testar
28
- Execute o comando via WSL:
29
- ```bash
30
- bun run examples/test-api.ts
31
- ```
@@ -1,27 +0,0 @@
1
- # Relatório de Refatoração: One Proof for All
2
-
3
- **Data:** 26-01-2026
4
- **Objetivo:** Refatoração completa do nome do projeto e estabilização do ambiente de testes ESM.
5
-
6
- ## O que foi feito
7
- 1. **Renaming de Marca**: O projeto foi renomeado de `@vibe2founder/one-spec-4-all` para `@vibe2founder/tests2dialects` em todos os arquivos de configuração (`package.json`, `tsconfig.json`).
8
- 2. **Correção de Módulos ESM**:
9
- - Adicionada extensão `.js` em todos os imports relativos conforme exigido pelo modo `NodeNext` do TypeScript.
10
- - Corrigido o tipo `Timer` para `ReturnType<typeof setInterval>` no CLI para compatibilidade com tipos de ambiente variados.
11
- 3. **Isolamento de Testes**:
12
- - Implementado o m├©todo `resetAtomicCore()` para garantir que o estado do singleton `AtomicCore` seja limpo entre a execu├º├úo de diferentes arquivos de especifica├º├úo no CLI.
13
- - O CLI agora importa e reseta o motor antes de cada arquivo, evitando vazamento de nomes de grupos e testes.
14
- 4. **Melhoria no Report do CLI**:
15
- - Logs de passagem/falha agora incluem o caminho completo (`Grupo > Teste`), permitindo que o CLI extraia nomes precisos mesmo em execu├º├Áes ass├¡ncronas.
16
- 5. **Tipagem Semàntica de Mocks**:
17
- - Criada a interface `AtomicMock` que integra todos os m├©todos dos dialetos (Matem├itico, Narrativo, Imperativo) via Proxy, resolvendo todos os erros de lint nos arquivos de exemplo.
18
-
19
- ## Por que foi feito
20
- A mudan├ºa para "One Proof for All" reflete melhor a natureza axiom├itica e de "prova de conceito" (proof) dos dialetos. As corre├º├Áes t├©cnicas foram necess├irias para garantir um fluxo de desenvolvimento fluido e sem erros de build, respeitando as regras de tipagem nominal do vibe2founder.
21
-
22
- ## Como testar
23
- Para validar a instalação e refatoração, execute:
24
- ```bash
25
- wsl bun run src/cli.ts
26
- ```
27
- O resultado deve listar 5 arquivos de teste e 28 testes passando com nomes isolados.
@@ -1,25 +0,0 @@
1
- # Relatório de Atualização de Documentação
2
-
3
- **Data:** 31/12/2025
4
- **Hora:** 22:35
5
-
6
- ## O que foi feito
7
-
8
- 1. **Refatoração do Código Fonte (`src/index.ts`):**
9
-
10
- - Adicionadas exportações de nível superior (top-level exports) para todas as funções dos dialetos (Matemático, Narrativo, Imperativo).
11
- - Isso permite importar funções diretamente (ex: `import { axiom } from ...`) em vez de desestruturar de um objeto exportado.
12
-
13
- 2. **Atualização do README:**
14
-
15
- - Expandida a descrição filosófica de cada dialeto para fornecer mais contexto sobre _quando_ e _por que_ usar cada um.
16
- - Substituídos os exemplos antigos e simples por **exemplos completos e realistas**.
17
- - Os novos exemplos demonstram uso de mocks, lifecycle hooks (`given`, `background`, `initAll`) e asserções mais complexas.
18
- - Corrigidos os `import` nos exemplos para usar o nome correto do pacote (`@vibe2founder/tests2dialects`) e a nova sintaxe de exportação direta.
19
-
20
- 3. **Documentação de Mudanças:**
21
- - Criado o arquivo `CHANGELOG.md` para rastrear as alterações.
22
-
23
- ## Por que foi feito
24
-
25
- O usuário solicitou descrições mais detalhadas e exemplos mais completos para cada seção do README. Para atender a isso com qualidade, percebeu-se que a API exposta no código (`src/index.ts`) não correspondia à ergonomia desejada nos exemplos (importações diretas). Portanto, o código foi ajustado para suportar a documentação melhorada, garantindo que os usuários possam copiar e colar os exemplos e ter um código funcional.
@@ -1,15 +0,0 @@
1
- # Relatório de Conversão de Tabela
2
-
3
- **Data:** 31/12/2025
4
- **Hora:** 22:45
5
-
6
- ## O que foi feito
7
-
8
- 1. **Conversão de Tabela HTML para Markdown (`readme.md`):**
9
- - A tabela de comparação ("Rosetta Stone"), que estava em formato HTML puro dentro do README, foi convertida manualmente para o formato de tabela Markdown nativo do GitHub.
10
- - Mantive a estrutura de colunas e categorização.
11
- - Utilizei separadores visuais nas linhas (`--- Estrutura ---`) para emular as seções que existiam na tabela HTML.
12
-
13
- ## Por que foi feito
14
-
15
- O usuário solicitou explicitamente a transformação do bloco HTML inserido anteriormente para Markdown (`transforme em md`). Tabelas em Markdown são mais "portáveis", fáceis de editar diretamente no código-fonte e renderizam de forma mais consistente em diferentes visualizadores de Markdown, além de manter o arquivo `readme.md` mais limpo e sem mistura excessiva de HTML e Markdown.
package/tabela.html DELETED
@@ -1,350 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="pt-BR">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>tests2dialects Testing Framework - Rosetta Stone</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <link
9
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=JetBrains+Mono:wght@400;700&display=swap"
10
- rel="stylesheet"
11
- />
12
- <style>
13
- body {
14
- font-family: "Inter", sans-serif;
15
- }
16
- .mono {
17
- font-family: "JetBrains Mono", monospace;
18
- }
19
- </style>
20
- </head>
21
- <body class="bg-slate-50 text-slate-800 p-4 md:p-8">
22
- <div class="max-w-7xl mx-auto">
23
- <header class="mb-10 text-center">
24
- <h1 class="text-3xl md:text-4xl font-bold text-slate-900 mb-2">
25
- tests2dialects Testing Framework
26
- </h1>
27
- <p class="text-lg text-slate-600">Matriz de Tradução Semântica</p>
28
- </header>
29
-
30
- <!-- Tabela Principal -->
31
- <div class="overflow-x-auto shadow-xl rounded-lg border border-slate-200">
32
- <table class="w-full text-left text-sm bg-white">
33
- <thead class="bg-slate-900 text-slate-50 uppercase tracking-wider">
34
- <tr>
35
- <th class="px-6 py-4 font-bold border-r border-slate-700 w-1/5">
36
- Conceito / Jest
37
- </th>
38
- <th
39
- class="px-6 py-4 font-bold bg-indigo-900 border-r border-indigo-800 w-1/4"
40
- >
41
- <div class="flex items-center gap-2">
42
- <span>📐 Matemático</span>
43
- <span class="text-xs opacity-75 font-normal normal-case"
44
- >(Lógico/Funcional)</span
45
- >
46
- </div>
47
- </th>
48
- <th
49
- class="px-6 py-4 font-bold bg-emerald-900 border-r border-emerald-800 w-1/4"
50
- >
51
- <div class="flex items-center gap-2">
52
- <span>📖 Narrativo</span>
53
- <span class="text-xs opacity-75 font-normal normal-case"
54
- >(BDD/Humano)</span
55
- >
56
- </div>
57
- </th>
58
- <th class="px-6 py-4 font-bold bg-amber-900 w-1/4">
59
- <div class="flex items-center gap-2">
60
- <span>🛡️ Imperativo</span>
61
- <span class="text-xs opacity-75 font-normal normal-case"
62
- >(Técnico/Contrato)</span
63
- >
64
- </div>
65
- </th>
66
- </tr>
67
- </thead>
68
- <tbody class="divide-y divide-slate-200">
69
- <!-- SEÇÃO: ESTRUTURA BÁSICA -->
70
- <tr class="bg-slate-100">
71
- <td
72
- colspan="4"
73
- class="px-6 py-2 font-bold text-xs text-slate-500 uppercase tracking-widest"
74
- >
75
- Estrutura & Execução
76
- </td>
77
- </tr>
78
- <tr class="hover:bg-slate-50 transition-colors">
79
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
80
- describe()
81
- </td>
82
- <td class="px-6 py-4 text-indigo-700 mono font-bold">axiom()</td>
83
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
84
- intend() / story()
85
- </td>
86
- <td class="px-6 py-4 text-amber-700 mono font-bold">
87
- ensure() / suite()
88
- </td>
89
- </tr>
90
- <tr class="hover:bg-slate-50 transition-colors">
91
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
92
- it() / test()
93
- </td>
94
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
95
- proof() / lemma()
96
- </td>
97
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
98
- detail() / scenario()
99
- </td>
100
- <td class="px-6 py-4 text-amber-700 mono font-bold">
101
- check() / verify()
102
- </td>
103
- </tr>
104
- <tr class="hover:bg-slate-50 transition-colors">
105
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
106
- expect(x)
107
- </td>
108
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
109
- implies(x)
110
- </td>
111
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
112
- to(x) / expect(x)
113
- </td>
114
- <td class="px-6 py-4 text-amber-700 mono font-bold">that(x)</td>
115
- </tr>
116
-
117
- <!-- SEÇÃO: MOCKS - CRIAÇÃO -->
118
- <tr class="bg-slate-100">
119
- <td
120
- colspan="4"
121
- class="px-6 py-2 font-bold text-xs text-slate-500 uppercase tracking-widest"
122
- >
123
- Criação de Mocks
124
- </td>
125
- </tr>
126
- <tr class="hover:bg-slate-50 transition-colors">
127
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
128
- jest.fn()
129
- </td>
130
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
131
- arbitrary() / lambda()
132
- </td>
133
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
134
- dummy() / standIn()
135
- </td>
136
- <td class="px-6 py-4 text-amber-700 mono font-bold">
137
- stub() / mock()
138
- </td>
139
- </tr>
140
- <tr class="hover:bg-slate-50 transition-colors">
141
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
142
- jest.spyOn()
143
- </td>
144
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
145
- monitor()
146
- </td>
147
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
148
- watch() / shadow()
149
- </td>
150
- <td class="px-6 py-4 text-amber-700 mono font-bold">
151
- inspect() / spy()
152
- </td>
153
- </tr>
154
-
155
- <!-- SEÇÃO: MOCKS - COMPORTAMENTO -->
156
- <tr class="bg-slate-100">
157
- <td
158
- colspan="4"
159
- class="px-6 py-2 font-bold text-xs text-slate-500 uppercase tracking-widest"
160
- >
161
- Configuração de Mocks
162
- </td>
163
- </tr>
164
- <tr class="hover:bg-slate-50 transition-colors">
165
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
166
- mockReturnValue(v)
167
- </td>
168
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
169
- yields(v) / mapsTo(v)
170
- </td>
171
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
172
- respondsWith(v)
173
- </td>
174
- <td class="px-6 py-4 text-amber-700 mono font-bold">
175
- forceReturn(v)
176
- </td>
177
- </tr>
178
- <tr class="hover:bg-slate-50 transition-colors">
179
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
180
- mockResolvedValue(v)
181
- </td>
182
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
183
- convergesTo(v)
184
- </td>
185
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
186
- eventuallyGives(v)
187
- </td>
188
- <td class="px-6 py-4 text-amber-700 mono font-bold">
189
- resolveWith(v)
190
- </td>
191
- </tr>
192
- <tr class="hover:bg-slate-50 transition-colors">
193
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
194
- mockImplementation(fn)
195
- </td>
196
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
197
- derive(fn)
198
- </td>
199
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
200
- actsLike(fn)
201
- </td>
202
- <td class="px-6 py-4 text-amber-700 mono font-bold">
203
- executes(fn)
204
- </td>
205
- </tr>
206
-
207
- <!-- SEÇÃO: MOCKS - ASSERÇÕES -->
208
- <tr class="bg-slate-100">
209
- <td
210
- colspan="4"
211
- class="px-6 py-2 font-bold text-xs text-slate-500 uppercase tracking-widest"
212
- >
213
- Validação de Chamadas
214
- </td>
215
- </tr>
216
- <tr class="hover:bg-slate-50 transition-colors">
217
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
218
- toHaveBeenCalled()
219
- </td>
220
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
221
- .wasEvaluated()
222
- </td>
223
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
224
- .wasCalled()
225
- </td>
226
- <td class="px-6 py-4 text-amber-700 mono font-bold">
227
- .triggered()
228
- </td>
229
- </tr>
230
- <tr class="hover:bg-slate-50 transition-colors">
231
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
232
- toHaveBeenCalledWith(x)
233
- </td>
234
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
235
- .appliedTo(x)
236
- </td>
237
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
238
- .received(x)
239
- </td>
240
- <td class="px-6 py-4 text-amber-700 mono font-bold">
241
- .calledWith(x)
242
- </td>
243
- </tr>
244
- <tr class="hover:bg-slate-50 transition-colors">
245
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
246
- toHaveBeenCalledTimes(n)
247
- </td>
248
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
249
- .evaluated(n).times
250
- </td>
251
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
252
- .called(n).times
253
- </td>
254
- <td class="px-6 py-4 text-amber-700 mono font-bold">
255
- .triggeredCount(n)
256
- </td>
257
- </tr>
258
-
259
- <!-- SEÇÃO: LIFECYCLE -->
260
- <tr class="bg-slate-100">
261
- <td
262
- colspan="4"
263
- class="px-6 py-2 font-bold text-xs text-slate-500 uppercase tracking-widest"
264
- >
265
- Ciclo de Vida (Lifecycle)
266
- </td>
267
- </tr>
268
- <tr class="hover:bg-slate-50 transition-colors">
269
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
270
- beforeAll()
271
- </td>
272
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
273
- postulate() / setup()
274
- </td>
275
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
276
- background()
277
- </td>
278
- <td class="px-6 py-4 text-amber-700 mono font-bold">initAll()</td>
279
- </tr>
280
- <tr class="hover:bg-slate-50 transition-colors">
281
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
282
- afterAll()
283
- </td>
284
- <td class="px-6 py-4 text-indigo-700 mono font-bold">
285
- conclude()
286
- </td>
287
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
288
- cleanup()
289
- </td>
290
- <td class="px-6 py-4 text-amber-700 mono font-bold">
291
- disposeAll()
292
- </td>
293
- </tr>
294
- <tr class="hover:bg-slate-50 transition-colors">
295
- <td class="px-6 py-4 font-semibold text-slate-700 mono">
296
- beforeEach()
297
- </td>
298
- <td class="px-6 py-4 text-indigo-700 mono font-bold">given()</td>
299
- <td class="px-6 py-4 text-emerald-700 mono font-bold">
300
- before()
301
- </td>
302
- <td class="px-6 py-4 text-amber-700 mono font-bold">reset()</td>
303
- </tr>
304
- </tbody>
305
- </table>
306
- </div>
307
-
308
- <div class="mt-8 grid grid-cols-1 md:grid-cols-3 gap-6">
309
- <div class="bg-indigo-50 p-6 rounded-lg border border-indigo-100">
310
- <h3 class="font-bold text-indigo-900 mb-2">Exemplo Matemático</h3>
311
- <pre class="text-xs text-indigo-800 mono overflow-x-auto">
312
- const f = arbitrary();
313
- f.yields(10);
314
-
315
- proof("f map", () => {
316
- f();
317
- implies(f).wasEvaluated();
318
- });</pre
319
- >
320
- </div>
321
-
322
- <div class="bg-emerald-50 p-6 rounded-lg border border-emerald-100">
323
- <h3 class="font-bold text-emerald-900 mb-2">Exemplo Narrativo</h3>
324
- <pre class="text-xs text-emerald-800 mono overflow-x-auto">
325
- const login = standIn();
326
- login.respondsWith(true);
327
-
328
- scenario("Login", () => {
329
- login();
330
- to(login).wasCalled();
331
- });</pre
332
- >
333
- </div>
334
-
335
- <div class="bg-amber-50 p-6 rounded-lg border border-amber-100">
336
- <h3 class="font-bold text-amber-900 mb-2">Exemplo Imperativo</h3>
337
- <pre class="text-xs text-amber-800 mono overflow-x-auto">
338
- const api = stub();
339
- api.forceReturn(200);
340
-
341
- check("API status", () => {
342
- api();
343
- that(api).triggered();
344
- });</pre
345
- >
346
- </div>
347
- </div>
348
- </div>
349
- </body>
350
- </html>
package/tsconfig.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "lib": ["ES2022", "dom"],
7
- "types": ["node"],
8
- "outDir": "./dist",
9
- "strict": true,
10
- "noImplicitAny": true,
11
- "esModuleInterop": true,
12
- "skipLibCheck": true,
13
- "forceConsistentCasingInFileNames": true,
14
- "declaration": true,
15
- "baseUrl": ".",
16
- "paths": {
17
- "@vibe2founder/tests2dialects": ["./src/index.ts"]
18
- }
19
- },
20
- "include": ["src/**/*", "examples/**/*", "packages/**/*", "types/**/*"],
21
- "exclude": ["node_modules"]
22
- }