@icure/api 8.8.1 → 8.8.2
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.
|
@@ -28,20 +28,26 @@ export declare function dateDecode(dateNumber: number | null | undefined): Date
|
|
|
28
28
|
export declare function timeDecode(timeNumber: number | null | undefined): Date | undefined;
|
|
29
29
|
/**
|
|
30
30
|
* Encodes a Date object into a backend date number (e.g., patient birth date).
|
|
31
|
-
*
|
|
31
|
+
*
|
|
32
|
+
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
33
|
+
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
34
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number
|
|
32
35
|
* @return a YYYYMMDD date number for the backend
|
|
33
36
|
* @see #dateDecode
|
|
34
37
|
* @see #timeEncode
|
|
35
38
|
*/
|
|
36
|
-
export declare function dateEncode(date?: Date | null | undefined): number | undefined;
|
|
39
|
+
export declare function dateEncode(date?: Date | Number | String | null | undefined): number | undefined;
|
|
37
40
|
/**
|
|
38
41
|
* Encodes a Date object into a backend time number (e.g., health element openingDate).
|
|
39
|
-
*
|
|
42
|
+
*
|
|
43
|
+
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
44
|
+
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
45
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number
|
|
40
46
|
* @return a YYYYMMDDHHmmss date number for the backend
|
|
41
47
|
* @see #timeDecode
|
|
42
48
|
* @see #dateEncode
|
|
43
49
|
*/
|
|
44
|
-
export declare function timeEncode(date: Date | null | undefined): number | undefined;
|
|
50
|
+
export declare function timeEncode(date: Date | Number | String | null | undefined): number | undefined;
|
|
45
51
|
/**
|
|
46
52
|
* Formats a value and a physical unit into text.
|
|
47
53
|
* @param value the numerical or string value to encode
|
|
@@ -150,7 +150,10 @@ function timeDecode(timeNumber) {
|
|
|
150
150
|
}
|
|
151
151
|
/**
|
|
152
152
|
* Encodes a Date object into a backend date number (e.g., patient birth date).
|
|
153
|
-
*
|
|
153
|
+
*
|
|
154
|
+
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
155
|
+
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
156
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number
|
|
154
157
|
* @return a YYYYMMDD date number for the backend
|
|
155
158
|
* @see #dateDecode
|
|
156
159
|
* @see #timeEncode
|
|
@@ -159,13 +162,33 @@ function dateEncode(date) {
|
|
|
159
162
|
if (date === null || date === undefined) {
|
|
160
163
|
return undefined;
|
|
161
164
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
if (typeof date === 'string' && date.trim() === '')
|
|
166
|
+
return undefined;
|
|
167
|
+
if (date instanceof Date) {
|
|
168
|
+
// date is null if the field is not set
|
|
169
|
+
return date ? Number((0, date_fns_1.format)(date, 'yyyyMMdd').padStart(8, '19700101')) : undefined;
|
|
170
|
+
}
|
|
171
|
+
// A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds
|
|
172
|
+
const fuzzy = Number(date);
|
|
173
|
+
if (!fuzzy || isNaN(fuzzy))
|
|
174
|
+
return undefined;
|
|
175
|
+
if (fuzzy >= 18000101 && fuzzy < 25400000) {
|
|
176
|
+
// already a yyyyMMdd fuzzy date
|
|
177
|
+
return fuzzy;
|
|
178
|
+
}
|
|
179
|
+
if (fuzzy >= 18000101000000) {
|
|
180
|
+
// a yyyyMMddHHmmss fuzzy date: keep only the date part
|
|
181
|
+
return Math.floor(fuzzy / 1000000);
|
|
182
|
+
}
|
|
183
|
+
// an epoch expressed in milliseconds
|
|
184
|
+
return Number((0, date_fns_1.format)(new Date(fuzzy), 'yyyyMMdd'));
|
|
165
185
|
}
|
|
166
186
|
/**
|
|
167
187
|
* Encodes a Date object into a backend time number (e.g., health element openingDate).
|
|
168
|
-
*
|
|
188
|
+
*
|
|
189
|
+
* A Date is formatted as usual. A String or a Number is interpreted as a fuzzy date that is already
|
|
190
|
+
* encoded (yyyyMMdd or yyyyMMddHHmmss) or as an epoch expressed in milliseconds.
|
|
191
|
+
* @param date a Date object, or a fuzzy date / epoch as a String or Number
|
|
169
192
|
* @return a YYYYMMDDHHmmss date number for the backend
|
|
170
193
|
* @see #timeDecode
|
|
171
194
|
* @see #dateEncode
|
|
@@ -173,7 +196,25 @@ function dateEncode(date) {
|
|
|
173
196
|
function timeEncode(date) {
|
|
174
197
|
if (date === null || date === undefined)
|
|
175
198
|
return undefined;
|
|
176
|
-
|
|
199
|
+
if (typeof date === 'string' && date.trim() === '')
|
|
200
|
+
return undefined;
|
|
201
|
+
if (date instanceof Date) {
|
|
202
|
+
return date ? Number((0, date_fns_1.format)(date, 'yyyyMMddHHmmss')) : undefined;
|
|
203
|
+
}
|
|
204
|
+
// A String or a Number is a fuzzy date (yyyyMMdd, yyyyMMddHHmmss) or an epoch in milliseconds
|
|
205
|
+
const fuzzy = Number(date);
|
|
206
|
+
if (!fuzzy || isNaN(fuzzy))
|
|
207
|
+
return undefined;
|
|
208
|
+
if (fuzzy >= 18000101 && fuzzy < 25400000) {
|
|
209
|
+
// a yyyyMMdd fuzzy date: pad the time part with zeroes
|
|
210
|
+
return fuzzy * 1000000;
|
|
211
|
+
}
|
|
212
|
+
if (fuzzy >= 18000101000000) {
|
|
213
|
+
// already a yyyyMMddHHmmss fuzzy date
|
|
214
|
+
return fuzzy;
|
|
215
|
+
}
|
|
216
|
+
// an epoch expressed in milliseconds
|
|
217
|
+
return Number((0, date_fns_1.format)(new Date(fuzzy), 'yyyyMMddHHmmss'));
|
|
177
218
|
}
|
|
178
219
|
/**
|
|
179
220
|
* Formats a value and a physical unit into text.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting-util.js","sourceRoot":"","sources":["../../../icc-x-api/utils/formatting-util.ts"],"names":[],"mappings":"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","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 * @param dateNumber a YYYYMMDD date number from the backend\n * @return a Date object\n * @throws Error if it is impossible to create a date from the number, other if dateNumber is negative.\n * @see #dateEncode\n * @see #timeDecode\n */\nexport function dateDecode(dateNumber: number | null | undefined): Date | undefined {\n if (dateNumber === null || dateNumber === undefined) return undefined\n\n if (dateNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n const dateNumberStr: string = dateNumber.toString().padStart(8, '19700101')\n if (dateNumberStr.length > 8) {\n if (dateNumberStr.endsWith('000000')) {\n return dateNumber ? parseDate(dateNumberStr.slice(0, 8), 'yyyyMMdd', new Date()) : undefined\n }\n\n throw Error(\"Decoded date is over year 9999. We can't format it properly.\")\n }\n return dateNumber ? parseDate(dateNumberStr, 'yyyyMMdd', new Date()) : undefined\n}\n\n/**\n * Converts a backend time number (e.g., health element openingDate) into a Date object.\n * @param timeNumber a YYYYMMDD date number from the backend\n * @return a Date object\n * @see #timeEncode\n * @see #dateDecode\n */\nexport function timeDecode(timeNumber: number | null | undefined): Date | undefined {\n if (timeNumber === null || timeNumber === undefined) return undefined\n return timeNumber ? parseDate(timeNumber.toString(), 'yyyyMMddHHmmss', new Date()) : undefined\n}\n\n/**\n * Encodes a Date object into a backend date number (e.g., patient birth date).\n * @param date a Date object\n * @return a YYYYMMDD date number for the backend\n * @see #dateDecode\n * @see #timeEncode\n */\nexport function dateEncode(date?: Date | null | undefined): number | undefined {\n if (date === null || date === undefined) { return undefined }\n const dateStr = formatDate(date, 'yyyyMMdd').padStart(8, '19700101')\n // date is null if the field is not set\n return date ? Number(dateStr) : undefined\n}\n\n/**\n * Encodes a Date object into a backend time number (e.g., health element openingDate).\n * @param date a Date object\n * @return a YYYYMMDDHHmmss date number for the backend\n * @see #timeDecode\n * @see #dateEncode\n */\nexport function timeEncode(date: Date | null | undefined): number | undefined {\n if (date === null || date === undefined) return undefined\n return date ? Number(formatDate(date, 'yyyyMMddHHmmss')) : undefined\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":"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","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 * @param dateNumber a YYYYMMDD date number from the backend\n * @return a Date object\n * @throws Error if it is impossible to create a date from the number, other if dateNumber is negative.\n * @see #dateEncode\n * @see #timeDecode\n */\nexport function dateDecode(dateNumber: number | null | undefined): Date | undefined {\n if (dateNumber === null || dateNumber === undefined) return undefined\n\n if (dateNumber < 0) {\n throw new Error(\"We don't decode negative dates. Please make sure you have valid data.\")\n }\n const dateNumberStr: string = dateNumber.toString().padStart(8, '19700101')\n if (dateNumberStr.length > 8) {\n if (dateNumberStr.endsWith('000000')) {\n return dateNumber ? parseDate(dateNumberStr.slice(0, 8), 'yyyyMMdd', new Date()) : undefined\n }\n\n throw Error(\"Decoded date is over year 9999. We can't format it properly.\")\n }\n return dateNumber ? parseDate(dateNumberStr, 'yyyyMMdd', new Date()) : undefined\n}\n\n/**\n * Converts a backend time number (e.g., health element openingDate) into a Date object.\n * @param timeNumber a YYYYMMDD date number from the backend\n * @return a Date object\n * @see #timeEncode\n * @see #dateDecode\n */\nexport function timeDecode(timeNumber: number | null | undefined): Date | undefined {\n if (timeNumber === null || timeNumber === undefined) return undefined\n return timeNumber ? parseDate(timeNumber.toString(), 'yyyyMMddHHmmss', new Date()) : undefined\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"]}
|