@ovok/native 1.12.1 → 1.13.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.
Files changed (53) hide show
  1. package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js +7 -5
  2. package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js.map +1 -1
  3. package/lib/commonjs/modules/data-sync/services/managers/data-processor.js +4 -5
  4. package/lib/commonjs/modules/data-sync/services/managers/data-processor.js.map +1 -1
  5. package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js +12 -5
  6. package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js.map +1 -1
  7. package/lib/commonjs/modules/data-sync/types/health-sync-batch-error.js +18 -0
  8. package/lib/commonjs/modules/data-sync/types/health-sync-batch-error.js.map +1 -1
  9. package/lib/commonjs/modules/data-sync/utils/identify-imported-observations.js +70 -0
  10. package/lib/commonjs/modules/data-sync/utils/identify-imported-observations.js.map +1 -0
  11. package/lib/module/modules/data-sync/services/base-health-sync-service.js +7 -5
  12. package/lib/module/modules/data-sync/services/base-health-sync-service.js.map +1 -1
  13. package/lib/module/modules/data-sync/services/managers/data-processor.js +4 -5
  14. package/lib/module/modules/data-sync/services/managers/data-processor.js.map +1 -1
  15. package/lib/module/modules/data-sync/services/managers/storage-manager.js +12 -5
  16. package/lib/module/modules/data-sync/services/managers/storage-manager.js.map +1 -1
  17. package/lib/module/modules/data-sync/types/health-sync-batch-error.js +18 -0
  18. package/lib/module/modules/data-sync/types/health-sync-batch-error.js.map +1 -1
  19. package/lib/module/modules/data-sync/utils/identify-imported-observations.js +65 -0
  20. package/lib/module/modules/data-sync/utils/identify-imported-observations.js.map +1 -0
  21. package/lib/typescript/commonjs/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
  22. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/data-processor.d.ts +2 -2
  23. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/data-processor.d.ts.map +1 -1
  24. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts +7 -2
  25. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/src/modules/data-sync/types/health-sync-batch-error.d.ts.map +1 -1
  27. package/lib/typescript/commonjs/src/modules/data-sync/utils/identify-imported-observations.d.ts +25 -0
  28. package/lib/typescript/commonjs/src/modules/data-sync/utils/identify-imported-observations.d.ts.map +1 -0
  29. package/lib/typescript/module/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
  30. package/lib/typescript/module/src/modules/data-sync/services/managers/data-processor.d.ts +2 -2
  31. package/lib/typescript/module/src/modules/data-sync/services/managers/data-processor.d.ts.map +1 -1
  32. package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts +7 -2
  33. package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
  34. package/lib/typescript/module/src/modules/data-sync/types/health-sync-batch-error.d.ts.map +1 -1
  35. package/lib/typescript/module/src/modules/data-sync/utils/identify-imported-observations.d.ts +25 -0
  36. package/lib/typescript/module/src/modules/data-sync/utils/identify-imported-observations.d.ts.map +1 -0
  37. package/package.json +3 -3
  38. package/lib/commonjs/modules/data-sync/utils/generate-observation-entry.js +0 -108
  39. package/lib/commonjs/modules/data-sync/utils/generate-observation-entry.js.map +0 -1
  40. package/lib/commonjs/modules/data-sync/utils/save-bundle-observations.js +0 -100
  41. package/lib/commonjs/modules/data-sync/utils/save-bundle-observations.js.map +0 -1
  42. package/lib/module/modules/data-sync/utils/generate-observation-entry.js +0 -103
  43. package/lib/module/modules/data-sync/utils/generate-observation-entry.js.map +0 -1
  44. package/lib/module/modules/data-sync/utils/save-bundle-observations.js +0 -95
  45. package/lib/module/modules/data-sync/utils/save-bundle-observations.js.map +0 -1
  46. package/lib/typescript/commonjs/src/modules/data-sync/utils/generate-observation-entry.d.ts +0 -21
  47. package/lib/typescript/commonjs/src/modules/data-sync/utils/generate-observation-entry.d.ts.map +0 -1
  48. package/lib/typescript/commonjs/src/modules/data-sync/utils/save-bundle-observations.d.ts +0 -11
  49. package/lib/typescript/commonjs/src/modules/data-sync/utils/save-bundle-observations.d.ts.map +0 -1
  50. package/lib/typescript/module/src/modules/data-sync/utils/generate-observation-entry.d.ts +0 -21
  51. package/lib/typescript/module/src/modules/data-sync/utils/generate-observation-entry.d.ts.map +0 -1
  52. package/lib/typescript/module/src/modules/data-sync/utils/save-bundle-observations.d.ts +0 -11
  53. package/lib/typescript/module/src/modules/data-sync/utils/save-bundle-observations.d.ts.map +0 -1
