@icure/api 8.8.5 → 8.8.7
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.
|
@@ -40,7 +40,25 @@ function cloneDeep(obj) {
|
|
|
40
40
|
obj.forEach((v, k) => result.set(cloneDeep(k), cloneDeep(v)));
|
|
41
41
|
return result;
|
|
42
42
|
}
|
|
43
|
+
// ArrayBuffer checks
|
|
44
|
+
const tag = Object.prototype.toString.call(obj);
|
|
45
|
+
// Raw buffers (not views) + realm safe check
|
|
46
|
+
if (obj instanceof ArrayBuffer || tag === '[object ArrayBuffer]') {
|
|
47
|
+
return obj.slice(0);
|
|
48
|
+
}
|
|
49
|
+
// Shared buffers + realm safe check
|
|
50
|
+
if (typeof SharedArrayBuffer !== 'undefined' && (obj instanceof SharedArrayBuffer || tag === '[object SharedArrayBuffer]')) {
|
|
51
|
+
const src = new Uint8Array(obj);
|
|
52
|
+
const copy = new Uint8Array(src.byteLength);
|
|
53
|
+
copy.set(src);
|
|
54
|
+
return copy.buffer;
|
|
55
|
+
}
|
|
56
|
+
// ArrayBuffer.isView does non-view ArrayBuffers (raw ArrayBuffers, SharedArrayBuffers)
|
|
43
57
|
if (ArrayBuffer.isView(obj)) {
|
|
58
|
+
// Node Buffer: its .slice() shares memory, so it must be special-cased BEFORE the generic slice() path
|
|
59
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(obj)) {
|
|
60
|
+
return Buffer.from(obj); // Buffer.from(buffer) copies
|
|
61
|
+
}
|
|
44
62
|
if (obj instanceof DataView) {
|
|
45
63
|
const clonedBuffer = obj.buffer.slice(obj.byteOffset, obj.byteOffset + obj.byteLength);
|
|
46
64
|
return new DataView(clonedBuffer, 0, obj.byteLength);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-utils.js","sourceRoot":"","sources":["../../../icc-x-api/utils/collection-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Recursively deep clone a value. Handles primitives, arrays, plain objects, Date, RegExp, Set, Map, and typed arrays.\n * Non-cloneable values (functions, WeakMap, WeakSet, etc.) are copied by reference.\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj\n\n if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T\n if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags) as unknown as T\n\n if (Array.isArray(obj)) return obj.map((item) => cloneDeep(item)) as unknown as T\n\n if (obj instanceof Set) {\n const result = new Set()\n obj.forEach((v) => result.add(cloneDeep(v)))\n return result as unknown as T\n }\n\n if (obj instanceof Map) {\n const result = new Map()\n obj.forEach((v, k) => result.set(cloneDeep(k), cloneDeep(v)))\n return result as unknown as T\n }\n\n if (ArrayBuffer.isView(obj)) {\n if (obj instanceof DataView) {\n const clonedBuffer = obj.buffer.slice(obj.byteOffset, obj.byteOffset + obj.byteLength)\n return new DataView(clonedBuffer, 0, obj.byteLength) as unknown as T\n }\n\n const view = obj as unknown as {\n buffer: ArrayBuffer\n byteOffset: number\n byteLength: number\n length?: number\n BYTES_PER_ELEMENT?: number\n slice?: () => unknown\n constructor: new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => unknown\n }\n\n if (typeof view.slice === 'function') {\n return view.slice() as T\n }\n\n const clonedBuffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength)\n const TypedArrayCtor = view.constructor as new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => typeof obj\n const length =\n typeof view.BYTES_PER_ELEMENT === 'number' && typeof view.length === 'number' ? view.length : undefined\n return new TypedArrayCtor(clonedBuffer, 0, length) as unknown as T\n }\n\n const result: any = Object.create(Object.getPrototypeOf(obj))\n for (const key of Object.keys(obj)) {\n result[key] = cloneDeep((obj as any)[key])\n }\n return result\n}\n\n/**\n * Remove duplicate elements from an array based on a key function or property name.\n */\nexport function uniqBy<T>(arr: T[], key: ((item: T) => unknown) | string): T[] {\n const seen = new Set()\n return arr.filter((item) => {\n const k = typeof key === 'string' ? (item as any)[key] : key(item)\n if (seen.has(k)) return false\n seen.add(k)\n return true\n })\n}\n\n/**\n * Sort an array by a key function. Returns a new sorted array (does not mutate the original).\n */\nexport function sortBy<T>(arr: T[], keyFn: (item: T) => string | number | boolean | null | undefined): T[] {\n return [...arr].sort((a, b) => {\n const ka = keyFn(a)\n const kb = keyFn(b)\n if (ka == null && kb == null) return 0\n if (ka == null) return -1\n if (kb == null) return 1\n if (ka < kb) return -1\n if (ka > kb) return 1\n return 0\n })\n}\n\n/**\n * Check if two sets are equals (they contain the same elements). Will not work if the content can't be compared by `==`.\n */\nexport function setEquals<T>(setA: Set<T>, setB: Set<T>): boolean {\n if (setA.size != setB.size) return false\n return Array.from(setA).every((x) => setB.has(x))\n}\n\n/**\n * Check if two arrays are equals (they contain the same elements).\n */\nexport function arrayEquals<T>(arrayA: T[], arrayB: T[]): boolean {\n if (arrayA.length != arrayB.length) return false\n for (let i = 0; i < arrayA.length; ++i) {\n if (!anyEquals(arrayA[i], arrayB[i])) return false\n }\n return true\n}\n\n/**\n * Check if two elements are equals (they contain the same elements).\n */\nexport function anyEquals(anyA: any, anyB: any): boolean {\n //Test if object is array\n if (Array.isArray(anyA) && Array.isArray(anyB)) {\n return arrayEquals(anyA, anyB)\n } /*Test if objects are set */ else if (anyA instanceof Set && anyB instanceof Set) {\n return setEquals(anyA, anyB)\n } else if (typeof anyA === 'object' && typeof anyB === 'object') {\n return objectEquals(anyA, anyB)\n }\n return anyA === anyB\n}\n\n/**\n * Check if two objects are equals (by comparing the properties in a deep way).\n * @param objectA\n * @param objectB\n * @param ignoredProperties\n */\nexport function objectEquals<T extends { [key: string]: any }>(objectA: T, objectB: T, ignoredProperties?: string[]): boolean {\n const missingInA = Object.keys(objectB)\n .filter((key) => !ignoredProperties?.includes(key))\n .filter((key) => !Object.keys(objectA).includes(key))\n .filter((key) => objectB[key] !== undefined && objectB[key] !== null)\n\n if (missingInA.length > 0) return false\n\n const missingInB = Object.keys(objectA)\n .filter((key) => !ignoredProperties?.includes(key))\n .filter((key) => !Object.keys(objectB).includes(key))\n .filter((key) => objectA[key] !== undefined && objectA[key] !== null)\n\n if (missingInB.length > 0) return false\n\n for (let i = 0, keys = Object.keys(objectA); i < keys.length; i++) {\n const key = keys[i]\n if (ignoredProperties?.includes(key)) continue\n if (!anyEquals(objectA[key], objectB[key])) return false\n }\n\n return true\n}\n\n/**\n * Fully consumes an async generator and provides all results as an array.\n * @param generator an async generator.\n */\nexport async function asyncGeneratorToArray<T>(generator: AsyncGenerator<T, any, never>): Promise<T[]> {\n const res = []\n let latest = await generator.next()\n while (!latest.done) {\n res.push(latest.value)\n latest = await generator.next()\n }\n return res\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-utils.js","sourceRoot":"","sources":["../../../icc-x-api/utils/collection-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Recursively deep clone a value. Handles primitives, arrays, plain objects, Date, RegExp, Set, Map, and typed arrays.\n * Non-cloneable values (functions, WeakMap, WeakSet, etc.) are copied by reference.\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj\n\n if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T\n if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags) as unknown as T\n\n if (Array.isArray(obj)) return obj.map((item) => cloneDeep(item)) as unknown as T\n\n if (obj instanceof Set) {\n const result = new Set()\n obj.forEach((v) => result.add(cloneDeep(v)))\n return result as unknown as T\n }\n\n if (obj instanceof Map) {\n const result = new Map()\n obj.forEach((v, k) => result.set(cloneDeep(k), cloneDeep(v)))\n return result as unknown as T\n }\n\n // ArrayBuffer checks\n const tag = Object.prototype.toString.call(obj)\n\n // Raw buffers (not views) + realm safe check\n if (obj instanceof ArrayBuffer || tag === '[object ArrayBuffer]') {\n return (obj as unknown as ArrayBuffer).slice(0) as unknown as T\n }\n\n // Shared buffers + realm safe check\n if (typeof SharedArrayBuffer !== 'undefined' && (obj instanceof SharedArrayBuffer || tag === '[object SharedArrayBuffer]')) {\n const src = new Uint8Array(obj as unknown as SharedArrayBuffer)\n const copy = new Uint8Array(src.byteLength)\n copy.set(src)\n return copy.buffer as unknown as T\n }\n\n // ArrayBuffer.isView does non-view ArrayBuffers (raw ArrayBuffers, SharedArrayBuffers)\n if (ArrayBuffer.isView(obj)) {\n // Node Buffer: its .slice() shares memory, so it must be special-cased BEFORE the generic slice() path\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(obj)) {\n return Buffer.from(obj) as unknown as T // Buffer.from(buffer) copies\n }\n\n if (obj instanceof DataView) {\n const clonedBuffer = obj.buffer.slice(obj.byteOffset, obj.byteOffset + obj.byteLength)\n return new DataView(clonedBuffer, 0, obj.byteLength) as unknown as T\n }\n\n const view = obj as unknown as {\n buffer: ArrayBuffer\n byteOffset: number\n byteLength: number\n length?: number\n BYTES_PER_ELEMENT?: number\n slice?: () => unknown\n constructor: new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => unknown\n }\n\n if (typeof view.slice === 'function') {\n return view.slice() as T\n }\n\n const clonedBuffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength)\n const TypedArrayCtor = view.constructor as new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => typeof obj\n const length = typeof view.BYTES_PER_ELEMENT === 'number' && typeof view.length === 'number' ? view.length : undefined\n return new TypedArrayCtor(clonedBuffer, 0, length) as unknown as T\n }\n\n const result: any = Object.create(Object.getPrototypeOf(obj))\n for (const key of Object.keys(obj)) {\n result[key] = cloneDeep((obj as any)[key])\n }\n return result\n}\n\n/**\n * Remove duplicate elements from an array based on a key function or property name.\n */\nexport function uniqBy<T>(arr: T[], key: ((item: T) => unknown) | string): T[] {\n const seen = new Set()\n return arr.filter((item) => {\n const k = typeof key === 'string' ? (item as any)[key] : key(item)\n if (seen.has(k)) return false\n seen.add(k)\n return true\n })\n}\n\n/**\n * Sort an array by a key function. Returns a new sorted array (does not mutate the original).\n */\nexport function sortBy<T>(arr: T[], keyFn: (item: T) => string | number | boolean | null | undefined): T[] {\n return [...arr].sort((a, b) => {\n const ka = keyFn(a)\n const kb = keyFn(b)\n if (ka == null && kb == null) return 0\n if (ka == null) return -1\n if (kb == null) return 1\n if (ka < kb) return -1\n if (ka > kb) return 1\n return 0\n })\n}\n\n/**\n * Check if two sets are equals (they contain the same elements). Will not work if the content can't be compared by `==`.\n */\nexport function setEquals<T>(setA: Set<T>, setB: Set<T>): boolean {\n if (setA.size != setB.size) return false\n return Array.from(setA).every((x) => setB.has(x))\n}\n\n/**\n * Check if two arrays are equals (they contain the same elements).\n */\nexport function arrayEquals<T>(arrayA: T[], arrayB: T[]): boolean {\n if (arrayA.length != arrayB.length) return false\n for (let i = 0; i < arrayA.length; ++i) {\n if (!anyEquals(arrayA[i], arrayB[i])) return false\n }\n return true\n}\n\n/**\n * Check if two elements are equals (they contain the same elements).\n */\nexport function anyEquals(anyA: any, anyB: any): boolean {\n //Test if object is array\n if (Array.isArray(anyA) && Array.isArray(anyB)) {\n return arrayEquals(anyA, anyB)\n } /*Test if objects are set */ else if (anyA instanceof Set && anyB instanceof Set) {\n return setEquals(anyA, anyB)\n } else if (typeof anyA === 'object' && typeof anyB === 'object') {\n return objectEquals(anyA, anyB)\n }\n return anyA === anyB\n}\n\n/**\n * Check if two objects are equals (by comparing the properties in a deep way).\n * @param objectA\n * @param objectB\n * @param ignoredProperties\n */\nexport function objectEquals<T extends { [key: string]: any }>(objectA: T, objectB: T, ignoredProperties?: string[]): boolean {\n const missingInA = Object.keys(objectB)\n .filter((key) => !ignoredProperties?.includes(key))\n .filter((key) => !Object.keys(objectA).includes(key))\n .filter((key) => objectB[key] !== undefined && objectB[key] !== null)\n\n if (missingInA.length > 0) return false\n\n const missingInB = Object.keys(objectA)\n .filter((key) => !ignoredProperties?.includes(key))\n .filter((key) => !Object.keys(objectB).includes(key))\n .filter((key) => objectA[key] !== undefined && objectA[key] !== null)\n\n if (missingInB.length > 0) return false\n\n for (let i = 0, keys = Object.keys(objectA); i < keys.length; i++) {\n const key = keys[i]\n if (ignoredProperties?.includes(key)) continue\n if (!anyEquals(objectA[key], objectB[key])) return false\n }\n\n return true\n}\n\n/**\n * Fully consumes an async generator and provides all results as an array.\n * @param generator an async generator.\n */\nexport async function asyncGeneratorToArray<T>(generator: AsyncGenerator<T, any, never>): Promise<T[]> {\n const res = []\n let latest = await generator.next()\n while (!latest.done) {\n res.push(latest.value)\n latest = await generator.next()\n }\n return res\n}\n"]}
|
|
@@ -14,47 +14,51 @@ export declare function phoneNumberFormat(phoneNumber: string | null | undefined
|
|
|
14
14
|
*
|
|
15
15
|
* Accepts both yyyyMMdd and yyyyMMddHHmmss fuzzy dates (only the date part is kept), a String that
|
|
16
16
|
* can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.
|
|
17
|
-
*
|
|
17
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date.
|
|
18
|
+
* @param dateNumber a yyyyMMdd / yyyyMMddHHmmss fuzzy date, a numeric String, or a Date; {} defaults to now
|
|
18
19
|
* @return a Date object
|
|
19
20
|
* @throws Error if the fuzzy date is negative.
|
|
20
21
|
* @see #dateEncode
|
|
21
22
|
* @see #timeDecode
|
|
22
23
|
*/
|
|
23
|
-
export declare function dateDecode(dateNumber: number | string | Date | null | undefined): Date | undefined;
|
|
24
|
+
export declare function dateDecode(dateNumber: number | string | Date | Record<string, never> | null | undefined): Date | undefined;
|
|
24
25
|
/**
|
|
25
26
|
* Converts a backend time number (e.g., health element openingDate) into a Date object.
|
|
26
27
|
*
|
|
27
28
|
* Accepts both yyyyMMddHHmmss and yyyyMMdd fuzzy dates (the time part defaults to midnight), a String
|
|
28
29
|
* that can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.
|
|
29
|
-
*
|
|
30
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.
|
|
31
|
+
* @param timeNumber a yyyyMMddHHmmss / yyyyMMdd fuzzy date, a numeric String, or a Date; {} defaults to now
|
|
30
32
|
* @return a Date object
|
|
31
33
|
* @throws Error if the fuzzy date is negative.
|
|
32
34
|
* @see #timeEncode
|
|
33
35
|
* @see #dateDecode
|
|
34
36
|
*/
|
|
35
|
-
export declare function timeDecode(timeNumber: number | string | Date | null | undefined): Date | undefined;
|
|
37
|
+
export declare function timeDecode(timeNumber: number | string | Date | Record<string, never> | null | undefined): Date | undefined;
|
|
36
38
|
/**
|
|
37
39
|
* Encodes a Date object into a backend date number (e.g., patient birth date).
|
|
38
40
|
*
|
|
39
41
|
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
40
42
|
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
41
|
-
*
|
|
43
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date.
|
|
44
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to today
|
|
42
45
|
* @return a YYYYMMDD date number for the backend
|
|
43
46
|
* @see #dateDecode
|
|
44
47
|
* @see #timeEncode
|
|
45
48
|
*/
|
|
46
|
-
export declare function dateEncode(date
|
|
49
|
+
export declare function dateEncode(date: Date | number | string | Record<string, never> | null | undefined): number | undefined;
|
|
47
50
|
/**
|
|
48
51
|
* Encodes a Date object into a backend time number (e.g., health element openingDate).
|
|
49
52
|
*
|
|
50
53
|
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
51
54
|
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
52
|
-
*
|
|
55
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.
|
|
56
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to now
|
|
53
57
|
* @return a YYYYMMDDHHmmss date number for the backend
|
|
54
58
|
* @see #timeDecode
|
|
55
59
|
* @see #dateEncode
|
|
56
60
|
*/
|
|
57
|
-
export declare function timeEncode(date: Date |
|
|
61
|
+
export declare function timeEncode(date: Date | number | string | Record<string, never> | null | undefined): number | undefined;
|
|
58
62
|
/**
|
|
59
63
|
* Formats a value and a physical unit into text.
|
|
60
64
|
* @param value the numerical or string value to encode
|
|
@@ -113,12 +113,19 @@ function phoneNumberFormat(phoneNumber) {
|
|
|
113
113
|
}
|
|
114
114
|
return (0, libphonenumber_js_1.formatNumber)(parsedPhoneNumber, 'INTERNATIONAL');
|
|
115
115
|
}
|
|
116
|
+
// An empty object ({}) is a supported sentinel meaning "now": the date/time encoders and decoders
|
|
117
|
+
// interpret it as the current date. Only a plain, empty object qualifies — Dates, arrays, boxed
|
|
118
|
+
// primitives, and objects with keys are excluded.
|
|
119
|
+
function isNowSentinel(value) {
|
|
120
|
+
return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype && Object.keys(value).length === 0;
|
|
121
|
+
}
|
|
116
122
|
/**
|
|
117
123
|
* Converts a backend date number (e.g., patient birth date) into a Date object.
|
|
118
124
|
*
|
|
119
125
|
* Accepts both yyyyMMdd and yyyyMMddHHmmss fuzzy dates (only the date part is kept), a String that
|
|
120
126
|
* can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.
|
|
121
|
-
*
|
|
127
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date.
|
|
128
|
+
* @param dateNumber a yyyyMMdd / yyyyMMddHHmmss fuzzy date, a numeric String, or a Date; {} defaults to now
|
|
122
129
|
* @return a Date object
|
|
123
130
|
* @throws Error if the fuzzy date is negative.
|
|
124
131
|
* @see #dateEncode
|
|
@@ -129,6 +136,9 @@ function dateDecode(dateNumber) {
|
|
|
129
136
|
return undefined;
|
|
130
137
|
if (dateNumber instanceof Date)
|
|
131
138
|
return dateNumber;
|
|
139
|
+
// An empty object ({}) is the supported sentinel meaning "now"; any other object yields undefined.
|
|
140
|
+
if (typeof dateNumber === 'object')
|
|
141
|
+
return isNowSentinel(dateNumber) ? new Date() : undefined;
|
|
132
142
|
if (typeof dateNumber === 'string') {
|
|
133
143
|
if (dateNumber.trim() === '')
|
|
134
144
|
return undefined;
|
|
@@ -151,7 +161,8 @@ function dateDecode(dateNumber) {
|
|
|
151
161
|
*
|
|
152
162
|
* Accepts both yyyyMMddHHmmss and yyyyMMdd fuzzy dates (the time part defaults to midnight), a String
|
|
153
163
|
* that can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.
|
|
154
|
-
*
|
|
164
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.
|
|
165
|
+
* @param timeNumber a yyyyMMddHHmmss / yyyyMMdd fuzzy date, a numeric String, or a Date; {} defaults to now
|
|
155
166
|
* @return a Date object
|
|
156
167
|
* @throws Error if the fuzzy date is negative.
|
|
157
168
|
* @see #timeEncode
|
|
@@ -162,6 +173,9 @@ function timeDecode(timeNumber) {
|
|
|
162
173
|
return undefined;
|
|
163
174
|
if (timeNumber instanceof Date)
|
|
164
175
|
return timeNumber;
|
|
176
|
+
// An empty object ({}) is the supported sentinel meaning "now"; any other object yields undefined.
|
|
177
|
+
if (typeof timeNumber === 'object')
|
|
178
|
+
return isNowSentinel(timeNumber) ? new Date() : undefined;
|
|
165
179
|
if (typeof timeNumber === 'string') {
|
|
166
180
|
if (timeNumber.trim() === '')
|
|
167
181
|
return undefined;
|
|
@@ -184,21 +198,24 @@ function timeDecode(timeNumber) {
|
|
|
184
198
|
*
|
|
185
199
|
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
186
200
|
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
187
|
-
*
|
|
201
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date.
|
|
202
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to today
|
|
188
203
|
* @return a YYYYMMDD date number for the backend
|
|
189
204
|
* @see #dateDecode
|
|
190
205
|
* @see #timeEncode
|
|
191
206
|
*/
|
|
192
207
|
function dateEncode(date) {
|
|
193
|
-
if (date === null || date === undefined)
|
|
194
|
-
return undefined;
|
|
195
|
-
}
|
|
196
|
-
if (typeof date === 'string' && date.trim() === '')
|
|
208
|
+
if (date === null || date === undefined)
|
|
197
209
|
return undefined;
|
|
198
210
|
if (date instanceof Date) {
|
|
199
211
|
// date is null if the field is not set
|
|
200
212
|
return date ? Number((0, date_fns_1.format)(date, 'yyyyMMdd').padStart(8, '19700101')) : undefined;
|
|
201
213
|
}
|
|
214
|
+
// An empty object ({}) is the supported sentinel meaning "now"; any other object yields undefined.
|
|
215
|
+
if (typeof date === 'object')
|
|
216
|
+
return isNowSentinel(date) ? dateEncode(new Date()) : undefined;
|
|
217
|
+
if (typeof date === 'string' && date.trim() === '')
|
|
218
|
+
return undefined;
|
|
202
219
|
// A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds
|
|
203
220
|
const fuzzy = Number(date);
|
|
204
221
|
if (!fuzzy || isNaN(fuzzy))
|
|
@@ -219,7 +236,8 @@ function dateEncode(date) {
|
|
|
219
236
|
*
|
|
220
237
|
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
221
238
|
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
222
|
-
*
|
|
239
|
+
* A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.
|
|
240
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to now
|
|
223
241
|
* @return a YYYYMMDDHHmmss date number for the backend
|
|
224
242
|
* @see #timeDecode
|
|
225
243
|
* @see #dateEncode
|
|
@@ -227,11 +245,14 @@ function dateEncode(date) {
|
|
|
227
245
|
function timeEncode(date) {
|
|
228
246
|
if (date === null || date === undefined)
|
|
229
247
|
return undefined;
|
|
230
|
-
if (typeof date === 'string' && date.trim() === '')
|
|
231
|
-
return undefined;
|
|
232
248
|
if (date instanceof Date) {
|
|
233
249
|
return date ? Number((0, date_fns_1.format)(date, 'yyyyMMddHHmmss')) : undefined;
|
|
234
250
|
}
|
|
251
|
+
// An empty object ({}) is the supported sentinel meaning "now"; any other object yields undefined.
|
|
252
|
+
if (typeof date === 'object')
|
|
253
|
+
return isNowSentinel(date) ? timeEncode(new Date()) : undefined;
|
|
254
|
+
if (typeof date === 'string' && date.trim() === '')
|
|
255
|
+
return undefined;
|
|
235
256
|
// A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds
|
|
236
257
|
const fuzzy = Number(date);
|
|
237
258
|
if (!fuzzy || isNaN(fuzzy))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting-util.js","sourceRoot":"","sources":["../../../icc-x-api/utils/formatting-util.ts"],"names":[],"mappings":";;;AAgBA,kCAaC;AAED,oCAOC;AAED,gCAGC;AAED,kCAGC;AAED,sCAGC;AAED,gCAGC;AAED,oCAGC;AAuBD,8CAQC;AAaD,gCAiBC;AAaD,gCAgBC;AAYD,gCAoBC;AAYD,gCAmBC;AAOD,oBAWC;AAOD,wBAGC;AAMD,sBAGC;AAMD,kCAMC;AAED,gCAGC;AAED,4CAIC;AAsED,kEAwDC;AAED,4BAqBC;AAzaD,yDAA2E;AAC3E,uCAAiE;AAEjE,6BAA6B;AAC7B,MAAM,eAAe,GAAG,IAAI,CAAA;AAEf,QAAA,WAAW,GAAG,IAAI,MAAM,CAAC,oCAAoC,CAAC,CAAA;AAC9D,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,4CAA4C,CAAC,CAAA;AACrE,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,oCAAoC,CAAC,CAAA;AAE1E,MAAM,QAAQ,GAAG;IACf,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;IACpE,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;CACvE,CAAA;AAED,kDAAkD;AAClD,SAAgB,WAAW,CAAC,IAA+B;IACzD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,gDAAgD;IAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA,CAAC,+CAA+C;IAC3F,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAChF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAC,sBAAsB;IACzD,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,GAAG,GAAG,CAAC,CAAA,CAAC,gBAAgB;IAC5B,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,qCAAqC;QACjF,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA,CAAC,8CAA8C;IACtE,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,KAAK,CAAC,CAAA;AACxB,CAAC;AAED,SAAgB,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,IAA+B;IACxD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAU,EAAE,aAAa,CAAC,CAAA;AAChD,CAAC;AAED,SAAgB,WAAW,CAAC,KAAgC;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAW,EAAE,aAAa,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,aAAa,CAAC,KAAgC;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAW,CAAC,CAAA;AACnC,CAAC;AAED,SAAgB,UAAU,CAAC,IAA+B;IACxD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAU,EAAE,gBAAgB,CAAC,CAAA;AACnD,CAAC;AAED,SAAgB,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;;EAmBE;AAEF,SAAgB,iBAAiB,CAAC,WAAsC;IACtE,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvE,MAAM,iBAAiB,GAAG,IAAA,+BAAW,EAAC,WAAW,EAAE,eAAe,CAAiB,CAAA;IACnF,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,+DAA+D;QAC/D,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,OAAO,IAAA,gCAAY,EAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,UAAqD;IAC9E,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACrE,IAAI,UAAU,YAAY,IAAI;QAAE,OAAO,UAAU,CAAA;IACjD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAA;QACnC,UAAU,GAAG,MAAM,CAAA;IACrB,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,0FAA0F;IAC1F,MAAM,aAAa,GAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;IAE3E,OAAO,IAAA,gBAAS,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;AACrE,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,UAAqD;IAC9E,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACrE,IAAI,UAAU,YAAY,IAAI;QAAE,OAAO,UAAU,CAAA;IACjD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAA;QACnC,UAAU,GAAG,MAAM,CAAA;IACrB,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,mGAAmG;IACnG,MAAM,aAAa,GAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC3F,OAAO,IAAA,gBAAS,EAAC,aAAa,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAC,IAAgD;IACzE,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,SAAS,CAAA;IAAC,CAAC;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACpE,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,uCAAuC;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxF,CAAC;IACD,8FAA8F;IAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAC1C,gCAAgC;QAChC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QAC5B,uDAAuD;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAA;IACpC,CAAC;IACD,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAC,IAA+C;IACxE,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACpE,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,CAAC;IACD,8FAA8F;IAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAC1C,uDAAuD;QACvD,OAAO,KAAK,GAAG,OAAO,CAAA;IACxB,CAAC;IACD,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QAC5B,sCAAsC;QACtC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAgB,IAAI,CAAC,KAAyC,EAAE,IAA+B;IAC7F,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;IACjB,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,SAAS,GAAG,EAAE,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,gBAAgB;QAChB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,MAAM,CAAC,KAAgC;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,KAAgC;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,MAAoD;IAC9E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC9D,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,SAAgB,UAAU,CAAC,MAAoE;IAC7F,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;AACpE,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAoE;IACnG,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,OAAO,UAAU,iCAAK,MAAM,KAAE,SAAS,IAAE,CAAA;AAC3C,CAAC;AAED,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,yBAAyB,GAA6C;IAC1E,OAAO;IACP,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,QAAQ;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,UAAU;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,4EAA4E;IAC5E,CAAC,OAAO,EAAE,IAAI,CAAC;IACf,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,eAAe;IACf,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,cAAc;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,eAAe;IACf,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,OAAO;IACP,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,QAAQ;IACR,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,SAAS;IACT,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,SAAS;IACT,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,qBAAqB;IACrB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,kBAAkB;IAClB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,iBAAiB;IACjB,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACX,CAAA;AAED,SAAgB,2BAA2B,CAAC,MAAiC;IAC3E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,aAAa,GAAG,EAAE,CAAA;IAEtB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;YACzD,aAAa,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAEnB,qDAAqD;QACrD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAClC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACxC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;gBACjB,SAAQ;YACV,CAAC;YACD,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YAC7C,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;YACX,SAAQ;QACV,CAAC;QAED,mEAAmE;QACnE,IAAI,OAA8C,CAAA;QAClD,KAAK,MAAM,KAAK,IAAI,yBAAyB,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,KAAK,CAAA;gBACf,MAAK;YACP,CAAC;QACH,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,EAAE,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACtB,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACtB,SAAQ;QACV,CAAC;QAED,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,aAAa,IAAI,CAAC,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,EAAE,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACf,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,YAAY,EAAE,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED,SAAgB,QAAQ,CAAC,mBAA8C;IACrE,IAAI,mBAAmB,KAAK,IAAI,IAAI,mBAAmB,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvF,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,GAAG,QAAQ,CAAC,CAAC,CAAC;QAClF,IAAA,gBAAS,EAAC,EAAE,GAAG,mBAAmB,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC,mBAAmB,IAAI,cAAc,CAAC,CAAC,CAAC;YACvC,IAAA,gBAAS,EAAC,EAAE,GAAG,mBAAmB,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACjC,OAAO;QACL,MAAM,EAAE,CAAC,MAAiC,EAAsB,EAAE;YAChE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC7D,MAAM,aAAa,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC3E,OAAO,IAAA,iBAAU,EAAC,MAAM,EAAE,aAAa,EAAE;gBACvC,4BAA4B,EAAE,IAAI;gBAClC,2BAA2B,EAAE,IAAI;aAClC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { parseNumber, formatNumber, ParsedNumber } from 'libphonenumber-js'\nimport {format as formatDate, parse as parseDate} from 'date-fns'\n\n// TODO: move this to env.js?\nconst DEFAULT_COUNTRY = 'BE'\n\nexport const nihiiRegExp = new RegExp('^(\\\\d{1})(\\\\d{5})(\\\\d{2})(\\\\d{3})$')\nexport const ssinRegExp = new RegExp('^(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{2})$')\nexport const ibanRegExp = new RegExp('^(\\\\d{4})(\\\\d{4})(\\\\d{4})(\\\\d{4})$')\n\nconst patterns = {\n IBAN: (iban: string) => /^BE\\d{14}$/.test(iban) && isValidIBAN(iban),\n IBANBE: (iban: string) => /^BE\\d{14}$/.test(iban) && isValidIBAN(iban),\n}\n\n//http://ht5ifv.serprest.pt/extensions/tools/IBAN/\nexport function isValidIBAN(iban: string | null | undefined): boolean | undefined {\n if (iban === null || iban === undefined) return undefined\n //This function check if the checksum if correct\n iban = iban.replace(/^(.{4})(.*)$/, '$2$1') //Move the first 4 chars from left to the right\n const fun = (e: string) => (e.charCodeAt(0) - 'A'.charCodeAt(0) + 10).toString()\n iban = iban.replace(/[A-Z]/g, fun) //Convert A-Z to 10-25\n let $sum = 0\n let $ei = 1 //First exponent\n for (let $i = iban.length - 1; $i >= 0; $i--) {\n $sum += $ei * parseInt(iban.charAt($i), 10) //multiply the digit by it's exponent\n $ei = ($ei * 10) % 97 //compute next base 10 exponent in modulus 97\n }\n return $sum % 97 === 1\n}\n\nexport function ibanValidate(iban: string | null | undefined): boolean | undefined {\n if (iban === null || iban === undefined) return undefined\n if (iban.startsWith('BE')) {\n return patterns.IBANBE(iban)\n } else {\n return patterns.IBAN(iban)\n }\n}\n\nexport function ibanFormat(iban: string | null | undefined): string | undefined {\n if (iban === null || iban === undefined) return undefined\n return iban.replace(ibanRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiFormat(nihii: string | null | undefined): string | undefined {\n if (nihii === null || nihii === undefined) return undefined\n return nihii.replace(nihiiRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiValidate(nihii: string | null | undefined): boolean | undefined {\n if (nihii === null || nihii === undefined) return undefined\n return !!nihii.match(nihiiRegExp)\n}\n\nexport function ssinFormat(ssin: string | null | undefined): string | undefined {\n if (ssin === null || ssin === undefined) return undefined\n return ssin.replace(ssinRegExp, '$1 $2 $3 $4 $5')\n}\n\nexport function ssinValidate(ssin: string | null | undefined): boolean | undefined {\n if (ssin === null || ssin === undefined) return undefined\n return !!ssin.match(ssinRegExp)\n}\n\n/* Alternate lib free version\nexport function phoneNumberValidate(phoneNumber: string): boolean {\n return (\n !!phoneNumber.match(/(?:\\+|00)([1-9][0-9]{1-2})([- /.]*([0-9]+))+/) ||\n !!phoneNumber.match(/(0[1-9][0-9]*)([- /.]*([0-9]+))+/)\n )\n}\n\nexport function phoneNumberFormat(phoneNumber: string): string {\n let match = phoneNumber.match(/(?:\\+|00)([1-9][0-9]{1-2})([- /.]*([0-9]+))+/)\n if (match) {\n return `+${match[1]} ${match[2].replace(/[- /.]/g, \" \")}`.replace(/ /g, \" \")\n }\n match = phoneNumber.match(/0([1-9][0-9]*)([- /.]*([0-9]+))+/)\n if (match) {\n return `+32 ${match[1]} ${match[2].replace(/[- /.]/g, \" \")}`.replace(/ /g, \" \")\n }\n return phoneNumber\n}\n*/\n\nexport function phoneNumberFormat(phoneNumber: string | null | undefined): string | undefined {\n if (phoneNumber === null || phoneNumber === undefined) return undefined\n const parsedPhoneNumber = parseNumber(phoneNumber, DEFAULT_COUNTRY) as ParsedNumber\n if (Object.keys(parsedPhoneNumber).length === 0) {\n // The number is not valid, so we leave the input string as-is.\n return phoneNumber\n }\n return formatNumber(parsedPhoneNumber, 'INTERNATIONAL')\n}\n\n/**\n * Converts a backend date number (e.g., patient birth date) into a Date object.\n *\n * Accepts both yyyyMMdd and yyyyMMddHHmmss fuzzy dates (only the date part is kept), a String that\n * can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.\n * @param dateNumber a yyyyMMdd / yyyyMMddHHmmss fuzzy date, a numeric String, or a Date\n * @return a Date object\n * @throws Error if the fuzzy date is negative.\n * @see #dateEncode\n * @see #timeDecode\n */\nexport function dateDecode(dateNumber: number | string | Date | null | undefined): Date | undefined {\n if (dateNumber === null || dateNumber === undefined) return undefined\n if (dateNumber instanceof Date) return dateNumber\n if (typeof dateNumber === 'string') {\n if (dateNumber.trim() === '') return undefined\n const parsed = Number(dateNumber)\n if (isNaN(parsed)) return undefined\n dateNumber = parsed\n }\n if (dateNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n if (!dateNumber) return undefined\n // Accept both yyyyMMdd and yyyyMMddHHmmss: pad short numbers and keep only the date part.\n const dateNumberStr: string = dateNumber.toString().padStart(8, '19700101')\n\n return parseDate(dateNumberStr.slice(0, 8), 'yyyyMMdd', new Date())\n}\n\n/**\n * Converts a backend time number (e.g., health element openingDate) into a Date object.\n *\n * Accepts both yyyyMMddHHmmss and yyyyMMdd fuzzy dates (the time part defaults to midnight), a String\n * that can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.\n * @param timeNumber a yyyyMMddHHmmss / yyyyMMdd fuzzy date, a numeric String, or a Date\n * @return a Date object\n * @throws Error if the fuzzy date is negative.\n * @see #timeEncode\n * @see #dateDecode\n */\nexport function timeDecode(timeNumber: number | string | Date | null | undefined): Date | undefined {\n if (timeNumber === null || timeNumber === undefined) return undefined\n if (timeNumber instanceof Date) return timeNumber\n if (typeof timeNumber === 'string') {\n if (timeNumber.trim() === '') return undefined\n const parsed = Number(timeNumber)\n if (isNaN(parsed)) return undefined\n timeNumber = parsed\n }\n if (timeNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n if (!timeNumber) return undefined\n // Accept both yyyyMMdd and yyyyMMddHHmmss: pad the date part, then fill the time part with zeroes.\n const timeNumberStr: string = timeNumber.toString().padStart(8, '19700101').padEnd(14, '0')\n return parseDate(timeNumberStr, 'yyyyMMddHHmmss', new Date())\n}\n\n/**\n * Encodes a Date object into a backend date number (e.g., patient birth date).\n *\n * A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already\n * encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.\n * @param date a Date object, or a fuzzy date / epoch as a String or Number\n * @return a YYYYMMDD date number for the backend\n * @see #dateDecode\n * @see #timeEncode\n */\nexport function dateEncode(date?: Date | Number | String | null | undefined): number | undefined {\n if (date === null || date === undefined) { return undefined }\n if (typeof date === 'string' && date.trim() === '') return undefined\n if (date instanceof Date) {\n // date is null if the field is not set\n return date ? Number(formatDate(date, 'yyyyMMdd').padStart(8, '19700101')) : undefined\n }\n // A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds\n const fuzzy = Number(date)\n if (!fuzzy || isNaN(fuzzy)) return undefined\n if (fuzzy >= 18000101 && fuzzy < 25400000) {\n // already a yyyyMMdd fuzzy date\n return fuzzy\n }\n if (fuzzy >= 18000101000000) {\n // a yyyyMMddHHmmss fuzzy date: keep only the date part\n return Math.floor(fuzzy / 1000000)\n }\n // an epoch expressed in milliseconds\n return Number(formatDate(new Date(fuzzy), 'yyyyMMdd'))\n}\n\n/**\n * Encodes a Date object into a backend time number (e.g., health element openingDate).\n *\n * A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already\n * encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.\n * @param date a Date object, or a fuzzy date / epoch as a String or Number\n * @return a YYYYMMDDHHmmss date number for the backend\n * @see #timeDecode\n * @see #dateEncode\n */\nexport function timeEncode(date: Date | Number | String | null | undefined): number | undefined {\n if (date === null || date === undefined) return undefined\n if (typeof date === 'string' && date.trim() === '') return undefined\n if (date instanceof Date) {\n return date ? Number(formatDate(date, 'yyyyMMddHHmmss')) : undefined\n }\n // A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds\n const fuzzy = Number(date)\n if (!fuzzy || isNaN(fuzzy)) return undefined\n if (fuzzy >= 18000101 && fuzzy < 25400000) {\n // a yyyyMMdd fuzzy date: pad the time part with zeroes\n return fuzzy * 1000000\n }\n if (fuzzy >= 18000101000000) {\n // already a yyyyMMddHHmmss fuzzy date\n return fuzzy\n }\n // an epoch expressed in milliseconds\n return Number(formatDate(new Date(fuzzy), 'yyyyMMddHHmmss'))\n}\n\n/**\n * Formats a value and a physical unit into text.\n * @param value the numerical or string value to encode\n * @param unit the unit represented as a string (an empty string is also supported)\n */\nexport function unit(value: number | string | null | undefined, unit: string | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined\n unit = unit || ''\n let separator: string\n if (!unit || unit.startsWith('°')) {\n separator = ''\n } else {\n // including '%'\n separator = '\\xa0'\n }\n return value + separator + unit\n}\n\n/**\n * 0.1 + 0.2 = 0.30000000000000004. Use this function to be better at maths.\n * @param value number\n * @return the rounded number, two after the comma\n */\nexport function amount(value: number | null | undefined): number | undefined {\n if (value === null || value === undefined) return undefined\n return Number(value.toFixed(2))\n}\n\n/**\n * A simple formatter to keep the logic across the app.\n * Input: 2.1 ; Output: 2.10€\n */\nexport function money(value: number | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined\n return [value.toFixed(2), '€'].join('')\n}\n\n/**\n * Transform a dictionary to a url params.\n * From { key1: value1, key2: value2, ... } returns key1=value1&key2=value2&...=...\n */\nexport function toUrlParams(params: { [key: string]: string } | null | undefined): string | undefined {\n if (params === null || params === undefined) return undefined\n return Object.entries(params)\n .map(([key, value]) => (value ? key + '=' + value : undefined))\n .filter(Boolean)\n .join('&')\n}\n\nexport function personName(person: { firstName?: string; lastName?: string } | null | undefined): string | undefined {\n if (person === null || person === undefined) return undefined\n return `${person.firstName || ''} ${person.lastName || ''}`.trim()\n}\n\nexport function personNameAbbrev(person: { firstName?: string; lastName?: string } | null | undefined): string | undefined {\n if (person === null || person === undefined) return undefined\n const firstName = person.firstName ? person.firstName[0] + '.' : undefined\n return personName({...person, firstName})\n}\n\n// Moment.js → date-fns format token mapping. Listed longest-first so the\n// matcher consumes the longest valid moment token at each position.\nconst MOMENT_TO_DATE_FNS_TOKENS: ReadonlyArray<readonly [string, string]> = [\n // Year\n ['YYYY', 'yyyy'],\n ['YY', 'yy'],\n ['Y', 'y'],\n // Month\n ['MMMM', 'MMMM'],\n ['MMM', 'MMM'],\n ['Mo', 'Mo'],\n ['MM', 'MM'],\n ['M', 'M'],\n // Quarter\n ['Qo', 'Qo'],\n ['Q', 'Q'],\n // Day of year (moment DDD/DDDD/DDDo → date-fns D/DDD/Do, additional tokens)\n ['DDDDo', 'Do'],\n ['DDDD', 'DDD'],\n ['DDDo', 'Do'],\n ['DDD', 'D'],\n // Day of month\n ['Do', 'do'],\n ['DD', 'dd'],\n ['D', 'd'],\n // Day of week\n ['dddd', 'EEEE'],\n ['ddd', 'EEE'],\n ['dd', 'EEEEEE'],\n ['do', 'eo'],\n ['d', 'e'],\n ['E', 'i'],\n // Week of year\n ['ww', 'ww'],\n ['wo', 'wo'],\n ['w', 'w'],\n ['WW', 'II'],\n ['Wo', 'Io'],\n ['W', 'I'],\n // Hour\n ['HH', 'HH'],\n ['H', 'H'],\n ['hh', 'hh'],\n ['h', 'h'],\n ['kk', 'kk'],\n ['k', 'k'],\n // AM/PM\n ['A', 'a'],\n ['a', 'aaa'],\n // Minute\n ['mm', 'mm'],\n ['m', 'm'],\n // Second\n ['ss', 'ss'],\n ['s', 's'],\n // Fractional seconds\n ['SSSS', 'SSSS'],\n ['SSS', 'SSS'],\n ['SS', 'SS'],\n ['S', 'S'],\n // Timezone offset\n ['ZZ', 'xx'],\n ['Z', 'xxx'],\n // Unix timestamp\n ['X', 't'],\n ['x', 'T'],\n]\n\nexport function momentFormatToDateFnsFormat(format: string | null | undefined): string | undefined {\n if (format === null || format === undefined) return undefined\n const parts: string[] = []\n let literalBuffer = ''\n\n const flushLiteral = () => {\n if (literalBuffer.length > 0) {\n parts.push(\"'\" + literalBuffer.replace(/'/g, \"''\") + \"'\")\n literalBuffer = ''\n }\n }\n\n let i = 0\n while (i < format.length) {\n const c = format[i]\n\n // Moment bracketed literal: [text] → date-fns 'text'\n if (c === '[') {\n const end = format.indexOf(']', i)\n if (end === -1) {\n literalBuffer += format.substring(i + 1)\n i = format.length\n continue\n }\n literalBuffer += format.substring(i + 1, end)\n i = end + 1\n continue\n }\n\n // Match the longest moment token starting at the current position.\n let matched: readonly [string, string] | undefined\n for (const token of MOMENT_TO_DATE_FNS_TOKENS) {\n if (format.startsWith(token[0], i)) {\n matched = token\n break\n }\n }\n if (matched) {\n flushLiteral()\n parts.push(matched[1])\n i += matched[0].length\n continue\n }\n\n // Non-token character: alphabetic chars must be escaped as literals,\n // otherwise date-fns would interpret them as its own tokens.\n if (/[A-Za-z]/.test(c)) {\n literalBuffer += c\n } else {\n flushLiteral()\n parts.push(c)\n }\n i++\n }\n flushLiteral()\n return parts.join('')\n}\n\nexport function toMoment(epochOrLongCalendar: number | null | undefined): { format: (format: string | null | undefined) => string | undefined } | undefined {\n if (epochOrLongCalendar === null || epochOrLongCalendar === undefined) return undefined\n if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {\n return undefined\n }\n const parsed = (epochOrLongCalendar >= 18000101 && epochOrLongCalendar < 25400000) ?\n parseDate('' + epochOrLongCalendar, 'yyyyMMdd', new Date()) :\n (epochOrLongCalendar >= 18000101000000) ?\n parseDate('' + epochOrLongCalendar, 'yyyyMMddHHmmss', new Date()) :\n new Date(epochOrLongCalendar)\n return {\n format: (format: string | null | undefined): string | undefined => {\n if (format === null || format === undefined) return undefined\n const dateFnsFormat = momentFormatToDateFnsFormat(format)\n if (dateFnsFormat === null || dateFnsFormat === undefined) return undefined\n return formatDate(parsed, dateFnsFormat, {\n useAdditionalDayOfYearTokens: true,\n useAdditionalWeekYearTokens: true,\n })\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"formatting-util.js","sourceRoot":"","sources":["../../../icc-x-api/utils/formatting-util.ts"],"names":[],"mappings":";;;AAgBA,kCAaC;AAED,oCAOC;AAED,gCAGC;AAED,kCAGC;AAED,sCAGC;AAED,gCAGC;AAED,oCAGC;AAuBD,8CAQC;AAqBD,gCAmBC;AAcD,gCAkBC;AAaD,gCAsBC;AAaD,gCAqBC;AAOD,oBAWC;AAOD,wBAGC;AAMD,sBAGC;AAMD,kCAMC;AAED,gCAGC;AAED,4CAIC;AAsED,kEAwDC;AAED,4BAqBC;AA5bD,yDAA2E;AAC3E,uCAAiE;AAEjE,6BAA6B;AAC7B,MAAM,eAAe,GAAG,IAAI,CAAA;AAEf,QAAA,WAAW,GAAG,IAAI,MAAM,CAAC,oCAAoC,CAAC,CAAA;AAC9D,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,4CAA4C,CAAC,CAAA;AACrE,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,oCAAoC,CAAC,CAAA;AAE1E,MAAM,QAAQ,GAAG;IACf,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;IACpE,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;CACvE,CAAA;AAED,kDAAkD;AAClD,SAAgB,WAAW,CAAC,IAA+B;IACzD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,gDAAgD;IAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA,CAAC,+CAA+C;IAC3F,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAChF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAC,sBAAsB;IACzD,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,GAAG,GAAG,CAAC,CAAA,CAAC,gBAAgB;IAC5B,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,qCAAqC;QACjF,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA,CAAC,8CAA8C;IACtE,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,KAAK,CAAC,CAAA;AACxB,CAAC;AAED,SAAgB,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,IAA+B;IACxD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAU,EAAE,aAAa,CAAC,CAAA;AAChD,CAAC;AAED,SAAgB,WAAW,CAAC,KAAgC;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAW,EAAE,aAAa,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,aAAa,CAAC,KAAgC;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAW,CAAC,CAAA;AACnC,CAAC;AAED,SAAgB,UAAU,CAAC,IAA+B;IACxD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAU,EAAE,gBAAgB,CAAC,CAAA;AACnD,CAAC;AAED,SAAgB,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;;EAmBE;AAEF,SAAgB,iBAAiB,CAAC,WAAsC;IACtE,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvE,MAAM,iBAAiB,GAAG,IAAA,+BAAW,EAAC,WAAW,EAAE,eAAe,CAAiB,CAAA;IACnF,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,+DAA+D;QAC/D,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,OAAO,IAAA,gCAAY,EAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;AACzD,CAAC;AAED,kGAAkG;AAClG,gGAAgG;AAChG,kDAAkD;AAClD,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;AAC5I,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,UAAU,CAAC,UAA6E;IACtG,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACrE,IAAI,UAAU,YAAY,IAAI;QAAE,OAAO,UAAU,CAAA;IACjD,mGAAmG;IACnG,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAA;QACnC,UAAU,GAAG,MAAM,CAAA;IACrB,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,0FAA0F;IAC1F,MAAM,aAAa,GAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;IAE3E,OAAO,IAAA,gBAAS,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;AACrE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,UAAU,CAAC,UAA6E;IACtG,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACrE,IAAI,UAAU,YAAY,IAAI;QAAE,OAAO,UAAU,CAAA;IACjD,mGAAmG;IACnG,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAA;QACnC,UAAU,GAAG,MAAM,CAAA;IACrB,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,mGAAmG;IACnG,MAAM,aAAa,GAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC3F,OAAO,IAAA,gBAAS,EAAC,aAAa,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,IAAuE;IAChG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,uCAAuC;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxF,CAAC;IACD,mGAAmG;IACnG,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACpE,8FAA8F;IAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAC1C,gCAAgC;QAChC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QAC5B,uDAAuD;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAA;IACpC,CAAC;IACD,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CAAC,IAAuE;IAChG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,CAAC;IACD,mGAAmG;IACnG,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACpE,8FAA8F;IAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAC1C,uDAAuD;QACvD,OAAO,KAAK,GAAG,OAAO,CAAA;IACxB,CAAC;IACD,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QAC5B,sCAAsC;QACtC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAA,iBAAU,EAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAgB,IAAI,CAAC,KAAyC,EAAE,IAA+B;IAC7F,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;IACjB,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,SAAS,GAAG,EAAE,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,gBAAgB;QAChB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,MAAM,CAAC,KAAgC;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,KAAgC;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC3D,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,MAAoD;IAC9E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC9D,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,SAAgB,UAAU,CAAC,MAAoE;IAC7F,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;AACpE,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAoE;IACnG,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,OAAO,UAAU,iCAAK,MAAM,KAAE,SAAS,IAAE,CAAA;AAC3C,CAAC;AAED,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,yBAAyB,GAA6C;IAC1E,OAAO;IACP,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,QAAQ;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,UAAU;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,4EAA4E;IAC5E,CAAC,OAAO,EAAE,IAAI,CAAC;IACf,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,eAAe;IACf,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,cAAc;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,eAAe;IACf,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,OAAO;IACP,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,QAAQ;IACR,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,SAAS;IACT,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,SAAS;IACT,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,qBAAqB;IACrB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,kBAAkB;IAClB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,iBAAiB;IACjB,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACX,CAAA;AAED,SAAgB,2BAA2B,CAAC,MAAiC;IAC3E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,aAAa,GAAG,EAAE,CAAA;IAEtB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;YACzD,aAAa,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAEnB,qDAAqD;QACrD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAClC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACxC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;gBACjB,SAAQ;YACV,CAAC;YACD,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YAC7C,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;YACX,SAAQ;QACV,CAAC;QAED,mEAAmE;QACnE,IAAI,OAA8C,CAAA;QAClD,KAAK,MAAM,KAAK,IAAI,yBAAyB,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,KAAK,CAAA;gBACf,MAAK;YACP,CAAC;QACH,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,EAAE,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACtB,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACtB,SAAQ;QACV,CAAC;QAED,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,aAAa,IAAI,CAAC,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,EAAE,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACf,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,YAAY,EAAE,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED,SAAgB,QAAQ,CAAC,mBAA8C;IACrE,IAAI,mBAAmB,KAAK,IAAI,IAAI,mBAAmB,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvF,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,GAAG,QAAQ,CAAC,CAAC,CAAC;QAClF,IAAA,gBAAS,EAAC,EAAE,GAAG,mBAAmB,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC,mBAAmB,IAAI,cAAc,CAAC,CAAC,CAAC;YACvC,IAAA,gBAAS,EAAC,EAAE,GAAG,mBAAmB,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACjC,OAAO;QACL,MAAM,EAAE,CAAC,MAAiC,EAAsB,EAAE;YAChE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC7D,MAAM,aAAa,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC3E,OAAO,IAAA,iBAAU,EAAC,MAAM,EAAE,aAAa,EAAE;gBACvC,4BAA4B,EAAE,IAAI;gBAClC,2BAA2B,EAAE,IAAI;aAClC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { parseNumber, formatNumber, ParsedNumber } from 'libphonenumber-js'\nimport {format as formatDate, parse as parseDate} from 'date-fns'\n\n// TODO: move this to env.js?\nconst DEFAULT_COUNTRY = 'BE'\n\nexport const nihiiRegExp = new RegExp('^(\\\\d{1})(\\\\d{5})(\\\\d{2})(\\\\d{3})$')\nexport const ssinRegExp = new RegExp('^(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{2})$')\nexport const ibanRegExp = new RegExp('^(\\\\d{4})(\\\\d{4})(\\\\d{4})(\\\\d{4})$')\n\nconst patterns = {\n IBAN: (iban: string) => /^BE\\d{14}$/.test(iban) && isValidIBAN(iban),\n IBANBE: (iban: string) => /^BE\\d{14}$/.test(iban) && isValidIBAN(iban),\n}\n\n//http://ht5ifv.serprest.pt/extensions/tools/IBAN/\nexport function isValidIBAN(iban: string | null | undefined): boolean | undefined {\n if (iban === null || iban === undefined) return undefined\n //This function check if the checksum if correct\n iban = iban.replace(/^(.{4})(.*)$/, '$2$1') //Move the first 4 chars from left to the right\n const fun = (e: string) => (e.charCodeAt(0) - 'A'.charCodeAt(0) + 10).toString()\n iban = iban.replace(/[A-Z]/g, fun) //Convert A-Z to 10-25\n let $sum = 0\n let $ei = 1 //First exponent\n for (let $i = iban.length - 1; $i >= 0; $i--) {\n $sum += $ei * parseInt(iban.charAt($i), 10) //multiply the digit by it's exponent\n $ei = ($ei * 10) % 97 //compute next base 10 exponent in modulus 97\n }\n return $sum % 97 === 1\n}\n\nexport function ibanValidate(iban: string | null | undefined): boolean | undefined {\n if (iban === null || iban === undefined) return undefined\n if (iban.startsWith('BE')) {\n return patterns.IBANBE(iban)\n } else {\n return patterns.IBAN(iban)\n }\n}\n\nexport function ibanFormat(iban: string | null | undefined): string | undefined {\n if (iban === null || iban === undefined) return undefined\n return iban.replace(ibanRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiFormat(nihii: string | null | undefined): string | undefined {\n if (nihii === null || nihii === undefined) return undefined\n return nihii.replace(nihiiRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiValidate(nihii: string | null | undefined): boolean | undefined {\n if (nihii === null || nihii === undefined) return undefined\n return !!nihii.match(nihiiRegExp)\n}\n\nexport function ssinFormat(ssin: string | null | undefined): string | undefined {\n if (ssin === null || ssin === undefined) return undefined\n return ssin.replace(ssinRegExp, '$1 $2 $3 $4 $5')\n}\n\nexport function ssinValidate(ssin: string | null | undefined): boolean | undefined {\n if (ssin === null || ssin === undefined) return undefined\n return !!ssin.match(ssinRegExp)\n}\n\n/* Alternate lib free version\nexport function phoneNumberValidate(phoneNumber: string): boolean {\n return (\n !!phoneNumber.match(/(?:\\+|00)([1-9][0-9]{1-2})([- /.]*([0-9]+))+/) ||\n !!phoneNumber.match(/(0[1-9][0-9]*)([- /.]*([0-9]+))+/)\n )\n}\n\nexport function phoneNumberFormat(phoneNumber: string): string {\n let match = phoneNumber.match(/(?:\\+|00)([1-9][0-9]{1-2})([- /.]*([0-9]+))+/)\n if (match) {\n return `+${match[1]} ${match[2].replace(/[- /.]/g, \" \")}`.replace(/ /g, \" \")\n }\n match = phoneNumber.match(/0([1-9][0-9]*)([- /.]*([0-9]+))+/)\n if (match) {\n return `+32 ${match[1]} ${match[2].replace(/[- /.]/g, \" \")}`.replace(/ /g, \" \")\n }\n return phoneNumber\n}\n*/\n\nexport function phoneNumberFormat(phoneNumber: string | null | undefined): string | undefined {\n if (phoneNumber === null || phoneNumber === undefined) return undefined\n const parsedPhoneNumber = parseNumber(phoneNumber, DEFAULT_COUNTRY) as ParsedNumber\n if (Object.keys(parsedPhoneNumber).length === 0) {\n // The number is not valid, so we leave the input string as-is.\n return phoneNumber\n }\n return formatNumber(parsedPhoneNumber, 'INTERNATIONAL')\n}\n\n// An empty object ({}) is a supported sentinel meaning \"now\": the date/time encoders and decoders\n// interpret it as the current date. Only a plain, empty object qualifies — Dates, arrays, boxed\n// primitives, and objects with keys are excluded.\nfunction isNowSentinel(value: unknown): boolean {\n return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype && Object.keys(value).length === 0\n}\n\n/**\n * Converts a backend date number (e.g., patient birth date) into a Date object.\n *\n * Accepts both yyyyMMdd and yyyyMMddHHmmss fuzzy dates (only the date part is kept), a String that\n * can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.\n * A null or undefined input yields undefined; an empty object ({}) defaults to the current date.\n * @param dateNumber a yyyyMMdd / yyyyMMddHHmmss fuzzy date, a numeric String, or a Date; {} defaults to now\n * @return a Date object\n * @throws Error if the fuzzy date is negative.\n * @see #dateEncode\n * @see #timeDecode\n */\nexport function dateDecode(dateNumber: number | string | Date | Record<string, never> | null | undefined): Date | undefined {\n if (dateNumber === null || dateNumber === undefined) return undefined\n if (dateNumber instanceof Date) return dateNumber\n // An empty object ({}) is the supported sentinel meaning \"now\"; any other object yields undefined.\n if (typeof dateNumber === 'object') return isNowSentinel(dateNumber) ? new Date() : undefined\n if (typeof dateNumber === 'string') {\n if (dateNumber.trim() === '') return undefined\n const parsed = Number(dateNumber)\n if (isNaN(parsed)) return undefined\n dateNumber = parsed\n }\n if (dateNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n if (!dateNumber) return undefined\n // Accept both yyyyMMdd and yyyyMMddHHmmss: pad short numbers and keep only the date part.\n const dateNumberStr: string = dateNumber.toString().padStart(8, '19700101')\n\n return parseDate(dateNumberStr.slice(0, 8), 'yyyyMMdd', new Date())\n}\n\n/**\n * Converts a backend time number (e.g., health element openingDate) into a Date object.\n *\n * Accepts both yyyyMMddHHmmss and yyyyMMdd fuzzy dates (the time part defaults to midnight), a String\n * that can be parsed as such a number (blank Strings yield undefined), and a Date which is passed through.\n * A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.\n * @param timeNumber a yyyyMMddHHmmss / yyyyMMdd fuzzy date, a numeric String, or a Date; {} defaults to now\n * @return a Date object\n * @throws Error if the fuzzy date is negative.\n * @see #timeEncode\n * @see #dateDecode\n */\nexport function timeDecode(timeNumber: number | string | Date | Record<string, never> | null | undefined): Date | undefined {\n if (timeNumber === null || timeNumber === undefined) return undefined\n if (timeNumber instanceof Date) return timeNumber\n // An empty object ({}) is the supported sentinel meaning \"now\"; any other object yields undefined.\n if (typeof timeNumber === 'object') return isNowSentinel(timeNumber) ? new Date() : undefined\n if (typeof timeNumber === 'string') {\n if (timeNumber.trim() === '') return undefined\n const parsed = Number(timeNumber)\n if (isNaN(parsed)) return undefined\n timeNumber = parsed\n }\n if (timeNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n if (!timeNumber) return undefined\n // Accept both yyyyMMdd and yyyyMMddHHmmss: pad the date part, then fill the time part with zeroes.\n const timeNumberStr: string = timeNumber.toString().padStart(8, '19700101').padEnd(14, '0')\n return parseDate(timeNumberStr, 'yyyyMMddHHmmss', new Date())\n}\n\n/**\n * Encodes a Date object into a backend date number (e.g., patient birth date).\n *\n * A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already\n * encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.\n * A null or undefined input yields undefined; an empty object ({}) defaults to the current date.\n * @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to today\n * @return a YYYYMMDD date number for the backend\n * @see #dateDecode\n * @see #timeEncode\n */\nexport function dateEncode(date: Date | number | string | Record<string, never> | null | undefined): number | undefined {\n if (date === null || date === undefined) return undefined\n if (date instanceof Date) {\n // date is null if the field is not set\n return date ? Number(formatDate(date, 'yyyyMMdd').padStart(8, '19700101')) : undefined\n }\n // An empty object ({}) is the supported sentinel meaning \"now\"; any other object yields undefined.\n if (typeof date === 'object') return isNowSentinel(date) ? dateEncode(new Date()) : undefined\n if (typeof date === 'string' && date.trim() === '') return undefined\n // A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds\n const fuzzy = Number(date)\n if (!fuzzy || isNaN(fuzzy)) return undefined\n if (fuzzy >= 18000101 && fuzzy < 25400000) {\n // already a yyyyMMdd fuzzy date\n return fuzzy\n }\n if (fuzzy >= 18000101000000) {\n // a yyyyMMddHHmmss fuzzy date: keep only the date part\n return Math.floor(fuzzy / 1000000)\n }\n // an epoch expressed in milliseconds\n return Number(formatDate(new Date(fuzzy), 'yyyyMMdd'))\n}\n\n/**\n * Encodes a Date object into a backend time number (e.g., health element openingDate).\n *\n * A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already\n * encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.\n * A null or undefined input yields undefined; an empty object ({}) defaults to the current date and time.\n * @param date a Date object, or a fuzzy date / epoch as a String or Number; {} defaults to now\n * @return a YYYYMMDDHHmmss date number for the backend\n * @see #timeDecode\n * @see #dateEncode\n */\nexport function timeEncode(date: Date | number | string | Record<string, never> | null | undefined): number | undefined {\n if (date === null || date === undefined) return undefined\n if (date instanceof Date) {\n return date ? Number(formatDate(date, 'yyyyMMddHHmmss')) : undefined\n }\n // An empty object ({}) is the supported sentinel meaning \"now\"; any other object yields undefined.\n if (typeof date === 'object') return isNowSentinel(date) ? timeEncode(new Date()) : undefined\n if (typeof date === 'string' && date.trim() === '') return undefined\n // A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds\n const fuzzy = Number(date)\n if (!fuzzy || isNaN(fuzzy)) return undefined\n if (fuzzy >= 18000101 && fuzzy < 25400000) {\n // a yyyyMMdd fuzzy date: pad the time part with zeroes\n return fuzzy * 1000000\n }\n if (fuzzy >= 18000101000000) {\n // already a yyyyMMddHHmmss fuzzy date\n return fuzzy\n }\n // an epoch expressed in milliseconds\n return Number(formatDate(new Date(fuzzy), 'yyyyMMddHHmmss'))\n}\n\n/**\n * Formats a value and a physical unit into text.\n * @param value the numerical or string value to encode\n * @param unit the unit represented as a string (an empty string is also supported)\n */\nexport function unit(value: number | string | null | undefined, unit: string | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined\n unit = unit || ''\n let separator: string\n if (!unit || unit.startsWith('°')) {\n separator = ''\n } else {\n // including '%'\n separator = '\\xa0'\n }\n return value + separator + unit\n}\n\n/**\n * 0.1 + 0.2 = 0.30000000000000004. Use this function to be better at maths.\n * @param value number\n * @return the rounded number, two after the comma\n */\nexport function amount(value: number | null | undefined): number | undefined {\n if (value === null || value === undefined) return undefined\n return Number(value.toFixed(2))\n}\n\n/**\n * A simple formatter to keep the logic across the app.\n * Input: 2.1 ; Output: 2.10€\n */\nexport function money(value: number | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined\n return [value.toFixed(2), '€'].join('')\n}\n\n/**\n * Transform a dictionary to a url params.\n * From { key1: value1, key2: value2, ... } returns key1=value1&key2=value2&...=...\n */\nexport function toUrlParams(params: { [key: string]: string } | null | undefined): string | undefined {\n if (params === null || params === undefined) return undefined\n return Object.entries(params)\n .map(([key, value]) => (value ? key + '=' + value : undefined))\n .filter(Boolean)\n .join('&')\n}\n\nexport function personName(person: { firstName?: string; lastName?: string } | null | undefined): string | undefined {\n if (person === null || person === undefined) return undefined\n return `${person.firstName || ''} ${person.lastName || ''}`.trim()\n}\n\nexport function personNameAbbrev(person: { firstName?: string; lastName?: string } | null | undefined): string | undefined {\n if (person === null || person === undefined) return undefined\n const firstName = person.firstName ? person.firstName[0] + '.' : undefined\n return personName({...person, firstName})\n}\n\n// Moment.js → date-fns format token mapping. Listed longest-first so the\n// matcher consumes the longest valid moment token at each position.\nconst MOMENT_TO_DATE_FNS_TOKENS: ReadonlyArray<readonly [string, string]> = [\n // Year\n ['YYYY', 'yyyy'],\n ['YY', 'yy'],\n ['Y', 'y'],\n // Month\n ['MMMM', 'MMMM'],\n ['MMM', 'MMM'],\n ['Mo', 'Mo'],\n ['MM', 'MM'],\n ['M', 'M'],\n // Quarter\n ['Qo', 'Qo'],\n ['Q', 'Q'],\n // Day of year (moment DDD/DDDD/DDDo → date-fns D/DDD/Do, additional tokens)\n ['DDDDo', 'Do'],\n ['DDDD', 'DDD'],\n ['DDDo', 'Do'],\n ['DDD', 'D'],\n // Day of month\n ['Do', 'do'],\n ['DD', 'dd'],\n ['D', 'd'],\n // Day of week\n ['dddd', 'EEEE'],\n ['ddd', 'EEE'],\n ['dd', 'EEEEEE'],\n ['do', 'eo'],\n ['d', 'e'],\n ['E', 'i'],\n // Week of year\n ['ww', 'ww'],\n ['wo', 'wo'],\n ['w', 'w'],\n ['WW', 'II'],\n ['Wo', 'Io'],\n ['W', 'I'],\n // Hour\n ['HH', 'HH'],\n ['H', 'H'],\n ['hh', 'hh'],\n ['h', 'h'],\n ['kk', 'kk'],\n ['k', 'k'],\n // AM/PM\n ['A', 'a'],\n ['a', 'aaa'],\n // Minute\n ['mm', 'mm'],\n ['m', 'm'],\n // Second\n ['ss', 'ss'],\n ['s', 's'],\n // Fractional seconds\n ['SSSS', 'SSSS'],\n ['SSS', 'SSS'],\n ['SS', 'SS'],\n ['S', 'S'],\n // Timezone offset\n ['ZZ', 'xx'],\n ['Z', 'xxx'],\n // Unix timestamp\n ['X', 't'],\n ['x', 'T'],\n]\n\nexport function momentFormatToDateFnsFormat(format: string | null | undefined): string | undefined {\n if (format === null || format === undefined) return undefined\n const parts: string[] = []\n let literalBuffer = ''\n\n const flushLiteral = () => {\n if (literalBuffer.length > 0) {\n parts.push(\"'\" + literalBuffer.replace(/'/g, \"''\") + \"'\")\n literalBuffer = ''\n }\n }\n\n let i = 0\n while (i < format.length) {\n const c = format[i]\n\n // Moment bracketed literal: [text] → date-fns 'text'\n if (c === '[') {\n const end = format.indexOf(']', i)\n if (end === -1) {\n literalBuffer += format.substring(i + 1)\n i = format.length\n continue\n }\n literalBuffer += format.substring(i + 1, end)\n i = end + 1\n continue\n }\n\n // Match the longest moment token starting at the current position.\n let matched: readonly [string, string] | undefined\n for (const token of MOMENT_TO_DATE_FNS_TOKENS) {\n if (format.startsWith(token[0], i)) {\n matched = token\n break\n }\n }\n if (matched) {\n flushLiteral()\n parts.push(matched[1])\n i += matched[0].length\n continue\n }\n\n // Non-token character: alphabetic chars must be escaped as literals,\n // otherwise date-fns would interpret them as its own tokens.\n if (/[A-Za-z]/.test(c)) {\n literalBuffer += c\n } else {\n flushLiteral()\n parts.push(c)\n }\n i++\n }\n flushLiteral()\n return parts.join('')\n}\n\nexport function toMoment(epochOrLongCalendar: number | null | undefined): { format: (format: string | null | undefined) => string | undefined } | undefined {\n if (epochOrLongCalendar === null || epochOrLongCalendar === undefined) return undefined\n if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {\n return undefined\n }\n const parsed = (epochOrLongCalendar >= 18000101 && epochOrLongCalendar < 25400000) ?\n parseDate('' + epochOrLongCalendar, 'yyyyMMdd', new Date()) :\n (epochOrLongCalendar >= 18000101000000) ?\n parseDate('' + epochOrLongCalendar, 'yyyyMMddHHmmss', new Date()) :\n new Date(epochOrLongCalendar)\n return {\n format: (format: string | null | undefined): string | undefined => {\n if (format === null || format === undefined) return undefined\n const dateFnsFormat = momentFormatToDateFnsFormat(format)\n if (dateFnsFormat === null || dateFnsFormat === undefined) return undefined\n return formatDate(parsed, dateFnsFormat, {\n useAdditionalDayOfYearTokens: true,\n useAdditionalWeekYearTokens: true,\n })\n }\n }\n}\n"]}
|