@openhi/constructs 0.0.85 → 0.0.86
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/lib/{chunk-SWSN6GDD.mjs → chunk-CEOAGPYY.mjs} +1 -5
- package/lib/chunk-CEOAGPYY.mjs.map +1 -0
- package/lib/chunk-X5MHU7DA.mjs +298 -0
- package/lib/chunk-X5MHU7DA.mjs.map +1 -0
- package/lib/data-store-postgres-replication.handler.d.mts +55 -0
- package/lib/data-store-postgres-replication.handler.d.ts +55 -0
- package/lib/data-store-postgres-replication.handler.js +448 -0
- package/lib/data-store-postgres-replication.handler.js.map +1 -0
- package/lib/data-store-postgres-replication.handler.mjs +313 -0
- package/lib/data-store-postgres-replication.handler.mjs.map +1 -0
- package/lib/firehose-archive-transform.handler.js +0 -4
- package/lib/firehose-archive-transform.handler.js.map +1 -1
- package/lib/firehose-archive-transform.handler.mjs +5 -290
- package/lib/firehose-archive-transform.handler.mjs.map +1 -1
- package/lib/index.d.mts +201 -5
- package/lib/index.d.ts +202 -6
- package/lib/index.js +392 -92
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +381 -81
- package/lib/index.mjs.map +1 -1
- package/lib/rest-api-lambda.handler.js +636 -153
- package/lib/rest-api-lambda.handler.js.map +1 -1
- package/lib/rest-api-lambda.handler.mjs +639 -153
- package/lib/rest-api-lambda.handler.mjs.map +1 -1
- package/package.json +21 -13
- package/scripts/generate-operations.js +2 -2
- package/scripts/generate-routes.js +1 -1
- package/lib/chunk-SWSN6GDD.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openhi/constructs",
|
|
3
3
|
"devDependencies": {
|
|
4
|
-
"@
|
|
4
|
+
"@microsoft/api-extractor": "7.58.7",
|
|
5
|
+
"@swc/core": "^1.15.33",
|
|
5
6
|
"@swc/jest": "^0.2.39",
|
|
6
7
|
"@types/express": "5.0.6",
|
|
7
8
|
"@types/jest": "^30.0.0",
|
|
8
|
-
"@types/node": "25.
|
|
9
|
+
"@types/node": "25.6.0",
|
|
10
|
+
"@types/pg": "^8.20.0",
|
|
9
11
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
10
12
|
"@typescript-eslint/parser": "^8",
|
|
11
|
-
"aws-cdk-lib": "2.
|
|
13
|
+
"aws-cdk-lib": "2.252.0",
|
|
12
14
|
"commit-and-tag-version": "^12",
|
|
13
15
|
"constructs": "10.6.0",
|
|
14
16
|
"copyfiles": "^2.4.1",
|
|
17
|
+
"embedded-postgres": "^18.3.0-beta.17",
|
|
15
18
|
"eslint": "^9",
|
|
16
19
|
"eslint-config-prettier": "^10.1.8",
|
|
17
20
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
18
21
|
"eslint-plugin-import": "^2.32.0",
|
|
22
|
+
"eslint-plugin-jsdoc": "^62.9.0",
|
|
19
23
|
"eslint-plugin-prettier": "^5.5.5",
|
|
24
|
+
"eslint-plugin-tsdoc": "^0.5.2",
|
|
20
25
|
"jest": "^30.3.0",
|
|
21
26
|
"jest-dynalite": "^3.6.1",
|
|
22
27
|
"jest-junit": "^16",
|
|
@@ -27,15 +32,17 @@
|
|
|
27
32
|
"typescript": "^5.9.3"
|
|
28
33
|
},
|
|
29
34
|
"peerDependencies": {
|
|
30
|
-
"aws-cdk-lib": "2.
|
|
35
|
+
"aws-cdk-lib": "2.252.0",
|
|
31
36
|
"constructs": "10.6.0"
|
|
32
37
|
},
|
|
33
38
|
"dependencies": {
|
|
34
|
-
"@aws-sdk/client-dynamodb": "^3.
|
|
35
|
-
"@aws-sdk/client-eventbridge": "^3.
|
|
36
|
-
"@aws-sdk/client-
|
|
37
|
-
"@aws-sdk/client-
|
|
38
|
-
"@
|
|
39
|
+
"@aws-sdk/client-dynamodb": "^3.1041.0",
|
|
40
|
+
"@aws-sdk/client-eventbridge": "^3.1041.0",
|
|
41
|
+
"@aws-sdk/client-rds-data": "^3.1041.0",
|
|
42
|
+
"@aws-sdk/client-s3": "^3.1041.0",
|
|
43
|
+
"@aws-sdk/client-secrets-manager": "^3.1041.0",
|
|
44
|
+
"@aws-sdk/client-ssm": "^3.1041.0",
|
|
45
|
+
"@codedrifters/utils": "^0.0.22",
|
|
39
46
|
"@codegenie/serverless-express": "^4.17.1",
|
|
40
47
|
"@types/aws-lambda": "^8.10.161",
|
|
41
48
|
"awscdk-appsync-utils": "^0.0.858",
|
|
@@ -43,15 +50,16 @@
|
|
|
43
50
|
"electrodb": "^3.7.5",
|
|
44
51
|
"esbuild": "^0.28.0",
|
|
45
52
|
"express": "^5.2.1",
|
|
53
|
+
"pg": "^8.20.0",
|
|
46
54
|
"type-fest": "^4",
|
|
47
55
|
"ulid": "^3.0.2",
|
|
48
|
-
"@openhi/
|
|
49
|
-
"@openhi/
|
|
56
|
+
"@openhi/types": "0.0.0",
|
|
57
|
+
"@openhi/config": "0.0.0"
|
|
50
58
|
},
|
|
51
59
|
"devEngines": {
|
|
52
60
|
"packageManager": {
|
|
53
61
|
"name": "pnpm",
|
|
54
|
-
"version": "10.33.
|
|
62
|
+
"version": "10.33.2",
|
|
55
63
|
"onFail": "ignore"
|
|
56
64
|
}
|
|
57
65
|
},
|
|
@@ -60,7 +68,7 @@
|
|
|
60
68
|
"publishConfig": {
|
|
61
69
|
"access": "public"
|
|
62
70
|
},
|
|
63
|
-
"version": "0.0.
|
|
71
|
+
"version": "0.0.86",
|
|
64
72
|
"types": "lib/index.d.ts",
|
|
65
73
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm exec projen\".",
|
|
66
74
|
"scripts": {
|
|
@@ -169,7 +169,7 @@ import {
|
|
|
169
169
|
} from "../../data-operations-common";
|
|
170
170
|
|
|
171
171
|
/**
|
|
172
|
-
* List ${type}s in a workspace (
|
|
172
|
+
* List ${type}s in a workspace (GSI1, sharded). Returns domain result for adapters to map to FHIR Bundle or other formats.
|
|
173
173
|
*
|
|
174
174
|
* @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md
|
|
175
175
|
*/
|
|
@@ -180,7 +180,7 @@ export type ${type}ListEntry = ListEntry<${type}>;
|
|
|
180
180
|
export type List${pluralLabel(type)}Result = ListResult<${type}>;
|
|
181
181
|
|
|
182
182
|
/**
|
|
183
|
-
* Lists all ${type}s in the workspace. Uses
|
|
183
|
+
* Lists all ${type}s in the workspace. Uses GSI1 (Unified Sharded List per ADR-011).
|
|
184
184
|
* Throws on service errors; adapters map to HTTP/GraphQL/Step Function.
|
|
185
185
|
*/
|
|
186
186
|
export async function ${listOp}(
|
|
@@ -134,7 +134,7 @@ import {
|
|
|
134
134
|
|
|
135
135
|
/**
|
|
136
136
|
* GET /${type} — search/list: returns a FHIR Bundle (searchset) from the data store.
|
|
137
|
-
* Uses
|
|
137
|
+
* Uses GSI1 (Unified Sharded List per ADR-011) to list all ${type}s in the workspace without a table scan.
|
|
138
138
|
*/
|
|
139
139
|
export async function ${listRoute}(
|
|
140
140
|
req: Request,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/dynamodb/dynamodb-stream-record.ts","../src/components/dynamodb/data-store-change-events.ts"],"sourcesContent":["import type { AttributeValue } from \"@aws-sdk/client-dynamodb\";\n\n/**\n * Shape of a DynamoDB change record as delivered inside Kinesis (table stream\n * destination) and decoded by the Firehose transform Lambda.\n */\nexport interface DynamoDbStreamKinesisRecord {\n eventName?: string;\n userIdentity?: unknown;\n dynamodb?: {\n Keys?: Record<string, AttributeValue>;\n NewImage?: Record<string, AttributeValue>;\n OldImage?: Record<string, AttributeValue>;\n SequenceNumber?: string;\n ApproximateCreationDateTime?: number;\n };\n}\n\nexport function dynamodbValueToJs(av: AttributeValue): unknown {\n if (av.S !== undefined) {\n return av.S;\n }\n if (av.N !== undefined) {\n return av.N.includes(\".\")\n ? Number.parseFloat(av.N)\n : Number.parseInt(av.N, 10);\n }\n if (av.BOOL !== undefined) {\n return av.BOOL;\n }\n if (av.NULL !== undefined) {\n return null;\n }\n if (av.M !== undefined) {\n return dynamodbImageToPlain(av.M);\n }\n if (av.L !== undefined) {\n return av.L.map((x: AttributeValue) => dynamodbValueToJs(x));\n }\n if (av.SS !== undefined) {\n return av.SS;\n }\n if (av.NS !== undefined) {\n return av.NS.map((n: string) =>\n n.includes(\".\") ? Number.parseFloat(n) : Number.parseInt(n, 10),\n );\n }\n return undefined;\n}\n\nexport function dynamodbImageToPlain(\n image: Record<string, AttributeValue>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(image)) {\n out[k] = dynamodbValueToJs(v);\n }\n return out;\n}\n","import type { AttributeValue } from \"@aws-sdk/client-dynamodb\";\nimport type { DynamoDbStreamKinesisRecord } from \"./dynamodb-stream-record\";\nimport { dynamodbImageToPlain } from \"./dynamodb-stream-record\";\n\n/**\n * EventBridge envelope constants for data-store CDC (no CDK imports).\n * @see docs/architecture/adr/2026-03-02-01-dynamodb-stream-to-data-event-bus.md\n */\nexport const DATA_STORE_CHANGE_EVENT_SOURCE = \"openhi.data.store\";\n\nexport const DATA_STORE_CHANGE_DETAIL_TYPE = \"FhirCurrentResourceChanged\";\n\n/** AWS PutEvents per-entry detail limit is 256 KiB; stay under for headroom. */\nexport const DATA_STORE_CHANGE_DETAIL_MAX_UTF8_BYTES = 250 * 1024;\n\nconst EXCLUDED_CHANGE_DETAIL_KEYS = new Set([\n \"PK\",\n \"SK\",\n \"GSI1PK\",\n \"GSI1SK\",\n \"GSI2PK\",\n \"GSI2SK\",\n \"GSI3PK\",\n \"GSI3SK\",\n \"GSI4PK\",\n \"GSI4SK\",\n /** Full FHIR JSON may contain PII; never list or ship in the bus payload. */\n \"resource\",\n]);\n\nfunction shallowValueEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction changedNonResourceAttributeNames(\n oldImage: Record<string, unknown> | undefined,\n newImage: Record<string, unknown> | undefined,\n): string[] | undefined {\n if (!oldImage || !newImage) {\n return undefined;\n }\n const names = new Set<string>();\n const keys = new Set([...Object.keys(oldImage), ...Object.keys(newImage)]);\n for (const k of keys) {\n if (EXCLUDED_CHANGE_DETAIL_KEYS.has(k)) {\n continue;\n }\n if (!shallowValueEqual(oldImage[k], newImage[k])) {\n names.add(k);\n }\n }\n return names.size > 0 ? [...names].sort() : undefined;\n}\n\n/** Non-excluded attribute names present on an item (for INSERT / REMOVE). */\nfunction presentMetadataAttributeNames(\n image: Record<string, unknown> | undefined,\n): string[] | undefined {\n if (!image) {\n return undefined;\n }\n const names = Object.keys(image).filter(\n (k) => !EXCLUDED_CHANGE_DETAIL_KEYS.has(k),\n );\n return names.length > 0 ? names.sort() : undefined;\n}\n\nfunction plainImage(\n image: Record<string, AttributeValue> | undefined,\n): Record<string, unknown> | undefined {\n if (!image) {\n return undefined;\n }\n return dynamodbImageToPlain(image);\n}\n\nexport interface FhirCurrentResourceChangeDetail {\n changeType: \"INSERT\" | \"MODIFY\" | \"REMOVE\";\n tenantId: string;\n workspaceId: string;\n resourceType: string;\n resourceId: string;\n resourceVersion: string;\n streamSequenceNumber?: string;\n /** Seconds since UNIX epoch (DynamoDB Streams `ApproximateCreationDateTime`). */\n approximateCreationEpochSec?: number;\n /**\n * MODIFY: attributes whose values differ between old and new images.\n * INSERT / REMOVE: attributes present on the written or removed image (metadata only).\n */\n changedAttributeNames?: string[];\n}\n\nexport function buildFhirCurrentResourceChangeDetail(\n record: DynamoDbStreamKinesisRecord,\n keys: {\n tenantId: string;\n workspaceId: string;\n resourceType: string;\n resourceId: string;\n version: string;\n },\n): FhirCurrentResourceChangeDetail {\n const rawName = record.eventName;\n const changeType =\n rawName === \"INSERT\" || rawName === \"MODIFY\" || rawName === \"REMOVE\"\n ? rawName\n : \"MODIFY\";\n\n const seq = record.dynamodb?.SequenceNumber;\n const approxEpochSec = record.dynamodb?.ApproximateCreationDateTime;\n\n const newPlain = plainImage(\n record.dynamodb?.NewImage as Record<string, AttributeValue> | undefined,\n );\n const oldPlain = plainImage(\n record.dynamodb?.OldImage as Record<string, AttributeValue> | undefined,\n );\n\n let changedAttributeNames: string[] | undefined;\n if (changeType === \"MODIFY\") {\n changedAttributeNames = changedNonResourceAttributeNames(\n oldPlain,\n newPlain,\n );\n } else if (changeType === \"INSERT\") {\n changedAttributeNames = presentMetadataAttributeNames(newPlain);\n } else {\n changedAttributeNames = presentMetadataAttributeNames(oldPlain);\n }\n\n return {\n changeType,\n tenantId: keys.tenantId,\n workspaceId: keys.workspaceId,\n resourceType: keys.resourceType,\n resourceId: keys.resourceId,\n resourceVersion: keys.version,\n ...(typeof seq === \"string\" && seq.length > 0\n ? { streamSequenceNumber: seq }\n : {}),\n ...(typeof approxEpochSec === \"number\" && Number.isFinite(approxEpochSec)\n ? { approximateCreationEpochSec: approxEpochSec }\n : {}),\n ...(changedAttributeNames ? { changedAttributeNames } : {}),\n };\n}\n"],"mappings":"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","names":[]}
|