fhir-persistence 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/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/cjs/index.cjs +8869 -0
- package/dist/cjs/index.cjs.map +7 -0
- package/dist/cjs/index.d.ts +3114 -0
- package/dist/cjs/package.json +5 -0
- package/dist/esm/index.d.ts +3114 -0
- package/dist/esm/index.mjs +8745 -0
- package/dist/esm/index.mjs.map +7 -0
- package/dist/esm/package.json +5 -0
- package/dist/index.d.ts +3114 -0
- package/dist/lib/cache/resource-cache.d.ts +137 -0
- package/dist/lib/cache/resource-cache.d.ts.map +1 -0
- package/dist/lib/cli/reindex.d.ts +55 -0
- package/dist/lib/cli/reindex.d.ts.map +1 -0
- package/dist/lib/db/adapter.d.ts +79 -0
- package/dist/lib/db/adapter.d.ts.map +1 -0
- package/dist/lib/db/better-sqlite3-adapter.d.ts +65 -0
- package/dist/lib/db/better-sqlite3-adapter.d.ts.map +1 -0
- package/dist/lib/db/dialect.d.ts +87 -0
- package/dist/lib/db/dialect.d.ts.map +1 -0
- package/dist/lib/db/index.d.ts +18 -0
- package/dist/lib/db/index.d.ts.map +1 -0
- package/dist/lib/db/postgres-adapter.d.ts +84 -0
- package/dist/lib/db/postgres-adapter.d.ts.map +1 -0
- package/dist/lib/db/postgres-dialect.d.ts +36 -0
- package/dist/lib/db/postgres-dialect.d.ts.map +1 -0
- package/dist/lib/db/sqlite-adapter.d.ts +41 -0
- package/dist/lib/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/lib/db/sqlite-dialect.d.ts +34 -0
- package/dist/lib/db/sqlite-dialect.d.ts.map +1 -0
- package/dist/lib/index.d.ts +65 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/migration/ig-persistence-manager.d.ts +56 -0
- package/dist/lib/migration/ig-persistence-manager.d.ts.map +1 -0
- package/dist/lib/migration/migration-generator.d.ts +38 -0
- package/dist/lib/migration/migration-generator.d.ts.map +1 -0
- package/dist/lib/migration/reindex-scheduler.d.ts +82 -0
- package/dist/lib/migration/reindex-scheduler.d.ts.map +1 -0
- package/dist/lib/migration/schema-diff.d.ts +44 -0
- package/dist/lib/migration/schema-diff.d.ts.map +1 -0
- package/dist/lib/migrations/index.d.ts +8 -0
- package/dist/lib/migrations/index.d.ts.map +1 -0
- package/dist/lib/migrations/migration-runner.d.ts +102 -0
- package/dist/lib/migrations/migration-runner.d.ts.map +1 -0
- package/dist/lib/observability/search-logger.d.ts +74 -0
- package/dist/lib/observability/search-logger.d.ts.map +1 -0
- package/dist/lib/platform/platform-ig-definitions.d.ts +51 -0
- package/dist/lib/platform/platform-ig-definitions.d.ts.map +1 -0
- package/dist/lib/platform/platform-ig-loader.d.ts +30 -0
- package/dist/lib/platform/platform-ig-loader.d.ts.map +1 -0
- package/dist/lib/providers/definition-provider.d.ts +124 -0
- package/dist/lib/providers/definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/fhir-definition-provider.d.ts +58 -0
- package/dist/lib/providers/fhir-definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/fhir-runtime-provider.d.ts +75 -0
- package/dist/lib/providers/fhir-runtime-provider.d.ts.map +1 -0
- package/dist/lib/providers/in-memory-definition-provider.d.ts +72 -0
- package/dist/lib/providers/in-memory-definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/index.d.ts +13 -0
- package/dist/lib/providers/index.d.ts.map +1 -0
- package/dist/lib/providers/property-path-runtime-provider.d.ts +34 -0
- package/dist/lib/providers/property-path-runtime-provider.d.ts.map +1 -0
- package/dist/lib/providers/runtime-provider.d.ts +84 -0
- package/dist/lib/providers/runtime-provider.d.ts.map +1 -0
- package/dist/lib/registry/element-cardinality.d.ts +15 -0
- package/dist/lib/registry/element-cardinality.d.ts.map +1 -0
- package/dist/lib/registry/index.d.ts +10 -0
- package/dist/lib/registry/index.d.ts.map +1 -0
- package/dist/lib/registry/package-registry-repo.d.ts +106 -0
- package/dist/lib/registry/package-registry-repo.d.ts.map +1 -0
- package/dist/lib/registry/search-parameter-registry.d.ts +175 -0
- package/dist/lib/registry/search-parameter-registry.d.ts.map +1 -0
- package/dist/lib/registry/structure-definition-registry.d.ts +93 -0
- package/dist/lib/registry/structure-definition-registry.d.ts.map +1 -0
- package/dist/lib/repo/errors.d.ts +61 -0
- package/dist/lib/repo/errors.d.ts.map +1 -0
- package/dist/lib/repo/history-bundle.d.ts +78 -0
- package/dist/lib/repo/history-bundle.d.ts.map +1 -0
- package/dist/lib/repo/index.d.ts +17 -0
- package/dist/lib/repo/index.d.ts.map +1 -0
- package/dist/lib/repo/indexing-pipeline.d.ts +108 -0
- package/dist/lib/repo/indexing-pipeline.d.ts.map +1 -0
- package/dist/lib/repo/lookup-table-writer.d.ts +46 -0
- package/dist/lib/repo/lookup-table-writer.d.ts.map +1 -0
- package/dist/lib/repo/reference-indexer.d.ts +56 -0
- package/dist/lib/repo/reference-indexer.d.ts.map +1 -0
- package/dist/lib/repo/row-builder.d.ts +78 -0
- package/dist/lib/repo/row-builder.d.ts.map +1 -0
- package/dist/lib/repo/row-indexer.d.ts +111 -0
- package/dist/lib/repo/row-indexer.d.ts.map +1 -0
- package/dist/lib/repo/sql-builder.d.ts +166 -0
- package/dist/lib/repo/sql-builder.d.ts.map +1 -0
- package/dist/lib/repo/types.d.ts +321 -0
- package/dist/lib/repo/types.d.ts.map +1 -0
- package/dist/lib/schema/ddl-generator.d.ts +81 -0
- package/dist/lib/schema/ddl-generator.d.ts.map +1 -0
- package/dist/lib/schema/index.d.ts +8 -0
- package/dist/lib/schema/index.d.ts.map +1 -0
- package/dist/lib/schema/table-schema-builder.d.ts +66 -0
- package/dist/lib/schema/table-schema-builder.d.ts.map +1 -0
- package/dist/lib/schema/table-schema.d.ts +236 -0
- package/dist/lib/schema/table-schema.d.ts.map +1 -0
- package/dist/lib/search/index.d.ts +22 -0
- package/dist/lib/search/index.d.ts.map +1 -0
- package/dist/lib/search/pagination.d.ts +53 -0
- package/dist/lib/search/pagination.d.ts.map +1 -0
- package/dist/lib/search/param-parser.d.ts +85 -0
- package/dist/lib/search/param-parser.d.ts.map +1 -0
- package/dist/lib/search/search-bundle.d.ts +61 -0
- package/dist/lib/search/search-bundle.d.ts.map +1 -0
- package/dist/lib/search/search-executor.d.ts +58 -0
- package/dist/lib/search/search-executor.d.ts.map +1 -0
- package/dist/lib/search/search-planner.d.ts +57 -0
- package/dist/lib/search/search-planner.d.ts.map +1 -0
- package/dist/lib/search/search-sql-builder.d.ts +86 -0
- package/dist/lib/search/search-sql-builder.d.ts.map +1 -0
- package/dist/lib/search/types.d.ts +219 -0
- package/dist/lib/search/types.d.ts.map +1 -0
- package/dist/lib/search/where-builder.d.ts +64 -0
- package/dist/lib/search/where-builder.d.ts.map +1 -0
- package/dist/lib/startup/fhir-system.d.ts +82 -0
- package/dist/lib/startup/fhir-system.d.ts.map +1 -0
- package/dist/lib/store/conditional-service.d.ts +76 -0
- package/dist/lib/store/conditional-service.d.ts.map +1 -0
- package/dist/lib/store/fhir-persistence.d.ts +81 -0
- package/dist/lib/store/fhir-persistence.d.ts.map +1 -0
- package/dist/lib/store/fhir-store.d.ts +44 -0
- package/dist/lib/store/fhir-store.d.ts.map +1 -0
- package/dist/lib/terminology/terminology-code-repo.d.ts +61 -0
- package/dist/lib/terminology/terminology-code-repo.d.ts.map +1 -0
- package/dist/lib/terminology/valueset-repo.d.ts +76 -0
- package/dist/lib/terminology/valueset-repo.d.ts.map +1 -0
- package/dist/lib/transaction/bundle-processor.d.ts +84 -0
- package/dist/lib/transaction/bundle-processor.d.ts.map +1 -0
- package/dist/lib/transaction/urn-resolver.d.ts +62 -0
- package/dist/lib/transaction/urn-resolver.d.ts.map +1 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/package.json +87 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FhirStore — v2 CRUD Facade
|
|
3
|
+
*
|
|
4
|
+
* Provides create / read / update / delete / history operations
|
|
5
|
+
* against any StorageAdapter implementation (SQLite, PostgreSQL, etc.).
|
|
6
|
+
*
|
|
7
|
+
* Design decisions:
|
|
8
|
+
* - Uses StorageAdapter interface (not DatabaseClient directly)
|
|
9
|
+
* - All writes are transactional (BEGIN IMMEDIATE on SQLite)
|
|
10
|
+
* - Soft delete: deleted=1, content preserved (ADR-08)
|
|
11
|
+
* - Optimistic locking via versionId (If-Match / ETag)
|
|
12
|
+
* - History ordered by versionSeq DESC
|
|
13
|
+
* - No projectId (single-tenant)
|
|
14
|
+
*
|
|
15
|
+
* @module fhir-persistence/store
|
|
16
|
+
*/
|
|
17
|
+
import type { StorageAdapter } from '../db/adapter.js';
|
|
18
|
+
import type { FhirResource, PersistedResource, HistoryEntry } from '../repo/types.js';
|
|
19
|
+
import type { ReferenceRowV2 } from '../repo/reference-indexer.js';
|
|
20
|
+
export interface CreateResourceOptions {
|
|
21
|
+
/** Pre-assigned ID (used in batch/transaction). */
|
|
22
|
+
assignedId?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface UpdateResourceOptions {
|
|
25
|
+
/** Expected versionId for optimistic locking (If-Match header). */
|
|
26
|
+
ifMatch?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface HistoryOptions {
|
|
29
|
+
since?: string;
|
|
30
|
+
count?: number;
|
|
31
|
+
cursor?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class FhirStore {
|
|
34
|
+
private readonly adapter;
|
|
35
|
+
constructor(adapter: StorageAdapter);
|
|
36
|
+
createResource<T extends FhirResource>(resourceType: string, resource: T, options?: CreateResourceOptions): Promise<T & PersistedResource>;
|
|
37
|
+
readResource(resourceType: string, id: string): Promise<PersistedResource>;
|
|
38
|
+
updateResource<T extends FhirResource>(resourceType: string, resource: T, options?: UpdateResourceOptions): Promise<T & PersistedResource>;
|
|
39
|
+
deleteResource(resourceType: string, id: string): Promise<void>;
|
|
40
|
+
readVersion(resourceType: string, id: string, versionId: string): Promise<PersistedResource>;
|
|
41
|
+
readHistory(resourceType: string, id: string, options?: HistoryOptions): Promise<HistoryEntry[]>;
|
|
42
|
+
writeReferences(resourceType: string, resourceId: string, refs: ReferenceRowV2[]): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=fhir-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fhir-store.d.ts","sourceRoot":"","sources":["../../../src/store/fhir-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EAGb,MAAM,kBAAkB,CAAC;AAgB1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAMnE,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAM9C,cAAc,CAAC,CAAC,SAAS,YAAY,EACzC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC;IAmD3B,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwB1E,cAAc,CAAC,CAAC,SAAS,YAAY,EACzC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC;IAwF3B,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD/D,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC;IAkBvB,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,YAAY,EAAE,CAAC;IA6BpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;CAYjB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminology Code Repository
|
|
3
|
+
*
|
|
4
|
+
* Persists CodeSystem codes as a display cache in `terminology_codes`.
|
|
5
|
+
* Provides fast lookup by (system, code) and by code alone.
|
|
6
|
+
*
|
|
7
|
+
* Key design decisions:
|
|
8
|
+
* - Uses StorageAdapter (not DatabaseClient)
|
|
9
|
+
* - `?` placeholders for SQLite compatibility
|
|
10
|
+
* - `INSERT OR IGNORE` for idempotent batch inserts
|
|
11
|
+
* - PRIMARY KEY (system, code) — composite
|
|
12
|
+
* - INDEX (code) for lookupByCode without system
|
|
13
|
+
*
|
|
14
|
+
* @module fhir-persistence/terminology
|
|
15
|
+
*/
|
|
16
|
+
import type { StorageAdapter } from '../db/adapter.js';
|
|
17
|
+
export interface TerminologyCode {
|
|
18
|
+
/** Code system URI (e.g., "http://loinc.org"). */
|
|
19
|
+
system: string;
|
|
20
|
+
/** Code value (e.g., "8480-6"). */
|
|
21
|
+
code: string;
|
|
22
|
+
/** Human-readable display text. */
|
|
23
|
+
display: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class TerminologyCodeRepo {
|
|
26
|
+
private readonly adapter;
|
|
27
|
+
constructor(adapter: StorageAdapter);
|
|
28
|
+
/**
|
|
29
|
+
* Ensure the terminology_codes table and indexes exist.
|
|
30
|
+
*/
|
|
31
|
+
ensureTable(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Batch insert codes. Duplicates are silently ignored (INSERT OR IGNORE).
|
|
34
|
+
*
|
|
35
|
+
* @param codes - Array of codes to insert.
|
|
36
|
+
* @returns Number of codes actually inserted (excluding duplicates).
|
|
37
|
+
*/
|
|
38
|
+
batchInsert(codes: TerminologyCode[]): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Lookup display text for a specific (system, code) pair.
|
|
41
|
+
*
|
|
42
|
+
* @returns Display text, or undefined if not found.
|
|
43
|
+
*/
|
|
44
|
+
lookup(system: string, code: string): Promise<string | undefined>;
|
|
45
|
+
/**
|
|
46
|
+
* Lookup all codes matching a code value (any system).
|
|
47
|
+
* Useful for code-only search without specifying system.
|
|
48
|
+
*
|
|
49
|
+
* @returns Array of matching TerminologyCode entries.
|
|
50
|
+
*/
|
|
51
|
+
lookupByCode(code: string): Promise<TerminologyCode[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Get the total number of codes in the table.
|
|
54
|
+
*/
|
|
55
|
+
getCodeCount(): Promise<number>;
|
|
56
|
+
/**
|
|
57
|
+
* Remove all codes from the table.
|
|
58
|
+
*/
|
|
59
|
+
clear(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=terminology-code-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminology-code-repo.d.ts","sourceRoot":"","sources":["../../../src/terminology/terminology-code-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B5D;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IASvE;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQ5D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAQrC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ValueSet Repository
|
|
3
|
+
*
|
|
4
|
+
* Persists FHIR ValueSet resources in `terminology_valuesets`.
|
|
5
|
+
* Each ValueSet is uniquely identified by (url, version).
|
|
6
|
+
*
|
|
7
|
+
* Key design decisions:
|
|
8
|
+
* - Uses StorageAdapter (not DatabaseClient)
|
|
9
|
+
* - `?` placeholders for SQLite compatibility
|
|
10
|
+
* - `INSERT OR REPLACE` for upsert semantics
|
|
11
|
+
* - PRIMARY KEY (url, version) — composite
|
|
12
|
+
* - Content stored as JSON text
|
|
13
|
+
*
|
|
14
|
+
* @module fhir-persistence/terminology
|
|
15
|
+
*/
|
|
16
|
+
import type { StorageAdapter } from '../db/adapter.js';
|
|
17
|
+
export interface StoredValueSet {
|
|
18
|
+
/** ValueSet canonical URL (e.g., "http://hl7.org/fhir/ValueSet/observation-codes"). */
|
|
19
|
+
url: string;
|
|
20
|
+
/** ValueSet version (e.g., "4.0.1"). */
|
|
21
|
+
version: string;
|
|
22
|
+
/** ValueSet name (human-readable). */
|
|
23
|
+
name: string | null;
|
|
24
|
+
/** Full ValueSet content as JSON string. */
|
|
25
|
+
content: string;
|
|
26
|
+
/** When this record was stored. */
|
|
27
|
+
storedAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ValueSetInput {
|
|
30
|
+
url: string;
|
|
31
|
+
version: string;
|
|
32
|
+
name?: string;
|
|
33
|
+
content: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class ValueSetRepo {
|
|
36
|
+
private readonly adapter;
|
|
37
|
+
constructor(adapter: StorageAdapter);
|
|
38
|
+
/**
|
|
39
|
+
* Ensure the terminology_valuesets table exists.
|
|
40
|
+
*/
|
|
41
|
+
ensureTable(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Insert or update a ValueSet.
|
|
44
|
+
* If a ValueSet with the same (url, version) exists, it is replaced.
|
|
45
|
+
*/
|
|
46
|
+
upsert(input: ValueSetInput): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Get a specific ValueSet by url and version.
|
|
49
|
+
*
|
|
50
|
+
* @returns The stored ValueSet, or undefined if not found.
|
|
51
|
+
*/
|
|
52
|
+
getValueSet(url: string, version: string): Promise<StoredValueSet | undefined>;
|
|
53
|
+
/**
|
|
54
|
+
* Get all versions of a ValueSet by URL.
|
|
55
|
+
*
|
|
56
|
+
* @returns Array of stored ValueSets, ordered by version.
|
|
57
|
+
*/
|
|
58
|
+
getByUrl(url: string): Promise<StoredValueSet[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Get all stored ValueSets.
|
|
61
|
+
*/
|
|
62
|
+
getAll(): Promise<StoredValueSet[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Remove a specific ValueSet by url and version.
|
|
65
|
+
*/
|
|
66
|
+
remove(url: string, version: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get the total number of stored ValueSets.
|
|
69
|
+
*/
|
|
70
|
+
getValueSetCount(): Promise<number>;
|
|
71
|
+
/**
|
|
72
|
+
* Remove all stored ValueSets.
|
|
73
|
+
*/
|
|
74
|
+
clear(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=valueset-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueset-repo.d.ts","sourceRoot":"","sources":["../../../src/terminology/valueset-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,WAAW,cAAc;IAC7B,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAuBD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQpF;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOzC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAQzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle Processor — v2
|
|
3
|
+
*
|
|
4
|
+
* Processes FHIR Bundle resources of type `transaction` and `batch`
|
|
5
|
+
* using FhirStore + StorageAdapter (not FhirRepository).
|
|
6
|
+
*
|
|
7
|
+
* Key differences from v1 (src/repo/bundle-processor.ts):
|
|
8
|
+
* - Uses `FhirStore` for CRUD (not `FhirRepository`)
|
|
9
|
+
* - Uses `StorageAdapter.transaction()` for atomic transactions
|
|
10
|
+
* - `urn:uuid:` carries resourceType via `UrnTarget`
|
|
11
|
+
* - Batch rejects `urn:uuid:` references (returns 400)
|
|
12
|
+
* - Supports `If-None-Exist` conditional create
|
|
13
|
+
* - `?` placeholders (SQLite), `deleted = 0` (INTEGER)
|
|
14
|
+
*
|
|
15
|
+
* @module fhir-persistence/transaction
|
|
16
|
+
*/
|
|
17
|
+
import type { FhirResource, PersistedResource } from '../repo/types.js';
|
|
18
|
+
import type { StorageAdapter } from '../db/adapter.js';
|
|
19
|
+
import type { FhirStore } from '../store/fhir-store.js';
|
|
20
|
+
/**
|
|
21
|
+
* A single entry in a FHIR Bundle.
|
|
22
|
+
*/
|
|
23
|
+
export interface BundleEntry {
|
|
24
|
+
fullUrl?: string;
|
|
25
|
+
resource?: FhirResource;
|
|
26
|
+
request?: {
|
|
27
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
28
|
+
url: string;
|
|
29
|
+
/** If-None-Exist header for conditional create. */
|
|
30
|
+
ifNoneExist?: string;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A FHIR Bundle resource.
|
|
35
|
+
*/
|
|
36
|
+
export interface Bundle {
|
|
37
|
+
resourceType: 'Bundle';
|
|
38
|
+
type: 'transaction' | 'batch';
|
|
39
|
+
entry?: BundleEntry[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Result entry for a single bundle operation.
|
|
43
|
+
*/
|
|
44
|
+
export interface BundleResponseEntry {
|
|
45
|
+
resource?: PersistedResource;
|
|
46
|
+
response: {
|
|
47
|
+
status: string;
|
|
48
|
+
location?: string;
|
|
49
|
+
etag?: string;
|
|
50
|
+
lastModified?: string;
|
|
51
|
+
outcome?: {
|
|
52
|
+
issue: Array<{
|
|
53
|
+
severity: string;
|
|
54
|
+
code: string;
|
|
55
|
+
diagnostics: string;
|
|
56
|
+
}>;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Result of processing a bundle.
|
|
62
|
+
*/
|
|
63
|
+
export interface BundleResponse {
|
|
64
|
+
resourceType: 'Bundle';
|
|
65
|
+
type: 'transaction-response' | 'batch-response';
|
|
66
|
+
entry: BundleResponseEntry[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* v2: Process a transaction bundle — all-or-nothing.
|
|
70
|
+
*
|
|
71
|
+
* All entries are processed within a single StorageAdapter transaction.
|
|
72
|
+
* If any entry fails, the entire transaction is rolled back.
|
|
73
|
+
*
|
|
74
|
+
* Entry processing order: strict sequential (no reorder).
|
|
75
|
+
*/
|
|
76
|
+
export declare function processTransactionV2(store: FhirStore, adapter: StorageAdapter, bundle: Bundle): Promise<BundleResponse>;
|
|
77
|
+
/**
|
|
78
|
+
* v2: Process a batch bundle — each entry independently.
|
|
79
|
+
*
|
|
80
|
+
* Each entry is processed in its own try/catch.
|
|
81
|
+
* urn:uuid references are rejected in batch mode (return 400).
|
|
82
|
+
*/
|
|
83
|
+
export declare function processBatchV2(store: FhirStore, bundle: Bundle): Promise<BundleResponse>;
|
|
84
|
+
//# sourceMappingURL=bundle-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-processor.d.ts","sourceRoot":"","sources":["../../../src/transaction/bundle-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAYxD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC1C,GAAG,EAAE,MAAM,CAAC;QACZ,mDAAmD;QACnD,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,QAAQ,CAAC;IACvB,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC;KACrF,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,QAAQ,CAAC;IACvB,IAAI,EAAE,sBAAsB,GAAG,gBAAgB,CAAC;IAChD,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AA4BD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CA0CzB;AAMD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CAwCzB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URN Resolver — v2
|
|
3
|
+
*
|
|
4
|
+
* Builds a mapping from `urn:uuid:` references to actual resource IDs,
|
|
5
|
+
* and deep-resolves those references within FHIR resources.
|
|
6
|
+
*
|
|
7
|
+
* Key differences from v1 (src/repo/bundle-processor.ts inline logic):
|
|
8
|
+
* - Extracted into a dedicated module for testability
|
|
9
|
+
* - `UrnTarget` carries `resourceType` (not just the string "Type/id")
|
|
10
|
+
* - `deepResolveUrns` is iterative (no recursion depth limit needed)
|
|
11
|
+
* - Only replaces `.reference` fields (FHIR Reference type)
|
|
12
|
+
*
|
|
13
|
+
* @module fhir-persistence/transaction
|
|
14
|
+
*/
|
|
15
|
+
import type { FhirResource } from '../repo/types.js';
|
|
16
|
+
/**
|
|
17
|
+
* A resolved URN target with explicit resourceType.
|
|
18
|
+
*/
|
|
19
|
+
export interface UrnTarget {
|
|
20
|
+
/** The assigned resource ID. */
|
|
21
|
+
id: string;
|
|
22
|
+
/** The FHIR resource type (e.g., "Patient"). */
|
|
23
|
+
resourceType: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A single entry in a FHIR Bundle (minimal shape for URN resolution).
|
|
27
|
+
*/
|
|
28
|
+
export interface BundleEntryForUrn {
|
|
29
|
+
fullUrl?: string;
|
|
30
|
+
resource?: FhirResource;
|
|
31
|
+
request?: {
|
|
32
|
+
method: string;
|
|
33
|
+
url: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build a mapping from `urn:uuid:` fullUrls to assigned IDs + resourceTypes.
|
|
38
|
+
*
|
|
39
|
+
* Only processes POST entries with `urn:uuid:` fullUrl.
|
|
40
|
+
* Each matching entry gets a newly generated UUID as its assigned ID.
|
|
41
|
+
*
|
|
42
|
+
* The returned map has two key formats for each entry:
|
|
43
|
+
* - `"urn:uuid:<uuid>"` → `UrnTarget` (for fullUrl-based lookup)
|
|
44
|
+
*
|
|
45
|
+
* @param entries - Bundle entries to scan.
|
|
46
|
+
* @returns Map from urn:uuid string to UrnTarget.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildUrnMap(entries: BundleEntryForUrn[]): Map<string, UrnTarget>;
|
|
49
|
+
/**
|
|
50
|
+
* Replace `urn:uuid:` references in a resource with actual `Type/id` references.
|
|
51
|
+
*
|
|
52
|
+
* Only replaces values in `.reference` fields (FHIR Reference type)
|
|
53
|
+
* to avoid accidental replacement in narratives or identifiers.
|
|
54
|
+
*
|
|
55
|
+
* Uses structured deep-walk (iterative stack, not recursive).
|
|
56
|
+
*
|
|
57
|
+
* @param resource - The FHIR resource to resolve (will be cloned).
|
|
58
|
+
* @param urnMap - Map from urn:uuid strings to UrnTarget.
|
|
59
|
+
* @returns A new resource with resolved references.
|
|
60
|
+
*/
|
|
61
|
+
export declare function deepResolveUrns<T extends FhirResource>(resource: T, urnMap: Map<string, UrnTarget>): T;
|
|
62
|
+
//# sourceMappingURL=urn-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urn-resolver.d.ts","sourceRoot":"","sources":["../../../src/transaction/urn-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAkBhF;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,CAAC,CA0CH"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
+
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
+
{
|
|
4
|
+
"tsdocVersion": "0.12",
|
|
5
|
+
"toolPackages": [
|
|
6
|
+
{
|
|
7
|
+
"packageName": "@microsoft/api-extractor",
|
|
8
|
+
"packageVersion": "7.57.7"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fhir-persistence",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Embedded FHIR R4 persistence layer — CRUD, search, indexing, schema migration over SQLite and PostgreSQL",
|
|
5
|
+
"homepage": "https://github.com/medxaidev/fhir-persistence#readme",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Fangjun <fangjun20208@gmail.com>",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"fhir",
|
|
10
|
+
"fhir-r4",
|
|
11
|
+
"fhir-persistence",
|
|
12
|
+
"fhir-server",
|
|
13
|
+
"fhir-search",
|
|
14
|
+
"hl7",
|
|
15
|
+
"healthcare",
|
|
16
|
+
"sqlite",
|
|
17
|
+
"postgresql",
|
|
18
|
+
"embedded-database",
|
|
19
|
+
"schema-migration",
|
|
20
|
+
"search-indexing",
|
|
21
|
+
"typescript",
|
|
22
|
+
"interoperability",
|
|
23
|
+
"clinical",
|
|
24
|
+
"ehr"
|
|
25
|
+
],
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/medxaidev/fhir-persistence.git"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/medxaidev/fhir-persistence/issues"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"registry": "https://registry.npmjs.org/"
|
|
36
|
+
},
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"type": "module",
|
|
39
|
+
"main": "./dist/cjs/index.cjs",
|
|
40
|
+
"module": "./dist/esm/index.mjs",
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"exports": {
|
|
43
|
+
".": {
|
|
44
|
+
"import": {
|
|
45
|
+
"types": "./dist/esm/index.d.ts",
|
|
46
|
+
"default": "./dist/esm/index.mjs"
|
|
47
|
+
},
|
|
48
|
+
"require": {
|
|
49
|
+
"types": "./dist/cjs/index.d.ts",
|
|
50
|
+
"default": "./dist/cjs/index.cjs"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"./package.json": "./package.json"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"README.md",
|
|
58
|
+
"LICENSE",
|
|
59
|
+
"CHANGELOG.md"
|
|
60
|
+
],
|
|
61
|
+
"scripts": {
|
|
62
|
+
"clean": "rimraf dist",
|
|
63
|
+
"build": "npm run clean && tsc && node ./scripts/esbuild.mjs",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"prepublishOnly": "npm run test && npm run build"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"better-sqlite3": "^12.6.2",
|
|
69
|
+
"fhir-definition": "^0.5.0",
|
|
70
|
+
"fhir-runtime": "^0.8.1",
|
|
71
|
+
"sql.js": "^1.14.1"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@microsoft/api-extractor": "^7.57.7",
|
|
75
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
76
|
+
"@types/node": "25.2.0",
|
|
77
|
+
"esbuild": "0.27.2",
|
|
78
|
+
"rimraf": "6.1.2",
|
|
79
|
+
"tsx": "4.21.0",
|
|
80
|
+
"typescript": "5.9.3",
|
|
81
|
+
"vitest": "4.0.18"
|
|
82
|
+
},
|
|
83
|
+
"engines": {
|
|
84
|
+
"node": ">=18.0.0",
|
|
85
|
+
"npm": ">=9.0.0"
|
|
86
|
+
}
|
|
87
|
+
}
|