@icure/api 8.7.2 → 8.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
export declare const nihiiRegExp: RegExp;
|
|
2
2
|
export declare const ssinRegExp: RegExp;
|
|
3
3
|
export declare const ibanRegExp: RegExp;
|
|
4
|
-
export declare function isValidIBAN(iban: string): boolean;
|
|
5
|
-
export declare function ibanValidate(iban: string): boolean;
|
|
6
|
-
export declare function ibanFormat(iban: string): string;
|
|
7
|
-
export declare function nihiiFormat(nihii: string): string;
|
|
8
|
-
export declare function nihiiValidate(nihii: string): boolean;
|
|
9
|
-
export declare function ssinFormat(ssin: string): string;
|
|
10
|
-
export declare function ssinValidate(ssin: string): boolean;
|
|
11
|
-
export declare function phoneNumberFormat(phoneNumber: string): string;
|
|
4
|
+
export declare function isValidIBAN(iban: string | null | undefined): boolean | undefined;
|
|
5
|
+
export declare function ibanValidate(iban: string | null | undefined): boolean | undefined;
|
|
6
|
+
export declare function ibanFormat(iban: string | null | undefined): string | undefined;
|
|
7
|
+
export declare function nihiiFormat(nihii: string | null | undefined): string | undefined;
|
|
8
|
+
export declare function nihiiValidate(nihii: string | null | undefined): boolean | undefined;
|
|
9
|
+
export declare function ssinFormat(ssin: string | null | undefined): string | undefined;
|
|
10
|
+
export declare function ssinValidate(ssin: string | null | undefined): boolean | undefined;
|
|
11
|
+
export declare function phoneNumberFormat(phoneNumber: string | null | undefined): string | undefined;
|
|
12
12
|
/**
|
|
13
13
|
* Converts a backend date number (e.g., patient birth date) into a Date object.
|
|
14
14
|
* @param dateNumber a YYYYMMDD date number from the backend
|
|
@@ -17,7 +17,7 @@ export declare function phoneNumberFormat(phoneNumber: string): string;
|
|
|
17
17
|
* @see #dateEncode
|
|
18
18
|
* @see #timeDecode
|
|
19
19
|
*/
|
|
20
|
-
export declare function dateDecode(dateNumber: number): Date | undefined;
|
|
20
|
+
export declare function dateDecode(dateNumber: number | null | undefined): Date | undefined;
|
|
21
21
|
/**
|
|
22
22
|
* Converts a backend time number (e.g., health element openingDate) into a Date object.
|
|
23
23
|
* @param timeNumber a YYYYMMDD date number from the backend
|
|
@@ -25,7 +25,7 @@ export declare function dateDecode(dateNumber: number): Date | undefined;
|
|
|
25
25
|
* @see #timeEncode
|
|
26
26
|
* @see #dateDecode
|
|
27
27
|
*/
|
|
28
|
-
export declare function timeDecode(timeNumber: number): Date | undefined;
|
|
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
|
* @param date a Date object
|
|
@@ -33,7 +33,7 @@ export declare function timeDecode(timeNumber: number): Date | undefined;
|
|
|
33
33
|
* @see #dateDecode
|
|
34
34
|
* @see #timeEncode
|
|
35
35
|
*/
|
|
36
|
-
export declare function dateEncode(date
|
|
36
|
+
export declare function dateEncode(date?: Date | null | undefined): number | undefined;
|
|
37
37
|
/**
|
|
38
38
|
* Encodes a Date object into a backend time number (e.g., health element openingDate).
|
|
39
39
|
* @param date a Date object
|
|
@@ -41,40 +41,40 @@ export declare function dateEncode(date: Date): number | undefined;
|
|
|
41
41
|
* @see #timeDecode
|
|
42
42
|
* @see #dateEncode
|
|
43
43
|
*/
|
|
44
|
-
export declare function timeEncode(date: Date): number | undefined;
|
|
44
|
+
export declare function timeEncode(date: Date | null | undefined): number | undefined;
|
|
45
45
|
/**
|
|
46
46
|
* Formats a value and a physical unit into text.
|
|
47
47
|
* @param value the numerical or string value to encode
|
|
48
48
|
* @param unit the unit represented as a string (an empty string is also supported)
|
|
49
49
|
*/
|
|
50
|
-
export declare function unit(value: number | string, unit: string | null): string;
|
|
50
|
+
export declare function unit(value: number | string | null | undefined, unit: string | null | undefined): string | undefined;
|
|
51
51
|
/**
|
|
52
52
|
* 0.1 + 0.2 = 0.30000000000000004. Use this function to be better at maths.
|
|
53
|
-
* @param
|
|
53
|
+
* @param value number
|
|
54
54
|
* @return the rounded number, two after the comma
|
|
55
55
|
*/
|
|
56
|
-
export declare function amount(value: number): number;
|
|
56
|
+
export declare function amount(value: number | null | undefined): number | undefined;
|
|
57
57
|
/**
|
|
58
58
|
* A simple formatter to keep the logic across the app.
|
|
59
59
|
* Input: 2.1 ; Output: 2.10€
|
|
60
60
|
*/
|
|
61
|
-
export declare function money(value: number): string;
|
|
61
|
+
export declare function money(value: number | null | undefined): string | undefined;
|
|
62
62
|
/**
|
|
63
63
|
* Transform a dictionary to a url params.
|
|
64
64
|
* From { key1: value1, key2: value2, ... } returns key1=value1&key2=value2&...=...
|
|
65
65
|
*/
|
|
66
66
|
export declare function toUrlParams(params: {
|
|
67
67
|
[key: string]: string;
|
|
68
|
-
}): string;
|
|
68
|
+
} | null | undefined): string | undefined;
|
|
69
69
|
export declare function personName(person: {
|
|
70
70
|
firstName?: string;
|
|
71
71
|
lastName?: string;
|
|
72
|
-
}): string;
|
|
72
|
+
} | null | undefined): string | undefined;
|
|
73
73
|
export declare function personNameAbbrev(person: {
|
|
74
74
|
firstName?: string;
|
|
75
75
|
lastName?: string;
|
|
76
|
-
}): string;
|
|
77
|
-
export declare function momentFormatToDateFnsFormat(format: string): string;
|
|
78
|
-
export declare function toMoment(epochOrLongCalendar: number): {
|
|
79
|
-
format: (format: string) => string;
|
|
80
|
-
} |
|
|
76
|
+
} | null | undefined): string | undefined;
|
|
77
|
+
export declare function momentFormatToDateFnsFormat(format: string | null | undefined): string | undefined;
|
|
78
|
+
export declare function toMoment(epochOrLongCalendar: number | null | undefined): {
|
|
79
|
+
format: (format: string | null | undefined) => string | undefined;
|
|
80
|
+
} | undefined;
|
|
@@ -34,6 +34,8 @@ const patterns = {
|
|
|
34
34
|
};
|
|
35
35
|
//http://ht5ifv.serprest.pt/extensions/tools/IBAN/
|
|
36
36
|
function isValidIBAN(iban) {
|
|
37
|
+
if (iban === null || iban === undefined)
|
|
38
|
+
return undefined;
|
|
37
39
|
//This function check if the checksum if correct
|
|
38
40
|
iban = iban.replace(/^(.{4})(.*)$/, '$2$1'); //Move the first 4 chars from left to the right
|
|
39
41
|
const fun = (e) => (e.charCodeAt(0) - 'A'.charCodeAt(0) + 10).toString();
|
|
@@ -47,6 +49,8 @@ function isValidIBAN(iban) {
|
|
|
47
49
|
return $sum % 97 === 1;
|
|
48
50
|
}
|
|
49
51
|
function ibanValidate(iban) {
|
|
52
|
+
if (iban === null || iban === undefined)
|
|
53
|
+
return undefined;
|
|
50
54
|
if (iban.startsWith('BE')) {
|
|
51
55
|
return patterns.IBANBE(iban);
|
|
52
56
|
}
|
|
@@ -55,18 +59,28 @@ function ibanValidate(iban) {
|
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
function ibanFormat(iban) {
|
|
62
|
+
if (iban === null || iban === undefined)
|
|
63
|
+
return undefined;
|
|
58
64
|
return iban.replace(exports.ibanRegExp, '$1 $2 $3 $4');
|
|
59
65
|
}
|
|
60
66
|
function nihiiFormat(nihii) {
|
|
67
|
+
if (nihii === null || nihii === undefined)
|
|
68
|
+
return undefined;
|
|
61
69
|
return nihii.replace(exports.nihiiRegExp, '$1 $2 $3 $4');
|
|
62
70
|
}
|
|
63
71
|
function nihiiValidate(nihii) {
|
|
72
|
+
if (nihii === null || nihii === undefined)
|
|
73
|
+
return undefined;
|
|
64
74
|
return !!nihii.match(exports.nihiiRegExp);
|
|
65
75
|
}
|
|
66
76
|
function ssinFormat(ssin) {
|
|
77
|
+
if (ssin === null || ssin === undefined)
|
|
78
|
+
return undefined;
|
|
67
79
|
return ssin.replace(exports.ssinRegExp, '$1 $2 $3 $4 $5');
|
|
68
80
|
}
|
|
69
81
|
function ssinValidate(ssin) {
|
|
82
|
+
if (ssin === null || ssin === undefined)
|
|
83
|
+
return undefined;
|
|
70
84
|
return !!ssin.match(exports.ssinRegExp);
|
|
71
85
|
}
|
|
72
86
|
/* Alternate lib free version
|
|
@@ -90,6 +104,8 @@ export function phoneNumberFormat(phoneNumber: string): string {
|
|
|
90
104
|
}
|
|
91
105
|
*/
|
|
92
106
|
function phoneNumberFormat(phoneNumber) {
|
|
107
|
+
if (phoneNumber === null || phoneNumber === undefined)
|
|
108
|
+
return undefined;
|
|
93
109
|
const parsedPhoneNumber = (0, libphonenumber_js_1.parseNumber)(phoneNumber, DEFAULT_COUNTRY);
|
|
94
110
|
if (Object.keys(parsedPhoneNumber).length === 0) {
|
|
95
111
|
// The number is not valid, so we leave the input string as-is.
|
|
@@ -106,9 +122,8 @@ function phoneNumberFormat(phoneNumber) {
|
|
|
106
122
|
* @see #timeDecode
|
|
107
123
|
*/
|
|
108
124
|
function dateDecode(dateNumber) {
|
|
109
|
-
if (
|
|
125
|
+
if (dateNumber === null || dateNumber === undefined)
|
|
110
126
|
return undefined;
|
|
111
|
-
}
|
|
112
127
|
if (dateNumber < 0) {
|
|
113
128
|
throw new Error("We don't decode negative dates. Please make sure you have valid data.");
|
|
114
129
|
}
|
|
@@ -129,6 +144,8 @@ function dateDecode(dateNumber) {
|
|
|
129
144
|
* @see #dateDecode
|
|
130
145
|
*/
|
|
131
146
|
function timeDecode(timeNumber) {
|
|
147
|
+
if (timeNumber === null || timeNumber === undefined)
|
|
148
|
+
return undefined;
|
|
132
149
|
return timeNumber ? (0, date_fns_1.parse)(timeNumber.toString(), 'yyyyMMddHHmmss', new Date()) : undefined;
|
|
133
150
|
}
|
|
134
151
|
/**
|
|
@@ -139,6 +156,9 @@ function timeDecode(timeNumber) {
|
|
|
139
156
|
* @see #timeEncode
|
|
140
157
|
*/
|
|
141
158
|
function dateEncode(date) {
|
|
159
|
+
if (date === null || date === undefined) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
142
162
|
const dateStr = (0, date_fns_1.format)(date, 'yyyyMMdd').padStart(8, '19700101');
|
|
143
163
|
// date is null if the field is not set
|
|
144
164
|
return date ? Number(dateStr) : undefined;
|
|
@@ -151,6 +171,8 @@ function dateEncode(date) {
|
|
|
151
171
|
* @see #dateEncode
|
|
152
172
|
*/
|
|
153
173
|
function timeEncode(date) {
|
|
174
|
+
if (date === null || date === undefined)
|
|
175
|
+
return undefined;
|
|
154
176
|
return date ? Number((0, date_fns_1.format)(date, 'yyyyMMddHHmmss')) : undefined;
|
|
155
177
|
}
|
|
156
178
|
/**
|
|
@@ -159,6 +181,8 @@ function timeEncode(date) {
|
|
|
159
181
|
* @param unit the unit represented as a string (an empty string is also supported)
|
|
160
182
|
*/
|
|
161
183
|
function unit(value, unit) {
|
|
184
|
+
if (value === null || value === undefined)
|
|
185
|
+
return undefined;
|
|
162
186
|
unit = unit || '';
|
|
163
187
|
let separator;
|
|
164
188
|
if (!unit || unit.startsWith('°')) {
|
|
@@ -172,33 +196,43 @@ function unit(value, unit) {
|
|
|
172
196
|
}
|
|
173
197
|
/**
|
|
174
198
|
* 0.1 + 0.2 = 0.30000000000000004. Use this function to be better at maths.
|
|
175
|
-
* @param
|
|
199
|
+
* @param value number
|
|
176
200
|
* @return the rounded number, two after the comma
|
|
177
201
|
*/
|
|
178
202
|
function amount(value) {
|
|
179
|
-
|
|
203
|
+
if (value === null || value === undefined)
|
|
204
|
+
return undefined;
|
|
205
|
+
return Number(value.toFixed(2));
|
|
180
206
|
}
|
|
181
207
|
/**
|
|
182
208
|
* A simple formatter to keep the logic across the app.
|
|
183
209
|
* Input: 2.1 ; Output: 2.10€
|
|
184
210
|
*/
|
|
185
211
|
function money(value) {
|
|
186
|
-
|
|
212
|
+
if (value === null || value === undefined)
|
|
213
|
+
return undefined;
|
|
214
|
+
return [value.toFixed(2), '€'].join('');
|
|
187
215
|
}
|
|
188
216
|
/**
|
|
189
217
|
* Transform a dictionary to a url params.
|
|
190
218
|
* From { key1: value1, key2: value2, ... } returns key1=value1&key2=value2&...=...
|
|
191
219
|
*/
|
|
192
220
|
function toUrlParams(params) {
|
|
221
|
+
if (params === null || params === undefined)
|
|
222
|
+
return undefined;
|
|
193
223
|
return Object.entries(params)
|
|
194
224
|
.map(([key, value]) => (value ? key + '=' + value : undefined))
|
|
195
225
|
.filter(Boolean)
|
|
196
226
|
.join('&');
|
|
197
227
|
}
|
|
198
228
|
function personName(person) {
|
|
229
|
+
if (person === null || person === undefined)
|
|
230
|
+
return undefined;
|
|
199
231
|
return `${person.firstName || ''} ${person.lastName || ''}`.trim();
|
|
200
232
|
}
|
|
201
233
|
function personNameAbbrev(person) {
|
|
234
|
+
if (person === null || person === undefined)
|
|
235
|
+
return undefined;
|
|
202
236
|
const firstName = person.firstName ? person.firstName[0] + '.' : undefined;
|
|
203
237
|
return personName(Object.assign(Object.assign({}, person), { firstName }));
|
|
204
238
|
}
|
|
@@ -270,6 +304,8 @@ const MOMENT_TO_DATE_FNS_TOKENS = [
|
|
|
270
304
|
['x', 'T'],
|
|
271
305
|
];
|
|
272
306
|
function momentFormatToDateFnsFormat(format) {
|
|
307
|
+
if (format === null || format === undefined)
|
|
308
|
+
return undefined;
|
|
273
309
|
const parts = [];
|
|
274
310
|
let literalBuffer = '';
|
|
275
311
|
const flushLiteral = () => {
|
|
@@ -322,8 +358,10 @@ function momentFormatToDateFnsFormat(format) {
|
|
|
322
358
|
return parts.join('');
|
|
323
359
|
}
|
|
324
360
|
function toMoment(epochOrLongCalendar) {
|
|
361
|
+
if (epochOrLongCalendar === null || epochOrLongCalendar === undefined)
|
|
362
|
+
return undefined;
|
|
325
363
|
if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {
|
|
326
|
-
return
|
|
364
|
+
return undefined;
|
|
327
365
|
}
|
|
328
366
|
const parsed = (epochOrLongCalendar >= 18000101 && epochOrLongCalendar < 25400000) ?
|
|
329
367
|
(0, date_fns_1.parse)('' + epochOrLongCalendar, 'yyyyMMdd', new Date()) :
|
|
@@ -332,7 +370,12 @@ function toMoment(epochOrLongCalendar) {
|
|
|
332
370
|
new Date(epochOrLongCalendar);
|
|
333
371
|
return {
|
|
334
372
|
format: (format) => {
|
|
335
|
-
|
|
373
|
+
if (format === null || format === undefined)
|
|
374
|
+
return undefined;
|
|
375
|
+
const dateFnsFormat = momentFormatToDateFnsFormat(format);
|
|
376
|
+
if (dateFnsFormat === null || dateFnsFormat === undefined)
|
|
377
|
+
return undefined;
|
|
378
|
+
return (0, date_fns_1.format)(parsed, dateFnsFormat, {
|
|
336
379
|
useAdditionalDayOfYearTokens: true,
|
|
337
380
|
useAdditionalWeekYearTokens: true,
|
|
338
381
|
});
|
|
@@ -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) {\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) {\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): string {\n return iban.replace(ibanRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiFormat(nihii: string): string {\n return nihii.replace(nihiiRegExp, '$1 $2 $3 $4')\n}\n\nexport function nihiiValidate(nihii: string): boolean {\n return !!nihii.match(nihiiRegExp)\n}\n\nexport function ssinFormat(ssin: string): string {\n return ssin.replace(ssinRegExp, '$1 $2 $3 $4 $5')\n}\n\nexport function ssinValidate(ssin: string): boolean {\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): string {\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): Date | undefined {\n if (!dateNumber) {\n return undefined\n }\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): Date | 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): number | 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): number | 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, unit: string | null): string {\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 a number\n * @return the rounded number, two after the comma\n */\nexport function amount(value: number): number {\n return Number((value || 0).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): string {\n return [(value || 0).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 }): string {\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 }): string {\n return `${person.firstName || ''} ${person.lastName || ''}`.trim()\n}\n\nexport function personNameAbbrev(person: { firstName?: string; lastName?: string }): string {\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): string {\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): { format: (format: string) => string } | null {\n if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {\n return null\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): string => {\n return formatDate(parsed, momentFormatToDateFnsFormat(format), {\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 * @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"]}
|