@fhiron/sdk 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 ADDED
@@ -0,0 +1,128 @@
1
+ # @fhiron/sdk
2
+
3
+ Embebe validación FHIR® contra **CL Core v1.9.4** dentro de tu aplicación. Mismo motor que [`@fhiron/cli`](https://www.npmjs.com/package/@fhiron/cli) y [`@fhiron/mcp-connector`](https://www.npmjs.com/package/@fhiron/mcp-connector): misma API, misma cuota, mismo CL Core.
4
+
5
+ - Cliente tipado (TypeScript de primera clase, `.d.ts` incluidos)
6
+ - Errores en español, con referencia al perfil que falla
7
+ - Zero dependencies, Node 18+, ESM y CommonJS
8
+ - `lint()` estructural offline (sin red, sin cuota) + `validate()` remoto
9
+
10
+ > Tres canales, misma plataforma: conversa con tu agente vía **MCP**, automatiza en terminal y CI con la **CLI**, embebe la validación en tu producto con el **SDK**.
11
+
12
+ ## Instalación
13
+
14
+ ```bash
15
+ npm install @fhiron/sdk
16
+ ```
17
+
18
+ Necesitas una API key de tu tenant. Genérala en [fhiron.cl/dashboard](https://fhiron.cl/dashboard).
19
+
20
+ ## Uso
21
+
22
+ ```ts
23
+ import { Fhiron } from '@fhiron/sdk';
24
+
25
+ const fhiron = new Fhiron({ apiKey: process.env.FHIRON_API_KEY });
26
+
27
+ const patient = {
28
+ resourceType: 'Patient',
29
+ identifier: [{ system: 'http://www.registrocivil.cl/run', value: '12345678-9' }],
30
+ name: [{ family: 'Pérez', given: ['Ana'] }],
31
+ gender: 'female',
32
+ };
33
+
34
+ const result = await fhiron.validate(patient);
35
+
36
+ if (!result.ok) {
37
+ for (const issue of result.errors) {
38
+ console.log(`${issue.path}: ${issue.message}`);
39
+ }
40
+ }
41
+ ```
42
+
43
+ CommonJS:
44
+
45
+ ```js
46
+ const { Fhiron } = require('@fhiron/sdk');
47
+ ```
48
+
49
+ ## API
50
+
51
+ ### `new Fhiron(options?)`
52
+
53
+ | Opción | Tipo | Default | Descripción |
54
+ |-----------------|----------|--------------------------------------------|-------------|
55
+ | `apiKey` | `string` | `process.env.FHIRON_API_KEY` | API key del tenant. |
56
+ | `baseUrl` | `string` | `https://fhiron.cl` (o `FHIRON_API_URL`) | Base de la API. |
57
+ | `timeout` | `number` | `10000` | Timeout por petición (ms). |
58
+ | `clCoreVersion` | `string` | resuelto por el tenant | Fija la versión de CL Core, ej. `"1.9.4"`. |
59
+ | `language` | `string` | `"es"` | Idioma de los mensajes (`"es"` \| `"en"`). |
60
+
61
+ ### `await fhiron.validate(resource, opts?)`
62
+
63
+ Valida un recurso FHIR (o un Bundle) contra CL Core en el motor remoto. **Descuenta 1 de la cuota mensual.** Devuelve un `ValidateResult`:
64
+
65
+ ```ts
66
+ interface ValidateResult {
67
+ valid: boolean; // el motor no encontró errores
68
+ ok: boolean; // valid && !engineDegraded: úsalo para gate
69
+ engineDegraded: boolean; // el motor no pudo validar (NO se descontó cuota)
70
+ resourceType: string | null;
71
+ profile: string | null;
72
+ issues: Issue[]; // todos los hallazgos, en español
73
+ errors: Issue[]; // atajo: severity === 'error'
74
+ warnings: Issue[];
75
+ information: Issue[];
76
+ messages: { errors: string[]; warnings: string[] };
77
+ raw: Record<string, unknown>; // respuesta cruda del endpoint
78
+ }
79
+ ```
80
+
81
+ `opts`: `{ profile?, clCoreVersion?, timeout? }`. `profile` acepta `"hl7.fhir.cl.clcore@1.9.4"` o `"1.9.4"`.
82
+
83
+ ### `fhiron.lint(resource)`
84
+
85
+ Lint estructural **offline** (sin red, sin cuota). Devuelve `Issue[]`. Útil para feedback inmediato en un editor o un formulario antes de gastar una validación remota.
86
+
87
+ ### `await fhiron.check(resource, opts?)`
88
+
89
+ Conveniencia: corre `lint()` local y `validate()` remoto, y adjunta `localIssues` al resultado.
90
+
91
+ ## Manejo de errores
92
+
93
+ `validate()` lanza errores tipados ante fallos HTTP o de red. Todos extienden `FhironError`:
94
+
95
+ ```ts
96
+ import { FhironQuotaError, FhironAuthError, FhironError } from '@fhiron/sdk';
97
+
98
+ try {
99
+ await fhiron.validate(resource);
100
+ } catch (err) {
101
+ if (err instanceof FhironQuotaError) {
102
+ console.log('Cuota agotada. Upgrade en', err.upgradeUrl);
103
+ } else if (err instanceof FhironAuthError) {
104
+ console.log('Revisa tu API key.');
105
+ } else if (err instanceof FhironError) {
106
+ console.log('Fallo de Fhiron:', err.message);
107
+ }
108
+ }
109
+ ```
110
+
111
+ | Clase | Cuándo |
112
+ |----------------------|--------|
113
+ | `FhironAuthError` | HTTP 401 / 403: key ausente, inválida o sin permisos. |
114
+ | `FhironQuotaError` | HTTP 429: cuota agotada (`.upgradeUrl`). |
115
+ | `FhironRequestError` | HTTP 400 / 415 / 422: problema de forma del recurso. |
116
+ | `FhironServerError` | HTTP 5xx: servidor o motor. Reintentable. |
117
+ | `FhironTimeoutError` | Supera `timeout`. Reintentable. |
118
+ | `FhironNetworkError` | Fallo de red / offline. Reintentable. |
119
+
120
+ ## Notas
121
+
122
+ - La validación remota cumple la misma política de cuota que el resto de Fhiron: se descuenta por recurso validado contra el endpoint canónico.
123
+ - `lint()` es estructural y local; no reemplaza a `validate()`, que corre el motor HAPI + perfiles CL Core.
124
+ - Cuando `engineDegraded` es `true`, el motor remoto no pudo procesar el recurso (problema sistémico del servidor) y **no se descontó cuota**.
125
+
126
+ ## Licencia
127
+
128
+ MIT
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@fhiron/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Fhiron SDK — embebe validación FHIR® contra CL Core v1.9.4 en tu app. Mismo motor que @fhiron/mcp-connector y @fhiron/cli. Cliente tipado, errores en español, zero dependencies. Node 18+, ESM y CommonJS.",
5
+ "type": "commonjs",
6
+ "main": "src/index.js",
7
+ "module": "src/index.mjs",
8
+ "types": "src/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.d.ts",
12
+ "import": "./src/index.mjs",
13
+ "require": "./src/index.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "src",
19
+ "README.md"
20
+ ],
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "dependencies": {},
25
+ "keywords": [
26
+ "fhir",
27
+ "sdk",
28
+ "cl-core",
29
+ "chile",
30
+ "hl7",
31
+ "validation",
32
+ "validador",
33
+ "deis",
34
+ "minsal",
35
+ "tfc",
36
+ "typescript",
37
+ "spanish"
38
+ ],
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/Fhironstack/skills.git"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/Fhironstack/skills/issues"
46
+ },
47
+ "homepage": "https://fhiron.cl/sdk",
48
+ "scripts": {
49
+ "test": "node --test 'test/*.test.js'",
50
+ "sync-linter": "bash scripts/sync-linter.sh",
51
+ "typecheck": "tsc --noEmit --strict src/index.d.ts test/types.test-d.ts",
52
+ "prepublishOnly": "bash scripts/sync-linter.sh && npm test"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }