@codexsploitx/schemaapi 1.0.1 → 1.0.3

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 CodexSploitx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexsploitx/schemaapi",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
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
@@ -1,61 +1,70 @@
1
+ <div align="center">
2
+
1
3
  # SchemaApi
2
4
 
3
- > El Zod de las APIs
4
- > No reemplaza tu stack. Lo hace confiable.
5
+ **The Zod of APIs**
6
+ *Type-safe contracts. Runtime validation. Auto-generated docs.*
5
7
 
6
- SchemaApi es una librería de **contratos para APIs**.
7
- No sustituye Express, Fastify, Next.js, Axios ni Fetch.
8
- Se coloca **encima** de ellos como una capa de validación, coherencia y arquitectura.
8
+ [![npm version](https://img.shields.io/npm/v/schemaapi?style=flat-square&color=blue)](https://www.npmjs.com/package/schemaapi)
9
+ [![License](https://img.shields.io/npm/l/schemaapi?style=flat-square&color=green)](LICENSE)
10
+ [![Tests](https://img.shields.io/github/actions/workflow/status/CodexSploitx/SchemaApi/test.yml?label=tests&style=flat-square)](https://github.com/CodexSploitx/SchemaApi/actions)
11
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org/)
9
12
 
10
- ---
13
+ [Features](#-features) • [Installation](#-installation) • [Usage](#-usage) • [Adapters](#-adapters) • [Documentation](#-documentation)
11
14
 
12
- ## 🧠 Filosofía
15
+ </div>
13
16
 
14
- > “Tu API no es tu código.
15
- > Tu API es el contrato que prometes al mundo.”
17
+ ---
16
18
 
17
- SchemaApi convierte ese contrato en:
18
- - Código tipado
19
- - Validación runtime
20
- - Seguridad (roles y errores tipados)
21
- - Documentación (vía CLI y contrato)
22
- - SDK de cliente básico
23
- - Tests (unitarios y de contrato)
19
+ ## 🚀 Why SchemaApi?
24
20
 
25
- ---
21
+ **Your API is a contract.** But in most codebases, that contract is broken into pieces:
22
+ - Validation logic in controllers.
23
+ - Types in a `types.ts` file.
24
+ - Documentation in a stale Swagger file.
25
+ - Client SDKs handwritten (and buggy).
26
26
 
27
- ## Lo que hace SchemaApi hoy
27
+ **SchemaApi** unifies everything into a **Single Source of Truth**. Define your contract once, and get everything else for free.
28
28
 
29
- - Valida rutas, métodos HTTP y parámetros
30
- - Valida query, body y headers
31
- - Controla roles y autenticación
32
- - Valida responses y errores (incluye status codes definidos en el contrato)
33
- - Expone un contrato único fuente de verdad para docs/SDK/tests
34
- - Ofrece un cliente JS/TS básico vía `createClient`
35
- - Proporciona una CLI mínima (`schemaapi`) para orquestar generación de docs/SDK/tests
36
- - Versionado de API con detección de breaking changes
29
+ > "It doesn't replace your framework. It makes it invincible."
37
30
 
38
31
  ---
39
32
 
40
- ## Lo que NO hace
33
+ ## Features
41
34
 
42
- - No transporta datos (usa Fetch / Axios)
43
- - No reemplaza tu framework (Express / Next / Fastify)
44
- - No maneja DB ni ORM
45
- - No es un servidor
35
+ | Feature | Description |
36
+ | :--- | :--- |
37
+ | **🛡️ End-to-End Type Safety** | Types flow from your server contract directly to your client SDK. No code generation required. |
38
+ | **⚡ Runtime Validation** | Powered by **[Zod](https://zod.dev)**. Automatically validates params, query, body, and headers. |
39
+ | **🔐 Built-in Security** | Define `roles` and `scopes` directly in your contract. RBAC made simple. |
40
+ | **📚 Auto Documentation** | Generate beautiful, interactive HTML documentation that never drifts from code. |
41
+ | **🔌 Framework Agnostic** | Works with Express, Next.js, Fastify, Remix, NestJS, and more. |
42
+ | **📦 Zero-Config SDK** | Export a fully typed client that handles methods, paths, and errors for you. |
46
43
 
47
44
  ---
48
45
 
49
- ## 🌐 Instalación
46
+ ## 📦 Installation
50
47
 
51
48
  ```bash
52
- npm install schemaapi
53
- # o
54
- yarn add schemaapi
49
+ # npm
50
+ npm install schemaapi zod
51
+
52
+ # pnpm
53
+ pnpm add schemaapi zod
55
54
 
55
+ # yarn
56
+ yarn add schemaapi zod
57
+ ```
56
58
 
57
- 🧩 Ejemplo básico
59
+ ---
60
+
61
+ ## 🛠 Usage
62
+
63
+ ### 1️⃣ Define the Contract
58
64
 
65
+ Create a shared file (e.g., `contract.ts`). This is your API's law.
66
+
67
+ ```typescript
59
68
  import { createContract } from "schemaapi";
60
69
  import { z } from "zod";
61
70
 
@@ -63,27 +72,95 @@ export const contract = createContract({
63
72
  "/users/:id": {
64
73
  GET: {
65
74
  params: z.object({ id: z.string().uuid() }),
66
- headers: z.object({ authorization: z.string() }),
67
- roles: ["user", "admin"],
68
75
  response: z.object({
69
76
  id: z.string(),
70
- username: z.string(),
71
- email: z.string().email()
77
+ name: z.string(),
78
+ email: z.string().email(),
72
79
  }),
73
- errors: { 401: "UNAUTHORIZED", 404: "USER_NOT_FOUND" }
74
- }
75
- }
80
+ errors: {
81
+ 404: "USER_NOT_FOUND",
82
+ },
83
+ },
84
+ },
76
85
  });
86
+ ```
77
87
 
88
+ ### 2️⃣ Implement the Server
78
89
 
90
+ Use the `handle` method to implement the logic. SchemaApi ensures you return exactly what the contract promises.
79
91
 
80
- 🛠 Integración con Express
92
+ ```typescript
93
+ import express from "express";
94
+ import { contract } from "./contract";
95
+
96
+ const app = express();
81
97
 
82
98
  app.get(
83
99
  "/users/:id",
84
- contract.handle("GET /users/:id", async (ctx) => {
85
- const user = await db.findUser(ctx.params.id);
86
- return user; // Validación automática
100
+ contract.handle("GET /users/:id", async ({ params }) => {
101
+ // `params.id` is strictly typed as a UUID string
102
+ const user = await db.users.find(params.id);
103
+
104
+ if (!user) {
105
+ throw { status: 404, message: "User not found" };
106
+ }
107
+
108
+ // TypeScript ensures this return value matches the contract
109
+ return user;
87
110
  })
88
111
  );
89
- # SchemaApi
112
+ ```
113
+
114
+ ### 3️⃣ Consume with Client SDK
115
+
116
+ No more manual fetch calls. No more `any`.
117
+
118
+ ```typescript
119
+ import { createClient } from "schemaapi";
120
+ import { contract } from "./shared/contract";
121
+
122
+ const client = createClient(contract, {
123
+ baseUrl: "https://api.example.com"
124
+ });
125
+
126
+ // Full autocomplete & type checking
127
+ const user = await client.users.get({
128
+ id: "550e8400-e29b-41d4-a716-446655440000"
129
+ });
130
+
131
+ console.log(user.email); // ✅ Typed!
132
+ ```
133
+
134
+ ---
135
+
136
+ ## 🔌 Adapters Ecosystem
137
+
138
+ SchemaApi is designed to drop into any stack.
139
+
140
+ | Adapter | Status | Package Support |
141
+ | :--- | :---: | :--- |
142
+ | <img src="https://raw.githubusercontent.com/expressjs/expressjs.com/gh-pages/images/favicon.png" width="20" /> **Express** | ✅ Stable | Native support |
143
+ | <img src="https://assets.vercel.com/image/upload/v1662130559/nextjs/Icon_dark_background.png" width="20" /> **Next.js** | ✅ Stable | API Routes & App Router |
144
+ | <img src="https://raw.githubusercontent.com/fastify/graphics/master/fastify-icon.png" width="20" /> **Fastify** | ✅ Stable | High performance |
145
+ | <img src="https://github.com/remix-run/branding/raw/main/remix-r.png" width="20" /> **Remix** | ✅ Stable | Loaders & Actions |
146
+ | <img src="https://nestjs.com/img/logo-small.svg" width="20" /> **NestJS** | ✅ Stable | Decorators |
147
+ | <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Deno.svg/1200px-Deno.svg.png" width="20" /> **Deno** | ✅ Stable | Native HTTP |
148
+ | ⚡ **WebSocket** | 🚧 Beta | Real-time contracts |
149
+
150
+ ---
151
+
152
+ ## 📚 Documentation Generator
153
+
154
+ Stop writing Swagger files manually. Generate a stunning static documentation site with one command.
155
+
156
+ ```bash
157
+ npx schemaapi generate docs --out ./docs
158
+ ```
159
+
160
+ It creates a fully responsive, dark-mode ready HTML dashboard showing all your routes, schemas, and types.
161
+
162
+ ---
163
+
164
+ ## 📄 License
165
+
166
+ MIT © [CodexSploitx](https://github.com/CodexSploitx)
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.