fhir-dosage-utils 1.10.1 → 1.10.3

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.
package/dist/main.js CHANGED
@@ -202,15 +202,15 @@ function $6ce94eb09701f53d$export$e9106be159f8c977({ quantity: quantity, config:
202
202
  quantity: quantity
203
203
  });
204
204
  let value = quantity.value || 1;
205
+ let comparatorCode = quantity.comparator;
205
206
  let quantityString = unit.length === 0 ? i18next.t("amount.quantity.withoutUnit", {
206
207
  quantity: value
207
208
  }) : i18next.t("amount.quantity.withUnit", {
208
209
  quantity: value,
209
210
  unit: unit
210
211
  });
211
- let comparatorCode = quantity.comparator;
212
- let comparatorString = (0, $3d60081b7152576d$export$e7321bf46d18757f)(comparatorCode) ? i18next.t(`quantityComparator:${comparatorCode}`) : undefined;
213
- if (!(0, $3d60081b7152576d$export$e7321bf46d18757f)(comparatorString)) return quantityString;
212
+ if (!(0, $3d60081b7152576d$export$e7321bf46d18757f)(comparatorCode)) return quantityString;
213
+ let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);
214
214
  return `${comparatorString} ${quantityString}`;
215
215
  }
216
216
 
@@ -495,32 +495,27 @@ function $93b58b7d2ead3b95$export$826742c1df3eca39(i18next, arr, linkWord = "and
495
495
 
496
496
 
497
497
 
498
- // Function to extract times
499
498
  function $7a065f861a4b61f2$var$extractTime(minutes) {
500
- let days = Math.floor(minutes / 1440);
501
- let hours = Math.floor(minutes % 1440 / 60);
499
+ let d = Math.floor(minutes / 1440);
500
+ let h = Math.floor(minutes % 1440 / 60);
502
501
  let remainingMinutes = minutes % 60;
503
502
  return {
504
- days: days,
505
- hours: hours,
506
- minutes: remainingMinutes
503
+ d: d,
504
+ h: h,
505
+ min: remainingMinutes
507
506
  };
508
507
  }
509
508
  function $7a065f861a4b61f2$var$transformOffset(i18next, offset) {
510
509
  if (!(0, $3d60081b7152576d$export$e7321bf46d18757f)(offset) || offset <= 0) return undefined;
511
510
  let time = $7a065f861a4b61f2$var$extractTime(offset);
512
- let subParts = [
513
- time.days > 0 ? i18next.t("unitsOfTime:withCount.d", {
514
- count: time.days
515
- }) : undefined,
516
- time.hours > 0 ? i18next.t("unitsOfTime:withCount.h", {
517
- count: time.hours
518
- }) : undefined,
519
- time.minutes > 0 ? i18next.t("unitsOfTime:withCount.min", {
520
- count: time.minutes
521
- }) : undefined
522
- ].filter((0, $3d60081b7152576d$export$e7321bf46d18757f));
523
- return subParts.join(" ");
511
+ let order = [
512
+ "d",
513
+ "h",
514
+ "min"
515
+ ];
516
+ return order.map((unit)=>time[unit] > 0 ? i18next.t(`unitsOfTime:withCount.${unit}`, {
517
+ count: time[unit]
518
+ }) : undefined).filter((0, $3d60081b7152576d$export$e7321bf46d18757f)).join(" ");
524
519
  }
525
520
  function $7a065f861a4b61f2$var$transformWhen(i18next, when) {
526
521
  if ((0, $7642ff4865ae4b0f$export$d9ff4a623e416a11)(when)) return undefined;
@@ -582,7 +577,6 @@ function $a846209a7dd119d4$export$ee205fa48981886d({ dos: dos, i18next: i18next
582
577
 
583
578
 
584
579
 
585
- // Turn a list of codeable concept into a string
586
580
  function $ee04e2a8ed39962f$var$fromCodeableConceptArrayToString(i18next, codes, config) {
587
581
  const codesAsString = codes.map((code)=>config.fromCodeableConceptToString({
588
582
  code: code,
@@ -590,15 +584,17 @@ function $ee04e2a8ed39962f$var$fromCodeableConceptArrayToString(i18next, codes,
590
584
  })).filter((0, $3d60081b7152576d$export$e7321bf46d18757f));
591
585
  return (0, $93b58b7d2ead3b95$export$826742c1df3eca39)(i18next, codesAsString);
592
586
  }
593
- function $ee04e2a8ed39962f$export$5c69a2202525487a({ dos: dos, config: config, i18next: i18next }) {
594
- let asNeededBoolean = dos.asNeededBoolean;
587
+ function $ee04e2a8ed39962f$var$extractCodeableList(dos) {
595
588
  let asNeededCodeableConcept = dos.asNeededCodeableConcept;
596
589
  let asNeededFor = dos.asNeededFor;
597
- let asNeeded = dos.asNeeded;
598
- // Codeable concept as list, to make algorithm simpler
599
- let codeableList = asNeededFor || (asNeededCodeableConcept !== undefined ? [
590
+ return asNeededFor || (asNeededCodeableConcept !== undefined ? [
600
591
  asNeededCodeableConcept
601
592
  ] : []);
593
+ }
594
+ function $ee04e2a8ed39962f$export$5c69a2202525487a({ dos: dos, config: config, i18next: i18next }) {
595
+ let asNeededBoolean = dos.asNeededBoolean;
596
+ let asNeeded = dos.asNeeded;
597
+ let codeableList = $ee04e2a8ed39962f$var$extractCodeableList(dos);
602
598
  if (codeableList.length > 0) return i18next.t("fields.asNeededFor", {
603
599
  reasons: $ee04e2a8ed39962f$var$fromCodeableConceptArrayToString(i18next, codeableList, config)
604
600
  });
@@ -680,9 +676,23 @@ function $39470eb799331038$export$498ca7f558a02e67({ dos: dos, i18next: i18next
680
676
 
681
677
 
682
678
 
683
- // Function to clean up the params for dateStyle situation
684
- // Note: dateStyle and timeStyle can be used with each other,
685
- // but not with other date-time component options (e.g. weekday, hour, month, etc.).
679
+ const $208be5279f5e6c65$var$strategies = {
680
+ yearOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
681
+ year: "numeric"
682
+ }).format(date),
683
+ // e.g. 2024-03 => May 2024
684
+ yearAndMonthOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
685
+ year: "numeric",
686
+ month: "long"
687
+ }).format(date),
688
+ dateOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
689
+ ...$208be5279f5e6c65$var$generateDateStyleFormatOptions(config.dateTimeFormatOptions)
690
+ }).format(date),
691
+ dateTime: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
692
+ ...$208be5279f5e6c65$var$generateDateStyleFormatOptions(config.dateTimeFormatOptions),
693
+ ...$208be5279f5e6c65$var$generateTimeStyleFormatOptions(config.dateTimeFormatOptions)
694
+ }).format(date)
695
+ };
686
696
  function $208be5279f5e6c65$var$generateDateStyleFormatOptions(options) {
687
697
  if ((0, $3d60081b7152576d$export$e7321bf46d18757f)(options.dateStyle)) return {
688
698
  dateStyle: options.dateStyle
@@ -697,7 +707,6 @@ function $208be5279f5e6c65$var$generateDateStyleFormatOptions(options) {
697
707
  ...defaults
698
708
  };
699
709
  }
700
- // Function to clean up the params for timeStyle situation
701
710
  function $208be5279f5e6c65$var$generateTimeStyleFormatOptions(options) {
702
711
  if ((0, $3d60081b7152576d$export$e7321bf46d18757f)(options.timeStyle)) return {
703
712
  timeStyle: options.timeStyle
@@ -712,51 +721,27 @@ function $208be5279f5e6c65$var$generateTimeStyleFormatOptions(options) {
712
721
  ...defaults
713
722
  };
714
723
  }
724
+ function $208be5279f5e6c65$var$fromDateToMappedDate(datetime) {
725
+ let date = new Date(datetime);
726
+ let hasTimePart = datetime.includes("T");
727
+ let hyphensCount = datetime.split("-").length - 1;
728
+ let hasMonths = hyphensCount >= 1;
729
+ let hasDays = hyphensCount >= 2;
730
+ return {
731
+ date: date,
732
+ hasTimePart: hasTimePart,
733
+ hasMonths: hasMonths,
734
+ hasDays: hasDays
735
+ };
736
+ }
715
737
  function $208be5279f5e6c65$export$a77f8869772ffca4({ config: config, datetimes: datetimes }) {
716
- let options = config.dateTimeFormatOptions;
717
- const entries = datetimes.map((datetime)=>{
718
- let date = new Date(datetime);
719
- let hasTimePart = datetime.includes("T");
720
- let hyphensCount = datetime.split("-").length - 1;
721
- let hasMonths = hyphensCount >= 1;
722
- let hasDays = hyphensCount >= 2;
723
- return {
724
- date: date,
725
- hasTimePart: hasTimePart,
726
- hasMonths: hasMonths,
727
- hasDays: hasDays
728
- };
729
- });
730
- // Time to do the magic
738
+ const entries = datetimes.map($208be5279f5e6c65$var$fromDateToMappedDate);
731
739
  const result = entries.map(({ date: date, hasTimePart: hasTimePart, hasMonths: hasMonths, hasDays: hasDays })=>{
732
- // If only year is defined, print it fully (e.g. 2024)
733
- if (!hasMonths) {
734
- let df1 = new Intl.DateTimeFormat(config.language, {
735
- year: "numeric"
736
- });
737
- return df1.format(date);
738
- }
739
- // If only year and month are defined, print it nicely (e.g. 2024-03 => May 2024 )
740
- if (!hasDays) {
741
- let df2 = new Intl.DateTimeFormat(config.language, {
742
- year: "numeric",
743
- month: "long"
744
- });
745
- return df2.format(date);
746
- }
747
- // If only year / month and days are defined, print it according
748
- if (!hasTimePart) {
749
- let df3 = new Intl.DateTimeFormat(config.language, {
750
- ...$208be5279f5e6c65$var$generateDateStyleFormatOptions(options)
751
- });
752
- return df3.format(date);
753
- }
754
- // Otherwise, we have a full datetime
755
- let df4 = new Intl.DateTimeFormat(config.language, {
756
- ...$208be5279f5e6c65$var$generateDateStyleFormatOptions(options),
757
- ...$208be5279f5e6c65$var$generateTimeStyleFormatOptions(options)
740
+ const chosenStrategy = !hasMonths ? "yearOnly" : !hasDays ? "yearAndMonthOnly" : !hasTimePart ? "dateOnly" : "dateTime";
741
+ return $208be5279f5e6c65$var$strategies[chosenStrategy]({
742
+ config: config,
743
+ date: date
758
744
  });
759
- return df4.format(date);
760
745
  });
761
746
  return result;
762
747
  }
@@ -1006,12 +991,7 @@ class $74b0cf9d3dbd5b46$export$1c191bca55f84a03 extends (0, $868b4eaa4f62b9f7$ex
1006
991
  sequences.add(sequenceNr);
1007
992
  }
1008
993
  // By using the Set values, we are sure it is returned in the way Dosages were written
1009
- return [
1010
- ...sequences.values()
1011
- ].map((sequence)=>{
1012
- let concurrentInstructions = groups[sequence];
1013
- return concurrentInstructions;
1014
- });
994
+ return Array.from(sequences, (sequence)=>groups[sequence]);
1015
995
  }
1016
996
  /**
1017
997
  * From a single dosage, extract specific field(s) requested by user.
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/api.ts","src/classes/Configurator.ts","src/internal/defaultAttributes.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n","import { Configurator } from \"./classes/Configurator\";\n\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n};\n\nexport class FhirDosageUtils extends Configurator {\n /**\n * Factory to create a fine-tuned instance of the utility class\n */\n static async build(\n userConfig?: Params,\n i18nConfig: I18InitOptions = defaultI18NConfig,\n ) {\n const instance = new FhirDosageUtils(userConfig, i18nConfig);\n await instance.init();\n return instance;\n }\n\n /**\n * Does this array of Dosage objects contains only \"sequential\" instructions ?\n */\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n return (\n encounteredSequenceNumbers.size === 0 ||\n encounteredSequenceNumbers.size === dosages.length\n );\n }\n\n /**\n * Turn this array of Dosage objects into a data structure useful to handle \"sequential\" and \"concurrent\" instructions (cf. \"sequence\" property).\n * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.\n */\n groupBySequence(dosages: Dosage[]) {\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n const dosage = dosages[idx];\n\n let sequenceNr = dosage.sequence || idx + 1;\n let localGroup = groups[sequenceNr] || [];\n\n localGroup.push(dosage);\n groups[sequenceNr] = localGroup;\n\n sequences.add(sequenceNr);\n }\n\n // By using the Set values, we are sure it is returned in the way Dosages were written\n return [...sequences.values()].map((sequence) => {\n let concurrentInstructions = groups[sequence];\n return concurrentInstructions;\n });\n }\n\n /**\n * From a single dosage, extract specific field(s) requested by user.\n * Some use cases could request to split part of the object for given needs (quantity and timing separately)\n */\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n /**\n * Turn a FHIR Dosage object into text\n */\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n /**\n * Turn multiple FHIR Dosage objects into text\n */\n fromMultipleDosageToText(dosages: Dosage[]): string {\n // As we can have concurrent / sequential instructions, we need a generic algorithm to do the job\n const hasOnlySequentialInstructions =\n this.containsOnlySequentialInstructions(dosages);\n\n // Sequential instructions\n if (hasOnlySequentialInstructions) {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n // We have both \"sequential\" and \"concurrent\" instructions - time to see what is the configuration\n let sortedDosages = this.groupBySequence(dosages);\n\n // Now that data structures are filled, it is a piece of cake to generate the result\n let sequentialInstructions: string[] = sortedDosages.map(\n (concurrentInstructions) => {\n let concurrentInstructionsAsString = concurrentInstructions.map(\n (dosage) => this.fromDosageToText(dosage),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n },\n );\n\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\nimport type {\n Config,\n DisplayOrder,\n I18N,\n Params,\n InitOptions,\n I18InitOptions,\n} from \"../types\";\n\nexport class Configurator {\n // User Configuration\n protected config: Config;\n // i18next config\n protected i18nConfig: InitOptions;\n // i18next instance\n // When multiple instances of the class are used, they must act independantly regardless of the others\n protected i18nInstance: I18N;\n\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n this.config = {\n ...defaultAttributes,\n ...userConfig,\n };\n this.i18nConfig = {\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...i18nConfig,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n /**\n * To init i18next properly according requested criteria\n */\n protected async init() {\n // You should wait for init to complete (wait for the callback or promise resolution)\n // before using the t function!\n return await this.i18nInstance.use(ChainedBackend).init(this.i18nConfig);\n }\n\n /**\n * To change language\n */\n async changeLanguage(lng: string) {\n this.config = {\n ...this.config,\n language: lng,\n };\n return this.i18nInstance.changeLanguage(lng);\n }\n\n /**\n * Get current language\n */\n getLanguage() {\n return this.config.language;\n }\n\n /**\n * To change display order\n */\n changeDisplayOrder(order: DisplayOrder[]) {\n this.config = {\n ...this.config,\n displayOrder: order,\n };\n }\n\n /**\n * Get display order\n */\n getDisplayOrder() {\n return this.config.displayOrder;\n }\n\n /**\n * Get display separator\n */\n getDisplaySeparator() {\n return this.config.displaySeparator;\n }\n\n /**\n * Set display separator\n */\n changeDisplaySeparator(sep: string) {\n this.config = {\n ...this.config,\n displaySeparator: sep,\n };\n }\n\n /**\n * Get date time format options\n */\n getDateTimeFormatOptions() {\n return this.config.dateTimeFormatOptions;\n }\n\n /**\n * Set date time format options\n */\n changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions) {\n this.config = {\n ...this.config,\n dateTimeFormatOptions: opts,\n };\n }\n}\n","import type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\n/**\n * Function to turn extensions into a string for humans.\n */\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n\n // KIS implementation : print it as provided, without doing anything\n // Extensions have so many cases btw, that having a basic function does the trick\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n let comparatorCode = quantity.comparator;\n let comparatorString = isNotUndefined(comparatorCode)\n ? i18next.t(`quantityComparator:${comparatorCode}`)\n : undefined;\n\n if (!isNotUndefined(comparatorString)) {\n return quantityString;\n }\n\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n // 1. If we have a empty object, return undefined\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n let unit = hasQuantityUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasQuantityUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`amount.range.${technicalKey}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n // 3. Only high is present\n if (isNotUndefined(highValue)) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n // 1. Frequency and frequencyMax are present\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n // 3. Only frequency is present\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n // 1. period and periodMax are present\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 2. Only periodMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 3. Only period present\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type {\n DisplayOrderParams,\n I18N,\n WhenTimeKeys as TimeKeys,\n} from \"../types\";\n\n// Function to extract times\nfunction extractTime(minutes: number) {\n let days = Math.floor(minutes / 1440);\n let hours = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { days, hours, minutes: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n\n let subParts = [\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter(isNotUndefined);\n\n return subParts.join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n// Function to transform dayOfWeek into a string\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n // If empty, skip it\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n // If empty, skip it\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n // Turn it into a string\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n} from \"../types\";\n\n// Turn a list of codeable concept into a string\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n let asNeeded = (dos as DosageR5).asNeeded;\n\n // Codeable concept as list, to make algorithm simpler\n let codeableList =\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : []);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(\n i18next,\n codeableList as CodeableConcept[],\n config,\n ),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n // 1. Both count & countMax are present\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n // 3. Only count is present\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\n\n// Function to clean up the params for dateStyle situation\n// Note: dateStyle and timeStyle can be used with each other,\n// but not with other date-time component options (e.g. weekday, hour, month, etc.).\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\n/**\n * Generic function to map datetimes to user friendly date\n * e.g. from 2018, 1973-06, 1905-08-23, 2015-02-07T13:28:17-05:00 or 2017-01-01T00:00:00.000Z\n */\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n let options = config.dateTimeFormatOptions;\n\n const entries: MappedDate[] = datetimes.map((datetime) => {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n });\n\n // Time to do the magic\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n // If only year is defined, print it fully (e.g. 2024)\n if (!hasMonths) {\n let df1 = new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n });\n return df1.format(date);\n }\n\n // If only year and month are defined, print it nicely (e.g. 2024-03 => May 2024 )\n if (!hasDays) {\n let df2 = new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n });\n return df2.format(date);\n }\n\n // If only year / month and days are defined, print it according\n if (!hasTimePart) {\n let df3 = new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(options),\n });\n return df3.format(date);\n }\n\n // Otherwise, we have a full datetime\n let df4 = new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n // Generate the string version of them\n const boundsPeriod = dos.timing.repeat.boundsPeriod;\n\n let start = formatDatetime({ config, datetime: boundsPeriod.start });\n let end = formatDatetime({ config, datetime: boundsPeriod.end });\n\n // 1. Both start and end are present\n if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n // 3. Only end is present\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n // So better to have a generic approach\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\n // Only consider not empty array\n if (values.length === 0) {\n return undefined;\n }\n\n // Periods are expressed as ratio (like rateRatio)\n const valuesAsString = values\n .map((period) => {\n return fromRatioToString({ config, i18next, ratio: period });\n })\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["src/index.ts","src/api.ts","src/classes/Configurator.ts","src/internal/defaultAttributes.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n","import { Configurator } from \"./classes/Configurator\";\n\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n};\n\nexport class FhirDosageUtils extends Configurator {\n /**\n * Factory to create a fine-tuned instance of the utility class\n */\n static async build(\n userConfig?: Params,\n i18nConfig: I18InitOptions = defaultI18NConfig,\n ) {\n const instance = new FhirDosageUtils(userConfig, i18nConfig);\n await instance.init();\n return instance;\n }\n\n /**\n * Does this array of Dosage objects contains only \"sequential\" instructions ?\n */\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n return (\n encounteredSequenceNumbers.size === 0 ||\n encounteredSequenceNumbers.size === dosages.length\n );\n }\n\n /**\n * Turn this array of Dosage objects into a data structure useful to handle \"sequential\" and \"concurrent\" instructions (cf. \"sequence\" property).\n * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.\n */\n groupBySequence(dosages: Dosage[]) {\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n const dosage = dosages[idx];\n\n let sequenceNr = dosage.sequence || idx + 1;\n let localGroup = groups[sequenceNr] || [];\n\n localGroup.push(dosage);\n groups[sequenceNr] = localGroup;\n\n sequences.add(sequenceNr);\n }\n\n // By using the Set values, we are sure it is returned in the way Dosages were written\n return Array.from(sequences, (sequence) => groups[sequence]);\n }\n\n /**\n * From a single dosage, extract specific field(s) requested by user.\n * Some use cases could request to split part of the object for given needs (quantity and timing separately)\n */\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n /**\n * Turn a FHIR Dosage object into text\n */\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n /**\n * Turn multiple FHIR Dosage objects into text\n */\n fromMultipleDosageToText(dosages: Dosage[]): string {\n // As we can have concurrent / sequential instructions, we need a generic algorithm to do the job\n const hasOnlySequentialInstructions =\n this.containsOnlySequentialInstructions(dosages);\n\n // Sequential instructions\n if (hasOnlySequentialInstructions) {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n // We have both \"sequential\" and \"concurrent\" instructions - time to see what is the configuration\n let sortedDosages = this.groupBySequence(dosages);\n\n // Now that data structures are filled, it is a piece of cake to generate the result\n let sequentialInstructions: string[] = sortedDosages.map(\n (concurrentInstructions) => {\n let concurrentInstructionsAsString = concurrentInstructions.map(\n (dosage) => this.fromDosageToText(dosage),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n },\n );\n\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\nimport type {\n Config,\n DisplayOrder,\n I18N,\n Params,\n InitOptions,\n I18InitOptions,\n} from \"../types\";\n\nexport class Configurator {\n // User Configuration\n protected config: Config;\n // i18next config\n protected i18nConfig: InitOptions;\n // i18next instance\n // When multiple instances of the class are used, they must act independantly regardless of the others\n protected i18nInstance: I18N;\n\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n this.config = {\n ...defaultAttributes,\n ...userConfig,\n };\n this.i18nConfig = {\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...i18nConfig,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n /**\n * To init i18next properly according requested criteria\n */\n protected async init() {\n // You should wait for init to complete (wait for the callback or promise resolution)\n // before using the t function!\n return await this.i18nInstance.use(ChainedBackend).init(this.i18nConfig);\n }\n\n /**\n * To change language\n */\n async changeLanguage(lng: string) {\n this.config = {\n ...this.config,\n language: lng,\n };\n return this.i18nInstance.changeLanguage(lng);\n }\n\n /**\n * Get current language\n */\n getLanguage() {\n return this.config.language;\n }\n\n /**\n * To change display order\n */\n changeDisplayOrder(order: DisplayOrder[]) {\n this.config = {\n ...this.config,\n displayOrder: order,\n };\n }\n\n /**\n * Get display order\n */\n getDisplayOrder() {\n return this.config.displayOrder;\n }\n\n /**\n * Get display separator\n */\n getDisplaySeparator() {\n return this.config.displaySeparator;\n }\n\n /**\n * Set display separator\n */\n changeDisplaySeparator(sep: string) {\n this.config = {\n ...this.config,\n displaySeparator: sep,\n };\n }\n\n /**\n * Get date time format options\n */\n getDateTimeFormatOptions() {\n return this.config.dateTimeFormatOptions;\n }\n\n /**\n * Set date time format options\n */\n changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions) {\n this.config = {\n ...this.config,\n dateTimeFormatOptions: opts,\n };\n }\n}\n","import type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\n/**\n * Function to turn extensions into a string for humans.\n */\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n\n // KIS implementation : print it as provided, without doing anything\n // Extensions have so many cases btw, that having a basic function does the trick\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n let comparatorCode = quantity.comparator;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n if (!isNotUndefined(comparatorCode)) {\n return quantityString;\n }\n\n let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);\n\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n // 1. If we have a empty object, return undefined\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n let unit = hasQuantityUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasQuantityUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`amount.range.${technicalKey}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n // 3. Only high is present\n if (isNotUndefined(highValue)) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n // 1. Frequency and frequencyMax are present\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n // 3. Only frequency is present\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n // 1. period and periodMax are present\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 2. Only periodMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 3. Only period present\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type {\n DisplayOrderParams,\n I18N,\n WhenTimeKeys as TimeKeys,\n} from \"../types\";\n\nfunction extractTime(minutes: number) {\n let d = Math.floor(minutes / 1440);\n let h = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { d, h, min: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n let order = [\"d\", \"h\", \"min\"] as (keyof typeof time)[];\n\n return order\n .map((unit) =>\n time[unit] > 0\n ? i18next.t(`unitsOfTime:withCount.${unit}`, { count: time[unit] })\n : undefined,\n )\n .filter(isNotUndefined)\n .join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n// Function to transform dayOfWeek into a string\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n // If empty, skip it\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n // If empty, skip it\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n // Turn it into a string\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n Dosage,\n} from \"../types\";\n\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nfunction extractCodeableList(dos: Dosage): CodeableConcept[] {\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n return (\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : [])\n );\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeeded = (dos as DosageR5).asNeeded;\n let codeableList = extractCodeableList(dos);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(i18next, codeableList, config),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n // 1. Both count & countMax are present\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n // 3. Only count is present\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\ntype RenderStrategy = \"yearOnly\" | \"yearAndMonthOnly\" | \"dateOnly\" | \"dateTime\";\ntype RenderFunction = (params: RenderParams) => string;\ntype RenderParams = {\n config: Config;\n date: Date;\n};\n\nconst strategies = {\n yearOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, { year: \"numeric\" }).format(date),\n // e.g. 2024-03 => May 2024\n yearAndMonthOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n }).format(date),\n dateOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n dateTime: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n ...generateTimeStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n} satisfies Record<RenderStrategy, RenderFunction>;\n\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction fromDateToMappedDate(datetime: string): MappedDate {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n}\n\n/**\n * Generic function to map datetimes to user friendly date\n * e.g. from 2018, 1973-06, 1905-08-23, 2015-02-07T13:28:17-05:00 or 2017-01-01T00:00:00.000Z\n */\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n const entries = datetimes.map(fromDateToMappedDate);\n\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n const chosenStrategy: RenderStrategy = !hasMonths\n ? \"yearOnly\"\n : !hasDays\n ? \"yearAndMonthOnly\"\n : !hasTimePart\n ? \"dateOnly\"\n : \"dateTime\";\n\n return strategies[chosenStrategy]({ config, date });\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n // Generate the string version of them\n const boundsPeriod = dos.timing.repeat.boundsPeriod;\n\n let start = formatDatetime({ config, datetime: boundsPeriod.start });\n let end = formatDatetime({ config, datetime: boundsPeriod.end });\n\n // 1. Both start and end are present\n if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n // 3. Only end is present\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n // So better to have a generic approach\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\n // Only consider not empty array\n if (values.length === 0) {\n return undefined;\n }\n\n // Periods are expressed as ratio (like rateRatio)\n const valuesAsString = values\n .map((period) => {\n return fromRatioToString({ config, i18next, ratio: period });\n })\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/module.js CHANGED
@@ -186,15 +186,15 @@ function $2f3f5b2132f3c88a$export$e9106be159f8c977({ quantity: quantity, config:
186
186
  quantity: quantity
187
187
  });
188
188
  let value = quantity.value || 1;
189
+ let comparatorCode = quantity.comparator;
189
190
  let quantityString = unit.length === 0 ? i18next.t("amount.quantity.withoutUnit", {
190
191
  quantity: value
191
192
  }) : i18next.t("amount.quantity.withUnit", {
192
193
  quantity: value,
193
194
  unit: unit
194
195
  });
195
- let comparatorCode = quantity.comparator;
196
- let comparatorString = (0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(comparatorCode) ? i18next.t(`quantityComparator:${comparatorCode}`) : undefined;
197
- if (!(0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(comparatorString)) return quantityString;
196
+ if (!(0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(comparatorCode)) return quantityString;
197
+ let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);
198
198
  return `${comparatorString} ${quantityString}`;
199
199
  }
200
200
 
@@ -479,32 +479,27 @@ function $f475af73bad0ba43$export$826742c1df3eca39(i18next, arr, linkWord = "and
479
479
 
480
480
 
481
481
 
482
- // Function to extract times
483
482
  function $f88800def2ddd9e9$var$extractTime(minutes) {
484
- let days = Math.floor(minutes / 1440);
485
- let hours = Math.floor(minutes % 1440 / 60);
483
+ let d = Math.floor(minutes / 1440);
484
+ let h = Math.floor(minutes % 1440 / 60);
486
485
  let remainingMinutes = minutes % 60;
487
486
  return {
488
- days: days,
489
- hours: hours,
490
- minutes: remainingMinutes
487
+ d: d,
488
+ h: h,
489
+ min: remainingMinutes
491
490
  };
492
491
  }
493
492
  function $f88800def2ddd9e9$var$transformOffset(i18next, offset) {
494
493
  if (!(0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(offset) || offset <= 0) return undefined;
495
494
  let time = $f88800def2ddd9e9$var$extractTime(offset);
496
- let subParts = [
497
- time.days > 0 ? i18next.t("unitsOfTime:withCount.d", {
498
- count: time.days
499
- }) : undefined,
500
- time.hours > 0 ? i18next.t("unitsOfTime:withCount.h", {
501
- count: time.hours
502
- }) : undefined,
503
- time.minutes > 0 ? i18next.t("unitsOfTime:withCount.min", {
504
- count: time.minutes
505
- }) : undefined
506
- ].filter((0, $c65c41ac1f3ea82b$export$e7321bf46d18757f));
507
- return subParts.join(" ");
495
+ let order = [
496
+ "d",
497
+ "h",
498
+ "min"
499
+ ];
500
+ return order.map((unit)=>time[unit] > 0 ? i18next.t(`unitsOfTime:withCount.${unit}`, {
501
+ count: time[unit]
502
+ }) : undefined).filter((0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)).join(" ");
508
503
  }
509
504
  function $f88800def2ddd9e9$var$transformWhen(i18next, when) {
510
505
  if ((0, $1c8530b981ded822$export$d9ff4a623e416a11)(when)) return undefined;
@@ -566,7 +561,6 @@ function $a1b58a85293e76cc$export$ee205fa48981886d({ dos: dos, i18next: i18next
566
561
 
567
562
 
568
563
 
569
- // Turn a list of codeable concept into a string
570
564
  function $ab507771e2827c53$var$fromCodeableConceptArrayToString(i18next, codes, config) {
571
565
  const codesAsString = codes.map((code)=>config.fromCodeableConceptToString({
572
566
  code: code,
@@ -574,15 +568,17 @@ function $ab507771e2827c53$var$fromCodeableConceptArrayToString(i18next, codes,
574
568
  })).filter((0, $c65c41ac1f3ea82b$export$e7321bf46d18757f));
575
569
  return (0, $f475af73bad0ba43$export$826742c1df3eca39)(i18next, codesAsString);
576
570
  }
577
- function $ab507771e2827c53$export$5c69a2202525487a({ dos: dos, config: config, i18next: i18next }) {
578
- let asNeededBoolean = dos.asNeededBoolean;
571
+ function $ab507771e2827c53$var$extractCodeableList(dos) {
579
572
  let asNeededCodeableConcept = dos.asNeededCodeableConcept;
580
573
  let asNeededFor = dos.asNeededFor;
581
- let asNeeded = dos.asNeeded;
582
- // Codeable concept as list, to make algorithm simpler
583
- let codeableList = asNeededFor || (asNeededCodeableConcept !== undefined ? [
574
+ return asNeededFor || (asNeededCodeableConcept !== undefined ? [
584
575
  asNeededCodeableConcept
585
576
  ] : []);
577
+ }
578
+ function $ab507771e2827c53$export$5c69a2202525487a({ dos: dos, config: config, i18next: i18next }) {
579
+ let asNeededBoolean = dos.asNeededBoolean;
580
+ let asNeeded = dos.asNeeded;
581
+ let codeableList = $ab507771e2827c53$var$extractCodeableList(dos);
586
582
  if (codeableList.length > 0) return i18next.t("fields.asNeededFor", {
587
583
  reasons: $ab507771e2827c53$var$fromCodeableConceptArrayToString(i18next, codeableList, config)
588
584
  });
@@ -664,9 +660,23 @@ function $73a945b97fd1a22f$export$498ca7f558a02e67({ dos: dos, i18next: i18next
664
660
 
665
661
 
666
662
 
667
- // Function to clean up the params for dateStyle situation
668
- // Note: dateStyle and timeStyle can be used with each other,
669
- // but not with other date-time component options (e.g. weekday, hour, month, etc.).
663
+ const $d3afe3c00981fd78$var$strategies = {
664
+ yearOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
665
+ year: "numeric"
666
+ }).format(date),
667
+ // e.g. 2024-03 => May 2024
668
+ yearAndMonthOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
669
+ year: "numeric",
670
+ month: "long"
671
+ }).format(date),
672
+ dateOnly: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
673
+ ...$d3afe3c00981fd78$var$generateDateStyleFormatOptions(config.dateTimeFormatOptions)
674
+ }).format(date),
675
+ dateTime: ({ config: config, date: date })=>new Intl.DateTimeFormat(config.language, {
676
+ ...$d3afe3c00981fd78$var$generateDateStyleFormatOptions(config.dateTimeFormatOptions),
677
+ ...$d3afe3c00981fd78$var$generateTimeStyleFormatOptions(config.dateTimeFormatOptions)
678
+ }).format(date)
679
+ };
670
680
  function $d3afe3c00981fd78$var$generateDateStyleFormatOptions(options) {
671
681
  if ((0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(options.dateStyle)) return {
672
682
  dateStyle: options.dateStyle
@@ -681,7 +691,6 @@ function $d3afe3c00981fd78$var$generateDateStyleFormatOptions(options) {
681
691
  ...defaults
682
692
  };
683
693
  }
684
- // Function to clean up the params for timeStyle situation
685
694
  function $d3afe3c00981fd78$var$generateTimeStyleFormatOptions(options) {
686
695
  if ((0, $c65c41ac1f3ea82b$export$e7321bf46d18757f)(options.timeStyle)) return {
687
696
  timeStyle: options.timeStyle
@@ -696,51 +705,27 @@ function $d3afe3c00981fd78$var$generateTimeStyleFormatOptions(options) {
696
705
  ...defaults
697
706
  };
698
707
  }
708
+ function $d3afe3c00981fd78$var$fromDateToMappedDate(datetime) {
709
+ let date = new Date(datetime);
710
+ let hasTimePart = datetime.includes("T");
711
+ let hyphensCount = datetime.split("-").length - 1;
712
+ let hasMonths = hyphensCount >= 1;
713
+ let hasDays = hyphensCount >= 2;
714
+ return {
715
+ date: date,
716
+ hasTimePart: hasTimePart,
717
+ hasMonths: hasMonths,
718
+ hasDays: hasDays
719
+ };
720
+ }
699
721
  function $d3afe3c00981fd78$export$a77f8869772ffca4({ config: config, datetimes: datetimes }) {
700
- let options = config.dateTimeFormatOptions;
701
- const entries = datetimes.map((datetime)=>{
702
- let date = new Date(datetime);
703
- let hasTimePart = datetime.includes("T");
704
- let hyphensCount = datetime.split("-").length - 1;
705
- let hasMonths = hyphensCount >= 1;
706
- let hasDays = hyphensCount >= 2;
707
- return {
708
- date: date,
709
- hasTimePart: hasTimePart,
710
- hasMonths: hasMonths,
711
- hasDays: hasDays
712
- };
713
- });
714
- // Time to do the magic
722
+ const entries = datetimes.map($d3afe3c00981fd78$var$fromDateToMappedDate);
715
723
  const result = entries.map(({ date: date, hasTimePart: hasTimePart, hasMonths: hasMonths, hasDays: hasDays })=>{
716
- // If only year is defined, print it fully (e.g. 2024)
717
- if (!hasMonths) {
718
- let df1 = new Intl.DateTimeFormat(config.language, {
719
- year: "numeric"
720
- });
721
- return df1.format(date);
722
- }
723
- // If only year and month are defined, print it nicely (e.g. 2024-03 => May 2024 )
724
- if (!hasDays) {
725
- let df2 = new Intl.DateTimeFormat(config.language, {
726
- year: "numeric",
727
- month: "long"
728
- });
729
- return df2.format(date);
730
- }
731
- // If only year / month and days are defined, print it according
732
- if (!hasTimePart) {
733
- let df3 = new Intl.DateTimeFormat(config.language, {
734
- ...$d3afe3c00981fd78$var$generateDateStyleFormatOptions(options)
735
- });
736
- return df3.format(date);
737
- }
738
- // Otherwise, we have a full datetime
739
- let df4 = new Intl.DateTimeFormat(config.language, {
740
- ...$d3afe3c00981fd78$var$generateDateStyleFormatOptions(options),
741
- ...$d3afe3c00981fd78$var$generateTimeStyleFormatOptions(options)
724
+ const chosenStrategy = !hasMonths ? "yearOnly" : !hasDays ? "yearAndMonthOnly" : !hasTimePart ? "dateOnly" : "dateTime";
725
+ return $d3afe3c00981fd78$var$strategies[chosenStrategy]({
726
+ config: config,
727
+ date: date
742
728
  });
743
- return df4.format(date);
744
729
  });
745
730
  return result;
746
731
  }
@@ -990,12 +975,7 @@ class $8435b8d847fb3eb7$export$1c191bca55f84a03 extends (0, $2422495f2648c580$ex
990
975
  sequences.add(sequenceNr);
991
976
  }
992
977
  // By using the Set values, we are sure it is returned in the way Dosages were written
993
- return [
994
- ...sequences.values()
995
- ].map((sequence)=>{
996
- let concurrentInstructions = groups[sequence];
997
- return concurrentInstructions;
998
- });
978
+ return Array.from(sequences, (sequence)=>groups[sequence]);
999
979
  }
1000
980
  /**
1001
981
  * From a single dosage, extract specific field(s) requested by user.
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/api.ts","src/classes/Configurator.ts","src/internal/defaultAttributes.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n","import { Configurator } from \"./classes/Configurator\";\n\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n};\n\nexport class FhirDosageUtils extends Configurator {\n /**\n * Factory to create a fine-tuned instance of the utility class\n */\n static async build(\n userConfig?: Params,\n i18nConfig: I18InitOptions = defaultI18NConfig,\n ) {\n const instance = new FhirDosageUtils(userConfig, i18nConfig);\n await instance.init();\n return instance;\n }\n\n /**\n * Does this array of Dosage objects contains only \"sequential\" instructions ?\n */\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n return (\n encounteredSequenceNumbers.size === 0 ||\n encounteredSequenceNumbers.size === dosages.length\n );\n }\n\n /**\n * Turn this array of Dosage objects into a data structure useful to handle \"sequential\" and \"concurrent\" instructions (cf. \"sequence\" property).\n * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.\n */\n groupBySequence(dosages: Dosage[]) {\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n const dosage = dosages[idx];\n\n let sequenceNr = dosage.sequence || idx + 1;\n let localGroup = groups[sequenceNr] || [];\n\n localGroup.push(dosage);\n groups[sequenceNr] = localGroup;\n\n sequences.add(sequenceNr);\n }\n\n // By using the Set values, we are sure it is returned in the way Dosages were written\n return [...sequences.values()].map((sequence) => {\n let concurrentInstructions = groups[sequence];\n return concurrentInstructions;\n });\n }\n\n /**\n * From a single dosage, extract specific field(s) requested by user.\n * Some use cases could request to split part of the object for given needs (quantity and timing separately)\n */\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n /**\n * Turn a FHIR Dosage object into text\n */\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n /**\n * Turn multiple FHIR Dosage objects into text\n */\n fromMultipleDosageToText(dosages: Dosage[]): string {\n // As we can have concurrent / sequential instructions, we need a generic algorithm to do the job\n const hasOnlySequentialInstructions =\n this.containsOnlySequentialInstructions(dosages);\n\n // Sequential instructions\n if (hasOnlySequentialInstructions) {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n // We have both \"sequential\" and \"concurrent\" instructions - time to see what is the configuration\n let sortedDosages = this.groupBySequence(dosages);\n\n // Now that data structures are filled, it is a piece of cake to generate the result\n let sequentialInstructions: string[] = sortedDosages.map(\n (concurrentInstructions) => {\n let concurrentInstructionsAsString = concurrentInstructions.map(\n (dosage) => this.fromDosageToText(dosage),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n },\n );\n\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\nimport type {\n Config,\n DisplayOrder,\n I18N,\n Params,\n InitOptions,\n I18InitOptions,\n} from \"../types\";\n\nexport class Configurator {\n // User Configuration\n protected config: Config;\n // i18next config\n protected i18nConfig: InitOptions;\n // i18next instance\n // When multiple instances of the class are used, they must act independantly regardless of the others\n protected i18nInstance: I18N;\n\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n this.config = {\n ...defaultAttributes,\n ...userConfig,\n };\n this.i18nConfig = {\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...i18nConfig,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n /**\n * To init i18next properly according requested criteria\n */\n protected async init() {\n // You should wait for init to complete (wait for the callback or promise resolution)\n // before using the t function!\n return await this.i18nInstance.use(ChainedBackend).init(this.i18nConfig);\n }\n\n /**\n * To change language\n */\n async changeLanguage(lng: string) {\n this.config = {\n ...this.config,\n language: lng,\n };\n return this.i18nInstance.changeLanguage(lng);\n }\n\n /**\n * Get current language\n */\n getLanguage() {\n return this.config.language;\n }\n\n /**\n * To change display order\n */\n changeDisplayOrder(order: DisplayOrder[]) {\n this.config = {\n ...this.config,\n displayOrder: order,\n };\n }\n\n /**\n * Get display order\n */\n getDisplayOrder() {\n return this.config.displayOrder;\n }\n\n /**\n * Get display separator\n */\n getDisplaySeparator() {\n return this.config.displaySeparator;\n }\n\n /**\n * Set display separator\n */\n changeDisplaySeparator(sep: string) {\n this.config = {\n ...this.config,\n displaySeparator: sep,\n };\n }\n\n /**\n * Get date time format options\n */\n getDateTimeFormatOptions() {\n return this.config.dateTimeFormatOptions;\n }\n\n /**\n * Set date time format options\n */\n changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions) {\n this.config = {\n ...this.config,\n dateTimeFormatOptions: opts,\n };\n }\n}\n","import type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\n/**\n * Function to turn extensions into a string for humans.\n */\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n\n // KIS implementation : print it as provided, without doing anything\n // Extensions have so many cases btw, that having a basic function does the trick\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n let comparatorCode = quantity.comparator;\n let comparatorString = isNotUndefined(comparatorCode)\n ? i18next.t(`quantityComparator:${comparatorCode}`)\n : undefined;\n\n if (!isNotUndefined(comparatorString)) {\n return quantityString;\n }\n\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n // 1. If we have a empty object, return undefined\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n let unit = hasQuantityUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasQuantityUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`amount.range.${technicalKey}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n // 3. Only high is present\n if (isNotUndefined(highValue)) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n // 1. Frequency and frequencyMax are present\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n // 3. Only frequency is present\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n // 1. period and periodMax are present\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 2. Only periodMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 3. Only period present\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type {\n DisplayOrderParams,\n I18N,\n WhenTimeKeys as TimeKeys,\n} from \"../types\";\n\n// Function to extract times\nfunction extractTime(minutes: number) {\n let days = Math.floor(minutes / 1440);\n let hours = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { days, hours, minutes: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n\n let subParts = [\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter(isNotUndefined);\n\n return subParts.join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n// Function to transform dayOfWeek into a string\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n // If empty, skip it\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n // If empty, skip it\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n // Turn it into a string\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n} from \"../types\";\n\n// Turn a list of codeable concept into a string\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n let asNeeded = (dos as DosageR5).asNeeded;\n\n // Codeable concept as list, to make algorithm simpler\n let codeableList =\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : []);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(\n i18next,\n codeableList as CodeableConcept[],\n config,\n ),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n // 1. Both count & countMax are present\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n // 3. Only count is present\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\n\n// Function to clean up the params for dateStyle situation\n// Note: dateStyle and timeStyle can be used with each other,\n// but not with other date-time component options (e.g. weekday, hour, month, etc.).\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\n/**\n * Generic function to map datetimes to user friendly date\n * e.g. from 2018, 1973-06, 1905-08-23, 2015-02-07T13:28:17-05:00 or 2017-01-01T00:00:00.000Z\n */\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n let options = config.dateTimeFormatOptions;\n\n const entries: MappedDate[] = datetimes.map((datetime) => {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n });\n\n // Time to do the magic\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n // If only year is defined, print it fully (e.g. 2024)\n if (!hasMonths) {\n let df1 = new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n });\n return df1.format(date);\n }\n\n // If only year and month are defined, print it nicely (e.g. 2024-03 => May 2024 )\n if (!hasDays) {\n let df2 = new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n });\n return df2.format(date);\n }\n\n // If only year / month and days are defined, print it according\n if (!hasTimePart) {\n let df3 = new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(options),\n });\n return df3.format(date);\n }\n\n // Otherwise, we have a full datetime\n let df4 = new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n // Generate the string version of them\n const boundsPeriod = dos.timing.repeat.boundsPeriod;\n\n let start = formatDatetime({ config, datetime: boundsPeriod.start });\n let end = formatDatetime({ config, datetime: boundsPeriod.end });\n\n // 1. Both start and end are present\n if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n // 3. Only end is present\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n // So better to have a generic approach\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\n // Only consider not empty array\n if (values.length === 0) {\n return undefined;\n }\n\n // Periods are expressed as ratio (like rateRatio)\n const valuesAsString = values\n .map((period) => {\n return fromRatioToString({ config, i18next, ratio: period });\n })\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["src/index.ts","src/api.ts","src/classes/Configurator.ts","src/internal/defaultAttributes.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n","import { Configurator } from \"./classes/Configurator\";\n\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n};\n\nexport class FhirDosageUtils extends Configurator {\n /**\n * Factory to create a fine-tuned instance of the utility class\n */\n static async build(\n userConfig?: Params,\n i18nConfig: I18InitOptions = defaultI18NConfig,\n ) {\n const instance = new FhirDosageUtils(userConfig, i18nConfig);\n await instance.init();\n return instance;\n }\n\n /**\n * Does this array of Dosage objects contains only \"sequential\" instructions ?\n */\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n return (\n encounteredSequenceNumbers.size === 0 ||\n encounteredSequenceNumbers.size === dosages.length\n );\n }\n\n /**\n * Turn this array of Dosage objects into a data structure useful to handle \"sequential\" and \"concurrent\" instructions (cf. \"sequence\" property).\n * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.\n */\n groupBySequence(dosages: Dosage[]) {\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n const dosage = dosages[idx];\n\n let sequenceNr = dosage.sequence || idx + 1;\n let localGroup = groups[sequenceNr] || [];\n\n localGroup.push(dosage);\n groups[sequenceNr] = localGroup;\n\n sequences.add(sequenceNr);\n }\n\n // By using the Set values, we are sure it is returned in the way Dosages were written\n return Array.from(sequences, (sequence) => groups[sequence]);\n }\n\n /**\n * From a single dosage, extract specific field(s) requested by user.\n * Some use cases could request to split part of the object for given needs (quantity and timing separately)\n */\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n /**\n * Turn a FHIR Dosage object into text\n */\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n /**\n * Turn multiple FHIR Dosage objects into text\n */\n fromMultipleDosageToText(dosages: Dosage[]): string {\n // As we can have concurrent / sequential instructions, we need a generic algorithm to do the job\n const hasOnlySequentialInstructions =\n this.containsOnlySequentialInstructions(dosages);\n\n // Sequential instructions\n if (hasOnlySequentialInstructions) {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n // We have both \"sequential\" and \"concurrent\" instructions - time to see what is the configuration\n let sortedDosages = this.groupBySequence(dosages);\n\n // Now that data structures are filled, it is a piece of cake to generate the result\n let sequentialInstructions: string[] = sortedDosages.map(\n (concurrentInstructions) => {\n let concurrentInstructionsAsString = concurrentInstructions.map(\n (dosage) => this.fromDosageToText(dosage),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n },\n );\n\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\nimport type {\n Config,\n DisplayOrder,\n I18N,\n Params,\n InitOptions,\n I18InitOptions,\n} from \"../types\";\n\nexport class Configurator {\n // User Configuration\n protected config: Config;\n // i18next config\n protected i18nConfig: InitOptions;\n // i18next instance\n // When multiple instances of the class are used, they must act independantly regardless of the others\n protected i18nInstance: I18N;\n\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n this.config = {\n ...defaultAttributes,\n ...userConfig,\n };\n this.i18nConfig = {\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...i18nConfig,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n /**\n * To init i18next properly according requested criteria\n */\n protected async init() {\n // You should wait for init to complete (wait for the callback or promise resolution)\n // before using the t function!\n return await this.i18nInstance.use(ChainedBackend).init(this.i18nConfig);\n }\n\n /**\n * To change language\n */\n async changeLanguage(lng: string) {\n this.config = {\n ...this.config,\n language: lng,\n };\n return this.i18nInstance.changeLanguage(lng);\n }\n\n /**\n * Get current language\n */\n getLanguage() {\n return this.config.language;\n }\n\n /**\n * To change display order\n */\n changeDisplayOrder(order: DisplayOrder[]) {\n this.config = {\n ...this.config,\n displayOrder: order,\n };\n }\n\n /**\n * Get display order\n */\n getDisplayOrder() {\n return this.config.displayOrder;\n }\n\n /**\n * Get display separator\n */\n getDisplaySeparator() {\n return this.config.displaySeparator;\n }\n\n /**\n * Set display separator\n */\n changeDisplaySeparator(sep: string) {\n this.config = {\n ...this.config,\n displaySeparator: sep,\n };\n }\n\n /**\n * Get date time format options\n */\n getDateTimeFormatOptions() {\n return this.config.dateTimeFormatOptions;\n }\n\n /**\n * Set date time format options\n */\n changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions) {\n this.config = {\n ...this.config,\n dateTimeFormatOptions: opts,\n };\n }\n}\n","import type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\n/**\n * Function to turn extensions into a string for humans.\n */\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n\n // KIS implementation : print it as provided, without doing anything\n // Extensions have so many cases btw, that having a basic function does the trick\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n let comparatorCode = quantity.comparator;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n if (!isNotUndefined(comparatorCode)) {\n return quantityString;\n }\n\n let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);\n\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n // 1. If we have a empty object, return undefined\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n let unit = hasQuantityUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasQuantityUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`amount.range.${technicalKey}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n // 3. Only high is present\n if (isNotUndefined(highValue)) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n // 1. Frequency and frequencyMax are present\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n // 3. Only frequency is present\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n // 1. period and periodMax are present\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 2. Only periodMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 3. Only period present\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type {\n DisplayOrderParams,\n I18N,\n WhenTimeKeys as TimeKeys,\n} from \"../types\";\n\nfunction extractTime(minutes: number) {\n let d = Math.floor(minutes / 1440);\n let h = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { d, h, min: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n let order = [\"d\", \"h\", \"min\"] as (keyof typeof time)[];\n\n return order\n .map((unit) =>\n time[unit] > 0\n ? i18next.t(`unitsOfTime:withCount.${unit}`, { count: time[unit] })\n : undefined,\n )\n .filter(isNotUndefined)\n .join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n// Function to transform dayOfWeek into a string\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n // If empty, skip it\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n // If empty, skip it\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n // Turn it into a string\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n Dosage,\n} from \"../types\";\n\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nfunction extractCodeableList(dos: Dosage): CodeableConcept[] {\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n return (\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : [])\n );\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeeded = (dos as DosageR5).asNeeded;\n let codeableList = extractCodeableList(dos);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(i18next, codeableList, config),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n // 1. Both count & countMax are present\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n // 3. Only count is present\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\ntype RenderStrategy = \"yearOnly\" | \"yearAndMonthOnly\" | \"dateOnly\" | \"dateTime\";\ntype RenderFunction = (params: RenderParams) => string;\ntype RenderParams = {\n config: Config;\n date: Date;\n};\n\nconst strategies = {\n yearOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, { year: \"numeric\" }).format(date),\n // e.g. 2024-03 => May 2024\n yearAndMonthOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n }).format(date),\n dateOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n dateTime: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n ...generateTimeStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n} satisfies Record<RenderStrategy, RenderFunction>;\n\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction fromDateToMappedDate(datetime: string): MappedDate {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n}\n\n/**\n * Generic function to map datetimes to user friendly date\n * e.g. from 2018, 1973-06, 1905-08-23, 2015-02-07T13:28:17-05:00 or 2017-01-01T00:00:00.000Z\n */\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n const entries = datetimes.map(fromDateToMappedDate);\n\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n const chosenStrategy: RenderStrategy = !hasMonths\n ? \"yearOnly\"\n : !hasDays\n ? \"yearAndMonthOnly\"\n : !hasTimePart\n ? \"dateOnly\"\n : \"dateTime\";\n\n return strategies[chosenStrategy]({ config, date });\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n // Generate the string version of them\n const boundsPeriod = dos.timing.repeat.boundsPeriod;\n\n let start = formatDatetime({ config, datetime: boundsPeriod.start });\n let end = formatDatetime({ config, datetime: boundsPeriod.end });\n\n // 1. Both start and end are present\n if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n // 3. Only end is present\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n // So better to have a generic approach\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\n // Only consider not empty array\n if (values.length === 0) {\n return undefined;\n }\n\n // Periods are expressed as ratio (like rateRatio)\n const valuesAsString = values\n .map((period) => {\n return fromRatioToString({ config, i18next, ratio: period });\n })\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"module.js.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/src/internal/undefinedChecks.ts","src/src/utils/fromFHIRQuantityUnitToString.ts","src/src/internal/isEmptyArray.ts","src/src/utils/fromCodeableConceptToString.ts","src/src/utils/fromExtensionsToString.ts","src/src/types.ts","src/src/internal/defaultAttributes.ts","src/src/classes/Configurator.ts","src/src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/src/utils/fromQuantityToString.ts","src/src/translators/doseQuantity.ts","src/src/internal/hasUnit.ts","src/src/utils/fromRangeToString.ts","src/src/translators/doseRange.ts","src/src/translators/rateQuantity.ts","src/src/translators/rateRange.ts","src/src/utils/fromRatioToString.ts","src/src/translators/rateRatio.ts","src/src/internal/extractMatchingTimingRepeat.ts","src/src/translators/durationDurationMax.ts","src/src/translators/frequencyFrequencyMax.ts","src/src/translators/periodPeriodMax.ts","src/src/utils/fromListToString.ts","src/src/translators/offsetWhen.ts","src/src/translators/dayOfWeek.ts","src/src/translators/timeOfDay.ts","src/src/translators/asNeeded.ts","src/src/translators/boundsDuration.ts","src/src/translators/boundsRange.ts","src/src/translators/countCountMax.ts","src/src/utils/formatDatetimes.ts","src/src/translators/event.ts","src/src/translators/additionalInstruction.ts","src/src/translators/maxDosePerLifetime.ts","src/src/translators/maxDosePerAdministration.ts","src/src/translators/boundsPeriod.ts","src/src/translators/maxDosePerPeriod.ts","src/src/translators/index.ts","src/src/utils/fromDisplayOrderToResult.ts","src/src/api.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":"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","sources":["src/src/internal/undefinedChecks.ts","src/src/utils/fromFHIRQuantityUnitToString.ts","src/src/internal/isEmptyArray.ts","src/src/utils/fromCodeableConceptToString.ts","src/src/utils/fromExtensionsToString.ts","src/src/types.ts","src/src/internal/defaultAttributes.ts","src/src/classes/Configurator.ts","src/src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/src/utils/fromQuantityToString.ts","src/src/translators/doseQuantity.ts","src/src/internal/hasUnit.ts","src/src/utils/fromRangeToString.ts","src/src/translators/doseRange.ts","src/src/translators/rateQuantity.ts","src/src/translators/rateRange.ts","src/src/utils/fromRatioToString.ts","src/src/translators/rateRatio.ts","src/src/internal/extractMatchingTimingRepeat.ts","src/src/translators/durationDurationMax.ts","src/src/translators/frequencyFrequencyMax.ts","src/src/translators/periodPeriodMax.ts","src/src/utils/fromListToString.ts","src/src/translators/offsetWhen.ts","src/src/translators/dayOfWeek.ts","src/src/translators/timeOfDay.ts","src/src/translators/asNeeded.ts","src/src/translators/boundsDuration.ts","src/src/translators/boundsRange.ts","src/src/translators/countCountMax.ts","src/src/utils/formatDatetimes.ts","src/src/translators/event.ts","src/src/translators/additionalInstruction.ts","src/src/translators/maxDosePerLifetime.ts","src/src/translators/maxDosePerAdministration.ts","src/src/translators/boundsPeriod.ts","src/src/translators/maxDosePerPeriod.ts","src/src/translators/index.ts","src/src/utils/fromDisplayOrderToResult.ts","src/src/api.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fhir-dosage-utils",
3
- "version": "1.10.1",
3
+ "version": "1.10.3",
4
4
  "description": "Turn FHIR Dosage into human readable text in your wanted language (english, french, dutch, ...) and much more",
5
5
  "files": [
6
6
  "dist"