@vibe2founder/tests2dialects 0.1.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.
- package/CHANGELOG.md +73 -0
- package/bun.lock +22 -0
- package/bunfig.toml +2 -0
- package/critica.md +77 -0
- package/docs/4-ideias.md +66 -0
- package/docs/api-api.md +93 -0
- package/docs/api-imperativo.md +125 -0
- package/docs/api-matematico.md +145 -0
- package/docs/api-narrativo.md +181 -0
- package/docs/guia-rapido.md +189 -0
- package/docs/whitepaper.md +21 -0
- package/examples/imperative.spec.ts +58 -0
- package/examples/math.spec.ts +52 -0
- package/examples/narrative.spec.ts +61 -0
- package/examples/polyglot-shopping-cart.spec.ts +212 -0
- package/examples/sanity.spec.ts +54 -0
- package/examples/showcase-api.spec.ts +70 -0
- package/examples/test-api.ts +36 -0
- package/infograficos/detalhado.png +0 -0
- package/infograficos/mobile.png +0 -0
- package/infograficos/normal.png +0 -0
- package/landing-page/README.md +38 -0
- package/landing-page/bun.lock +609 -0
- package/landing-page/eslint.config.js +23 -0
- package/landing-page/index.html +17 -0
- package/landing-page/package-lock.json +2962 -0
- package/landing-page/package.json +34 -0
- package/landing-page/postcss.config.js +6 -0
- package/landing-page/public/vite.svg +1 -0
- package/landing-page/src/App.tsx +358 -0
- package/landing-page/src/assets/react.svg +1 -0
- package/landing-page/src/index.css +34 -0
- package/landing-page/src/main.tsx +10 -0
- package/landing-page/tailwind.config.js +59 -0
- package/landing-page/tsconfig.app.json +28 -0
- package/landing-page/tsconfig.json +7 -0
- package/landing-page/tsconfig.node.json +26 -0
- package/landing-page/vite.config.ts +7 -0
- package/logo.png +0 -0
- package/output.log +60 -0
- package/package.json +36 -0
- package/packages/api-test-dialect/README.md +30 -0
- package/packages/api-test-dialect/index.ts +132 -0
- package/packages/api-test-dialect/openapi.json +64 -0
- package/packages/reqify/README.md +33 -0
- package/packages/reqify/index.ts +48 -0
- package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.json +0 -0
- package/podcast/O_Matem/303/241tico,_o_Narrador_e_o_Engenheiro.md +0 -0
- package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
- package/podcast/critica-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
- package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o_(7_words__covers_t.md +1 -0
- package/podcast/critica-Unificar_filosofia_e_pr/303/241tica_na_documenta/303/247/303/243o__7_words__covers_t.ogg +0 -0
- package/podcast/critica2-Sil/303/252ncio_estrat/303/251gico_e_sobrecarga_em_READMEs.ogg +0 -0
- package/podcast/critica2.json +3191 -0
- package/podcast/critica2.md +1 -0
- package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.json +0 -0
- package/podcast/debate-Dialetos_de_teste__inova/303/247/303/243o_ou_fragmenta/303/247/303/243o_.md +0 -0
- package/readme.md +58 -0
- package/reports/01-01-2026_00-45.md +40 -0
- package/reports/01-01-2026_02-30.md +37 -0
- package/reports/03-02-2026_10-55.md +8 -0
- package/reports/03-02-2026_11-45.md +13 -0
- package/reports/03-02-2026_11-50.md +10 -0
- package/reports/26-01-2026_16-25.md +31 -0
- package/reports/26-01-2026_19-20.md +27 -0
- package/reports/31-12-2025_22-35.md +25 -0
- package/reports/31-12-2025_22-45.md +15 -0
- package/slides/Dialetos_de_Teste_Um_Executor_M/303/272ltiplos_Vocabul/303/241rios.pdf +0 -0
- package/src/cli.ts +445 -0
- package/src/index.ts +539 -0
- package/tabela.html +350 -0
- package/tsconfig.json +22 -0
- package/types/api-types.ts +11 -0
- package/www/index.html +1344 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "landing-page",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc -b && vite build",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"preview": "vite preview"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"framer-motion": "^12.29.2",
|
|
14
|
+
"react": "^19.2.0",
|
|
15
|
+
"react-dom": "^19.2.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@eslint/js": "^9.39.1",
|
|
19
|
+
"@types/node": "^24.10.1",
|
|
20
|
+
"@types/react": "^19.2.5",
|
|
21
|
+
"@types/react-dom": "^19.2.3",
|
|
22
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
23
|
+
"autoprefixer": "^10.4.24",
|
|
24
|
+
"eslint": "^9.39.1",
|
|
25
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
26
|
+
"eslint-plugin-react-refresh": "^0.4.24",
|
|
27
|
+
"globals": "^16.5.0",
|
|
28
|
+
"postcss": "^8.5.6",
|
|
29
|
+
"tailwindcss": "3.4.15",
|
|
30
|
+
"typescript": "~5.9.3",
|
|
31
|
+
"typescript-eslint": "^8.46.4",
|
|
32
|
+
"vite": "^7.2.4"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { motion, AnimatePresence } from 'framer-motion';
|
|
3
|
+
import {
|
|
4
|
+
ShieldCheck,
|
|
5
|
+
BookOpen,
|
|
6
|
+
Calculator,
|
|
7
|
+
Send,
|
|
8
|
+
Zap,
|
|
9
|
+
CheckCircle2,
|
|
10
|
+
ArrowRight,
|
|
11
|
+
Terminal,
|
|
12
|
+
Code2,
|
|
13
|
+
FileCode2,
|
|
14
|
+
Cpu
|
|
15
|
+
} from 'lucide-react';
|
|
16
|
+
|
|
17
|
+
const DialectCard = ({ icon: Icon, title, description, colorClass, active, onClick }: any) => (
|
|
18
|
+
<motion.div
|
|
19
|
+
whileHover={{ scale: 1.02 }}
|
|
20
|
+
whileTap={{ scale: 0.98 }}
|
|
21
|
+
onClick={onClick}
|
|
22
|
+
className={`p-6 cursor-pointer glass-card border-2 transition-all duration-300 ${
|
|
23
|
+
active ? colorClass : 'border-white/5 opacity-60 hover:opacity-100'
|
|
24
|
+
}`}
|
|
25
|
+
>
|
|
26
|
+
<div className="flex items-center gap-4 mb-3">
|
|
27
|
+
<div className={`p-2 rounded-lg ${active ? 'bg-white/10' : ''}`}>
|
|
28
|
+
<Icon className={`w-6 h-6 ${active ? 'text-inherit' : 'text-white/40'}`} />
|
|
29
|
+
</div>
|
|
30
|
+
<h3 className="text-xl font-bold">{title}</h3>
|
|
31
|
+
</div>
|
|
32
|
+
<p className="text-sm text-white/60 leading-relaxed">{description}</p>
|
|
33
|
+
</motion.div>
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const CodeBlock = ({ code, language }: { code: string; language: string }) => (
|
|
37
|
+
<div className="relative group">
|
|
38
|
+
<div className="absolute -inset-1 bg-gradient-to-r from-math/20 to-apispec/20 rounded-xl blur opacity-25 group-hover:opacity-50 transition duration-1000"></div>
|
|
39
|
+
<div className="relative bg-black/40 border border-white/10 rounded-xl p-6 font-mono text-sm overflow-x-auto">
|
|
40
|
+
<div className="flex gap-2 mb-4 border-b border-white/5 pb-2">
|
|
41
|
+
<div className="w-3 h-3 rounded-full bg-red-500/50" />
|
|
42
|
+
<div className="w-3 h-3 rounded-full bg-yellow-500/50" />
|
|
43
|
+
<div className="w-3 h-3 rounded-full bg-green-500/50" />
|
|
44
|
+
<span className="ml-4 text-white/30 text-xs italic">{language}</span>
|
|
45
|
+
</div>
|
|
46
|
+
<pre className="text-white/80 leading-relaxed">{code}</pre>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
function App() {
|
|
52
|
+
const [activeDialect, setActiveDialect] = useState('math');
|
|
53
|
+
|
|
54
|
+
const dialects = [
|
|
55
|
+
{
|
|
56
|
+
id: 'math',
|
|
57
|
+
icon: Calculator,
|
|
58
|
+
title: 'Mathematical',
|
|
59
|
+
description: 'Perfect for algorithms, pure logic, and complex data processing. Prove your code, don\'t just test it.',
|
|
60
|
+
colorClass: 'border-math text-math-light',
|
|
61
|
+
keywords: ['axiom', 'proof', 'implies', 'postulate'],
|
|
62
|
+
code: `axiom("Number Theory", () => {
|
|
63
|
+
const fib = arbitrary();
|
|
64
|
+
fib.derive((n) => n <= 1 ? n : fib(n-1) + fib(n-2));
|
|
65
|
+
|
|
66
|
+
proof("Fibonacci(2) implies 1", () => {
|
|
67
|
+
implies(fib(2)).is(1);
|
|
68
|
+
});
|
|
69
|
+
});`
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: 'narrative',
|
|
73
|
+
icon: BookOpen,
|
|
74
|
+
title: 'Narrative',
|
|
75
|
+
description: 'Ideal for user journeys and business rules. Readable by PMs and stakeholders. Your tests are your documentation.',
|
|
76
|
+
colorClass: 'border-narrative text-narrative-light',
|
|
77
|
+
keywords: ['intend', 'scenario', 'to', 'story'],
|
|
78
|
+
code: `intend("User Checkout Journey", () => {
|
|
79
|
+
scenario("User without permission tries to access admin", () => {
|
|
80
|
+
to(response.status).be(403);
|
|
81
|
+
});
|
|
82
|
+
});`
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'imperative',
|
|
86
|
+
icon: ShieldCheck,
|
|
87
|
+
title: 'Imperative',
|
|
88
|
+
description: 'Best for API contracts and system compliance. Assertive language for strict requirements.',
|
|
89
|
+
colorClass: 'border-imperative text-imperative-light',
|
|
90
|
+
keywords: ['ensure', 'check', 'that', 'verify'],
|
|
91
|
+
code: `ensure("PCI-DSS v4 Compliance", () => {
|
|
92
|
+
verify("Sensitive data is never in plain text", () => {
|
|
93
|
+
that(payload).matches(/^encrypted:/);
|
|
94
|
+
});
|
|
95
|
+
});`
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: 'apispec',
|
|
99
|
+
icon: Send,
|
|
100
|
+
title: 'API Spec',
|
|
101
|
+
description: 'Declarative API testing. Validate contracts and schemas with fluid, readable syntax.',
|
|
102
|
+
colorClass: 'border-apispec text-apispec-light',
|
|
103
|
+
keywords: ['define', 'post', 'shouldReturn', 'matchingSchema'],
|
|
104
|
+
code: `await ApiSpec.define("Create User")
|
|
105
|
+
.from("https://api.example.com")
|
|
106
|
+
.post("/users", { name: "John" })
|
|
107
|
+
.shouldReturn(201)
|
|
108
|
+
.matchingSchema(userSchema)
|
|
109
|
+
.run();`
|
|
110
|
+
}
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
const currentDialect = dialects.find(d => d.id === activeDialect)!;
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<div className="min-h-screen">
|
|
117
|
+
{/* Hero Section */}
|
|
118
|
+
<header className="relative overflow-hidden pt-20 pb-32 px-4">
|
|
119
|
+
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-full h-full -z-10">
|
|
120
|
+
<div className="absolute top-0 left-1/4 w-[500px] h-[500px] bg-math/10 rounded-full blur-[120px]" />
|
|
121
|
+
<div className="absolute bottom-0 right-1/4 w-[500px] h-[500px] bg-apispec/10 rounded-full blur-[120px]" />
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div className="max-w-6xl mx-auto text-center">
|
|
125
|
+
<motion.div
|
|
126
|
+
initial={{ opacity: 0, y: 20 }}
|
|
127
|
+
animate={{ opacity: 1, y: 0 }}
|
|
128
|
+
transition={{ duration: 0.6 }}
|
|
129
|
+
>
|
|
130
|
+
<span className="inline-flex items-center px-4 py-1.5 rounded-full text-sm font-medium bg-white/5 border border-white/10 text-white/70 mb-8">
|
|
131
|
+
<Zap className="w-4 h-4 mr-2 text-amber-400" />
|
|
132
|
+
The Future of Polyglot Testing
|
|
133
|
+
</span>
|
|
134
|
+
<h1 className="text-6xl md:text-8xl font-black mb-8 leading-[1.1] tracking-tight">
|
|
135
|
+
One Proof <span className="gradient-text">4 All.</span>
|
|
136
|
+
</h1>
|
|
137
|
+
<p className="text-xl md:text-2xl text-white/60 max-w-3xl mx-auto mb-12 font-light leading-relaxed">
|
|
138
|
+
One Runner to Rule Them All. Decouple your execution logic from
|
|
139
|
+
semantics. Speak the language of the problem you are solving.
|
|
140
|
+
</p>
|
|
141
|
+
<div className="flex flex-col sm:flex-row justify-center gap-4">
|
|
142
|
+
<button className="px-8 py-4 bg-white text-black font-bold rounded-full hover:bg-white/90 transition-all flex items-center justify-center gap-2 group">
|
|
143
|
+
Get Started{" "}
|
|
144
|
+
<ArrowRight className="w-5 h-5 group-hover:translate-x-1 transition-transform" />
|
|
145
|
+
</button>
|
|
146
|
+
<button className="px-8 py-4 bg-white/5 border border-white/10 text-white font-bold rounded-full hover:bg-white/10 transition-all">
|
|
147
|
+
View Documentation
|
|
148
|
+
</button>
|
|
149
|
+
</div>
|
|
150
|
+
</motion.div>
|
|
151
|
+
</div>
|
|
152
|
+
</header>
|
|
153
|
+
|
|
154
|
+
{/* Philosophy Section */}
|
|
155
|
+
<section className="py-24 px-4 bg-white/5 border-y border-white/10">
|
|
156
|
+
<div className="max-w-6xl mx-auto">
|
|
157
|
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16 items-center">
|
|
158
|
+
<div>
|
|
159
|
+
<h2 className="text-4xl font-bold mb-6">
|
|
160
|
+
Zero Risk. <span className="text-white/40">Total Freedom.</span>
|
|
161
|
+
</h2>
|
|
162
|
+
<p className="text-lg text-white/60 mb-10 leading-relaxed">
|
|
163
|
+
Your legacy Jest code remains untouched. <b>one-spec-4-all</b>{" "}
|
|
164
|
+
is an additive framework. Keep your existing tests and start
|
|
165
|
+
adding new ones using the dialect that fits best.
|
|
166
|
+
</p>
|
|
167
|
+
|
|
168
|
+
<div className="space-y-6">
|
|
169
|
+
{[
|
|
170
|
+
{ icon: CheckCircle2, text: "Runs natively alongside Jest" },
|
|
171
|
+
{
|
|
172
|
+
icon: CheckCircle2,
|
|
173
|
+
text: "No rewrite required for existing tests",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
icon: CheckCircle2,
|
|
177
|
+
text: "Unify your whole team's testing language",
|
|
178
|
+
},
|
|
179
|
+
].map((item, i) => (
|
|
180
|
+
<motion.div
|
|
181
|
+
initial={{ opacity: 0, x: -20 }}
|
|
182
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
183
|
+
transition={{ delay: i * 0.1 }}
|
|
184
|
+
key={i}
|
|
185
|
+
className="flex items-center gap-3 text-white/80"
|
|
186
|
+
>
|
|
187
|
+
<item.icon className="w-5 h-5 text-narrative" />
|
|
188
|
+
<span>{item.text}</span>
|
|
189
|
+
</motion.div>
|
|
190
|
+
))}
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
<div className="bg-black/60 p-8 rounded-3xl border border-white/10 shadow-2xl relative overflow-hidden group">
|
|
195
|
+
<div className="absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity">
|
|
196
|
+
<ShieldCheck className="w-32 h-32" />
|
|
197
|
+
</div>
|
|
198
|
+
<h3 className="text-2xl font-bold mb-4 flex items-center gap-2">
|
|
199
|
+
<Terminal className="w-6 h-6 text-math" />
|
|
200
|
+
Polyglot Runner
|
|
201
|
+
</h3>
|
|
202
|
+
<p className="text-white/40 mb-6 font-mono text-sm">
|
|
203
|
+
// coexist in the same file
|
|
204
|
+
</p>
|
|
205
|
+
<div className="space-y-4 opacity-80 scale-95 group-hover:scale-100 transition-transform duration-500">
|
|
206
|
+
<div className="p-4 bg-white/5 rounded-xl border-l-4 border-white/20 text-xs font-mono">
|
|
207
|
+
<span className="text-white/40">// Standard Jest</span>
|
|
208
|
+
<div className="mt-1">
|
|
209
|
+
<span className="text-purple-400">describe</span>(
|
|
210
|
+
<span className="text-amber-200">"Legacy Login"</span>, ()
|
|
211
|
+
=> {" { ... } "})
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<div className="p-4 bg-white/5 rounded-xl border-l-4 border-narrative text-xs font-mono">
|
|
215
|
+
<span className="text-narrative/60">// One Proof 4 All</span>
|
|
216
|
+
<div className="mt-1">
|
|
217
|
+
<span className="text-narrative-light">intend</span>(
|
|
218
|
+
<span className="text-amber-200">"New Auth Flow"</span>, ()
|
|
219
|
+
=> {" { ... } "})
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</section>
|
|
227
|
+
|
|
228
|
+
{/* Dialects Section */}
|
|
229
|
+
<section className="py-32 px-4 max-w-7xl mx-auto">
|
|
230
|
+
<div className="text-center mb-20">
|
|
231
|
+
<h2 className="text-5xl font-bold mb-6">
|
|
232
|
+
Choose Your <span className="gradient-text">Dialect.</span>
|
|
233
|
+
</h2>
|
|
234
|
+
<p className="text-white/50 text-xl max-w-2xl mx-auto leading-relaxed">
|
|
235
|
+
Don't learn everything. Just pick what fits your domain and ignore
|
|
236
|
+
the rest.
|
|
237
|
+
</p>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-16">
|
|
241
|
+
{dialects.map((d) => (
|
|
242
|
+
<DialectCard
|
|
243
|
+
key={d.id}
|
|
244
|
+
{...d}
|
|
245
|
+
active={activeDialect === d.id}
|
|
246
|
+
onClick={() => setActiveDialect(d.id)}
|
|
247
|
+
/>
|
|
248
|
+
))}
|
|
249
|
+
</div>
|
|
250
|
+
|
|
251
|
+
<AnimatePresence mode="wait">
|
|
252
|
+
<motion.div
|
|
253
|
+
key={activeDialect}
|
|
254
|
+
initial={{ opacity: 0, y: 10 }}
|
|
255
|
+
animate={{ opacity: 1, y: 0 }}
|
|
256
|
+
exit={{ opacity: 0, y: -10 }}
|
|
257
|
+
className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center"
|
|
258
|
+
>
|
|
259
|
+
<div className="glass-card p-12 border-white/10">
|
|
260
|
+
<div className="flex items-center gap-4 mb-6 text-2xl font-bold">
|
|
261
|
+
<currentDialect.icon
|
|
262
|
+
className={`w-8 h-8 ${currentDialect.colorClass.split(" ")[1]}`}
|
|
263
|
+
/>
|
|
264
|
+
{currentDialect.title} Dialect
|
|
265
|
+
</div>
|
|
266
|
+
<p className="text-white/70 text-lg mb-8 leading-relaxed">
|
|
267
|
+
{currentDialect.description}
|
|
268
|
+
</p>
|
|
269
|
+
<div className="flex flex-wrap gap-2">
|
|
270
|
+
{currentDialect.keywords.map((kw) => (
|
|
271
|
+
<span
|
|
272
|
+
key={kw}
|
|
273
|
+
className="px-3 py-1 rounded-md bg-white/5 text-white/50 font-mono text-xs"
|
|
274
|
+
>
|
|
275
|
+
{kw}
|
|
276
|
+
</span>
|
|
277
|
+
))}
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
<CodeBlock code={currentDialect.code} language="typescript" />
|
|
281
|
+
</motion.div>
|
|
282
|
+
</AnimatePresence>
|
|
283
|
+
</section>
|
|
284
|
+
|
|
285
|
+
{/* Why Section */}
|
|
286
|
+
<section className="py-32 px-4 border-t border-white/10">
|
|
287
|
+
<div className="max-w-6xl mx-auto">
|
|
288
|
+
<div className="text-center mb-20">
|
|
289
|
+
<h2 className="text-4xl font-bold mb-4">Engineered for Teams</h2>
|
|
290
|
+
<p className="text-white/40">
|
|
291
|
+
Bridging the gap between engineering, product, and science.
|
|
292
|
+
</p>
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
|
296
|
+
{[
|
|
297
|
+
{
|
|
298
|
+
icon: Cpu,
|
|
299
|
+
title: "Data Scientists",
|
|
300
|
+
desc: "Use mathematical proofs for algorithms without wrestling with UI-focused testing frameworks.",
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
icon: FileCode2,
|
|
304
|
+
title: "Architects",
|
|
305
|
+
desc: "Enforce API contracts and strict compliance with imperative dialects that mean business.",
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
icon: Code2,
|
|
309
|
+
title: "PMs & QAs",
|
|
310
|
+
desc: "Narrative specs that read like English. Verification becomes a collaborative process.",
|
|
311
|
+
},
|
|
312
|
+
].map((feature, i) => (
|
|
313
|
+
<div key={i} className="p-8 glass-card">
|
|
314
|
+
<feature.icon className="w-10 h-10 mb-6 text-white/80" />
|
|
315
|
+
<h3 className="text-xl font-bold mb-3">{feature.title}</h3>
|
|
316
|
+
<p className="text-white/50 text-sm leading-relaxed">
|
|
317
|
+
{feature.desc}
|
|
318
|
+
</p>
|
|
319
|
+
</div>
|
|
320
|
+
))}
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</section>
|
|
324
|
+
|
|
325
|
+
{/* Footer */}
|
|
326
|
+
<footer className="py-20 px-4 border-t border-white/10 text-center">
|
|
327
|
+
<h2 className="text-3xl font-black mb-8 italic">
|
|
328
|
+
One Proof <span className="gradient-text">4 All.</span>
|
|
329
|
+
</h2>
|
|
330
|
+
<p className="text-white/30 text-sm mb-8">
|
|
331
|
+
© 2026 vibe2founder Canonical. Built for the era of agentic coding.
|
|
332
|
+
</p>
|
|
333
|
+
<div className="flex justify-center gap-6">
|
|
334
|
+
<a
|
|
335
|
+
href="#"
|
|
336
|
+
className="text-white/50 hover:text-white transition-colors"
|
|
337
|
+
>
|
|
338
|
+
GitHub
|
|
339
|
+
</a>
|
|
340
|
+
<a
|
|
341
|
+
href="#"
|
|
342
|
+
className="text-white/50 hover:text-white transition-colors"
|
|
343
|
+
>
|
|
344
|
+
Documentation
|
|
345
|
+
</a>
|
|
346
|
+
<a
|
|
347
|
+
href="#"
|
|
348
|
+
className="text-white/50 hover:text-white transition-colors"
|
|
349
|
+
>
|
|
350
|
+
Changelog
|
|
351
|
+
</a>
|
|
352
|
+
</div>
|
|
353
|
+
</footer>
|
|
354
|
+
</div>
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export default App;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
body {
|
|
7
|
+
@apply bg-background text-foreground antialiased;
|
|
8
|
+
font-feature-settings: "ss01", "ss02", "cv01", "cv02";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.glass-card {
|
|
13
|
+
@apply bg-white/5 backdrop-blur-lg border border-white/10 rounded-2xl;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.gradient-text {
|
|
17
|
+
@apply bg-clip-text text-transparent bg-gradient-to-r from-math-light via-narrative-light to-imperative-light;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.dialect-card-math {
|
|
21
|
+
@apply border-math/30 hover:border-math transition-all duration-300;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.dialect-card-narrative {
|
|
25
|
+
@apply border-narrative/30 hover:border-narrative transition-all duration-300;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.dialect-card-imperative {
|
|
29
|
+
@apply border-imperative/30 hover:border-imperative transition-all duration-300;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.dialect-card-apispec {
|
|
33
|
+
@apply border-apispec/30 hover:border-apispec transition-all duration-300;
|
|
34
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
export default {
|
|
3
|
+
content: [
|
|
4
|
+
"./index.html",
|
|
5
|
+
"./src/**/*.{js,ts,jsx,tsx}",
|
|
6
|
+
],
|
|
7
|
+
theme: {
|
|
8
|
+
extend: {
|
|
9
|
+
colors: {
|
|
10
|
+
background: "#0a0a0a",
|
|
11
|
+
foreground: "#ededed",
|
|
12
|
+
math: {
|
|
13
|
+
light: "#818cf8",
|
|
14
|
+
DEFAULT: "#6366f1",
|
|
15
|
+
dark: "#4f46e5",
|
|
16
|
+
},
|
|
17
|
+
narrative: {
|
|
18
|
+
light: "#34d399",
|
|
19
|
+
DEFAULT: "#10b981",
|
|
20
|
+
dark: "#059669",
|
|
21
|
+
},
|
|
22
|
+
imperative: {
|
|
23
|
+
light: "#fbbf24",
|
|
24
|
+
DEFAULT: "#f59e0b",
|
|
25
|
+
dark: "#d97706",
|
|
26
|
+
},
|
|
27
|
+
apispec: {
|
|
28
|
+
light: "#fb7185",
|
|
29
|
+
DEFAULT: "#f43f5e",
|
|
30
|
+
dark: "#e11d48",
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
fontFamily: {
|
|
34
|
+
sans: ["Inter", "sans-serif"],
|
|
35
|
+
mono: ["JetBrains Mono", "monospace"],
|
|
36
|
+
},
|
|
37
|
+
animation: {
|
|
38
|
+
'fade-in': 'fadeIn 0.5s ease-out',
|
|
39
|
+
'slide-up': 'slideUp 0.6s ease-out',
|
|
40
|
+
'glow': 'glow 2s infinite alternate',
|
|
41
|
+
},
|
|
42
|
+
keyframes: {
|
|
43
|
+
fadeIn: {
|
|
44
|
+
'0%': { opacity: '0' },
|
|
45
|
+
'100%': { opacity: '1' },
|
|
46
|
+
},
|
|
47
|
+
slideUp: {
|
|
48
|
+
'0%': { transform: 'translateY(20px)', opacity: '0' },
|
|
49
|
+
'100%': { transform: 'translateY(0)', opacity: '1' },
|
|
50
|
+
},
|
|
51
|
+
glow: {
|
|
52
|
+
'0%': { boxShadow: '0 0 5px rgba(99, 102, 241, 0.2)' },
|
|
53
|
+
'100%': { boxShadow: '0 0 20px rgba(99, 102, 241, 0.6)' },
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
plugins: [],
|
|
59
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"useDefineForClassFields": true,
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"module": "ESNext",
|
|
8
|
+
"types": ["vite/client"],
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
|
|
11
|
+
/* Bundler mode */
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"allowImportingTsExtensions": true,
|
|
14
|
+
"verbatimModuleSyntax": true,
|
|
15
|
+
"moduleDetection": "force",
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
"jsx": "react-jsx",
|
|
18
|
+
|
|
19
|
+
/* Linting */
|
|
20
|
+
"strict": true,
|
|
21
|
+
"noUnusedLocals": true,
|
|
22
|
+
"noUnusedParameters": true,
|
|
23
|
+
"erasableSyntaxOnly": true,
|
|
24
|
+
"noFallthroughCasesInSwitch": true,
|
|
25
|
+
"noUncheckedSideEffectImports": true
|
|
26
|
+
},
|
|
27
|
+
"include": ["src"]
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
4
|
+
"target": "ES2023",
|
|
5
|
+
"lib": ["ES2023"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"types": ["node"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": true,
|
|
13
|
+
"verbatimModuleSyntax": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"erasableSyntaxOnly": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["vite.config.ts"]
|
|
26
|
+
}
|
package/logo.png
ADDED
|
Binary file
|
package/output.log
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
|
|
2
|
+
[1m[35m tests2dialects [0m [2mv0.2.0[0m
|
|
3
|
+
|
|
4
|
+
[96mDEV[0m [2mScanning for [36m.spec.ts[0m files in [90m/mnt/d/www/Freelas/PROJETOS_OPENSOURCE/MEUS/@vibe2founder/canonical/one-spec-4-all/vibe2founder-one-spec-4-all[0m[0m
|
|
5
|
+
|
|
6
|
+
[2mFound[0m [1m5[0m [2mtest files[0m
|
|
7
|
+
|
|
8
|
+
[90m ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ[0m
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
[K [1m[32mÔ£ô[0m [90mexamples/[0m[36mimperative.spec.ts[0m [1m[32m4 passed[0m [90m(7ms)[0m
|
|
12
|
+
[1m[32mÔ£ô[0m [2mSistema de Seguran├ºa e Compliance ÔÇ║ Deve bloquear conex├Áes de IPs na blacklist[0m [90m7ms[0m
|
|
13
|
+
[1m[32mÔ£ô[0m [2mSistema de Seguran├ºa e Compliance ÔÇ║ Deve registrar auditoria para cada acesso[0m [90m8ms[0m
|
|
14
|
+
[1m[32mÔ£ô[0m [2mValida├º├úo Estrutural da API V2 ÔÇ║ Payload deve conter metadados corretos[0m [90m2ms[0m
|
|
15
|
+
[1m[32mÔ£ô[0m [2mValida├º├úo Estrutural da API V2 ÔÇ║ Campos obrigat├│rios devem existir[0m [90m2ms[0m
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
[K [1m[32mÔ£ô[0m [90mexamples/[0m[36mmath.spec.ts[0m [1m[32m4 passed[0m [90m(4ms)[0m
|
|
19
|
+
[1m[32mÔ£ô[0m [2mTeoria Financeira: Juros Compostos ÔÇ║ O capital deve crescer exponencialmente[0m [90m8ms[0m
|
|
20
|
+
[1m[32mÔ£ô[0m [2mTeoria Financeira: Juros Compostos ÔÇ║ Taxa zero implica em imutabilidade do capital[0m [90m6ms[0m
|
|
21
|
+
[1m[32mÔ£ô[0m [2m├ülgebra Booleana: Leis de De Morgan ÔÇ║ A nega├º├úo da disjun├º├úo ├® a conjun├º├úo das nega├º├Áes[0m [90m10ms[0m
|
|
22
|
+
[1m[32mÔ£ô[0m [2mAn├ílise de Fun├º├Áes Recursivas ÔÇ║ Fatorial de 5 converge para 120[0m [90m1ms[0m
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
[K [1m[32mÔ£ô[0m [90mexamples/[0m[36mnarrative.spec.ts[0m [1m[32m3 passed[0m [90m(4ms)[0m
|
|
26
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ O cliente finaliza a compra com sucesso[0m [90m1ms[0m
|
|
27
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ O sistema deve lidar com falha no pagamento[0m [90m5ms[0m
|
|
28
|
+
[1m[32mÔ£ô[0m [2mOnboarding de Novos Membros ÔÇ║ Deve criar perfil padr├úo ao registrar[0m [90m2ms[0m
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
[K [1m[32mÔ£ô[0m [90mexamples/[0m[36mpolyglot-shopping-cart.spec.ts[0m [1m[32m14 passed[0m [90m(5ms)[0m
|
|
32
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Desconto de 10% em R$100 implica R$90[0m [90m6ms[0m
|
|
33
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Desconto de 0% preserva o valor original[0m [90m8ms[0m
|
|
34
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Desconto de 100% anula o pre├ºo[0m [90m3ms[0m
|
|
35
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Total de carrinho vazio converge para zero[0m [90m2ms[0m
|
|
36
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Total de 3 itens a R$10 cada (qty=2) implica R$60[0m [90m9ms[0m
|
|
37
|
+
[1m[32mÔ£ô[0m [2mTeoria de C├ílculo de Pre├ºos ÔÇ║ Imposto de 10% sobre R$100 resulta em R$110[0m [90m4ms[0m
|
|
38
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ Usu├írio adiciona primeiro produto ao carrinho[0m [90m7ms[0m
|
|
39
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ Usu├írio aplica cupom de desconto[0m [90m3ms[0m
|
|
40
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ Usu├írio remove item e carrinho fica vazio[0m [90m8ms[0m
|
|
41
|
+
[1m[32mÔ£ô[0m [2mJornada de Compra do Usu├írio ÔÇ║ Usu├írio n├úo logado tenta finalizar compra[0m [90m9ms[0m
|
|
42
|
+
[1m[32mÔ£ô[0m [2mConformidade com Gateway de Pagamento v2.1 ÔÇ║ Transa├º├úo bem-sucedida retorna status 200[0m [90m1ms[0m
|
|
43
|
+
[1m[32mÔ£ô[0m [2mConformidade com Gateway de Pagamento v2.1 ÔÇ║ TransactionId segue padr├úo RFC do contrato[0m [90m5ms[0m
|
|
44
|
+
[1m[32mÔ£ô[0m [2mConformidade com Gateway de Pagamento v2.1 ÔÇ║ Toda transa├º├úo deve ser logada para auditoria[0m [90m8ms[0m
|
|
45
|
+
[1m[32mÔ£ô[0m [2mConformidade com Gateway de Pagamento v2.1 ÔÇ║ Gateway deve ser acionado exatamente uma vez por request[0m [90m4ms[0m
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
[K [1m[32mÔ£ô[0m [90mexamples/[0m[36msanity.spec.ts[0m [1m[32m3 passed[0m [90m(2ms)[0m
|
|
49
|
+
[1m[32mÔ£ô[0m [2mTeoria dos Conjuntos (Dialeto Matem├ítico) ÔÇ║ f deve mapear para 10[0m [90m1ms[0m
|
|
50
|
+
[1m[32mÔ£ô[0m [2mAutentica├º├úo de Usu├írio (Dialeto Narrativo) ÔÇ║ login bem sucedido[0m [90m6ms[0m
|
|
51
|
+
[1m[32mÔ£ô[0m [2mServi├ºo de Pagamento (Dialeto Imperativo) ÔÇ║ status da API ├® 200[0m [90m4ms[0m
|
|
52
|
+
|
|
53
|
+
[90m ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ ÔöÇ[0m
|
|
54
|
+
|
|
55
|
+
[1mTest Files[0m [1m[32m5 passed[0m [2m(5)[0m
|
|
56
|
+
[1m Tests[0m [1m[32m28 passed[0m [2m(28)[0m
|
|
57
|
+
[1m Duration[0m 22ms
|
|
58
|
+
|
|
59
|
+
[42m[1m[30m PASS [0m [1m[32mAll tests passed![0m
|
|
60
|
+
|