@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexsploitx/schemaapi",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Type-safe API contracts (HTTP/WebSocket) with adapters, client and docs generator.",
5
5
  "main": "dist/schemaapi.cjs.js",
6
6
  "module": "dist/schemaapi.esm.js",
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.