@codexsploitx/schemaapi 1.0.2 → 1.0.4
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/bin/schemaapi +27 -0
- package/package.json +1 -1
- package/readme.md +115 -0
- package/build.md +0 -246
- package/estructure.md +0 -55
- package/libreria.md +0 -319
- package/resumen.md +0 -188
package/bin/schemaapi
CHANGED
|
@@ -249,6 +249,33 @@ function handleInit(adapterArg) {
|
|
|
249
249
|
fs.writeFileSync(indexPath, 'export * from "./usersContract";\n');
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
+
if (adapter === "next") {
|
|
253
|
+
const appApiUsersDir = path.join(cwd, "app", "api", "users");
|
|
254
|
+
if (!fs.existsSync(appApiUsersDir)) {
|
|
255
|
+
fs.mkdirSync(appApiUsersDir, { recursive: true });
|
|
256
|
+
}
|
|
257
|
+
const routePath = path.join(appApiUsersDir, "route.ts");
|
|
258
|
+
if (!fs.existsSync(routePath)) {
|
|
259
|
+
const nextRouteContent = [
|
|
260
|
+
'import { adapters } from "schemaapi";',
|
|
261
|
+
'import { usersContract } from "../../../contracts";',
|
|
262
|
+
"",
|
|
263
|
+
"const handlers = adapters.next.handleContract(usersContract, {",
|
|
264
|
+
' "GET /users/:id": async ({ params }) => {',
|
|
265
|
+
" return {",
|
|
266
|
+
" id: String(params && params.id),",
|
|
267
|
+
' name: "John Doe",',
|
|
268
|
+
" };",
|
|
269
|
+
" },",
|
|
270
|
+
"});",
|
|
271
|
+
"",
|
|
272
|
+
"export const GET = handlers.GET;",
|
|
273
|
+
"",
|
|
274
|
+
].join("\n");
|
|
275
|
+
fs.writeFileSync(routePath, nextRouteContent);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
252
279
|
const configPath = path.join(cwd, "schemaapi.config.json");
|
|
253
280
|
let existingConfig = null;
|
|
254
281
|
if (fs.existsSync(configPath)) {
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
|
|
46
46
|
## 📦 Installation
|
|
47
47
|
|
|
48
|
+
### Core package
|
|
49
|
+
|
|
48
50
|
```bash
|
|
49
51
|
# npm
|
|
50
52
|
npm install schemaapi zod
|
|
@@ -56,6 +58,119 @@ pnpm add schemaapi zod
|
|
|
56
58
|
yarn add schemaapi zod
|
|
57
59
|
```
|
|
58
60
|
|
|
61
|
+
### Per-adapter setup
|
|
62
|
+
|
|
63
|
+
Below are the recommended commands for **new projects** and for **existing projects**.
|
|
64
|
+
|
|
65
|
+
#### Express
|
|
66
|
+
|
|
67
|
+
- 🆕 **New project**
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
mkdir my-express-api && cd my-express-api
|
|
71
|
+
npm init -y
|
|
72
|
+
npm install express schemaapi zod
|
|
73
|
+
npx schemaapi init express
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- ♻️ **Existing Express project**
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm install schemaapi zod
|
|
80
|
+
npx schemaapi init express
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### Next.js
|
|
84
|
+
|
|
85
|
+
- 🆕 **New project**
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npx create-next-app@latest my-next-api --ts
|
|
89
|
+
cd my-next-api
|
|
90
|
+
npm install schemaapi zod
|
|
91
|
+
npx schemaapi init next
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- ♻️ **Existing Next.js project**
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install schemaapi zod
|
|
98
|
+
npx schemaapi init next
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
El comando `schemaapi init next` creará automáticamente:
|
|
102
|
+
|
|
103
|
+
- Carpeta `contracts/` con un contrato de ejemplo `usersContract.ts`.
|
|
104
|
+
- `contracts/index.ts` exportando los contratos.
|
|
105
|
+
- `schemaapi.config.json` apuntando a `contracts/`.
|
|
106
|
+
- Un handler de ejemplo compatible con **App Router** en `app/api/users/route.ts`.
|
|
107
|
+
|
|
108
|
+
#### Fastify
|
|
109
|
+
|
|
110
|
+
- 🆕 **New project**
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
mkdir my-fastify-api && cd my-fastify-api
|
|
114
|
+
npm init -y
|
|
115
|
+
npm install fastify schemaapi zod
|
|
116
|
+
npx schemaapi init fastify
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- ♻️ **Existing Fastify project**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npm install schemaapi zod
|
|
123
|
+
npx schemaapi init fastify
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### Remix
|
|
127
|
+
|
|
128
|
+
- 🆕 **New project**
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npx create-remix@latest
|
|
132
|
+
npm install schemaapi zod
|
|
133
|
+
npx schemaapi init remix
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
- ♻️ **Existing Remix project**
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
npm install schemaapi zod
|
|
140
|
+
npx schemaapi init remix
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### NestJS
|
|
144
|
+
|
|
145
|
+
- 🆕 **New project**
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npm i -g @nestjs/cli
|
|
149
|
+
nest new my-nest-api
|
|
150
|
+
cd my-nest-api
|
|
151
|
+
npm install schemaapi zod
|
|
152
|
+
npx schemaapi init nest
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- ♻️ **Existing NestJS project**
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
npm install schemaapi zod
|
|
159
|
+
npx schemaapi init nest
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### Deno
|
|
163
|
+
|
|
164
|
+
- 🆕 / ♻️ **Deno projects**
|
|
165
|
+
|
|
166
|
+
En Deno no se usa npm para el runtime, pero puedes usar SchemaApi en tu
|
|
167
|
+
tooling o en proyectos que usen `deno2node`. Para Node+Deno híbrido:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
npm install schemaapi zod
|
|
171
|
+
npx schemaapi init deno
|
|
172
|
+
```
|
|
173
|
+
|
|
59
174
|
---
|
|
60
175
|
|
|
61
176
|
## 🛠 Usage
|
package/build.md
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
# Guía de build y publicación de SchemaApi
|
|
2
|
-
|
|
3
|
-
Este documento resume los pasos para:
|
|
4
|
-
|
|
5
|
-
- Preparar el paquete para producción
|
|
6
|
-
- Generar el build
|
|
7
|
-
- Verificar que todo está OK
|
|
8
|
-
- Publicar en registries tipo **npm** (y usarlo desde **npm**, **pnpm**, **yarn**, etc.)
|
|
9
|
-
|
|
10
|
-
> Nota: Los ejemplos asumen que estás en la raíz del repo:
|
|
11
|
-
> `/Users/admin/Desktop/DEV/SchemaApi`
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## 1. Requisitos previos
|
|
16
|
-
|
|
17
|
-
- Node.js `>= 18` (ya está definido en `package.json` → `engines.node`).
|
|
18
|
-
- Tener una cuenta en el registry donde quieras publicar (por defecto `https://registry.npmjs.org/`).
|
|
19
|
-
- Tener configurado tu cliente:
|
|
20
|
-
- Para **npm**:
|
|
21
|
-
```bash
|
|
22
|
-
npm login
|
|
23
|
-
```
|
|
24
|
-
- Para **pnpm**:
|
|
25
|
-
```bash
|
|
26
|
-
pnpm login
|
|
27
|
-
```
|
|
28
|
-
- Para **yarn**:
|
|
29
|
-
```bash
|
|
30
|
-
yarn npm login
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Todos ellos acaban hablando con el mismo registry (npmjs) salvo que configures otro.
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 2. Revisar `package.json`
|
|
38
|
-
|
|
39
|
-
Puntos importantes del `package.json` actual:
|
|
40
|
-
|
|
41
|
-
- `name`: pon aquí el nombre definitivo del paquete en npm.
|
|
42
|
-
- Ejemplo: `"name": "schemaapi"` o `"name": "@tu-org/schemaapi"`.
|
|
43
|
-
- Entradas de build ya configuradas:
|
|
44
|
-
- `"main": "dist/schemaapi.cjs.js"` (CommonJS)
|
|
45
|
-
- `"module": "dist/schemaapi.esm.js"` (ESM)
|
|
46
|
-
- `"browser": "dist/schemaapi.umd.js"` (bundle UMD)
|
|
47
|
-
- `"types": "dist/index.d.ts"` (tipos TypeScript)
|
|
48
|
-
- `"bin": { "schemaapi": "bin/schemaapi" }` (CLI global)
|
|
49
|
-
- Scripts:
|
|
50
|
-
- `"build": "rollup -c"`
|
|
51
|
-
- `"test": "vitest"`
|
|
52
|
-
- `"lint": "eslint ."`
|
|
53
|
-
|
|
54
|
-
Antes de publicar:
|
|
55
|
-
|
|
56
|
-
1. Asegúrate de que `name`, `version`, `description`, `repository`, `author` y `license` son los definitivos.
|
|
57
|
-
2. Si quieres controlar qué ficheros se publican, usa:
|
|
58
|
-
- Campo `"files"` en `package.json`, o
|
|
59
|
-
- Un `.npmignore`.
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 3. Pasos de build y verificación
|
|
64
|
-
|
|
65
|
-
Desde la raíz del proyecto:
|
|
66
|
-
|
|
67
|
-
1. Instalar dependencias (si no están ya):
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npm install
|
|
71
|
-
# o
|
|
72
|
-
pnpm install
|
|
73
|
-
# o
|
|
74
|
-
yarn install
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
2. Ejecutar los tests:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
npm test
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
3. Ejecutar el linter (opcional pero recomendado):
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
npm run lint
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
4. Generar el build:
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
npm run build
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Esto generará:
|
|
96
|
-
|
|
97
|
-
- `dist/schemaapi.cjs.js`
|
|
98
|
-
- `dist/schemaapi.esm.js`
|
|
99
|
-
- `dist/schemaapi.umd.js`
|
|
100
|
-
- `dist/index.d.ts`
|
|
101
|
-
- `dist/core/...` (tipos intermedios)
|
|
102
|
-
|
|
103
|
-
5. Validar que el CLI funciona con el build:
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
node bin/schemaapi
|
|
107
|
-
node bin/schemaapi generate docs
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
En un proyecto consumidor (fuera de este repo) podrás ejecutar:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
npx schemaapi generate docs
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## 4. Publicar en npm (registry por defecto)
|
|
119
|
-
|
|
120
|
-
### 4.1. Login
|
|
121
|
-
|
|
122
|
-
Si no lo has hecho ya:
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
npm login
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Introduce usuario, contraseña y email de tu cuenta de npm.
|
|
129
|
-
|
|
130
|
-
### 4.2. Subir la versión
|
|
131
|
-
|
|
132
|
-
1. Decide el número de versión siguiendo **semver**:
|
|
133
|
-
- `1.0.0` → versión inicial estable
|
|
134
|
-
- `1.0.1` → bugfix
|
|
135
|
-
- `1.1.0` → nuevas features que no rompen compatibilidad
|
|
136
|
-
- `2.0.0` → cambios rompientes
|
|
137
|
-
|
|
138
|
-
2. Actualiza la versión en `package.json` (puedes usar comandos de npm):
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# Ejemplos:
|
|
142
|
-
npm version patch # 1.0.0 -> 1.0.1
|
|
143
|
-
npm version minor # 1.0.0 -> 1.1.0
|
|
144
|
-
npm version major # 1.0.0 -> 2.0.0
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Esto actualiza `package.json` y crea un tag git (si el repo está bajo git).
|
|
148
|
-
|
|
149
|
-
3. Publicar:
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
npm publish
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
- Si usas un **scope** público (ej. `@tu-org/schemaapi`), asegúrate de tener `"publishConfig": { "access": "public" }` si es necesario.
|
|
156
|
-
- Si quieres una etiqueta distinta de `latest`, puedes usar:
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
npm publish --tag next
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## 5. Usar el paquete publicado con npm, pnpm, yarn
|
|
165
|
-
|
|
166
|
-
Una vez publicado en npm, podrás instalarlo desde cualquier cliente:
|
|
167
|
-
|
|
168
|
-
- Con **npm**:
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
npm install schemaapi
|
|
172
|
-
# o
|
|
173
|
-
npm install @tu-org/schemaapi
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
- Con **pnpm**:
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
pnpm add schemaapi
|
|
180
|
-
# o
|
|
181
|
-
pnpm add @tu-org/schemaapi
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
- Con **yarn**:
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
yarn add schemaapi
|
|
188
|
-
# o
|
|
189
|
-
yarn add @tu-org/schemaapi
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
El contenido publicado (dist, bin, types) será el mismo; solo cambia el cliente que lo descarga.
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## 6. Publicar en otros registries (GitHub Packages, privados, etc.)
|
|
197
|
-
|
|
198
|
-
El proceso es muy similar; cambia principalmente:
|
|
199
|
-
|
|
200
|
-
- El `registry` que configuramos.
|
|
201
|
-
- El nombre del paquete (por ejemplo, GitHub Packages suele usar `@OWNER/NAME`).
|
|
202
|
-
|
|
203
|
-
Ejemplo básico para **GitHub Packages**:
|
|
204
|
-
|
|
205
|
-
1. En tu `~/.npmrc` o `.npmrc` del proyecto:
|
|
206
|
-
|
|
207
|
-
```ini
|
|
208
|
-
@tu-org:registry=https://npm.pkg.github.com
|
|
209
|
-
//npm.pkg.github.com/:_authToken=GITHUB_PERSONAL_ACCESS_TOKEN
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
2. En `package.json`:
|
|
213
|
-
|
|
214
|
-
```json
|
|
215
|
-
{
|
|
216
|
-
"name": "@tu-org/schemaapi",
|
|
217
|
-
"publishConfig": {
|
|
218
|
-
"registry": "https://npm.pkg.github.com"
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
3. Mismo flujo:
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
npm run build
|
|
227
|
-
npm publish
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## 7. Checklist rápido antes de publicar
|
|
233
|
-
|
|
234
|
-
1. `npm test` pasa.
|
|
235
|
-
2. `npm run build` genera los artefactos en `dist/`.
|
|
236
|
-
3. `node bin/schemaapi` muestra la ayuda sin errores.
|
|
237
|
-
4. `node bin/schemaapi generate docs` funciona en un proyecto de prueba.
|
|
238
|
-
5. `package.json` tiene:
|
|
239
|
-
- `name` correcto (sin conflictos en el registry).
|
|
240
|
-
- `version` según semver.
|
|
241
|
-
- `main`, `module`, `browser`, `types`, `bin` apuntando a `dist/` y `bin/`.
|
|
242
|
-
- Datos de `repository`, `author`, `license` rellenados.
|
|
243
|
-
6. Has hecho `npm login` (o el login equivalente si usas otro registry).
|
|
244
|
-
|
|
245
|
-
Con esto deberías tener todo listo para subir la librería a npm y consumirla desde npm/pnpm/yarn como cualquier paquete profesional.
|
|
246
|
-
|
package/estructure.md
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
Estructura Recomendada
|
|
2
|
-
|
|
3
|
-
schemaapi/
|
|
4
|
-
├── src/
|
|
5
|
-
│ ├── core/
|
|
6
|
-
│ │ ├── contract.ts # createContract y definición de contratos
|
|
7
|
-
│ │ ├── validator.ts # Validación de requests/responses
|
|
8
|
-
│ │ ├── context.ts # Contexto de request (params, body, headers)
|
|
9
|
-
│ │ └── response-validator.ts # Validación de respuestas
|
|
10
|
-
│ ├── adapters/
|
|
11
|
-
│ │ ├── express.ts
|
|
12
|
-
│ │ ├── next.ts
|
|
13
|
-
│ │ ├── fastify.ts
|
|
14
|
-
│ │ └── hono.ts
|
|
15
|
-
│ ├── generators/
|
|
16
|
-
│ │ ├── docs.ts # Generación de documentación
|
|
17
|
-
│ │ ├── sdk.ts # Generación de SDK tipado
|
|
18
|
-
│ │ └── tests.ts # Generación de tests automáticos
|
|
19
|
-
│ └── cli/
|
|
20
|
-
│ ├── index.ts
|
|
21
|
-
│ └── commands/
|
|
22
|
-
├── types/
|
|
23
|
-
│ └── index.d.ts # Tipos globales para JS
|
|
24
|
-
├── docs/
|
|
25
|
-
│ ├── concepts.md
|
|
26
|
-
│ ├── validation.md
|
|
27
|
-
│ ├── cli.md
|
|
28
|
-
│ ├── sdk.md
|
|
29
|
-
│ └── versioning.md
|
|
30
|
-
├── examples/
|
|
31
|
-
│ ├── express-example.ts
|
|
32
|
-
│ ├── nextjs-example.ts
|
|
33
|
-
│ └── client-js.ts
|
|
34
|
-
├── package.json
|
|
35
|
-
├── tsconfig.json
|
|
36
|
-
├── README.md
|
|
37
|
-
└── LICENSE
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
🏗️ Estructura interna
|
|
41
|
-
|
|
42
|
-
core/ → lógica principal de contratos y validaciones
|
|
43
|
-
|
|
44
|
-
adapters/ → integración con frameworks
|
|
45
|
-
|
|
46
|
-
generators/ → docs, SDK y tests automáticos
|
|
47
|
-
|
|
48
|
-
cli/ → herramientas de línea de comandos
|
|
49
|
-
|
|
50
|
-
types/ → tipos para JS
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
|
package/libreria.md
DELETED
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
Plan para crear la librería schemaapi en npm
|
|
2
|
-
1️⃣ Stack y herramientas
|
|
3
|
-
|
|
4
|
-
Lenguaje: TypeScript (permite generar JS + tipado para usuarios TS)
|
|
5
|
-
|
|
6
|
-
Bundler: Rollup (para crear el bundle de npm, compatible con Node y Browser)
|
|
7
|
-
|
|
8
|
-
Target: Node.js y Browser (UMD + ESM)
|
|
9
|
-
|
|
10
|
-
Testing: Vitest o Jest
|
|
11
|
-
|
|
12
|
-
Lint / Formato: ESLint + Prettier
|
|
13
|
-
|
|
14
|
-
Publicación: npm
|
|
15
|
-
|
|
16
|
-
2️⃣ Estructura del proyecto
|
|
17
|
-
schemaapi/
|
|
18
|
-
├─ src/
|
|
19
|
-
│ ├─ index.ts # Entry point de la librería
|
|
20
|
-
│ ├─ contract.ts # createContract
|
|
21
|
-
│ ├─ sdk.ts # generateSDK
|
|
22
|
-
│ ├─ adapters/ # Adaptadores para Express, Next, Fastify...
|
|
23
|
-
│ │ ├─ express.ts
|
|
24
|
-
│ │ ├─ next.ts
|
|
25
|
-
│ │ └─ fastify.ts
|
|
26
|
-
│ └─ utils/ # Helpers internos
|
|
27
|
-
├─ package.json
|
|
28
|
-
├─ tsconfig.json
|
|
29
|
-
├─ rollup.config.ts
|
|
30
|
-
├─ README.md
|
|
31
|
-
└─ LICENSE
|
|
32
|
-
|
|
33
|
-
3️⃣ Funcionalidades que debe exponer la librería
|
|
34
|
-
// src/index.ts
|
|
35
|
-
export { createContract } from "./contract";
|
|
36
|
-
export { generateSDK } from "./sdk";
|
|
37
|
-
|
|
38
|
-
// Adapters (opcional)
|
|
39
|
-
export * as adapters from "./adapters";
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
createContract → define los endpoints y validaciones (params, query, body, headers, roles, response, errores)
|
|
43
|
-
|
|
44
|
-
generateSDK → genera un SDK tipado listo para usar
|
|
45
|
-
|
|
46
|
-
adapters → integración rápida con frameworks populares (Express, Next.js, Fastify, NestJS, etc.)
|
|
47
|
-
|
|
48
|
-
4️⃣ Ejemplo de uso después de publicar en npm
|
|
49
|
-
// Instalación
|
|
50
|
-
npm install schemaapi
|
|
51
|
-
|
|
52
|
-
// Definir contrato
|
|
53
|
-
import { createContract, generateSDK, adapters } from "schemaapi";
|
|
54
|
-
import { z } from "zod";
|
|
55
|
-
|
|
56
|
-
const userContract = createContract({
|
|
57
|
-
"/users/:id": {
|
|
58
|
-
GET: {
|
|
59
|
-
params: z.object({ id: z.string().uuid() }),
|
|
60
|
-
headers: z.object({ authorization: z.string() }),
|
|
61
|
-
roles: ["user", "admin"],
|
|
62
|
-
response: z.object({
|
|
63
|
-
id: z.string(),
|
|
64
|
-
username: z.string(),
|
|
65
|
-
email: z.string().email(),
|
|
66
|
-
}),
|
|
67
|
-
errors: {
|
|
68
|
-
401: "UNAUTHORIZED",
|
|
69
|
-
404: "USER_NOT_FOUND",
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// Generar SDK listo para usar
|
|
76
|
-
const schemaApiSdk = generateSDK(userContract, { baseUrl: "http://localhost:3000" });
|
|
77
|
-
|
|
78
|
-
// Usar en Express
|
|
79
|
-
import express from "express";
|
|
80
|
-
const app = express();
|
|
81
|
-
app.use(express.json());
|
|
82
|
-
adapters.express.handleContract(app, userContract);
|
|
83
|
-
app.listen(3000);
|
|
84
|
-
|
|
85
|
-
// Usar SDK
|
|
86
|
-
const user = await schemaApiSdk.getUser({ params: { id: "uuid-aqui" }, headers: { authorization: "Bearer TOKEN" } });
|
|
87
|
-
|
|
88
|
-
5️⃣ Configuración de Rollup
|
|
89
|
-
// rollup.config.ts
|
|
90
|
-
import typescript from "@rollup/plugin-typescript";
|
|
91
|
-
|
|
92
|
-
export default {
|
|
93
|
-
input: "src/index.ts",
|
|
94
|
-
output: [
|
|
95
|
-
{ file: "dist/schemaapi.cjs.js", format: "cjs" },
|
|
96
|
-
{ file: "dist/schemaapi.esm.js", format: "esm" },
|
|
97
|
-
],
|
|
98
|
-
plugins: [typescript({ tsconfig: "./tsconfig.json" })],
|
|
99
|
-
external: ["zod"], // No incluir dependencias externas
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
Esto permite que tu librería sea usable tanto en Node como en Browser
|
|
104
|
-
|
|
105
|
-
Usuarios solo hacen import { createContract } from "schemaapi" y listo
|
|
106
|
-
|
|
107
|
-
6️⃣ Publicación en npm
|
|
108
|
-
npm login
|
|
109
|
-
npm version patch
|
|
110
|
-
npm publish --access public
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
Cada cambio mayor: npm version major
|
|
114
|
-
|
|
115
|
-
Cada cambio menor: npm version minor
|
|
116
|
-
|
|
117
|
-
Cada bugfix: npm version patch
|
|
118
|
-
|
|
119
|
-
7️⃣ Bonus: integración lista para IDE + IA
|
|
120
|
-
|
|
121
|
-
Todos los métodos de SDK son tipados → autocompletado inmediato
|
|
122
|
-
|
|
123
|
-
Cada endpoint tiene params/query/body/headers tipados desde el contrato
|
|
124
|
-
|
|
125
|
-
Adaptadores permiten integración rápida en Express, Next.js, Fastify, NestJS, etc.
|
|
126
|
-
|
|
127
|
-
Validación de response y errores en tiempo de desarrollo
|
|
128
|
-
|
|
129
|
-
Si quieres, puedo hacer un prototipo completo de librería lista para publicar en npm, con:
|
|
130
|
-
|
|
131
|
-
createContract + validaciones completas
|
|
132
|
-
|
|
133
|
-
generateSDK tipado automáticamente
|
|
134
|
-
|
|
135
|
-
Adaptadores Express / Next / Fastify
|
|
136
|
-
|
|
137
|
-
Ejemplos de uso listos para instalar
|
|
138
|
-
|
|
139
|
-
Rollup + TS configurado para npm
|
|
140
|
-
|
|
141
|
-
Esto sería básicamente tu librería lista para usar en producción.
|
|
142
|
-
|
|
143
|
-
¿Quieres que haga eso ahora?
|
|
144
|
-
|
|
145
|
-
dame el .md para que mi ide trae ia lo haga con todos los adapatores y compatibilidad
|
|
146
|
-
|
|
147
|
-
¡Perfecto! 😎 Te voy a armar un README.md completo que tu IDE con IA pueda usar para autocompletar y generar todo: contratos, SDK, y adaptadores listos para todos los frameworks populares. Todo explicado paso a paso y con ejemplos.
|
|
148
|
-
|
|
149
|
-
# SchemaApi - Librería NPM: Contratos, SDK y Adaptadores
|
|
150
|
-
|
|
151
|
-
> Guía completa de uso de SchemaApi con todos los adaptadores y compatibilidad para frameworks populares.
|
|
152
|
-
> Diseñado para autocompletado y soporte de IDEs con IA.
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## 1️⃣ Instalación
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
npm install schemaapi zod
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
zod es la dependencia principal para la validación de schemas.
|
|
163
|
-
|
|
164
|
-
2️⃣ Importación principal
|
|
165
|
-
import { createContract, generateSDK, adapters } from "schemaapi";
|
|
166
|
-
import { z } from "zod";
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
createContract: define tus endpoints y validaciones
|
|
170
|
-
|
|
171
|
-
generateSDK: genera un SDK tipado listo para usar
|
|
172
|
-
|
|
173
|
-
adapters: integración rápida con frameworks populares
|
|
174
|
-
|
|
175
|
-
3️⃣ Crear un contrato de ejemplo
|
|
176
|
-
export const userContract = createContract({
|
|
177
|
-
"/users/:id": {
|
|
178
|
-
GET: {
|
|
179
|
-
params: z.object({ id: z.string().uuid() }),
|
|
180
|
-
query: z.object({ includePosts: z.boolean().optional() }),
|
|
181
|
-
headers: z.object({ authorization: z.string() }),
|
|
182
|
-
roles: ["user", "admin"],
|
|
183
|
-
response: z.object({
|
|
184
|
-
id: z.string(),
|
|
185
|
-
username: z.string(),
|
|
186
|
-
email: z.string().email(),
|
|
187
|
-
}),
|
|
188
|
-
errors: {
|
|
189
|
-
401: "UNAUTHORIZED",
|
|
190
|
-
404: "USER_NOT_FOUND",
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
PUT: {
|
|
194
|
-
params: z.object({ id: z.string().uuid() }),
|
|
195
|
-
body: z.object({ username: z.string().min(3) }),
|
|
196
|
-
roles: ["admin"],
|
|
197
|
-
response: z.object({ success: z.literal(true) }),
|
|
198
|
-
errors: {
|
|
199
|
-
401: "UNAUTHORIZED",
|
|
200
|
-
403: "FORBIDDEN",
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
4️⃣ Generar el SDK
|
|
207
|
-
export const schemaApiSdk = generateSDK(userContract, {
|
|
208
|
-
baseUrl: "http://localhost:3000",
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
Todos los endpoints del contrato se convierten en métodos tipados
|
|
213
|
-
|
|
214
|
-
Incluye validación automática de params, query, body, headers y response
|
|
215
|
-
|
|
216
|
-
Ejemplo de uso del SDK:
|
|
217
|
-
|
|
218
|
-
const user = await schemaApiSdk.getUser({
|
|
219
|
-
params: { id: "uuid-aqui" },
|
|
220
|
-
query: { includePosts: true },
|
|
221
|
-
headers: { authorization: "Bearer TOKEN" },
|
|
222
|
-
});
|
|
223
|
-
console.log(user.username);
|
|
224
|
-
|
|
225
|
-
5️⃣ Adaptadores para frameworks populares
|
|
226
|
-
5.1 Express
|
|
227
|
-
import express from "express";
|
|
228
|
-
const app = express();
|
|
229
|
-
app.use(express.json());
|
|
230
|
-
adapters.express.handleContract(app, userContract);
|
|
231
|
-
app.listen(3000);
|
|
232
|
-
|
|
233
|
-
5.2 Next.js API Routes
|
|
234
|
-
// pages/api/users/[id].ts
|
|
235
|
-
export default adapters.next.handleContract(userContract);
|
|
236
|
-
|
|
237
|
-
5.3 Fastify
|
|
238
|
-
import Fastify from "fastify";
|
|
239
|
-
const fastify = Fastify({ logger: true });
|
|
240
|
-
adapters.fastify.handleContract(fastify, userContract);
|
|
241
|
-
fastify.listen({ port: 3000 });
|
|
242
|
-
|
|
243
|
-
5.4 NestJS
|
|
244
|
-
import { Module } from "@nestjs/common";
|
|
245
|
-
|
|
246
|
-
@Module({
|
|
247
|
-
imports: [
|
|
248
|
-
adapters.nest.SchemaApiModule.register({ contracts: [userContract] }),
|
|
249
|
-
],
|
|
250
|
-
})
|
|
251
|
-
export class AppModule {}
|
|
252
|
-
|
|
253
|
-
5.5 Koa
|
|
254
|
-
import Koa from "koa";
|
|
255
|
-
import bodyParser from "koa-bodyparser";
|
|
256
|
-
const app = new Koa();
|
|
257
|
-
app.use(bodyParser());
|
|
258
|
-
adapters.koa.handleContract(app, userContract);
|
|
259
|
-
app.listen(3000);
|
|
260
|
-
|
|
261
|
-
5.6 Hapi
|
|
262
|
-
import Hapi from "@hapi/hapi";
|
|
263
|
-
const server = Hapi.server({ port: 3000 });
|
|
264
|
-
await adapters.hapi.handleContract(server, userContract);
|
|
265
|
-
await server.start();
|
|
266
|
-
|
|
267
|
-
5.7 Remix
|
|
268
|
-
// app/routes/users.$id.ts
|
|
269
|
-
export const loader = adapters.remix.handleContract(userContract);
|
|
270
|
-
export const action = adapters.remix.handleContract(userContract);
|
|
271
|
-
|
|
272
|
-
5.8 Bun / Deno
|
|
273
|
-
import { serve } from "bun";
|
|
274
|
-
serve(adapters.deno.handleContract(userContract), { port: 3000 });
|
|
275
|
-
|
|
276
|
-
6️⃣ Ejemplo completo de frontend usando SDK
|
|
277
|
-
import { schemaApiSdk } from "../sdk";
|
|
278
|
-
|
|
279
|
-
async function loadUser(id: string) {
|
|
280
|
-
try {
|
|
281
|
-
const user = await schemaApiSdk.getUser({
|
|
282
|
-
params: { id },
|
|
283
|
-
query: { includePosts: true },
|
|
284
|
-
headers: { authorization: "Bearer TOKEN" },
|
|
285
|
-
});
|
|
286
|
-
console.log(user.username, user.email);
|
|
287
|
-
} catch (err) {
|
|
288
|
-
console.error("Error:", err.message);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
Compatible con React, Next.js o cualquier frontend
|
|
294
|
-
|
|
295
|
-
Tipado y autocompletado garantizado
|
|
296
|
-
|
|
297
|
-
7️⃣ Beneficios
|
|
298
|
-
|
|
299
|
-
Una sola fuente de verdad (contract) para todos los frameworks
|
|
300
|
-
|
|
301
|
-
Validación completa: params, query, body, headers, roles, response, status codes
|
|
302
|
-
|
|
303
|
-
SDK tipado listo para backend y frontend
|
|
304
|
-
|
|
305
|
-
Compatible con IDEs IA → autocompletado y prevención de errores
|
|
306
|
-
|
|
307
|
-
Fácil integración con Express, Next.js, Fastify, NestJS, Koa, Hapi, Remix, Bun, Deno
|
|
308
|
-
|
|
309
|
-
8️⃣ Tips para IDE con IA
|
|
310
|
-
|
|
311
|
-
Mantener todos los contratos en un archivo central contracts/index.ts
|
|
312
|
-
|
|
313
|
-
Siempre usar TypeScript para tipado completo
|
|
314
|
-
|
|
315
|
-
Documentar cada endpoint para que la IA sugiera tipos y errores automáticamente
|
|
316
|
-
|
|
317
|
-
Usar schemaApiSdk para llamadas reales en frontend o backend
|
|
318
|
-
|
|
319
|
-
Cambios en el contrato → regenerar SDK → autocompletado actualizado
|
package/resumen.md
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
# SchemaApi - Checklist de Validaciones de Contract
|
|
2
|
-
|
|
3
|
-
> Guía completa y oficial de todas las validaciones que SchemaApi realiza sobre tus contratos de API.
|
|
4
|
-
> Ideal como checklist de desarrollo, QA o documentación interna.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1️⃣ Validaciones de método y ruta
|
|
9
|
-
|
|
10
|
-
| Validación | Descripción | Error típico |
|
|
11
|
-
|------------|------------|-------------|
|
|
12
|
-
| Método HTTP permitido | GET, POST, PUT, DELETE, PATCH, OPTIONS… | 405 Method Not Allowed |
|
|
13
|
-
| Existencia de la ruta | La ruta debe estar definida en el contrato | 404 Not Found |
|
|
14
|
-
| Parámetros dinámicos | `:id`, `:slug`, `*` deben declararse en `params` | 400 Bad Request |
|
|
15
|
-
| Métodos duplicados | Evita definir GET/POST duplicados en la misma ruta | Error en build/dev |
|
|
16
|
-
| Jerarquía de rutas | Rutas anidadas deben respetar la jerarquía | Error en build/dev |
|
|
17
|
-
| Versionado de rutas | Detecta breaking changes entre versiones | Warning/Error |
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 2️⃣ Validaciones de Path Params
|
|
22
|
-
|
|
23
|
-
| Validación | Descripción | Error típico |
|
|
24
|
-
|------------|------------|-------------|
|
|
25
|
-
| Tipo correcto | string, number, UUID, regex, enums | 400 Bad Request |
|
|
26
|
-
| Obligatorio/Optional | Parámetros marcados obligatorios deben llegar | 400 Bad Request |
|
|
27
|
-
| Formato | Regex, longitud mínima/máxima | 400 Bad Request |
|
|
28
|
-
|
|
29
|
-
**Ejemplo:**
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
params: z.object({ id: z.string().uuid() })
|
|
33
|
-
3️⃣ Validaciones de Query Params
|
|
34
|
-
Validación Descripción Error típico
|
|
35
|
-
Tipos correctos number, string, boolean, arrays 400 Bad Request
|
|
36
|
-
Obligatorio / Opcional Define si es requerido 400 Bad Request
|
|
37
|
-
Valores por defecto Permite fallback si no llega Correcto
|
|
38
|
-
Combinaciones dependientes Ej: sort + order 400 Bad Request
|
|
39
|
-
Arrays y objetos anidados Valida estructura compleja 400 Bad Request
|
|
40
|
-
|
|
41
|
-
4️⃣ Validaciones de Body
|
|
42
|
-
Validación Descripción Error típico
|
|
43
|
-
Body obligatorio Según método HTTP 400 Bad Request
|
|
44
|
-
Campos obligatorios / opcionales Deben cumplir schema 400 Bad Request
|
|
45
|
-
Tipos de campos string, number, boolean, array, objeto 400 Bad Request
|
|
46
|
-
Valores por defecto Permite fallback Correcto
|
|
47
|
-
Estructuras anidadas Arrays y objetos complejos 400 Bad Request
|
|
48
|
-
Validaciones avanzadas Regex, min/max, custom validator 400 Bad Request
|
|
49
|
-
|
|
50
|
-
5️⃣ Validaciones de Headers
|
|
51
|
-
Validación Descripción Error típico
|
|
52
|
-
Headers obligatorios Ej: Authorization, Content-Type 401/403
|
|
53
|
-
Tipos y formato string, number, regex 400/401
|
|
54
|
-
Valores predeterminados Si no llega header opcional Correcto
|
|
55
|
-
Combinaciones de headers Ej: X-Role + Authorization 400/403
|
|
56
|
-
|
|
57
|
-
6️⃣ Roles y Autenticación
|
|
58
|
-
Validación Descripción Error típico
|
|
59
|
-
Rol requerido Endpoint solo accesible a roles definidos 403 Forbidden
|
|
60
|
-
Múltiples roles Permite más de un rol Correcto
|
|
61
|
-
Rol predeterminado Optional fallback Correcto
|
|
62
|
-
Integración JWT / sesiones Opcional, validación token 401/403
|
|
63
|
-
Scopes / permisos adicionales Validación más granular 403 Forbidden
|
|
64
|
-
|
|
65
|
-
7️⃣ Responses y Status Codes
|
|
66
|
-
Validación Descripción Error típico
|
|
67
|
-
Schema de respuesta Debe cumplir schema exacto Error dev/test
|
|
68
|
-
Campos faltantes / extra Validación estricta Error dev/test
|
|
69
|
-
Status codes válidos Solo los definidos en errors Error dev/test
|
|
70
|
-
Arrays / objetos anidados Validación completa Error dev/test
|
|
71
|
-
Generación SDK / docs Automática a partir del schema N/A
|
|
72
|
-
Response opcional 204 Para métodos sin body Correcto
|
|
73
|
-
|
|
74
|
-
8️⃣ Errores y excepciones
|
|
75
|
-
Validación Descripción Error típico
|
|
76
|
-
Todos los errores declarados Cada status code debe estar definido Error dev/test
|
|
77
|
-
Status code no definido Handler retorna status no declarado Error dev/test
|
|
78
|
-
Mensajes consistentes String o códigos Warning/Error
|
|
79
|
-
Custom error handlers Opcional, consistente Correcto
|
|
80
|
-
Errores globales Soporte de fallback Correcto
|
|
81
|
-
|
|
82
|
-
9️⃣ Validaciones avanzadas / opcionales
|
|
83
|
-
Validación Descripción Error típico
|
|
84
|
-
Consistencia general Sin duplicados, campos obligatorios definidos Warning/Error
|
|
85
|
-
Comparación de versiones Detecta breaking changes Warning/Error
|
|
86
|
-
Validación condicional requiredIf / dependencias 400 Bad Request
|
|
87
|
-
Validación cross-endpoint Relaciones entre rutas Warning/Error
|
|
88
|
-
Observabilidad Logs automáticos de fallos N/A
|
|
89
|
-
Rate limiting lógico Throttling opcional 429 Too Many Requests
|
|
90
|
-
Payload / performance Tamaño máximo, response time 413 Payload Too Large
|
|
91
|
-
|
|
92
|
-
🔟 Meta-validaciones y herramientas
|
|
93
|
-
Validación Descripción
|
|
94
|
-
Generación documentación Swagger / OpenAPI / Markdown
|
|
95
|
-
Generación SDK JS / TS tipado automático
|
|
96
|
-
Generación tests Unitarios por endpoint y errores
|
|
97
|
-
Compatibilidad versiones Detecta breaking changes entre versiones
|
|
98
|
-
Seguridad básica Validación headers sensibles / inyección
|
|
99
|
-
|
|
100
|
-
✅ Resumen conceptual
|
|
101
|
-
SchemaApi puede validar todo lo que pueda romper la consistencia o confiabilidad de tu API:
|
|
102
|
-
|
|
103
|
-
Desde lo más básico (método, ruta, params, body)
|
|
104
|
-
|
|
105
|
-
Hasta avanzado (roles, versionado, dependencias cross-endpoint)
|
|
106
|
-
|
|
107
|
-
Esto convierte tu librería en una capa de contrato potente, que asegura que la API siempre se use de forma correcta antes de tocar la red o base de datos.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
# SchemaApi - Flujo de Validación de Contract
|
|
111
|
-
|
|
112
|
-
> Diagrama visual del flujo completo de validaciones en SchemaApi.
|
|
113
|
-
> Muestra qué se valida en cada capa antes de ejecutar un endpoint.
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## Flujo de Validación
|
|
118
|
-
|
|
119
|
-
```mermaid
|
|
120
|
-
flowchart TD
|
|
121
|
-
A[Inicio: Llamada API] --> B{Ruta existe?}
|
|
122
|
-
B -- No --> C[404 Not Found]
|
|
123
|
-
B -- Sí --> D{Método HTTP permitido?}
|
|
124
|
-
D -- No --> E[405 Method Not Allowed]
|
|
125
|
-
D -- Sí --> F{Path Params válidos?}
|
|
126
|
-
F -- No --> G[400 Bad Request - Invalid Path Param]
|
|
127
|
-
F -- Sí --> H{Query Params válidos?}
|
|
128
|
-
H -- No --> I[400 Bad Request - Invalid Query Param]
|
|
129
|
-
H -- Sí --> J{Body válido?}
|
|
130
|
-
J -- No --> K[400 Bad Request - Invalid Body]
|
|
131
|
-
J -- Sí --> L{Headers válidos?}
|
|
132
|
-
L -- No --> M[401/403 - Invalid Headers]
|
|
133
|
-
L -- Sí --> N{Rol autorizado?}
|
|
134
|
-
N -- No --> O[403 Forbidden]
|
|
135
|
-
N -- Sí --> P[Ejecutar Handler]
|
|
136
|
-
P --> Q{Response cumple schema?}
|
|
137
|
-
Q -- No --> R[Error Dev/Test - Invalid Response]
|
|
138
|
-
Q -- Sí --> S{Status Code permitido?}
|
|
139
|
-
S -- No --> T[Error Dev/Test - Status Code No Definido]
|
|
140
|
-
S -- Sí --> U[Respuesta exitosa al cliente]
|
|
141
|
-
🔹 Descripción del flujo
|
|
142
|
-
Ruta existe: Verifica que la ruta solicitada esté definida en el contrato.
|
|
143
|
-
|
|
144
|
-
Método HTTP permitido: Solo se aceptan los métodos definidos (GET, POST, etc.).
|
|
145
|
-
|
|
146
|
-
Path Params: Validación de tipos y obligatoriedad.
|
|
147
|
-
|
|
148
|
-
Query Params: Validación de tipos, opcionales/obligatorios y combinaciones.
|
|
149
|
-
|
|
150
|
-
Body: Validación de estructura, tipos, campos obligatorios y avanzados (regex, min/max, arrays/objetos).
|
|
151
|
-
|
|
152
|
-
Headers: Obligatorios y formato correcto.
|
|
153
|
-
|
|
154
|
-
Roles / permisos: Usuario debe tener rol autorizado.
|
|
155
|
-
|
|
156
|
-
Ejecutar Handler: Si todo es válido, se ejecuta la función del endpoint.
|
|
157
|
-
|
|
158
|
-
Response: Debe cumplir el schema exacto definido.
|
|
159
|
-
|
|
160
|
-
Status Code: Debe estar declarado en errors si no es 2xx.
|
|
161
|
-
|
|
162
|
-
Salida: La respuesta final al cliente es 100% validada.
|
|
163
|
-
|
|
164
|
-
🔹 Tipos de errores detectados
|
|
165
|
-
Error Capa Código típico
|
|
166
|
-
Ruta no existe Ruta 404
|
|
167
|
-
Método no permitido Método 405
|
|
168
|
-
Path Param inválido Path Params 400
|
|
169
|
-
Query Param inválido Query Params 400
|
|
170
|
-
Body inválido Body 400
|
|
171
|
-
Headers inválidos Headers 401 / 403
|
|
172
|
-
Rol no autorizado Roles 403
|
|
173
|
-
Response inválida Response Dev/Test Error
|
|
174
|
-
Status code no declarado Status Dev/Test Error
|
|
175
|
-
|
|
176
|
-
🔹 Beneficios de este flujo
|
|
177
|
-
Detecta errores antes de que lleguen a producción
|
|
178
|
-
|
|
179
|
-
Garantiza consistencia de contratos
|
|
180
|
-
|
|
181
|
-
Permite SDK tipado y generación de documentación automática
|
|
182
|
-
|
|
183
|
-
Facilita QA y testing: cada error es predecible y controlado
|
|
184
|
-
|
|
185
|
-
Posibilita versionado y detección de breaking changes
|
|
186
|
-
|
|
187
|
-
💡 Tip visual:
|
|
188
|
-
Puedes integrar este diagrama con herramientas como Mermaid.js en docs, para que sea interactivo y siempre actualizado según tu contrato.
|