@@ -1,103 +0,0 @@
1
- "use strict";
2
-
3
- import { OBSERVATION_SYNC_ID_SYSTEM, OBSERVATION_SYNC_PROVIDER_SYSTEM } from "./fhir-systems.js";
4
- import { getHealthRecordIdentifier } from "./get-health-record-sync-id.js";
5
- import { isDailyAggregateMode } from "./is-daily-aggregate-mode.js";
6
- import { replacesSavedObservation } from "./replaces-saved-observation.js";
7
- const getObservationCode = observation => observation.code?.coding?.map(coding => `${coding.system ?? ""}|${coding.code ?? ""}`).join("~") || observation.code?.text || "unknown";
8
- const getObservationTime = observation => {
9
- if (observation.effectivePeriod) {
10
- return `${observation.effectivePeriod.start ?? ""}:${observation.effectivePeriod.end ?? ""}`;
11
- }
12
- return observation.effectiveDateTime?.slice(0, 19) ?? "unknown";
13
- };
14
- const getStableObservationId = ({
15
- observation,
16
- provider,
17
- sourceId,
18
- bodyIndex
19
- }) => observation.id && !sourceId ? `${provider}:${observation.id}` : [provider, sourceId ?? getObservationTime(observation), getObservationCode(observation), bodyIndex].join(":");
20
- const createBundleUuid = () => {
21
- const cryptoApi = globalThis.crypto;
22
- const randomUuid = typeof cryptoApi === "object" && cryptoApi !== null && "randomUUID" in cryptoApi && typeof cryptoApi.randomUUID === "function" ? cryptoApi.randomUUID : undefined;
23
- if (randomUuid) {
24
- return randomUuid.call(cryptoApi);
25
- }
26
- const bytes = Array.from({
27
- length: 16
28
- }, () => Math.floor(Math.random() * 256));
29
- bytes[6] = bytes[6] & 0x0f | 0x40;
30
- bytes[8] = bytes[8] & 0x3f | 0x80;
31
- const hex = bytes.map(byte => byte.toString(16).padStart(2, "0")).join("");
32
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
33
- };
34
- const generateObservationEntry = ({
35
- groupedObservationBodies,
36
- provider,
37
- groupedObservationSyncIds,
38
- groupedRecordIds,
39
- patientId,
40
- mode
41
- }) => {
42
- return groupedObservationBodies.map((observationBodies, groupIndex) => {
43
- const fullUrls = observationBodies.map(() => `urn:uuid:${createBundleUuid()}`);
44
- const recordId = groupedRecordIds?.[groupIndex];
45
- return observationBodies.map((observationBody, bodyIndex) => {
46
- const syncIdentifier = getStableObservationId({
47
- observation: observationBody,
48
- provider,
49
- sourceId: groupedObservationSyncIds?.[groupIndex],
50
- bodyIndex
51
- });
52
- const fullUrl = fullUrls[bodyIndex];
53
- const searchParams = new URLSearchParams();
54
- const isDailyAggregate = isDailyAggregateMode(mode);
55
- const replaces = replacesSavedObservation(mode);
56
- const legacySyncIdentifier = isDailyAggregate && observationBody.id ? `${provider}:${observationBody.id}` : undefined;
57
- const syncIdentifiers = Array.from(new Set([syncIdentifier, legacySyncIdentifier].filter(Boolean)));
58
- searchParams.set("identifier", syncIdentifiers.map(identifier => `${OBSERVATION_SYNC_ID_SYSTEM}|${identifier}`).join(","));
59
- if (patientId) {
60
- searchParams.set("subject", `Patient/${patientId}`);
61
- }
62
- const search = searchParams.toString();
63
- const observationResource = {
64
- ...observationBody
65
- };
66
- if (replaces) {
67
- delete observationResource.id;
68
- }
69
- return {
70
- fullUrl,
71
- request: {
72
- method: replaces ? "PUT" : "POST",
73
- url: replaces ? `Observation?${search}` : "Observation",
74
- ...(replaces ? {} : {
75
- ifNoneExist: search
76
- })
77
- },
78
- resource: {
79
- ...observationResource,
80
- identifier: [...(observationBody.identifier || []), {
81
- system: OBSERVATION_SYNC_PROVIDER_SYSTEM,
82
- value: provider
83
- }, {
84
- system: OBSERVATION_SYNC_ID_SYSTEM,
85
- value: syncIdentifier
86
- }, ...(recordId ? [getHealthRecordIdentifier(provider, recordId)] : [])],
87
- device: {
88
- ...(observationBody.device ?? {}),
89
- identifier: {
90
- system: OBSERVATION_SYNC_PROVIDER_SYSTEM,
91
- value: provider
92
- }
93
- },
94
- hasMember: bodyIndex === 0 ? [] : [{
95
- reference: fullUrls[0]
96
- }]
97
- }
98
- };
99
- });
100
- }).flat();
101
- };
102
- export { generateObservationEntry, getStableObservationId };
103
- //# sourceMappingURL=generate-observation-entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["OBSERVATION_SYNC_ID_SYSTEM","OBSERVATION_SYNC_PROVIDER_SYSTEM","getHealthRecordIdentifier","isDailyAggregateMode","replacesSavedObservation","getObservationCode","observation","code","coding","map","system","join","text","getObservationTime","effectivePeriod","start","end","effectiveDateTime","slice","getStableObservationId","provider","sourceId","bodyIndex","id","createBundleUuid","cryptoApi","globalThis","crypto","randomUuid","randomUUID","undefined","call","bytes","Array","from","length","Math","floor","random","hex","byte","toString","padStart","generateObservationEntry","groupedObservationBodies","groupedObservationSyncIds","groupedRecordIds","patientId","mode","observationBodies","groupIndex","fullUrls","recordId","observationBody","syncIdentifier","fullUrl","searchParams","URLSearchParams","isDailyAggregate","replaces","legacySyncIdentifier","syncIdentifiers","Set","filter","Boolean","set","identifier","search","observationResource","request","method","url","ifNoneExist","resource","value","device","hasMember","reference","flat"],"sourceRoot":"../../../../../src","sources":["modules/data-sync/utils/generate-observation-entry.ts"],"mappings":"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","ignoreList":[]}
@@ -1,95 +0,0 @@
1
- "use strict";
2
-
3
- import { HealthSyncBatchError } from "../types/health-sync-batch-error.js";
4
- const MAX_HEALTH_IMPORT_BUNDLE_BYTES = 900_000;
5
- const getByteLength = value => {
6
- const TextEncoderConstructor = globalThis.TextEncoder;
7
- if (TextEncoderConstructor) {
8
- return new TextEncoderConstructor().encode(value).byteLength;
9
- }
10
- return encodeURIComponent(value).replace(/%[0-9A-F]{2}|./g, "_").length;
11
- };
12
- const getBundleByteLength = entries => getByteLength(JSON.stringify({
13
- resourceType: "Bundle",
14
- type: "batch",
15
- entry: entries
16
- }));
17
- const getMemberReference = entry => {
18
- const observation = entry.resource;
19
- return observation?.hasMember?.[0]?.reference;
20
- };
21
- const groupMeasurementEntries = entries => {
22
- const rootUrls = new Set(entries.map(entry => entry.fullUrl).filter(Boolean));
23
- const groups = new Map();
24
- entries.forEach((entry, index) => {
25
- const key = getMemberReference(entry) && rootUrls.has(getMemberReference(entry)) ? getMemberReference(entry) : entry.fullUrl ?? `entry-${index}`;
26
- const group = groups.get(key) ?? [];
27
- group.push(entry);
28
- groups.set(key, group);
29
- });
30
- return [...groups.values()];
31
- };
32
- const serializeBatch = entries => getBundleByteLength(entries);
33
- const splitHealthImportEntries = (entries, maxBytes = MAX_HEALTH_IMPORT_BUNDLE_BYTES) => {
34
- const batches = [];
35
- let current = [];
36
- for (const group of groupMeasurementEntries(entries)) {
37
- const candidate = [...current, ...group];
38
- if (current.length > 0 && serializeBatch(candidate) > maxBytes) {
39
- batches.push(current);
40
- current = [];
41
- }
42
- current.push(...group);
43
- }
44
- if (current.length > 0) {
45
- batches.push(current);
46
- }
47
- return batches;
48
- };
49
- const createBatchError = (bundle, expectedEntries) => {
50
- const responseEntries = bundle.entry ?? [];
51
- const statusCounts = new Map();
52
- responseEntries.forEach(entry => {
53
- const status = entry.response?.status ?? "missing status";
54
- if (status.startsWith("2")) {
55
- return;
56
- }
57
- statusCounts.set(status, (statusCounts.get(status) ?? 0) + 1);
58
- });
59
- const missingCount = Math.max(expectedEntries - responseEntries.length, 0);
60
- if (missingCount > 0) {
61
- statusCounts.set("missing status", (statusCounts.get("missing status") ?? 0) + missingCount);
62
- }
63
- const summary = [...statusCounts.entries()].map(([status, count]) => `${status} × ${count}`).join(", ");
64
- const error = new HealthSyncBatchError(`Health import batch did not save every entry (${summary || "unknown status"})`, bundle);
65
- return error;
66
- };
67
- const saveBundleObservations = async ({
68
- entries,
69
- client
70
- }) => {
71
- const responseBundles = [];
72
- for (const batchEntries of splitHealthImportEntries(entries)) {
73
- const bundle = await client.executeBatch({
74
- resourceType: "Bundle",
75
- type: "batch",
76
- entry: batchEntries
77
- });
78
- const responseEntries = bundle.entry ?? [];
79
- const hasMissingResponse = responseEntries.length !== batchEntries.length;
80
- const hasRejectedEntry = responseEntries.some(entry => !entry.response?.status.startsWith("2"));
81
- if (hasMissingResponse || hasRejectedEntry) {
82
- throw createBatchError(bundle, batchEntries.length);
83
- }
84
- responseBundles.push(bundle);
85
- }
86
- return {
87
- ...(responseBundles[0] ?? {
88
- resourceType: "Bundle",
89
- type: "batch-response"
90
- }),
91
- entry: responseBundles.flatMap(bundle => bundle.entry ?? [])
92
- };
93
- };
94
- export { MAX_HEALTH_IMPORT_BUNDLE_BYTES, saveBundleObservations, splitHealthImportEntries };
95
- //# sourceMappingURL=save-bundle-observations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["HealthSyncBatchError","MAX_HEALTH_IMPORT_BUNDLE_BYTES","getByteLength","value","TextEncoderConstructor","globalThis","TextEncoder","encode","byteLength","encodeURIComponent","replace","length","getBundleByteLength","entries","JSON","stringify","resourceType","type","entry","getMemberReference","observation","resource","hasMember","reference","groupMeasurementEntries","rootUrls","Set","map","fullUrl","filter","Boolean","groups","Map","forEach","index","key","has","group","get","push","set","values","serializeBatch","splitHealthImportEntries","maxBytes","batches","current","candidate","createBatchError","bundle","expectedEntries","responseEntries","statusCounts","status","response","startsWith","missingCount","Math","max","summary","count","join","error","saveBundleObservations","client","responseBundles","batchEntries","executeBatch","hasMissingResponse","hasRejectedEntry","some","flatMap"],"sourceRoot":"../../../../../src","sources":["modules/data-sync/utils/save-bundle-observations.ts"],"mappings":"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","ignoreList":[]}
@@ -1,21 +0,0 @@
1
- import { BundleEntry, Observation } from "@medplum/fhirtypes";
2
- import { HealthProvider } from "../types/health-provider";
3
- import { HealthDataMode } from "../types/health-sync-keys";
4
- type GenerateObservationEntryProps = {
5
- groupedObservationBodies: Observation[][];
6
- provider: HealthProvider;
7
- groupedObservationSyncIds?: Array<string | undefined>;
8
- /** Each group's source record, which a deletion of that record finds it by. */
9
- groupedRecordIds?: Array<string | undefined>;
10
- patientId?: string;
11
- mode?: HealthDataMode;
12
- };
13
- declare const getStableObservationId: ({ observation, provider, sourceId, bodyIndex, }: {
14
- observation: Observation;
15
- provider: HealthProvider;
16
- sourceId?: string;
17
- bodyIndex: number;
18
- }) => string;
19
- declare const generateObservationEntry: ({ groupedObservationBodies, provider, groupedObservationSyncIds, groupedRecordIds, patientId, mode, }: GenerateObservationEntryProps) => BundleEntry<Observation>[];
20
- export { generateObservationEntry, getStableObservationId };
21
- //# sourceMappingURL=generate-observation-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-observation-entry.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/data-sync/utils/generate-observation-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO3D,KAAK,6BAA6B,GAAG;IACnC,wBAAwB,EAAE,WAAW,EAAE,EAAE,CAAC;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,yBAAyB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEtD,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAiBF,QAAA,MAAM,sBAAsB,GAAI,iDAK7B;IACD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,MAQa,CAAC;AA6BlB,QAAA,MAAM,wBAAwB,GAAI,uGAO/B,6BAA6B,KAAG,WAAW,CAAC,WAAW,CAAC,EA6F1D,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,CAAC"}
@@ -1,11 +0,0 @@
1
- import { Bundle, BundleEntry } from "@medplum/fhirtypes";
2
- import { OvokClient } from "@ovok/core";
3
- declare const MAX_HEALTH_IMPORT_BUNDLE_BYTES = 900000;
4
- type SaveBundleObservationsProps = {
5
- entries: BundleEntry[];
6
- client: OvokClient;
7
- };
8
- declare const splitHealthImportEntries: (entries: BundleEntry[], maxBytes?: number) => BundleEntry[][];
9
- declare const saveBundleObservations: ({ entries, client, }: SaveBundleObservationsProps) => Promise<Bundle<import("@medplum/fhirtypes").Resource>>;
10
- export { MAX_HEALTH_IMPORT_BUNDLE_BYTES, saveBundleObservations, splitHealthImportEntries, };
11
- //# sourceMappingURL=save-bundle-observations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"save-bundle-observations.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/data-sync/utils/save-bundle-observations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,QAAA,MAAM,8BAA8B,SAAU,CAAC;AAE/C,KAAK,2BAA2B,GAAG;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAoDF,QAAA,MAAM,wBAAwB,GAC5B,SAAS,WAAW,EAAE,EACtB,iBAAyC,KACxC,WAAW,EAAE,EAuBf,CAAC;AAwCF,QAAA,MAAM,sBAAsB,GAAU,sBAGnC,2BAA2B,2DA+B7B,CAAC;AAEF,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,wBAAwB,GACzB,CAAC"}
@@ -1,21 +0,0 @@
1
- import { BundleEntry, Observation } from "@medplum/fhirtypes";
2
- import { HealthProvider } from "../types/health-provider";
3
- import { HealthDataMode } from "../types/health-sync-keys";
4
- type GenerateObservationEntryProps = {
5
- groupedObservationBodies: Observation[][];
6
- provider: HealthProvider;
7
- groupedObservationSyncIds?: Array<string | undefined>;
8
- /** Each group's source record, which a deletion of that record finds it by. */
9
- groupedRecordIds?: Array<string | undefined>;
10
- patientId?: string;
11
- mode?: HealthDataMode;
12
- };
13
- declare const getStableObservationId: ({ observation, provider, sourceId, bodyIndex, }: {
14
- observation: Observation;
15
- provider: HealthProvider;
16
- sourceId?: string;
17
- bodyIndex: number;
18
- }) => string;
19
- declare const generateObservationEntry: ({ groupedObservationBodies, provider, groupedObservationSyncIds, groupedRecordIds, patientId, mode, }: GenerateObservationEntryProps) => BundleEntry<Observation>[];
20
- export { generateObservationEntry, getStableObservationId };
21
- //# sourceMappingURL=generate-observation-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-observation-entry.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/data-sync/utils/generate-observation-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO3D,KAAK,6BAA6B,GAAG;IACnC,wBAAwB,EAAE,WAAW,EAAE,EAAE,CAAC;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,yBAAyB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEtD,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAiBF,QAAA,MAAM,sBAAsB,GAAI,iDAK7B;IACD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,MAQa,CAAC;AA6BlB,QAAA,MAAM,wBAAwB,GAAI,uGAO/B,6BAA6B,KAAG,WAAW,CAAC,WAAW,CAAC,EA6F1D,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,CAAC"}
@@ -1,11 +0,0 @@
1
- import { Bundle, BundleEntry } from "@medplum/fhirtypes";
2
- import { OvokClient } from "@ovok/core";
3
- declare const MAX_HEALTH_IMPORT_BUNDLE_BYTES = 900000;
4
- type SaveBundleObservationsProps = {
5
- entries: BundleEntry[];
6
- client: OvokClient;
7
- };
8
- declare const splitHealthImportEntries: (entries: BundleEntry[], maxBytes?: number) => BundleEntry[][];
9
- declare const saveBundleObservations: ({ entries, client, }: SaveBundleObservationsProps) => Promise<Bundle<import("@medplum/fhirtypes").Resource>>;
10
- export { MAX_HEALTH_IMPORT_BUNDLE_BYTES, saveBundleObservations, splitHealthImportEntries, };
11
- //# sourceMappingURL=save-bundle-observations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"save-bundle-observations.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/data-sync/utils/save-bundle-observations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,QAAA,MAAM,8BAA8B,SAAU,CAAC;AAE/C,KAAK,2BAA2B,GAAG;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAoDF,QAAA,MAAM,wBAAwB,GAC5B,SAAS,WAAW,EAAE,EACtB,iBAAyC,KACxC,WAAW,EAAE,EAuBf,CAAC;AAwCF,QAAA,MAAM,sBAAsB,GAAU,sBAGnC,2BAA2B,2DA+B7B,CAAC;AAEF,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,wBAAwB,GACzB,CAAC"}