@metriport/shared 0.32.3 → 0.32.4

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.
@@ -16,7 +16,7 @@ export declare const SUFFIXES: readonly ["jr", "junior", "sr", "senior", "ii", "
16
16
  export type Prefix = (typeof PREFIXES)[number];
17
17
  export type Suffix = (typeof SUFFIXES)[number];
18
18
  export declare const PREFIX_SET: Set<"ms" | "mr" | "mrs" | "dr" | "prof" | "rev" | "st" | "hon" | "senator" | "sen" | "rep" | "congressman" | "congresswoman" | "gov">;
19
- export declare const SUFFIX_SET: Set<"jr" | "junior" | "sr" | "senior" | "ii" | "iii" | "iv" | "v" | "vi" | "vii" | "viii" | "ix" | "x" | "2nd" | "3rd" | "4th" | "5th" | "6th" | "7th" | "8th" | "9th" | "10th">;
19
+ export declare const SUFFIX_SET: Set<"v" | "jr" | "junior" | "sr" | "senior" | "ii" | "iii" | "iv" | "vi" | "vii" | "viii" | "ix" | "x" | "2nd" | "3rd" | "4th" | "5th" | "6th" | "7th" | "8th" | "9th" | "10th">;
20
20
  export declare function isPrefix(prefix: string): prefix is Prefix;
21
21
  export declare function isSuffix(suffix: string): suffix is Suffix;
22
22
  export declare function genderMapperFromDomain<G extends string>(mapFromDomain: Record<GenderAtBirth, G>, unknownGender: G): (gender: GenderAtBirth) => G;
@@ -1,10 +1,32 @@
1
- export declare const BAMBOO_HIE_NAME = "Bamboo";
2
- export declare const KONZA_HIE_NAME = "Konza";
3
- export declare const HEALTH_CONNECT_TEXAS_HIE_NAME = "HealthConnectTexas";
4
- export declare const HIXNY_HIE_NAME = "Hixny";
5
- export declare const HIE_TEXAS_PCC = "HieTexasPcc";
6
- export declare const ALOHR_HIE_NAME = "Alohr";
7
- export declare const LAHIE_HIE_NAME = "Lahie";
8
- export declare const FLHIE_HIE_NAME = "Flhie";
9
- export declare const NUMBER_OF_HIEs = 8;
1
+ export declare enum HieName {
2
+ Bamboo = "Bamboo",
3
+ Konza = "Konza",
4
+ HealthConnectTexas = "HealthConnectTexas",
5
+ Hixny = "Hixny",
6
+ HieTexasPcc = "HieTexasPcc",
7
+ Alohr = "Alohr",
8
+ Lahie = "Lahie",
9
+ Flhie = "Flhie",
10
+ Riqi = "Riqi"
11
+ }
12
+ export declare const ALL_HIES: HieName[];
13
+ export declare const NUMBER_OF_HIEs: number;
14
+ /** @deprecated Use HieName.Bamboo */
15
+ export declare const BAMBOO_HIE_NAME = HieName.Bamboo;
16
+ /** @deprecated Use HieName.Konza */
17
+ export declare const KONZA_HIE_NAME = HieName.Konza;
18
+ /** @deprecated Use HieName.HealthConnectTexas */
19
+ export declare const HEALTH_CONNECT_TEXAS_HIE_NAME = HieName.HealthConnectTexas;
20
+ /** @deprecated Use HieName.Hixny */
21
+ export declare const HIXNY_HIE_NAME = HieName.Hixny;
22
+ /** @deprecated Use HieName.HieTexasPcc */
23
+ export declare const HIE_TEXAS_PCC = HieName.HieTexasPcc;
24
+ /** @deprecated Use HieName.Alohr */
25
+ export declare const ALOHR_HIE_NAME = HieName.Alohr;
26
+ /** @deprecated Use HieName.Lahie */
27
+ export declare const LAHIE_HIE_NAME = HieName.Lahie;
28
+ /** @deprecated Use HieName.Flhie */
29
+ export declare const FLHIE_HIE_NAME = HieName.Flhie;
30
+ /** @deprecated Use HieName.Riqi */
31
+ export declare const RIQI_HIE_NAME = HieName.Riqi;
10
32
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/external/hl7v2/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,6BAA6B,uBAAuB,CAAC;AAClE,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAC3C,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/external/hl7v2/constants.ts"],"names":[],"mappings":"AAAA,oBAAY,OAAO;IACjB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,kBAAkB,uBAAuB;IACzC,KAAK,UAAU;IACf,WAAW,gBAAgB;IAC3B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,eAAO,MAAM,QAAQ,WAAyB,CAAC;AAC/C,eAAO,MAAM,cAAc,QAAkB,CAAC;AAE9C,qCAAqC;AACrC,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAC9C,oCAAoC;AACpC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,iDAAiD;AACjD,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AACxE,oCAAoC;AACpC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,0CAA0C;AAC1C,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,oCAAoC;AACpC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,oCAAoC;AACpC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,oCAAoC;AACpC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,mCAAmC;AACnC,eAAO,MAAM,aAAa,eAAe,CAAC"}
@@ -1,13 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NUMBER_OF_HIEs = exports.FLHIE_HIE_NAME = exports.LAHIE_HIE_NAME = exports.ALOHR_HIE_NAME = exports.HIE_TEXAS_PCC = exports.HIXNY_HIE_NAME = exports.HEALTH_CONNECT_TEXAS_HIE_NAME = exports.KONZA_HIE_NAME = exports.BAMBOO_HIE_NAME = void 0;
4
- exports.BAMBOO_HIE_NAME = "Bamboo";
5
- exports.KONZA_HIE_NAME = "Konza";
6
- exports.HEALTH_CONNECT_TEXAS_HIE_NAME = "HealthConnectTexas";
7
- exports.HIXNY_HIE_NAME = "Hixny";
8
- exports.HIE_TEXAS_PCC = "HieTexasPcc";
9
- exports.ALOHR_HIE_NAME = "Alohr";
10
- exports.LAHIE_HIE_NAME = "Lahie";
11
- exports.FLHIE_HIE_NAME = "Flhie";
12
- exports.NUMBER_OF_HIEs = 8;
3
+ exports.RIQI_HIE_NAME = exports.FLHIE_HIE_NAME = exports.LAHIE_HIE_NAME = exports.ALOHR_HIE_NAME = exports.HIE_TEXAS_PCC = exports.HIXNY_HIE_NAME = exports.HEALTH_CONNECT_TEXAS_HIE_NAME = exports.KONZA_HIE_NAME = exports.BAMBOO_HIE_NAME = exports.NUMBER_OF_HIEs = exports.ALL_HIES = exports.HieName = void 0;
4
+ var HieName;
5
+ (function (HieName) {
6
+ HieName["Bamboo"] = "Bamboo";
7
+ HieName["Konza"] = "Konza";
8
+ HieName["HealthConnectTexas"] = "HealthConnectTexas";
9
+ HieName["Hixny"] = "Hixny";
10
+ HieName["HieTexasPcc"] = "HieTexasPcc";
11
+ HieName["Alohr"] = "Alohr";
12
+ HieName["Lahie"] = "Lahie";
13
+ HieName["Flhie"] = "Flhie";
14
+ HieName["Riqi"] = "Riqi";
15
+ })(HieName = exports.HieName || (exports.HieName = {}));
16
+ exports.ALL_HIES = Object.values(HieName);
17
+ exports.NUMBER_OF_HIEs = exports.ALL_HIES.length;
18
+ /** @deprecated Use HieName.Bamboo */
19
+ exports.BAMBOO_HIE_NAME = HieName.Bamboo;
20
+ /** @deprecated Use HieName.Konza */
21
+ exports.KONZA_HIE_NAME = HieName.Konza;
22
+ /** @deprecated Use HieName.HealthConnectTexas */
23
+ exports.HEALTH_CONNECT_TEXAS_HIE_NAME = HieName.HealthConnectTexas;
24
+ /** @deprecated Use HieName.Hixny */
25
+ exports.HIXNY_HIE_NAME = HieName.Hixny;
26
+ /** @deprecated Use HieName.HieTexasPcc */
27
+ exports.HIE_TEXAS_PCC = HieName.HieTexasPcc;
28
+ /** @deprecated Use HieName.Alohr */
29
+ exports.ALOHR_HIE_NAME = HieName.Alohr;
30
+ /** @deprecated Use HieName.Lahie */
31
+ exports.LAHIE_HIE_NAME = HieName.Lahie;
32
+ /** @deprecated Use HieName.Flhie */
33
+ exports.FLHIE_HIE_NAME = HieName.Flhie;
34
+ /** @deprecated Use HieName.Riqi */
35
+ exports.RIQI_HIE_NAME = HieName.Riqi;
13
36
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/external/hl7v2/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,cAAc,GAAG,OAAO,CAAC;AACzB,QAAA,6BAA6B,GAAG,oBAAoB,CAAC;AACrD,QAAA,cAAc,GAAG,OAAO,CAAC;AACzB,QAAA,aAAa,GAAG,aAAa,CAAC;AAC9B,QAAA,cAAc,GAAG,OAAO,CAAC;AACzB,QAAA,cAAc,GAAG,OAAO,CAAC;AACzB,QAAA,cAAc,GAAG,OAAO,CAAC;AACzB,QAAA,cAAc,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/external/hl7v2/constants.ts"],"names":[],"mappings":";;;AAAA,IAAY,OAUX;AAVD,WAAY,OAAO;IACjB,4BAAiB,CAAA;IACjB,0BAAe,CAAA;IACf,oDAAyC,CAAA;IACzC,0BAAe,CAAA;IACf,sCAA2B,CAAA;IAC3B,0BAAe,CAAA;IACf,0BAAe,CAAA;IACf,0BAAe,CAAA;IACf,wBAAa,CAAA;AACf,CAAC,EAVW,OAAO,GAAP,eAAO,KAAP,eAAO,QAUlB;AAEY,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,QAAA,cAAc,GAAG,gBAAQ,CAAC,MAAM,CAAC;AAE9C,qCAAqC;AACxB,QAAA,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;AAC9C,oCAAoC;AACvB,QAAA,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5C,iDAAiD;AACpC,QAAA,6BAA6B,GAAG,OAAO,CAAC,kBAAkB,CAAC;AACxE,oCAAoC;AACvB,QAAA,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5C,0CAA0C;AAC7B,QAAA,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;AACjD,oCAAoC;AACvB,QAAA,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5C,oCAAoC;AACvB,QAAA,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5C,oCAAoC;AACvB,QAAA,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5C,mCAAmC;AACtB,QAAA,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=concurrency.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.test.d.ts","sourceRoot":"","sources":["../../../src/util/__tests__/concurrency.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ /* eslint-disable @typescript-eslint/no-empty-function */
27
+ const faker_1 = require("@faker-js/faker");
28
+ const sleep_1 = require("../../common/sleep");
29
+ const sleepModule = __importStar(require("../../common/sleep"));
30
+ const concurrency_1 = require("../concurrency");
31
+ const anyNumber = expect.any(Number);
32
+ beforeEach(() => {
33
+ jest.restoreAllMocks();
34
+ });
35
+ afterAll(() => {
36
+ jest.restoreAllMocks();
37
+ });
38
+ describe("executeAsynchronously", () => {
39
+ it("fails if minJitter is lower than zero", async () => {
40
+ const list = ["a", "b", "c", "d", "e"];
41
+ const fn = jest.fn(async () => { });
42
+ await expect((0, concurrency_1.executeAsynchronously)(list, fn, {
43
+ numberOfParallelExecutions: 2,
44
+ minJitterMillis: faker_1.faker.number.int({ min: 1 }) * -1,
45
+ })).rejects.toThrow();
46
+ });
47
+ it("fails if maxJitter is lower than zero", async () => {
48
+ const list = ["a", "b", "c", "d", "e"];
49
+ const fn = jest.fn(async () => { });
50
+ await expect((0, concurrency_1.executeAsynchronously)(list, fn, {
51
+ numberOfParallelExecutions: 2,
52
+ maxJitterMillis: faker_1.faker.number.int({ min: 1 }) * -1,
53
+ })).rejects.toThrow();
54
+ });
55
+ it("fails if minJitter is higer than maxJitter", async () => {
56
+ const list = ["a", "b", "c", "d", "e"];
57
+ const fn = jest.fn(async () => { });
58
+ await expect((0, concurrency_1.executeAsynchronously)(list, fn, {
59
+ numberOfParallelExecutions: 2,
60
+ maxJitterMillis: faker_1.faker.number.int({ min: 0, max: 10 }),
61
+ minJitterMillis: faker_1.faker.number.int({ min: 11 }),
62
+ })).rejects.toThrow();
63
+ });
64
+ // TODO fix this test, likely need to build a "shift" function so we can mock it (or mock
65
+ // Array.prototype.shift)
66
+ // it("runs splits list and runs it asynchronously", async () => {
67
+ // const list = ["a", "b", "c", "d", "e"];
68
+ // const fn = jest.fn(async () => {
69
+ // await sleep(20);
70
+ // });
71
+ // await executeAsynchronously(list, fn, {
72
+ // numberOfParallelExecutions: 2,
73
+ // maxJitterMillis: 10,
74
+ // minJitterMillis: 10,
75
+ // });
76
+ // expect(fn).toHaveBeenNthCalledWith(1, "a", 0, 0, 2);
77
+ // expect(fn).toHaveBeenNthCalledWith(2, "d", 0, 1, 2);
78
+ // expect(fn).toHaveBeenNthCalledWith(3, "b", 1, 0, 2);
79
+ // expect(fn).toHaveBeenNthCalledWith(4, "e", 1, 1, 2);
80
+ // expect(fn).toHaveBeenNthCalledWith(5, "c", 2, 0, 2);
81
+ // });
82
+ it("defaults async runs to to number of items on list", async () => {
83
+ const list = new Array(21).fill(666);
84
+ const fn = jest.fn();
85
+ await (0, concurrency_1.executeAsynchronously)(list, fn);
86
+ expect(fn).toHaveBeenCalledTimes(list.length);
87
+ });
88
+ it("sends correct item ", async () => {
89
+ const list = [1, 2, 3];
90
+ const fn = jest.fn();
91
+ await (0, concurrency_1.executeAsynchronously)(list, fn);
92
+ expect(fn).toHaveBeenNthCalledWith(1, list[0], anyNumber, anyNumber, anyNumber);
93
+ expect(fn).toHaveBeenNthCalledWith(2, list[1], anyNumber, anyNumber, anyNumber);
94
+ expect(fn).toHaveBeenNthCalledWith(3, list[2], anyNumber, anyNumber, anyNumber);
95
+ });
96
+ it("sends correct index item ", async () => {
97
+ const list = [1, 2, 3];
98
+ const fn = jest.fn();
99
+ await (0, concurrency_1.executeAsynchronously)(list, fn);
100
+ expect(fn).toHaveBeenNthCalledWith(1, anyNumber, 0, anyNumber, anyNumber);
101
+ expect(fn).toHaveBeenNthCalledWith(2, anyNumber, 1, anyNumber, anyNumber);
102
+ expect(fn).toHaveBeenNthCalledWith(3, anyNumber, 2, anyNumber, anyNumber);
103
+ });
104
+ it("jitters before runs", async () => {
105
+ const sleep_mock = jest.spyOn(sleepModule, "sleep").mockImplementation(async () => { });
106
+ const randomNumbers = [0.1, 0.2];
107
+ let lastRandom = 0;
108
+ const random_mock = jest
109
+ .spyOn(Math, "random")
110
+ .mockImplementation(() => randomNumbers[lastRandom++] ?? 0);
111
+ const list = [1, 2, 3, 4];
112
+ const fn = jest.fn();
113
+ await (0, concurrency_1.executeAsynchronously)(list, fn, {
114
+ numberOfParallelExecutions: 2,
115
+ maxJitterMillis: 1000,
116
+ });
117
+ expect(random_mock).toHaveBeenCalledTimes(2);
118
+ expect(sleep_mock).toHaveBeenCalledTimes(2);
119
+ expect(sleep_mock).toHaveBeenNthCalledWith(1, 100);
120
+ expect(sleep_mock).toHaveBeenNthCalledWith(2, 200);
121
+ });
122
+ it("defaults jitter before run to zero", async () => {
123
+ const sleep_mock = jest.spyOn(sleepModule, "sleep").mockImplementation(async () => { });
124
+ const list = [1, 2, 3, 4];
125
+ const fn = jest.fn();
126
+ await (0, concurrency_1.executeAsynchronously)(list, fn, { numberOfParallelExecutions: 2 });
127
+ expect(sleep_mock).toHaveBeenCalledTimes(2);
128
+ expect(sleep_mock).toHaveBeenNthCalledWith(1, 0);
129
+ expect(sleep_mock).toHaveBeenNthCalledWith(2, 0);
130
+ });
131
+ });
132
+ describe("threadsafe set operations", () => {
133
+ it("should add numbers to a set in a thread-safe manner", async () => {
134
+ const set = new Set();
135
+ const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
136
+ const shuffleArray = (array) => {
137
+ for (let i = array.length - 1; i > 0; i--) {
138
+ const j = Math.floor(Math.random() * (i + 1));
139
+ //eslint-disable-next-line
140
+ [array[i], array[j]] = [array[j], array[i]];
141
+ }
142
+ return array;
143
+ };
144
+ const combinedList = [list, ...Array.from({ length: 9 }, () => shuffleArray([...list]))];
145
+ const addToSet = async (nums) => {
146
+ for (const num of nums) {
147
+ await (0, sleep_1.sleep)(10);
148
+ if (!set.has(num)) {
149
+ set.add(num);
150
+ }
151
+ }
152
+ };
153
+ await (0, concurrency_1.executeAsynchronously)(combinedList, addToSet, {
154
+ numberOfParallelExecutions: 20,
155
+ });
156
+ expect(set.size).toBe(20);
157
+ for (let i = 1; i <= 20; i++) {
158
+ expect(set.has(i)).toBe(true);
159
+ }
160
+ });
161
+ });
162
+ //# sourceMappingURL=concurrency.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.test.js","sourceRoot":"","sources":["../../../src/util/__tests__/concurrency.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=null-to-undefined.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-to-undefined.test.d.ts","sourceRoot":"","sources":["../../../src/util/__tests__/null-to-undefined.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const null_to_undefined_1 = require("../null-to-undefined");
4
+ const metriport_error_1 = require("../../error/metriport-error");
5
+ describe("nullToUndefined", () => {
6
+ it("converts top-level null to undefined", () => {
7
+ expect((0, null_to_undefined_1.nullToUndefined)(null)).toBeUndefined();
8
+ });
9
+ it("leaves primitives unchanged", () => {
10
+ expect((0, null_to_undefined_1.nullToUndefined)("a")).toBe("a");
11
+ expect((0, null_to_undefined_1.nullToUndefined)(0)).toBe(0);
12
+ expect((0, null_to_undefined_1.nullToUndefined)(true)).toBe(true);
13
+ });
14
+ it("converts null values inside a plain object to undefined", () => {
15
+ const input = { a: "x", b: null, c: 1 };
16
+ expect((0, null_to_undefined_1.nullToUndefined)(input)).toEqual({ a: "x", b: undefined, c: 1 });
17
+ });
18
+ it("converts null elements inside an array to undefined", () => {
19
+ const input = ["x", null, 1];
20
+ expect((0, null_to_undefined_1.nullToUndefined)(input)).toEqual(["x", undefined, 1]);
21
+ });
22
+ it("recurses into nested objects and arrays", () => {
23
+ const input = { rows: [{ code: "x", display: null }] };
24
+ expect((0, null_to_undefined_1.nullToUndefined)(input)).toEqual({
25
+ rows: [{ code: "x", display: undefined }],
26
+ });
27
+ });
28
+ it("handles array of row-like objects (select result shape)", () => {
29
+ const rows = [
30
+ { code: "10004002", display: "First", property_code: null, property_value: "1" },
31
+ { code: "1002007", display: null, property_code: "parent", property_value: null },
32
+ ];
33
+ expect((0, null_to_undefined_1.nullToUndefined)(rows)).toEqual([
34
+ { code: "10004002", display: "First", property_code: undefined, property_value: "1" },
35
+ { code: "1002007", display: undefined, property_code: "parent", property_value: undefined },
36
+ ]);
37
+ });
38
+ it("handles single row (selectOne result shape)", () => {
39
+ const row = { id: 1, system: "http://snomed.info/sct", name: null };
40
+ expect((0, null_to_undefined_1.nullToUndefined)(row)).toEqual({
41
+ id: 1,
42
+ system: "http://snomed.info/sct",
43
+ name: undefined,
44
+ });
45
+ });
46
+ it("returns non-plain objects (Date, RegExp, Buffer) unchanged", () => {
47
+ const d = new Date("2025-01-01");
48
+ expect((0, null_to_undefined_1.nullToUndefined)(d)).toBe(d);
49
+ const r = /foo/;
50
+ expect((0, null_to_undefined_1.nullToUndefined)(r)).toBe(r);
51
+ });
52
+ it("throws MetriportError when exceeding maxDepth", () => {
53
+ let nested = null;
54
+ for (let i = 0; i < 10; i++)
55
+ nested = { inner: nested };
56
+ expect(() => (0, null_to_undefined_1.nullToUndefined)(nested, 5)).toThrow(metriport_error_1.MetriportError);
57
+ expect(() => (0, null_to_undefined_1.nullToUndefined)(nested, 5)).toThrow("max recursion depth reached in nullToUndefined");
58
+ });
59
+ });
60
+ //# sourceMappingURL=null-to-undefined.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-to-undefined.test.js","sourceRoot":"","sources":["../../../src/util/__tests__/null-to-undefined.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export type ExecuteInChunksOptions = {
2
+ /**
3
+ * How many promises should execute at the same time. Defaults to `collection.length` (all promises to run at the same time).
4
+ */
5
+ numberOfParallelExecutions?: number;
6
+ /**
7
+ * Explict delay between runs. Defaults to 0, no delay.
8
+ */
9
+ delay?: number;
10
+ /**
11
+ * Maximum jitter in milliseconds before each run. Makes promises
12
+ * start at slight different times. Defaults to 0, no jitter.
13
+ */
14
+ maxJitterMillis?: number;
15
+ /**
16
+ * Minimum jitter in milliseconds before each run. Makes promises
17
+ * start at slight different times. Defaults to 0.
18
+ */
19
+ minJitterMillis?: number;
20
+ /**
21
+ * Whether to keep executing when an error occurs. Defaults to false, which
22
+ * means some might finish execution when the error happens - non-deterministic.
23
+ */
24
+ keepExecutingOnError?: boolean;
25
+ /**
26
+ * Where to log. Defaults to no logging.
27
+ */
28
+ log?: typeof console.log;
29
+ };
30
+ /**
31
+ * Function type that should be passed to `executeAsynchronously`.
32
+ * It receives the item to be processed, the index of the item in the array,
33
+ * the index of the promise that is processing the item, and the total amount
34
+ * of promises that are running in parallel.
35
+ * It should return a promise that resolves when the processing is done.
36
+ * It should handle errors internally.
37
+ * @param item the item to be processed
38
+ * @param itemIndex the index of the item in the array
39
+ * @param promiseIndex the index of the promise ("thread") that is processing the item
40
+ * @param promiseCount the total amount of promises that are running in parallel
41
+ */
42
+ export type FunctionType<T> = (item: T, itemIndex: number, promiseIndex: number, promiseCount: number) => Promise<void>;
43
+ /**
44
+ * TODO #ENG-170 Set default `numberOfParallelExecutions` to 5-10 max.
45
+ *
46
+ * Process an array or items asynchronously. It doesn't throw if one of the promises fails
47
+ * (error handling should be done within the promise/function).
48
+ *
49
+ * For example, with an array of 19 elements and 4 parallel executions,
50
+ * we would have something like this being executed, where:
51
+ * - each row is a promise, like a thread running in parallel to the other promises;
52
+ * - each column is a function call with the respective item of the array, it runs in sequence
53
+ * to other calls on the same row;
54
+ *
55
+ * promise
56
+ * idx| items being executed
57
+ * -|---------------------------------------> time
58
+ * 1| item1 | item2 | item3 | item4 | item5 |
59
+ * -|---------------------------------------|
60
+ * 2| item1 | item2 | item3 | item4 | item5 |
61
+ * -|---------------------------------------|
62
+ * 3| item1 | item2 | item3 | item4 | item5 |
63
+ * -|---------------------------------------|
64
+ * 4| item1 | item2 | item3 | item4 |
65
+ * -|---------------------------------------> time
66
+ *
67
+ * @param collection array of elements to be processed
68
+ * @param fn the function to be executed asynchronously
69
+ * @param options additional settings
70
+ */
71
+ export declare function executeAsynchronously<T>(collection: T[], fn: FunctionType<T>, { numberOfParallelExecutions, delay, maxJitterMillis, minJitterMillis, keepExecutingOnError, log, }?: ExecuteInChunksOptions): Promise<PromiseSettledResult<void>[]>;
72
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAC5B,IAAI,EAAE,CAAC,EACP,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;AAInB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,UAAU,EAAE,CAAC,EAAE,EACf,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,EACnB,EACE,0BAA8C,EAC9C,KAAS,EACT,eAAmB,EACnB,eAAmB,EACnB,oBAA4B,EAC5B,GAAG,GACJ,GAAE,sBAA2B,GAC7B,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAoCvC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeAsynchronously = void 0;
4
+ const shared_1 = require("../error/shared");
5
+ const sleep_1 = require("../common/sleep");
6
+ const emptyString = "";
7
+ /**
8
+ * TODO #ENG-170 Set default `numberOfParallelExecutions` to 5-10 max.
9
+ *
10
+ * Process an array or items asynchronously. It doesn't throw if one of the promises fails
11
+ * (error handling should be done within the promise/function).
12
+ *
13
+ * For example, with an array of 19 elements and 4 parallel executions,
14
+ * we would have something like this being executed, where:
15
+ * - each row is a promise, like a thread running in parallel to the other promises;
16
+ * - each column is a function call with the respective item of the array, it runs in sequence
17
+ * to other calls on the same row;
18
+ *
19
+ * promise
20
+ * idx| items being executed
21
+ * -|---------------------------------------> time
22
+ * 1| item1 | item2 | item3 | item4 | item5 |
23
+ * -|---------------------------------------|
24
+ * 2| item1 | item2 | item3 | item4 | item5 |
25
+ * -|---------------------------------------|
26
+ * 3| item1 | item2 | item3 | item4 | item5 |
27
+ * -|---------------------------------------|
28
+ * 4| item1 | item2 | item3 | item4 |
29
+ * -|---------------------------------------> time
30
+ *
31
+ * @param collection array of elements to be processed
32
+ * @param fn the function to be executed asynchronously
33
+ * @param options additional settings
34
+ */
35
+ async function executeAsynchronously(collection, fn, { numberOfParallelExecutions = collection.length, delay = 0, maxJitterMillis = 0, minJitterMillis = 0, keepExecutingOnError = false, log, } = {}) {
36
+ if (delay < 0)
37
+ throw new Error("delay must be >= 0");
38
+ if (minJitterMillis < 0)
39
+ throw new Error("minJitterMillis must be >= 0");
40
+ if (maxJitterMillis < 0)
41
+ throw new Error("maxJitterMillis must be >= 0");
42
+ if (minJitterMillis > maxJitterMillis) {
43
+ throw new Error("minJitterMillis must be <= maxJitterMillis");
44
+ }
45
+ // Copy the array so that we don't mutate the original (this only copies the references)
46
+ const itemsToProcess = collection.slice();
47
+ const amountOfPromises = Math.max(Math.min(itemsToProcess.length, numberOfParallelExecutions), 1);
48
+ const indexControl = { currentIndex: 0 };
49
+ const promises = new Array(amountOfPromises).fill(0).map(async (_, promiseIndex) => {
50
+ // possible jitter before each run so that they don't start at the same time
51
+ const jitter = Math.max(minJitterMillis, Math.random() * maxJitterMillis);
52
+ await (0, sleep_1.sleep)(jitter);
53
+ if (delay > 0)
54
+ await (0, sleep_1.sleep)(delay);
55
+ await executeSynchronously(itemsToProcess, fn, promiseIndex, amountOfPromises, indexControl, keepExecutingOnError, log);
56
+ });
57
+ if (keepExecutingOnError) {
58
+ return await Promise.allSettled(promises);
59
+ }
60
+ return (await Promise.all(promises)).map(p => ({ status: "fulfilled", value: p }));
61
+ }
62
+ exports.executeAsynchronously = executeAsynchronously;
63
+ /**
64
+ * Document properly before exposing this
65
+ */
66
+ async function executeSynchronously(itemsToProcess, fn, promiseIndex, amountOfPromises, indexControl, keepExecutingOnError, log) {
67
+ const tabs = log ? "\t".repeat(promiseIndex) : emptyString;
68
+ let item;
69
+ while ((item = itemsToProcess.shift())) {
70
+ log &&
71
+ log(`... ${tabs}... promise ${promiseIndex} item ${indexControl.currentIndex} remaining ${itemsToProcess.length}...`);
72
+ try {
73
+ await fn(item, indexControl.currentIndex, promiseIndex, amountOfPromises);
74
+ indexControl.currentIndex = indexControl.currentIndex + 1;
75
+ }
76
+ catch (error) {
77
+ if (keepExecutingOnError) {
78
+ log &&
79
+ log(`Error on item ${indexControl.currentIndex} of promise ${promiseIndex}: ${(0, shared_1.errorToString)(error)}`);
80
+ }
81
+ else {
82
+ throw error;
83
+ }
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export * from "./base64";
2
+ export * from "./concurrency";
2
3
  export * from "./duration";
4
+ export * from "./null-to-undefined";
3
5
  export * from "./sqs-delay-from-uuid";
4
6
  export * from "./uuid-v7";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC"}
@@ -15,7 +15,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./base64"), exports);
18
+ __exportStar(require("./concurrency"), exports);
18
19
  __exportStar(require("./duration"), exports);
20
+ __exportStar(require("./null-to-undefined"), exports);
19
21
  __exportStar(require("./sqs-delay-from-uuid"), exports);
20
22
  __exportStar(require("./uuid-v7"), exports);
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,wDAAsC;AACtC,4CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,gDAA8B;AAC9B,6CAA2B;AAC3B,sDAAoC;AACpC,wDAAsC;AACtC,4CAA0B"}
@@ -0,0 +1,2 @@
1
+ export declare function nullToUndefined<T>(value: T, maxDepth?: number): T;
2
+ //# sourceMappingURL=null-to-undefined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-to-undefined.d.ts","sourceRoot":"","sources":["../../src/util/null-to-undefined.ts"],"names":[],"mappings":"AAwBA,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,SAAkB,GAAG,CAAC,CAE1E"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nullToUndefined = void 0;
4
+ const metriport_error_1 = require("../error/metriport-error");
5
+ const defaultMaxDepth = 100;
6
+ function nullToUndefinedAtDepth(value, depth, maxDepth) {
7
+ if (depth > maxDepth)
8
+ throw new metriport_error_1.MetriportError("max recursion depth reached in nullToUndefined", undefined, {
9
+ maxDepth,
10
+ });
11
+ if (value === null)
12
+ return undefined;
13
+ if (Array.isArray(value)) {
14
+ return value.map(item => nullToUndefinedAtDepth(item, depth + 1, maxDepth));
15
+ }
16
+ if (typeof value === "object") {
17
+ if (value.constructor !== Object)
18
+ return value;
19
+ const out = {};
20
+ for (const [k, v] of Object.entries(value)) {
21
+ out[k] = nullToUndefinedAtDepth(v, depth + 1, maxDepth);
22
+ }
23
+ return out;
24
+ }
25
+ return value;
26
+ }
27
+ function nullToUndefined(value, maxDepth = defaultMaxDepth) {
28
+ return nullToUndefinedAtDepth(value, 0, maxDepth);
29
+ }
30
+ exports.nullToUndefined = nullToUndefined;
31
+ //# sourceMappingURL=null-to-undefined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-to-undefined.js","sourceRoot":"","sources":["../../src/util/null-to-undefined.ts"],"names":[],"mappings":";;;AAAA,8DAA0D;AAE1D,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,sBAAsB,CAAI,KAAQ,EAAE,KAAa,EAAE,QAAgB;IAC1E,IAAI,KAAK,GAAG,QAAQ;QAClB,MAAM,IAAI,gCAAc,CAAC,gDAAgD,EAAE,SAAS,EAAE;YACpF,QAAQ;SACT,CAAC,CAAC;IACL,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAc,CAAC;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAM,CAAC;KAClF;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;SACzD;QACD,OAAO,GAAQ,CAAC;KACjB;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,eAAe,CAAI,KAAQ,EAAE,QAAQ,GAAG,eAAe;IACrE,OAAO,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAFD,0CAEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metriport/shared",
3
- "version": "0.32.3",
3
+ "version": "0.32.4",
4
4
  "description": "Common code shared across packages - by Metriport Inc.",
5
5
  "author": "Metriport Inc. <contact@metriport.com>",
6
6
  "homepage": "https://metriport.com/",
@@ -131,5 +131,5 @@
131
131
  "ts-jest": "29.1.1",
132
132
  "typescript": "^4.9.5"
133
133
  },
134
- "gitHead": "457d31061f19c1d12ca3f1f1f6c843b1e62a8eb4"
134
+ "gitHead": "464886060a6adeec1616edd43d5edc8cf4ac4f41"
135
135
  }