sof-mssql 1.0.1 → 2.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 +175 -35
- package/dist/fhirpath/transpiler.d.ts +40 -2
- package/dist/fhirpath/transpiler.d.ts.map +1 -1
- package/dist/fhirpath/transpiler.js +85 -15
- package/dist/fhirpath/transpiler.js.map +1 -1
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +3 -0
- package/dist/load.js.map +1 -1
- package/dist/loader/connection.d.ts.map +1 -1
- package/dist/loader/connection.js +6 -0
- package/dist/loader/connection.js.map +1 -1
- package/dist/loader/tables.d.ts.map +1 -1
- package/dist/loader/tables.js +7 -0
- package/dist/loader/tables.js.map +1 -1
- package/dist/loader/types.d.ts +2 -0
- package/dist/loader/types.d.ts.map +1 -1
- package/dist/parser.d.ts +22 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +101 -10
- package/dist/parser.js.map +1 -1
- package/dist/queryGenerator/RepeatProcessor.d.ts +177 -0
- package/dist/queryGenerator/RepeatProcessor.d.ts.map +1 -0
- package/dist/queryGenerator/RepeatProcessor.js +336 -0
- package/dist/queryGenerator/RepeatProcessor.js.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts +45 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -1
- package/dist/queryGenerator/SelectClauseBuilder.js +150 -0
- package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -1
- package/dist/queryGenerator/WhereClauseBuilder.d.ts +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -1
- package/dist/queryGenerator/WhereClauseBuilder.js +6 -2
- package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -1
- package/dist/queryGenerator/index.d.ts +1 -0
- package/dist/queryGenerator/index.d.ts.map +1 -1
- package/dist/queryGenerator/index.js +3 -1
- package/dist/queryGenerator/index.js.map +1 -1
- package/dist/queryGenerator.d.ts +61 -1
- package/dist/queryGenerator.d.ts.map +1 -1
- package/dist/queryGenerator.js +176 -13
- package/dist/queryGenerator.js.map +1 -1
- package/dist/tests/utils/generator.js +11 -11
- package/dist/tests/utils/generator.js.map +1 -1
- package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -1
- package/dist/tests/utils/sqlOnFhir.js +39 -4
- package/dist/tests/utils/sqlOnFhir.js.map +1 -1
- package/dist/tests/utils/testContext.d.ts +3 -6
- package/dist/tests/utils/testContext.d.ts.map +1 -1
- package/dist/tests/utils/testContext.js +5 -9
- package/dist/tests/utils/testContext.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +66 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +449 -0
- package/dist/validation.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 🔥 MSSQL on FHIR 🔥
|
|
2
2
|
|
|
3
3
|
A TypeScript library and CLI tool for loading FHIR into Microsoft SQL Server,
|
|
4
4
|
and transpiling [SQL on FHIR](https://sql-on-fhir.org/) view definitions into
|
|
@@ -209,59 +209,76 @@ WHERE [r].[resource_type] = 'Patient'
|
|
|
209
209
|
|
|
210
210
|
### Basic usage
|
|
211
211
|
|
|
212
|
-
```
|
|
212
|
+
```typescript
|
|
213
213
|
import {SqlOnFhir} from 'sof-mssql';
|
|
214
214
|
|
|
215
|
-
// Create an instance with default configuration
|
|
216
215
|
const sqlOnFhir = new SqlOnFhir();
|
|
216
|
+
```
|
|
217
217
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
218
|
+
Create a ViewDefinition to transpile:
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"resourceType": "ViewDefinition",
|
|
223
|
+
"resource": "Patient",
|
|
224
|
+
"name": "patient_demographics",
|
|
225
|
+
"select": [
|
|
224
226
|
{
|
|
225
|
-
column: [
|
|
227
|
+
"column": [
|
|
226
228
|
{
|
|
227
|
-
name:
|
|
228
|
-
path:
|
|
229
|
-
type:
|
|
229
|
+
"name": "id",
|
|
230
|
+
"path": "id",
|
|
231
|
+
"type": "id"
|
|
230
232
|
},
|
|
231
233
|
{
|
|
232
|
-
name:
|
|
233
|
-
path:
|
|
234
|
-
type:
|
|
234
|
+
"name": "family_name",
|
|
235
|
+
"path": "name.family",
|
|
236
|
+
"type": "string"
|
|
235
237
|
},
|
|
236
238
|
{
|
|
237
|
-
name:
|
|
238
|
-
path:
|
|
239
|
-
type:
|
|
239
|
+
"name": "birth_date",
|
|
240
|
+
"path": "birthDate",
|
|
241
|
+
"type": "date"
|
|
240
242
|
}
|
|
241
243
|
]
|
|
242
244
|
}
|
|
243
245
|
]
|
|
244
|
-
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Transpile the ViewDefinition to T-SQL:
|
|
245
250
|
|
|
251
|
+
```typescript
|
|
246
252
|
const result = sqlOnFhir.transpile(viewDefinition);
|
|
247
253
|
|
|
248
254
|
console.log(result.sql);
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Generated SQL output:
|
|
258
|
+
|
|
259
|
+
```sql
|
|
260
|
+
SELECT
|
|
261
|
+
r.id AS [id],
|
|
262
|
+
JSON_VALUE(r.json, '$.name[0].family') AS [family_name],
|
|
263
|
+
CAST(JSON_VALUE(r.json, '$.birthDate') AS DATETIME2) AS [birth_date]
|
|
264
|
+
FROM [dbo].[fhir_resources] AS [r]
|
|
265
|
+
WHERE [r].[resource_type] = 'Patient'
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Access column metadata:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
258
271
|
console.log(result.columns);
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Column metadata output:
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
[
|
|
278
|
+
{ "name": "id", "type": "VARCHAR(64)", "nullable": true },
|
|
279
|
+
{ "name": "family_name", "type": "NVARCHAR(MAX)", "nullable": true },
|
|
280
|
+
{ "name": "birth_date", "type": "VARCHAR(10)", "nullable": true }
|
|
281
|
+
]
|
|
265
282
|
```
|
|
266
283
|
|
|
267
284
|
### Custom table configuration
|
|
@@ -292,8 +309,131 @@ const fhirResource = {
|
|
|
292
309
|
// ... rest of ViewDefinition
|
|
293
310
|
};
|
|
294
311
|
const result2 = sqlOnFhir.transpile(fhirResource);
|
|
312
|
+
````
|
|
313
|
+
|
|
314
|
+
### Type mappings and type hints
|
|
315
|
+
|
|
316
|
+
#### Default type mappings
|
|
317
|
+
|
|
318
|
+
By default, FHIR primitive types are mapped to the following T-SQL types:
|
|
319
|
+
|
|
320
|
+
| FHIR Type | Default T-SQL Type | Rationale |
|
|
321
|
+
|-----------------------------------------|--------------------|-------------------------------------------|
|
|
322
|
+
| `id` | `VARCHAR(64)` | ASCII-only, fixed max length |
|
|
323
|
+
| `boolean` | `BIT` | Native boolean |
|
|
324
|
+
| `integer`, `positiveint`, `unsignedint` | `INT` | 32-bit integer |
|
|
325
|
+
| `integer64` | `BIGINT` | 64-bit integer |
|
|
326
|
+
| `decimal` | `VARCHAR(MAX)` | Preserves arbitrary precision |
|
|
327
|
+
| `date` | `VARCHAR(10)` | Preserves partial dates (e.g., "2024-01") |
|
|
328
|
+
| `datetime` | `VARCHAR(50)` | Preserves partial datetimes and timezones |
|
|
329
|
+
| `instant` | `VARCHAR(50)` | Preserves full ISO 8601 format |
|
|
330
|
+
| `time` | `VARCHAR(20)` | Preserves partial times |
|
|
331
|
+
| `string`, `markdown`, `code` | `NVARCHAR(MAX)` | Unicode-capable text |
|
|
332
|
+
| `uri`, `url`, `canonical` | `NVARCHAR(MAX)` | Can contain Unicode (IRIs) |
|
|
333
|
+
| `uuid` | `VARCHAR(100)` | ASCII UUID format |
|
|
334
|
+
| `oid` | `VARCHAR(255)` | ASCII OID format |
|
|
335
|
+
| `base64binary` | `VARBINARY(MAX)` | Binary data |
|
|
336
|
+
|
|
337
|
+
**Design principle:** Default mappings use `VARCHAR` for temporal and numeric types to preserve FHIR semantics (partial dates, arbitrary precision decimals) rather than forcing conversion to SQL native types.
|
|
338
|
+
|
|
339
|
+
#### Using type hints
|
|
340
|
+
|
|
341
|
+
You can override default type mappings using the `tag` array on column definitions. Two tag types are supported:
|
|
342
|
+
|
|
343
|
+
**`tsql/type` - Direct T-SQL type specification:**
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"name": "birth_date",
|
|
348
|
+
"path": "birthDate",
|
|
349
|
+
"type": "date",
|
|
350
|
+
"tag": [
|
|
351
|
+
{ "name": "tsql/type", "value": "DATE" }
|
|
352
|
+
]
|
|
353
|
+
}
|
|
295
354
|
```
|
|
296
355
|
|
|
356
|
+
This generates a CAST expression: `CAST(JSON_VALUE(r.json, '$.birthDate') AS DATE) AS [birth_date]`
|
|
357
|
+
|
|
358
|
+
**`ansi/type` - ANSI/ISO SQL standard types (automatically converted to T-SQL):**
|
|
359
|
+
|
|
360
|
+
```json
|
|
361
|
+
{
|
|
362
|
+
"name": "age",
|
|
363
|
+
"path": "age",
|
|
364
|
+
"type": "integer",
|
|
365
|
+
"tag": [
|
|
366
|
+
{ "name": "ansi/type", "value": "INTEGER" }
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
The ANSI type `INTEGER` is automatically converted to T-SQL `INT`.
|
|
372
|
+
|
|
373
|
+
```json
|
|
374
|
+
{
|
|
375
|
+
"name": "active",
|
|
376
|
+
"path": "active",
|
|
377
|
+
"type": "boolean",
|
|
378
|
+
"tag": [
|
|
379
|
+
{ "name": "ansi/type", "value": "BOOLEAN" }
|
|
380
|
+
]
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
The ANSI type `BOOLEAN` is automatically converted to T-SQL `BIT`.
|
|
385
|
+
|
|
386
|
+
**Type precedence:** `tsql/type` > `ansi/type` > FHIR type defaults
|
|
387
|
+
|
|
388
|
+
**Supported ANSI types:**
|
|
389
|
+
- Character: `CHARACTER`, `CHARACTER VARYING`, `NATIONAL CHARACTER VARYING`
|
|
390
|
+
- Numeric: `INTEGER`, `SMALLINT`, `BIGINT`, `DECIMAL`, `NUMERIC`, `FLOAT`, `REAL`, `DOUBLE PRECISION`
|
|
391
|
+
- Temporal: `DATE`, `TIME`, `TIMESTAMP` (converted to `DATETIME2`)
|
|
392
|
+
- Boolean: `BOOLEAN` (converted to `BIT`)
|
|
393
|
+
|
|
394
|
+
**Example with multiple columns:**
|
|
395
|
+
|
|
396
|
+
This example demonstrates how different type hints affect the resulting SQL types:
|
|
397
|
+
|
|
398
|
+
```json
|
|
399
|
+
{
|
|
400
|
+
"resourceType": "ViewDefinition",
|
|
401
|
+
"resource": "Patient",
|
|
402
|
+
"select": [
|
|
403
|
+
{
|
|
404
|
+
"column": [
|
|
405
|
+
{
|
|
406
|
+
"name": "id",
|
|
407
|
+
"path": "id",
|
|
408
|
+
"type": "id"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"name": "birth_date",
|
|
412
|
+
"path": "birthDate",
|
|
413
|
+
"type": "date",
|
|
414
|
+
"tag": [
|
|
415
|
+
{ "name": "tsql/type", "value": "DATE" }
|
|
416
|
+
]
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"name": "deceased",
|
|
420
|
+
"path": "deceasedBoolean",
|
|
421
|
+
"type": "boolean",
|
|
422
|
+
"tag": [
|
|
423
|
+
{ "name": "ansi/type", "value": "BOOLEAN" }
|
|
424
|
+
]
|
|
425
|
+
}
|
|
426
|
+
]
|
|
427
|
+
}
|
|
428
|
+
]
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
Type behaviour for each column:
|
|
433
|
+
- `id` - Uses default FHIR type mapping: `VARCHAR(64)`
|
|
434
|
+
- `birth_date` - Overrides default `VARCHAR(10)` with T-SQL `DATE` type
|
|
435
|
+
- `deceased` - Uses ANSI `BOOLEAN` type, automatically converted to T-SQL `BIT`
|
|
436
|
+
|
|
297
437
|
## Database setup
|
|
298
438
|
|
|
299
439
|
### Table structure
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* FHIRPath expression transpiler to T-SQL.
|
|
3
3
|
* Converts FHIRPath expressions to equivalent T-SQL expressions for MS SQL Server.
|
|
4
4
|
*/
|
|
5
|
+
import type { ViewDefinitionColumnTag } from "../types.js";
|
|
5
6
|
import { TranspilerContext } from "./visitor";
|
|
6
7
|
export { TranspilerContext } from "./visitor";
|
|
7
8
|
export declare class Transpiler {
|
|
@@ -11,8 +12,45 @@ export declare class Transpiler {
|
|
|
11
12
|
static transpile(expression: string, context: TranspilerContext): string;
|
|
12
13
|
private static parseExpression;
|
|
13
14
|
/**
|
|
14
|
-
* Get the SQL data type for a
|
|
15
|
+
* Get the SQL data type for a FHIR type, with optional tag-based override.
|
|
16
|
+
*
|
|
17
|
+
* Default mappings are conservative to accommodate ALL valid FHIR data,
|
|
18
|
+
* using MAX sizes where needed and NVARCHAR for any fields that could
|
|
19
|
+
* potentially contain Unicode characters.
|
|
20
|
+
*
|
|
21
|
+
* Design principles:
|
|
22
|
+
* - Use NVARCHAR for fields that may contain Unicode (string, code, uri/url/canonical)
|
|
23
|
+
* - Use VARCHAR for ASCII-only fields (id, uuid, oid, decimal, dates/times)
|
|
24
|
+
* - Use MAX or generous fixed sizes to prevent truncation
|
|
25
|
+
* - Preserve FHIR semantics (partial dates, arbitrary precision decimals)
|
|
26
|
+
*
|
|
27
|
+
* Users can optimise storage using type tags:
|
|
28
|
+
* - 'tsql/type' - Direct T-SQL type (e.g., 'DATE', 'VARCHAR(50)')
|
|
29
|
+
* - 'ansi/type' - ANSI/ISO SQL standard type (e.g., 'INTEGER', 'CHARACTER(50)', 'BOOLEAN')
|
|
30
|
+
*
|
|
31
|
+
* Type precedence: tsql/type > ansi/type > FHIR type defaults
|
|
32
|
+
*
|
|
33
|
+
* Example tag usage:
|
|
34
|
+
* - { "name": "tsql/type", "value": "DATE" } - Use T-SQL DATE type
|
|
35
|
+
* - { "name": "ansi/type", "value": "INTEGER" } - Use ANSI INTEGER (converted to T-SQL INT)
|
|
36
|
+
* - { "name": "ansi/type", "value": "BOOLEAN" } - Use ANSI BOOLEAN (converted to T-SQL BIT)
|
|
37
|
+
*
|
|
38
|
+
* @param fhirType - FHIR primitive type name (e.g., 'string', 'integer')
|
|
39
|
+
* @param tags - Optional array of column tags for type hints
|
|
40
|
+
* @returns MS SQL Server type specification
|
|
15
41
|
*/
|
|
16
|
-
static inferSqlType(fhirType?: string): string;
|
|
42
|
+
static inferSqlType(fhirType?: string, tags?: ViewDefinitionColumnTag[]): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get type override from tsql/type or ansi/type tag if present.
|
|
45
|
+
*
|
|
46
|
+
* Precedence order:
|
|
47
|
+
* 1. tsql/type - Direct T-SQL type specification
|
|
48
|
+
* 2. ansi/type - ANSI/ISO SQL standard type (converted to T-SQL equivalent)
|
|
49
|
+
*/
|
|
50
|
+
private static getTagTypeOverride;
|
|
51
|
+
/**
|
|
52
|
+
* Get default MS SQL Server type mapping for a FHIR primitive type.
|
|
53
|
+
*/
|
|
54
|
+
private static getDefaultFhirTypeMapping;
|
|
17
55
|
}
|
|
18
56
|
//# sourceMappingURL=transpiler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transpiler.d.ts","sourceRoot":"","sources":["../../src/fhirpath/transpiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAyB,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM;IAkBxE,OAAO,CAAC,MAAM,CAAC,eAAe;IA4B9B
|
|
1
|
+
{"version":3,"file":"transpiler.d.ts","sourceRoot":"","sources":["../../src/fhirpath/transpiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAyB,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM;IAkBxE,OAAO,CAAC,MAAM,CAAC,eAAe;IA4B9B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,YAAY,CACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,uBAAuB,EAAE,GAC/B,MAAM;IAWT;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAuBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;CA0CzC"}
|
|
@@ -8,6 +8,7 @@ exports.Transpiler = void 0;
|
|
|
8
8
|
const antlr4ts_1 = require("antlr4ts");
|
|
9
9
|
const fhirpathLexer_1 = require("../generated/grammar/fhirpathLexer");
|
|
10
10
|
const fhirpathParser_1 = require("../generated/grammar/fhirpathParser");
|
|
11
|
+
const validation_js_1 = require("../validation.js");
|
|
11
12
|
const visitor_1 = require("./visitor");
|
|
12
13
|
class Transpiler {
|
|
13
14
|
/**
|
|
@@ -47,29 +48,98 @@ class Transpiler {
|
|
|
47
48
|
return { success: true, tree };
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
50
|
-
* Get the SQL data type for a
|
|
51
|
+
* Get the SQL data type for a FHIR type, with optional tag-based override.
|
|
52
|
+
*
|
|
53
|
+
* Default mappings are conservative to accommodate ALL valid FHIR data,
|
|
54
|
+
* using MAX sizes where needed and NVARCHAR for any fields that could
|
|
55
|
+
* potentially contain Unicode characters.
|
|
56
|
+
*
|
|
57
|
+
* Design principles:
|
|
58
|
+
* - Use NVARCHAR for fields that may contain Unicode (string, code, uri/url/canonical)
|
|
59
|
+
* - Use VARCHAR for ASCII-only fields (id, uuid, oid, decimal, dates/times)
|
|
60
|
+
* - Use MAX or generous fixed sizes to prevent truncation
|
|
61
|
+
* - Preserve FHIR semantics (partial dates, arbitrary precision decimals)
|
|
62
|
+
*
|
|
63
|
+
* Users can optimise storage using type tags:
|
|
64
|
+
* - 'tsql/type' - Direct T-SQL type (e.g., 'DATE', 'VARCHAR(50)')
|
|
65
|
+
* - 'ansi/type' - ANSI/ISO SQL standard type (e.g., 'INTEGER', 'CHARACTER(50)', 'BOOLEAN')
|
|
66
|
+
*
|
|
67
|
+
* Type precedence: tsql/type > ansi/type > FHIR type defaults
|
|
68
|
+
*
|
|
69
|
+
* Example tag usage:
|
|
70
|
+
* - { "name": "tsql/type", "value": "DATE" } - Use T-SQL DATE type
|
|
71
|
+
* - { "name": "ansi/type", "value": "INTEGER" } - Use ANSI INTEGER (converted to T-SQL INT)
|
|
72
|
+
* - { "name": "ansi/type", "value": "BOOLEAN" } - Use ANSI BOOLEAN (converted to T-SQL BIT)
|
|
73
|
+
*
|
|
74
|
+
* @param fhirType - FHIR primitive type name (e.g., 'string', 'integer')
|
|
75
|
+
* @param tags - Optional array of column tags for type hints
|
|
76
|
+
* @returns MS SQL Server type specification
|
|
51
77
|
*/
|
|
52
|
-
static inferSqlType(fhirType) {
|
|
78
|
+
static inferSqlType(fhirType, tags) {
|
|
79
|
+
// Check for tsql/type tag override.
|
|
80
|
+
const tagOverride = this.getTagTypeOverride(tags);
|
|
81
|
+
if (tagOverride) {
|
|
82
|
+
return tagOverride;
|
|
83
|
+
}
|
|
84
|
+
// Use default FHIR type mapping.
|
|
85
|
+
return this.getDefaultFhirTypeMapping(fhirType);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get type override from tsql/type or ansi/type tag if present.
|
|
89
|
+
*
|
|
90
|
+
* Precedence order:
|
|
91
|
+
* 1. tsql/type - Direct T-SQL type specification
|
|
92
|
+
* 2. ansi/type - ANSI/ISO SQL standard type (converted to T-SQL equivalent)
|
|
93
|
+
*/
|
|
94
|
+
static getTagTypeOverride(tags) {
|
|
95
|
+
if (!tags) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Check for tsql/type tag first (highest precedence)
|
|
99
|
+
const tsqlTypeTag = tags.find((tag) => tag.name === "tsql/type");
|
|
100
|
+
if (tsqlTypeTag) {
|
|
101
|
+
(0, validation_js_1.validateMsSqlType)(tsqlTypeTag.value);
|
|
102
|
+
return tsqlTypeTag.value;
|
|
103
|
+
}
|
|
104
|
+
// Check for ansi/type tag (lower precedence)
|
|
105
|
+
const ansiTypeTag = tags.find((tag) => tag.name === "ansi/type");
|
|
106
|
+
if (ansiTypeTag) {
|
|
107
|
+
return (0, validation_js_1.validateAnsiSqlType)(ansiTypeTag.value);
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get default MS SQL Server type mapping for a FHIR primitive type.
|
|
113
|
+
*/
|
|
114
|
+
static getDefaultFhirTypeMapping(fhirType) {
|
|
115
|
+
// Conservative default type mappings based on FHIR R4 constraints.
|
|
116
|
+
// Sized to accommodate ALL valid FHIR data.
|
|
117
|
+
// Uses NVARCHAR for potential Unicode, VARCHAR for ASCII-only.
|
|
53
118
|
const typeMap = {
|
|
54
|
-
|
|
119
|
+
// ASCII-only types with fixed constraints
|
|
120
|
+
id: "VARCHAR(64)",
|
|
121
|
+
boolean: "BIT",
|
|
122
|
+
integer: "INT",
|
|
123
|
+
positiveint: "INT",
|
|
124
|
+
unsignedint: "INT",
|
|
125
|
+
integer64: "BIGINT",
|
|
126
|
+
// ASCII-only structured formats
|
|
127
|
+
uuid: "VARCHAR(100)",
|
|
128
|
+
oid: "VARCHAR(255)",
|
|
129
|
+
decimal: "VARCHAR(MAX)",
|
|
130
|
+
date: "VARCHAR(10)",
|
|
131
|
+
datetime: "VARCHAR(50)",
|
|
132
|
+
instant: "VARCHAR(50)",
|
|
133
|
+
time: "VARCHAR(20)",
|
|
134
|
+
// Unicode-capable text types
|
|
55
135
|
string: "NVARCHAR(MAX)",
|
|
56
136
|
markdown: "NVARCHAR(MAX)",
|
|
57
137
|
code: "NVARCHAR(MAX)",
|
|
138
|
+
// URIs (can be IRIs with Unicode)
|
|
58
139
|
uri: "NVARCHAR(MAX)",
|
|
59
140
|
url: "NVARCHAR(MAX)",
|
|
60
141
|
canonical: "NVARCHAR(MAX)",
|
|
61
|
-
|
|
62
|
-
oid: "NVARCHAR(MAX)",
|
|
63
|
-
boolean: "BIT",
|
|
64
|
-
integer: "INT",
|
|
65
|
-
positiveint: "INT",
|
|
66
|
-
unsignedint: "INT",
|
|
67
|
-
integer64: "BIGINT",
|
|
68
|
-
decimal: "DECIMAL(18,6)",
|
|
69
|
-
date: "DATETIME2",
|
|
70
|
-
datetime: "DATETIME2",
|
|
71
|
-
instant: "DATETIME2",
|
|
72
|
-
time: "TIME",
|
|
142
|
+
// Binary data
|
|
73
143
|
base64binary: "VARBINARY(MAX)",
|
|
74
144
|
};
|
|
75
145
|
if (!fhirType) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transpiler.js","sourceRoot":"","sources":["../../src/fhirpath/transpiler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uCAA0D;AAC1D,sEAAmE;AACnE,wEAG6C;
|
|
1
|
+
{"version":3,"file":"transpiler.js","sourceRoot":"","sources":["../../src/fhirpath/transpiler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uCAA0D;AAC1D,sEAAmE;AACnE,wEAG6C;AAE7C,oDAA0E;AAC1E,uCAAqE;AAKrE,MAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,UAAkB,EAAE,OAA0B;QAC7D,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC;YACH,0CAA0C;YAC1C,MAAM,OAAO,GAAG,IAAI,+BAAqB,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,4CAA4C,UAAU,MAAM,KAAK,EAAE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,UAAkB;QAI/C,4BAA4B;QAC5B,MAAM,WAAW,GAAG,sBAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEvD,eAAe;QACf,MAAM,KAAK,GAAG,IAAI,6BAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,4BAAiB,CAAC,KAAK,CAAC,CAAC;QAEjD,gBAAgB;QAChB,MAAM,MAAM,GAAG,IAAI,+BAAc,CAAC,WAAW,CAAC,CAAC;QAE/C,yDAAyD;QACzD,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,8BAA8B;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAEvC,yBAAyB;QACzB,IAAI,MAAM,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,YAAY,CACjB,QAAiB,EACjB,IAAgC;QAEhC,oCAAoC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,iCAAiC;QACjC,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,kBAAkB,CAC/B,IAAgC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qDAAqD;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,IAAA,iCAAiB,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,WAAW,CAAC,KAAK,CAAC;QAC3B,CAAC;QAED,6CAA6C;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAA,mCAAmB,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,yBAAyB,CAAC,QAAiB;QACxD,mEAAmE;QACnE,4CAA4C;QAC5C,+DAA+D;QAC/D,MAAM,OAAO,GAA2B;YACtC,0CAA0C;YAC1C,EAAE,EAAE,aAAa;YACjB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,QAAQ;YAEnB,gCAAgC;YAChC,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,cAAc;YACnB,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,aAAa;YAEnB,6BAA6B;YAC7B,MAAM,EAAE,eAAe;YACvB,QAAQ,EAAE,eAAe;YACzB,IAAI,EAAE,eAAe;YAErB,kCAAkC;YAClC,GAAG,EAAE,eAAe;YACpB,GAAG,EAAE,eAAe;YACpB,SAAS,EAAE,eAAe;YAE1B,cAAc;YACd,YAAY,EAAE,gBAAgB;SAC/B,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,eAAe,CAAC;IAC5D,CAAC;CACF;AAvKD,gCAuKC"}
|
package/dist/load.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGpC;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA8C3C"}
|
package/dist/load.js
CHANGED
|
@@ -23,6 +23,7 @@ function getDryRunDatabaseConfig(commandOptions) {
|
|
|
23
23
|
password: commandOptions.password ?? "dummy",
|
|
24
24
|
database: commandOptions.database ?? "dummy",
|
|
25
25
|
trustServerCertificate: commandOptions.trustServerCertificate,
|
|
26
|
+
requestTimeout: commandOptions.requestTimeout,
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
@@ -42,6 +43,7 @@ function buildLoaderOptions(directory, commandOptions) {
|
|
|
42
43
|
password: commandOptions.password,
|
|
43
44
|
database: commandOptions.database,
|
|
44
45
|
trustServerCertificate: commandOptions.trustServerCertificate,
|
|
46
|
+
requestTimeout: commandOptions.requestTimeout,
|
|
45
47
|
});
|
|
46
48
|
return {
|
|
47
49
|
directory,
|
|
@@ -96,6 +98,7 @@ function createLoadCommand() {
|
|
|
96
98
|
.option("--password <password>", "Database password")
|
|
97
99
|
.option("--database <database>", "Database name")
|
|
98
100
|
.option("--trust-server-certificate", "Trust server certificate", false)
|
|
101
|
+
.option("--request-timeout <ms>", "Request timeout in milliseconds", parseInt, 300000)
|
|
99
102
|
.option("--pattern <pattern>", "File naming pattern (default: {ResourceType}.ndjson)")
|
|
100
103
|
.option("--resource-type <type>", "Only load specific resource type")
|
|
101
104
|
.option("--table-name <name>", "Table name (default: fhir_resources)")
|
package/dist/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";;AAEA;;;;GAIG;;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/loader/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAY,EAAE,KAAK,cAAc,EAA4B,MAAM,OAAO,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/loader/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAY,EAAE,KAAK,cAAc,EAA4B,MAAM,OAAO,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3E;AAED;;;;;;GAMG;AAEH,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAClC,cAAc,CAqChB"}
|
|
@@ -27,6 +27,7 @@ async function createConnectionPool(config) {
|
|
|
27
27
|
user: config.user,
|
|
28
28
|
password: config.password,
|
|
29
29
|
database: config.database,
|
|
30
|
+
requestTimeout: config.requestTimeout,
|
|
30
31
|
options: {
|
|
31
32
|
trustServerCertificate: config.trustServerCertificate ?? false,
|
|
32
33
|
// Enable multiple active result sets for parallel operations.
|
|
@@ -94,6 +95,10 @@ function getDatabaseConfigFromEnv(overrides) {
|
|
|
94
95
|
(process.env.MSSQL_PORT ? parseInt(process.env.MSSQL_PORT, 10) : 1433);
|
|
95
96
|
const trustServerCertificate = overrides?.trustServerCertificate ??
|
|
96
97
|
process.env.MSSQL_TRUST_SERVER_CERTIFICATE === "true";
|
|
98
|
+
const requestTimeout = overrides?.requestTimeout ??
|
|
99
|
+
(process.env.MSSQL_REQUEST_TIMEOUT
|
|
100
|
+
? parseInt(process.env.MSSQL_REQUEST_TIMEOUT, 10)
|
|
101
|
+
: undefined);
|
|
97
102
|
return {
|
|
98
103
|
host,
|
|
99
104
|
port,
|
|
@@ -101,6 +106,7 @@ function getDatabaseConfigFromEnv(overrides) {
|
|
|
101
106
|
password,
|
|
102
107
|
database,
|
|
103
108
|
trustServerCertificate,
|
|
109
|
+
requestTimeout,
|
|
104
110
|
};
|
|
105
111
|
}
|
|
106
112
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/loader/connection.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AAWH,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/loader/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/loader/tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAY,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/loader/tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAY,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAGjD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
package/dist/loader/tables.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.createTable = createTable;
|
|
|
14
14
|
exports.truncateTable = truncateTable;
|
|
15
15
|
exports.ensureTable = ensureTable;
|
|
16
16
|
const mssql_1 = __importDefault(require("mssql"));
|
|
17
|
+
const validation_js_1 = require("../validation.js");
|
|
17
18
|
/**
|
|
18
19
|
* Check if a table exists in the database.
|
|
19
20
|
*
|
|
@@ -42,6 +43,9 @@ async function tableExists(pool, schemaName, tableName) {
|
|
|
42
43
|
* @param tableName - Name of the table to create.
|
|
43
44
|
*/
|
|
44
45
|
async function createTable(pool, schemaName, tableName) {
|
|
46
|
+
// Validate identifiers to prevent SQL injection
|
|
47
|
+
(0, validation_js_1.validateSqlServerIdentifier)(schemaName, "Schema name");
|
|
48
|
+
(0, validation_js_1.validateSqlServerIdentifier)(tableName, "Table name");
|
|
45
49
|
// Create the table.
|
|
46
50
|
await pool.request().query(`
|
|
47
51
|
CREATE TABLE [${schemaName}].[${tableName}] (
|
|
@@ -64,6 +68,9 @@ async function createTable(pool, schemaName, tableName) {
|
|
|
64
68
|
* @param tableName - Name of the table to truncate.
|
|
65
69
|
*/
|
|
66
70
|
async function truncateTable(pool, schemaName, tableName) {
|
|
71
|
+
// Validate identifiers to prevent SQL injection
|
|
72
|
+
(0, validation_js_1.validateSqlServerIdentifier)(schemaName, "Schema name");
|
|
73
|
+
(0, validation_js_1.validateSqlServerIdentifier)(tableName, "Table name");
|
|
67
74
|
await pool.request().query(`TRUNCATE TABLE [${schemaName}].[${tableName}]`);
|
|
68
75
|
}
|
|
69
76
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/loader/tables.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/loader/tables.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAaH,kCAeC;AAUD,kCAuBC;AASD,sCAUC;AAUD,kCAeC;AAvGD,kDAAiD;AACjD,oDAA+D;AAE/D;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,UAAkB,EAClB,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI;SACtB,OAAO,EAAE;SACT,KAAK,CAAC,YAAY,EAAE,eAAG,CAAC,QAAQ,EAAE,UAAU,CAAC;SAC7C,KAAK,CAAC,WAAW,EAAE,eAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC;;;;KAIlD,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,UAAkB,EAClB,SAAiB;IAEjB,gDAAgD;IAChD,IAAA,2CAA2B,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,IAAA,2CAA2B,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAErD,oBAAoB;IACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;oBACT,UAAU,MAAM,SAAS;;;;;GAK1C,CAAC,CAAC;IAEH,6EAA6E;IAC7E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;uBACN,SAAS;UACtB,UAAU,MAAM,SAAS;GAChC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CACjC,IAAoB,EACpB,UAAkB,EAClB,SAAiB;IAEjB,gDAAgD;IAChD,IAAA,2CAA2B,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,IAAA,2CAA2B,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAErD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,mBAAmB,UAAU,MAAM,SAAS,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,UAAkB,EAClB,SAAiB,EACjB,WAAoB,KAAK;IAEzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
package/dist/loader/types.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface DatabaseConfig {
|
|
|
19
19
|
database: string;
|
|
20
20
|
/** Whether to trust the server certificate. */
|
|
21
21
|
trustServerCertificate?: boolean;
|
|
22
|
+
/** Request timeout in milliseconds (default: 300000). */
|
|
23
|
+
requestTimeout?: number;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
26
|
* Discovered NDJSON file with metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/loader/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,sBAAsB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/loader/types.ts"],"names":[],"mappings":"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"}
|