stocker-sdk 0.0.0-stage → 0.2.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 +216 -2
- package/dist/index.d.mts +80223 -0
- package/dist/index.mjs +34524 -0
- package/package.json +52 -4
package/README.md
CHANGED
|
@@ -1,3 +1,217 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Stocker SDK
|
|
2
2
|
|
|
3
|
-
|
|
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 del recurso no cambian.
|
|
117
|
+
La metadata de cada relación se expone como propiedades con el nombre de la relación
|
|
118
|
+
como prefijo: `relationships.products.meta.count: 23` produce `productsCount: 23`,
|
|
119
|
+
incluso si la relación no contiene `data`. Por ejemplo, `purchase-products.meta.total_pages`
|
|
120
|
+
produce `purchaseProductsTotalPages`. Los valores se conservan tal cual, incluidos
|
|
121
|
+
objetos anidados. Los atributos, relaciones y propiedades estructurales tienen prioridad
|
|
122
|
+
ante colisiones. El tipado de `Model` solo expone claves de metadata declaradas
|
|
123
|
+
explícitamente en el esquema, con sus tipos originales y como propiedades opcionales.
|
|
124
|
+
No hay tratamiento especial para `count`. No se admiten claves dinámicas en el modelo: `productsCounts` produce
|
|
125
|
+
un error de TypeScript. La deserialización sigue copiando todas las claves recibidas.
|
|
126
|
+
Las consultas `include` y `fields` siguen usando los nombres originales de la API.
|
|
127
|
+
|
|
128
|
+
También se pueden derivar tipos sin duplicar interfaces:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
import type { Model, V1ProductsResource } from './src/index';
|
|
132
|
+
|
|
133
|
+
type Product = Model<V1ProductsResource>;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
El documento original no se modifica: consérvalo para acceder a paginación,
|
|
137
|
+
`links`, `meta` y metadatos de relaciones. Los modelos conservan `type`, `id`,
|
|
138
|
+
los atributos, las relaciones y los `links`/`meta` del recurso. Jsona agrega
|
|
139
|
+
`relationshipNames` en los modelos que contienen relaciones.
|
|
140
|
+
|
|
141
|
+
Esta función no valida el esquema en ejecución ni convierte fechas o números
|
|
142
|
+
representados como texto. Los tipos dependen de que el servidor cumpla OpenAPI.
|
|
143
|
+
Puede haber ciclos en los modelos; no se garantiza que dos apariciones de un
|
|
144
|
+
recurso sean el mismo objeto por referencia, ni que `JSON.stringify()` funcione
|
|
145
|
+
sobre un grafo con ciclos. Los cuerpos de escritura siguen usando JSON:API.
|
|
146
|
+
|
|
147
|
+
## Desarrollo
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npm install
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Para regenerar el cliente después de modificar el contrato:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npm run generate:api
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Para compilar el paquete y seguir los cambios:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
npm run dev
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Este comando compila la biblioteca; no ejecuta el playground.
|
|
166
|
+
|
|
167
|
+
## Pruebas manuales con la API
|
|
168
|
+
|
|
169
|
+
En una instalación nueva, copia `.env.example` a `.env.local` y configura
|
|
170
|
+
`STOCKER_BASE_URL`, `STOCKER_TENANT` y `STOCKER_API_KEY`.
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
cp .env.example .env.local
|
|
174
|
+
npm run playground
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
En este proyecto ya se migró la configuración local existente a `.env.local`.
|
|
178
|
+
No es necesario reemplazarla. Las credenciales no se incluyen en Git.
|
|
179
|
+
|
|
180
|
+
Edita `playground/index.ts` para probar productos, ventas u otros recursos. El
|
|
181
|
+
playground importa la entrada pública del SDK desde `src/index.ts`.
|
|
182
|
+
|
|
183
|
+
Para repetir las llamadas cada vez que guardes cambios:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm run playground:watch
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
El playground realiza solicitudes reales al servidor configurado.
|
|
190
|
+
|
|
191
|
+
## Pruebas automatizadas
|
|
192
|
+
|
|
193
|
+
Las pruebas de `tests/` usan respuestas simuladas y no necesitan credenciales.
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm test
|
|
197
|
+
npm run test:run
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`npm test` mantiene las pruebas en modo observación. `test:run` las ejecuta una vez.
|
|
201
|
+
|
|
202
|
+
## Verificación
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
npm run typecheck
|
|
206
|
+
npm run test:run
|
|
207
|
+
npm run build
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Para ejecutar todas las comprobaciones, incluida la validación del paquete npm:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npm run check
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
`prepack` compila antes de crear el paquete y `prepublishOnly` ejecuta todas las
|
|
217
|
+
comprobaciones antes de publicar. Estos scripts utilizan npm.
|