stocker-sdk 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,208 @@
1
- # Temporary Holding Version
1
+ # Stocker SDK
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Cliente TypeScript de Stocker generado desde OpenAPI con Hey API.
4
+
5
+ ## Compatibilidad y dependencias
6
+
7
+ El paquete se distribuye como ESM y declara Node.js 22.18 o superior. Para
8
+ desarrollarlo usa Node.js 22.18+ de la rama 22 o Node.js 24.11+ de la rama 24,
9
+ compatibles con las herramientas de compilación. La configuración se verifica
10
+ actualmente con Node.js 24.14 y TypeScript 6.0.3.
11
+
12
+ Hey API está fijado en la versión estable `0.99.0`. La versión `next` se utilizó
13
+ para resolver una incompatibilidad con TypeScript 7; ya no es necesaria al usar
14
+ TypeScript 6 y el generador `tsc` para declaraciones. Las versiones directas se
15
+ fijan y `package-lock.json` conserva la resolución del árbol de dependencias.
16
+
17
+ El override de `js-yaml` a `4.3.2` actualiza la dependencia del parser de OpenAPI
18
+ dentro de la misma versión mayor para corregir sus avisos de seguridad. Debe
19
+ revisarse cuando Hey API actualice esa dependencia.
20
+
21
+ Jsona es la única dependencia de ejecución. Hey API, TypeScript, tsdown y Vitest
22
+ son herramientas de desarrollo: no se instalan como dependencias del SDK en las
23
+ aplicaciones consumidoras. Las exportaciones públicas incluyen las declaraciones
24
+ TypeScript y el JavaScript compilado; el playground y las credenciales se excluyen
25
+ del paquete.
26
+
27
+ ## Estructura
28
+
29
+ ```text
30
+ openapi/ Contratos OpenAPI y sus diagnósticos
31
+ src/
32
+ index.ts Entrada pública: recursos, tipos y creación de clientes
33
+ client.ts Inicialización común de clientes de Stocker
34
+ generated/stocker/ Código generado; no editar manualmente
35
+ jsonapi/ Deserialización genérica y tipos derivados de OpenAPI
36
+ playground/
37
+ index.ts Llamadas reales para probar durante el desarrollo
38
+ stocker.ts Cliente local configurado mediante variables de entorno
39
+ tests/
40
+ client.test.ts Pruebas automatizadas sin conexión a la API
41
+ deserialize.test.ts Pruebas de transformación y de tipos
42
+ .env.example Ejemplo de configuración local sin credenciales
43
+ .env.local Configuración privada, ignorada por Git
44
+ dist/ Resultado de compilación, ignorado por Git
45
+ ```
46
+
47
+ El paquete se construye desde `src/index.ts`. Importarlo expone el SDK sin
48
+ realizar solicitudes ni cargar la configuración del playground.
49
+
50
+ ## Inicializar el cliente
51
+
52
+ ```ts
53
+ import { createStockerClient, Products } from 'stocker-sdk';
54
+
55
+ const client = createStockerClient({
56
+ baseUrl: 'https://api.example.com',
57
+ tenant: 'my-tenant',
58
+ apiKey: 'my-api-key',
59
+ });
60
+
61
+ const { data } = await Products.listProducts({ client });
62
+ ```
63
+
64
+ La función configura `X-Tenant` y `api-key`, valida que las tres opciones estén
65
+ presentes y usa `throwOnError: true` por defecto. Acepta también las opciones del
66
+ cliente Fetch, como `fetch`, `headers`, `signal` y `throwOnError: false`. Los
67
+ encabezados adicionales no reemplazan los valores de `tenant` y `apiKey`.
68
+
69
+ Cada llamada crea un cliente independiente. El SDK no lee variables de entorno;
70
+ puedes pasar directamente sus valores y la función validará los que falten:
71
+
72
+ ```ts
73
+ const client = createStockerClient({
74
+ baseUrl: process.env.STOCKER_BASE_URL,
75
+ tenant: process.env.STOCKER_TENANT,
76
+ apiKey: process.env.STOCKER_API_KEY,
77
+ });
78
+ ```
79
+
80
+ El playground utiliza esta inicialización. Las solicitudes siguen recibiendo
81
+ el cliente mediante `{ client }`.
82
+
83
+ ## Deserialización de respuestas
84
+
85
+ `deserialize()` usa Jsona para convertir un documento JSON:API en modelos con
86
+ atributos y relaciones accesibles directamente. Los tipos se infieren del
87
+ contrato generado, sin definir un convertidor por recurso.
88
+
89
+ ```ts
90
+ import { deserialize, Products } from './src/index';
91
+
92
+ const { data: document } = await Products.listProducts({
93
+ client: backend,
94
+ query: {
95
+ include: ['category'],
96
+ 'fields[products]': ['name', 'code', 'category'],
97
+ },
98
+ });
99
+
100
+ const products = deserialize(document);
101
+ console.log(products?.[0]?.name);
102
+ console.log(products?.[0]?.category?.name);
103
+ ```
104
+
105
+ `backend` es un cliente configurado por la aplicación, como el del playground.
106
+ La función recibe el documento JSON:API (`response.data`), no la respuesta HTTP
107
+ completa. Una colección devuelve un arreglo; un documento individual devuelve
108
+ un objeto. Se conservan `undefined`, `null` y los documentos con `data: null`.
109
+
110
+ Las relaciones se resuelven usando `included` y los recursos principales del
111
+ documento. Si faltan sus atributos, se conserva la referencia `{ type, id }`;
112
+ no se hacen solicitudes adicionales. Los atributos siguen siendo opcionales
113
+ para reflejar campos parciales. Los atributos y relaciones se convierten a
114
+ camelCase: `product-sales` pasa a `productSales` y `created_at` a `createdAt`,
115
+ incluyendo las propiedades de objetos anidados en atributos. El autocompletado
116
+ refleja esos nombres. Los valores de `type`, los `links` y la metadata no cambian.
117
+ Las consultas `include` y `fields` siguen usando los nombres originales de la API.
118
+
119
+ También se pueden derivar tipos sin duplicar interfaces:
120
+
121
+ ```ts
122
+ import type { Model, V1ProductsResource } from './src/index';
123
+
124
+ type Product = Model<V1ProductsResource>;
125
+ ```
126
+
127
+ El documento original no se modifica: consérvalo para acceder a paginación,
128
+ `links`, `meta` y metadatos de relaciones. Los modelos conservan `type`, `id`,
129
+ los atributos, las relaciones y los `links`/`meta` del recurso. Jsona agrega
130
+ `relationshipNames` en los modelos que contienen relaciones.
131
+
132
+ Esta función no valida el esquema en ejecución ni convierte fechas o números
133
+ representados como texto. Los tipos dependen de que el servidor cumpla OpenAPI.
134
+ Puede haber ciclos en los modelos; no se garantiza que dos apariciones de un
135
+ recurso sean el mismo objeto por referencia, ni que `JSON.stringify()` funcione
136
+ sobre un grafo con ciclos. Los cuerpos de escritura siguen usando JSON:API.
137
+
138
+ ## Desarrollo
139
+
140
+ ```bash
141
+ npm install
142
+ ```
143
+
144
+ Para regenerar el cliente después de modificar el contrato:
145
+
146
+ ```bash
147
+ npm run generate:api
148
+ ```
149
+
150
+ Para compilar el paquete y seguir los cambios:
151
+
152
+ ```bash
153
+ npm run dev
154
+ ```
155
+
156
+ Este comando compila la biblioteca; no ejecuta el playground.
157
+
158
+ ## Pruebas manuales con la API
159
+
160
+ En una instalación nueva, copia `.env.example` a `.env.local` y configura
161
+ `STOCKER_BASE_URL`, `STOCKER_TENANT` y `STOCKER_API_KEY`.
162
+
163
+ ```bash
164
+ cp .env.example .env.local
165
+ npm run playground
166
+ ```
167
+
168
+ En este proyecto ya se migró la configuración local existente a `.env.local`.
169
+ No es necesario reemplazarla. Las credenciales no se incluyen en Git.
170
+
171
+ Edita `playground/index.ts` para probar productos, ventas u otros recursos. El
172
+ playground importa la entrada pública del SDK desde `src/index.ts`.
173
+
174
+ Para repetir las llamadas cada vez que guardes cambios:
175
+
176
+ ```bash
177
+ npm run playground:watch
178
+ ```
179
+
180
+ El playground realiza solicitudes reales al servidor configurado.
181
+
182
+ ## Pruebas automatizadas
183
+
184
+ Las pruebas de `tests/` usan respuestas simuladas y no necesitan credenciales.
185
+
186
+ ```bash
187
+ npm test
188
+ npm run test:run
189
+ ```
190
+
191
+ `npm test` mantiene las pruebas en modo observación. `test:run` las ejecuta una vez.
192
+
193
+ ## Verificación
194
+
195
+ ```bash
196
+ npm run typecheck
197
+ npm run test:run
198
+ npm run build
199
+ ```
200
+
201
+ Para ejecutar todas las comprobaciones, incluida la validación del paquete npm:
202
+
203
+ ```bash
204
+ npm run check
205
+ ```
206
+
207
+ `prepack` compila antes de crear el paquete y `prepublishOnly` ejecuta todas las
208
+ comprobaciones antes de publicar. Estos scripts utilizan npm.