fhir-dosage-utils 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
package/dist/main.js CHANGED
@@ -1045,6 +1045,10 @@ const $2c21ace90ecdbde6$var$displayOrders = {
1045
1045
  timingExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
1046
1046
  language: config.language,
1047
1047
  extensions: dos.timing?.extension
1048
+ }),
1049
+ timingRepeatExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
1050
+ language: config.language,
1051
+ extensions: dos.timing?.repeat?.extension
1048
1052
  })
1049
1053
  };
1050
1054
  function $2c21ace90ecdbde6$export$9f330b4bf8c0975c({ entry: entry, ...args }) {
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/utils/fromCodeableConceptToString.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/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractTimingRepeat.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","// Classe(s)\nimport { Configurator } from \"./classes/Configurator\";\n\n// Functions\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\n\n// Types\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\n// I18n default config\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n // have to cast the function to be webpack / builder friendly\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 // 1. Collect all sequences number\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter((s) => s !== undefined);\n\n // 2. Convert it to a Set\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n // 3. We have a \"sequential\" situation in two cases\n // A) No sequence number were provided\n // B) All sequence numbers are different\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 // Prepare variables\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n // Get dosage object\n const dosage = dosages[idx];\n\n // Get the sequence number (normally, in real world, it should be present in this case)\n // If no sequence number, assume it is idx + 1\n let sequenceNr = dosage.sequence || idx + 1;\n\n // Retrieve of create previous entries for this sequence number\n let localGroup = groups[sequenceNr] || [];\n\n // Add entry\n localGroup.push(dosage);\n\n // Pushback result\n groups[sequenceNr] = localGroup;\n\n // For reminder of the parsed sequence\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 // iterate on each key and generate a string from each part\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((s) => s !== undefined);\n\n // Join each part with a separator\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 // iterate on each key and generate a string from each part\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\n// Default values\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\n// Types\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 // Set up lib, according provided parameters\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n // User config\n this.config = {\n // default attributes\n ...defaultAttributes,\n // attributes set by user\n ...userConfig,\n };\n // I18N config\n this.i18nConfig = {\n // default attributes\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\"common\", \"daysOfWeek\", \"eventTiming\", \"unitsOfTime\"],\n defaultNS: \"common\",\n // attributes set by user\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","// Types\nimport type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\n// default attributes\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 type { Quantity } from \"../types\";\n\n/**\n * Function to turn a quantity unit (e.g UCUM \"ml\") into a string for humans (e.g \"militier\")\n * The choice to handle plural form or not is thus under the hands of people ;)\n */\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\n// Default fromFHIRQuantityUnitToString\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (quantity.code !== undefined) {\n return quantity.code;\n }\n\n if (quantity.unit !== undefined) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","import type { CodeableConcept } from \"../types\";\n\n/**\n * Function to turn codeable concept (e.g SNOMED CT \"311504000\") into a string for humans (e.g \"With or after food\")\n */\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n // If no code, skip it\n if (code === undefined) {\n return undefined;\n }\n\n // Take text first\n if (code.text !== undefined) {\n return code.text;\n }\n\n // If empty, skip it\n if (code.coding === undefined || code.coding.length === 0) {\n return undefined;\n }\n\n // Take first coding; display first then code\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import 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\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n // If no extensions, skip it\n if (extensions === undefined || extensions.length === 0) {\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","// translators\nimport {\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\";\n\n// Types\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\n// Map\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((s) => s !== undefined);\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} 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 // Use map to provide a result without iterate on each key\n return displayOrders[entry](args);\n}\n","// To avoid circular dependancies issue, let's have a single place for exports and imports\n\nexport { 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","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (doseQuantity === undefined) {\n return undefined;\n }\n\n // Otherwise rendering it\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","// Types\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 empty, return undefined\n if (dos.doseAndRate === undefined) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => s[key] !== undefined);\n\n // If not found, skip\n if (doseAndRate === undefined) {\n return undefined;\n }\n\n // return property\n return doseAndRate[key];\n}\n","// Function\n\n// Type\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity, only once\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string | undefined {\n // extract function for the unit display from config\n const { fromFHIRQuantityUnitToString, language } = config;\n\n // Compute the result\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n // If no unit is present (in other words \"\"), we don't put it\n if (unit.length === 0) {\n return i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n });\n } else {\n return i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n }\n}\n","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (doseRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (text === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\n// Quantity unit to string\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n // If common units from HL7, do the job\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 } else {\n // otherwise, it is UCUM, ... so let the user do the job\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n }\n}\n\n// To cover all nasty cases of Range, only once\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n // Extract params\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n // prepare unit display\n let quantityUnit = high || low;\n let hasUnit =\n quantityUnit?.unit !== undefined || quantityUnit?.code !== undefined;\n\n // Four cases\n\n // 1. If we have a empty object, return undefined\n if (lowValue === undefined && highValue === undefined) {\n return undefined;\n }\n\n // quantity unit\n let unit = hasUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (lowValue !== undefined && highValue !== undefined) {\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 (highValue !== undefined) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n // Warning, this case is kind dangerous and clinically unsafe so minimal effort on this ...\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (rateQuantity === undefined) {\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","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRatio === undefined) {\n return undefined;\n }\n\n // Turn ratio to text\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (ratioText === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import type { RatioParams, Quantity } from \"../types\";\n\n// Quantity has an unit ?\nfunction hasUnit(quantity?: Quantity): boolean {\n return (quantity?.unit || quantity?.code) !== undefined;\n}\n\n// To cover all nasty cases of Ratio, only once\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n // Extract params\n const { denominator, numerator } = ratio;\n\n // units as text\n let numeratorUnit = hasUnit(numerator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: numerator!,\n })\n : undefined;\n\n let denominatorUnit = hasUnit(denominator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: denominator!,\n })\n : undefined;\n\n // quantity\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n // Collect results\n const parts: string[] = [];\n let noUnits = numeratorUnit === undefined && denominatorUnit === undefined;\n let separator = noUnits ? \"\" : \" \";\n\n // Deal with numerator first\n if (quantityNumerator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n numeratorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const numeratorString = i18next.t(\n `amount.ratio.${technicalKey}.numerator`,\n {\n count: quantityNumerator,\n numeratorUnit: numeratorUnit,\n },\n );\n parts.push(numeratorString);\n }\n\n // Deal with denominator\n if (quantityDenominator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n denominatorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const denominatorString = i18next.t(\n `amount.ratio.${technicalKey}.denominator`,\n {\n count: quantityDenominator,\n denominatorUnit: denominatorUnit,\n },\n );\n parts.push(denominatorString);\n }\n\n // Concatenate the result\n if (parts.length === 0) {\n return undefined;\n } else {\n return parts.join(separator);\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let duration = repeat.duration;\n let max = repeat.durationMax;\n let unit = repeat.durationUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n return [\n // duration\n duration !== undefined &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n // durationMax\n max !== undefined &&\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}\n","import type { Dosage } from \"../types\";\n\nexport function extractTimingRepeat(dos: Dosage) {\n // If empty, return undefined\n if (dos.timing === undefined || dos.timing.repeat === undefined) {\n return undefined;\n }\n\n return dos.timing.repeat;\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let frequency = repeat.frequency;\n let max = repeat.frequencyMax;\n\n // Do nothing if no frequency / frequencyMax, I am not a wizard\n if (frequency === undefined && max === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Frequency and frequencyMax are present\n if (frequency !== undefined && max !== undefined) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (max !== undefined) {\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}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let period = repeat.period;\n let max = repeat.periodMax;\n let unit = repeat.periodUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. period and periodMax are present\n if (period !== undefined && max !== undefined) {\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 (max !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\nimport type { DisplayOrderParams, I18N } from \"../types\";\n\ntype TimeKeys =\n | \"MORN\"\n | \"MORN.early\"\n | \"MORN.late\"\n | \"NOON\"\n | \"AFT\"\n | \"AFT.early\"\n | \"AFT.late\"\n | \"EVE\"\n | \"EVE.early\"\n | \"EVE.late\"\n | \"NIGHT\"\n | \"PHS\"\n | \"IMD\"\n | \"HS\"\n | \"WAKE\"\n | \"C\"\n | \"CM\"\n | \"CD\"\n | \"CV\"\n | \"AC\"\n | \"ACM\"\n | \"ACD\"\n | \"ACV\"\n | \"PC\"\n | \"PCM\"\n | \"PCD\"\n | \"PCV\";\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\n// Function to transform offset into a string\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (offset === undefined || offset <= 0) {\n return undefined;\n }\n\n // extract days / hours / minutes from it\n let time = extractTime(offset);\n\n // generate part\n let subParts = [\n // days\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n // hours\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n // minutes\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter((s) => s !== undefined);\n\n return subParts.join(\" \");\n}\n\n// Function to transform when[] into a string\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n // Only run when array is not empty\n if (when === undefined || when.length === 0) {\n return undefined;\n }\n\n // Turn it into a string\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n const finalString = fromListToString(i18next, whens);\n\n return finalString;\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let offset = repeat.offset;\n let when = repeat.when;\n\n // If both are undefined, don't do anything\n if (offset === undefined && when === undefined) {\n return undefined;\n }\n\n return [\n // offset part\n transformOffset(i18next, offset),\n // when part\n transformWhen(i18next, when),\n ]\n .filter((s) => s !== undefined)\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\n// To make a list understandable for end-users\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n // Split the array into two parts: all entries except the last one, and the last\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n // concatenate the result\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","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let dayOfWeek = repeat.dayOfWeek;\n\n // If empty, skip it\n if (dayOfWeek === undefined || dayOfWeek.length === 0) {\n return undefined;\n } else {\n // Turn it into a string\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 // Split the time string by \":\"\n var parts = time.split(\":\");\n\n // Check if the last part (seconds) is \"00\", if so, remove it\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n // Join the remaining parts with \":\"\n return parts.join(\":\");\n}\n\n// Function to transform timeOfDay into a string\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let timeOfDay = repeat.timeOfDay;\n\n // If empty, skip it\n if (timeOfDay === undefined || timeOfDay.length === 0) {\n return undefined;\n } else {\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}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\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((s) => s !== undefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // Pickup the interesting attributes\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 } else {\n // merge boolean to make it simpler\n let booleanValue = asNeededBoolean || asNeeded || false;\n\n if (booleanValue) {\n return i18next.t(\"fields.asNeeded\");\n } else {\n return undefined;\n }\n }\n}\n","// Functions\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// types\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\n// Duration to string\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 } else {\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}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsDuration = repeat.boundsDuration;\n\n // Do nothing if no boundsDuration, I am not a wizard\n if (boundsDuration === undefined) {\n return undefined;\n } else {\n let durationText = transformDurationToString(\n i18next,\n boundsDuration,\n config,\n );\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n }\n}\n","// types\nimport type { DisplayOrderParams } from \"../types\";\n\n// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsRange = repeat.boundsRange;\n\n // Do nothing if no boundsRange, I am not a wizard\n if (boundsRange === undefined) {\n return undefined;\n } else {\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let count = repeat.count;\n let countMax = repeat.countMax;\n\n // Do nothing if no count, I am not a wizard\n if (count === undefined && countMax === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Both count & countMax are present\n if (count !== undefined && countMax !== undefined) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (countMax !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.event === undefined ||\n dos.timing.event.length === 0\n ) {\n return undefined;\n }\n\n // Generate the string version of them\n let events = dos.timing.event;\n\n // List to string\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","// types\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 return {\n year:\n options.dateStyle === undefined ? options.year || \"numeric\" : undefined,\n month:\n options.dateStyle === undefined ? options.month || \"2-digit\" : undefined,\n day: options.dateStyle === undefined ? options.day || \"2-digit\" : undefined,\n weekday: options.dateStyle === undefined ? options.weekday : undefined,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n return {\n hour:\n options.timeStyle === undefined ? options.hour || \"2-digit\" : undefined,\n minute:\n options.timeStyle === undefined ? options.minute || \"2-digit\" : undefined,\n second:\n options.timeStyle === undefined ? options.second || \"2-digit\" : undefined,\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 // prepare data for algorithm below\n const entries: MappedDate[] = datetimes.map((datetime) => {\n // Convert it to date\n let date = new Date(datetime);\n\n // other properties\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 // retrieve value from user\n dateStyle: options.dateStyle,\n // fallback if dateStyle is not defined\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 // retrieve value from user\n dateStyle: options.dateStyle,\n timeStyle: options.timeStyle,\n // fallback if dateStyle / timeStyle is not defined\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\n// Function to invoke only one formatDatetimes, with the addition condition that object could be undefined\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n // Can't do magic ;)\n if (datetime === undefined) {\n return undefined;\n }\n\n // Invoke previous function, and pick up the first entry\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.additionalInstruction === undefined ||\n dos.additionalInstruction.length === 0\n ) {\n return undefined;\n }\n\n // Turn it into strings\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter((s) => s !== undefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerLifetime === undefined) {\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","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerAdministration === undefined) {\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","// Functions\nimport { formatDatetime } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.repeat === undefined ||\n dos.timing.repeat.boundsPeriod === undefined\n ) {\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 // Three cases\n\n // 1. Both start and end are present\n if (start !== undefined && end !== undefined) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (start !== undefined) {\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\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerPeriod === undefined) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object\n // 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((s) => s !== undefined) 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/utils/fromCodeableConceptToString.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/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractTimingRepeat.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","// Classe(s)\nimport { Configurator } from \"./classes/Configurator\";\n\n// Functions\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\n\n// Types\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\n// I18n default config\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n // have to cast the function to be webpack / builder friendly\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 // 1. Collect all sequences number\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter((s) => s !== undefined);\n\n // 2. Convert it to a Set\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n // 3. We have a \"sequential\" situation in two cases\n // A) No sequence number were provided\n // B) All sequence numbers are different\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 // Prepare variables\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n // Get dosage object\n const dosage = dosages[idx];\n\n // Get the sequence number (normally, in real world, it should be present in this case)\n // If no sequence number, assume it is idx + 1\n let sequenceNr = dosage.sequence || idx + 1;\n\n // Retrieve of create previous entries for this sequence number\n let localGroup = groups[sequenceNr] || [];\n\n // Add entry\n localGroup.push(dosage);\n\n // Pushback result\n groups[sequenceNr] = localGroup;\n\n // For reminder of the parsed sequence\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 // iterate on each key and generate a string from each part\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((s) => s !== undefined);\n\n // Join each part with a separator\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 // iterate on each key and generate a string from each part\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\n// Default values\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\n// Types\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 // Set up lib, according provided parameters\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n // User config\n this.config = {\n // default attributes\n ...defaultAttributes,\n // attributes set by user\n ...userConfig,\n };\n // I18N config\n this.i18nConfig = {\n // default attributes\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\"common\", \"daysOfWeek\", \"eventTiming\", \"unitsOfTime\"],\n defaultNS: \"common\",\n // attributes set by user\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","// Types\nimport type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\n// default attributes\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 type { Quantity } from \"../types\";\n\n/**\n * Function to turn a quantity unit (e.g UCUM \"ml\") into a string for humans (e.g \"militier\")\n * The choice to handle plural form or not is thus under the hands of people ;)\n */\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\n// Default fromFHIRQuantityUnitToString\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (quantity.code !== undefined) {\n return quantity.code;\n }\n\n if (quantity.unit !== undefined) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","import type { CodeableConcept } from \"../types\";\n\n/**\n * Function to turn codeable concept (e.g SNOMED CT \"311504000\") into a string for humans (e.g \"With or after food\")\n */\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n // If no code, skip it\n if (code === undefined) {\n return undefined;\n }\n\n // Take text first\n if (code.text !== undefined) {\n return code.text;\n }\n\n // If empty, skip it\n if (code.coding === undefined || code.coding.length === 0) {\n return undefined;\n }\n\n // Take first coding; display first then code\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import 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\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n // If no extensions, skip it\n if (extensions === undefined || extensions.length === 0) {\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","// translators\nimport {\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\";\n\n// Types\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\n// Map\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((s) => s !== undefined);\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} 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 // Use map to provide a result without iterate on each key\n return displayOrders[entry](args);\n}\n","// To avoid circular dependancies issue, let's have a single place for exports and imports\n\nexport { 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","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (doseQuantity === undefined) {\n return undefined;\n }\n\n // Otherwise rendering it\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","// Types\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 empty, return undefined\n if (dos.doseAndRate === undefined) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => s[key] !== undefined);\n\n // If not found, skip\n if (doseAndRate === undefined) {\n return undefined;\n }\n\n // return property\n return doseAndRate[key];\n}\n","// Function\n\n// Type\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity, only once\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string | undefined {\n // extract function for the unit display from config\n const { fromFHIRQuantityUnitToString, language } = config;\n\n // Compute the result\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n // If no unit is present (in other words \"\"), we don't put it\n if (unit.length === 0) {\n return i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n });\n } else {\n return i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n }\n}\n","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (doseRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (text === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\n// Quantity unit to string\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n // If common units from HL7, do the job\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 } else {\n // otherwise, it is UCUM, ... so let the user do the job\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n }\n}\n\n// To cover all nasty cases of Range, only once\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n // Extract params\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n // prepare unit display\n let quantityUnit = high || low;\n let hasUnit =\n quantityUnit?.unit !== undefined || quantityUnit?.code !== undefined;\n\n // Four cases\n\n // 1. If we have a empty object, return undefined\n if (lowValue === undefined && highValue === undefined) {\n return undefined;\n }\n\n // quantity unit\n let unit = hasUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (lowValue !== undefined && highValue !== undefined) {\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 (highValue !== undefined) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n // Warning, this case is kind dangerous and clinically unsafe so minimal effort on this ...\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (rateQuantity === undefined) {\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","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRatio === undefined) {\n return undefined;\n }\n\n // Turn ratio to text\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (ratioText === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import type { RatioParams, Quantity } from \"../types\";\n\n// Quantity has an unit ?\nfunction hasUnit(quantity?: Quantity): boolean {\n return (quantity?.unit || quantity?.code) !== undefined;\n}\n\n// To cover all nasty cases of Ratio, only once\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n // Extract params\n const { denominator, numerator } = ratio;\n\n // units as text\n let numeratorUnit = hasUnit(numerator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: numerator!,\n })\n : undefined;\n\n let denominatorUnit = hasUnit(denominator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: denominator!,\n })\n : undefined;\n\n // quantity\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n // Collect results\n const parts: string[] = [];\n let noUnits = numeratorUnit === undefined && denominatorUnit === undefined;\n let separator = noUnits ? \"\" : \" \";\n\n // Deal with numerator first\n if (quantityNumerator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n numeratorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const numeratorString = i18next.t(\n `amount.ratio.${technicalKey}.numerator`,\n {\n count: quantityNumerator,\n numeratorUnit: numeratorUnit,\n },\n );\n parts.push(numeratorString);\n }\n\n // Deal with denominator\n if (quantityDenominator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n denominatorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const denominatorString = i18next.t(\n `amount.ratio.${technicalKey}.denominator`,\n {\n count: quantityDenominator,\n denominatorUnit: denominatorUnit,\n },\n );\n parts.push(denominatorString);\n }\n\n // Concatenate the result\n if (parts.length === 0) {\n return undefined;\n } else {\n return parts.join(separator);\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let duration = repeat.duration;\n let max = repeat.durationMax;\n let unit = repeat.durationUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n return [\n // duration\n duration !== undefined &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n // durationMax\n max !== undefined &&\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}\n","import type { Dosage } from \"../types\";\n\nexport function extractTimingRepeat(dos: Dosage) {\n // If empty, return undefined\n if (dos.timing === undefined || dos.timing.repeat === undefined) {\n return undefined;\n }\n\n return dos.timing.repeat;\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let frequency = repeat.frequency;\n let max = repeat.frequencyMax;\n\n // Do nothing if no frequency / frequencyMax, I am not a wizard\n if (frequency === undefined && max === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Frequency and frequencyMax are present\n if (frequency !== undefined && max !== undefined) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (max !== undefined) {\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}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let period = repeat.period;\n let max = repeat.periodMax;\n let unit = repeat.periodUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. period and periodMax are present\n if (period !== undefined && max !== undefined) {\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 (max !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\nimport type { DisplayOrderParams, I18N } from \"../types\";\n\ntype TimeKeys =\n | \"MORN\"\n | \"MORN.early\"\n | \"MORN.late\"\n | \"NOON\"\n | \"AFT\"\n | \"AFT.early\"\n | \"AFT.late\"\n | \"EVE\"\n | \"EVE.early\"\n | \"EVE.late\"\n | \"NIGHT\"\n | \"PHS\"\n | \"IMD\"\n | \"HS\"\n | \"WAKE\"\n | \"C\"\n | \"CM\"\n | \"CD\"\n | \"CV\"\n | \"AC\"\n | \"ACM\"\n | \"ACD\"\n | \"ACV\"\n | \"PC\"\n | \"PCM\"\n | \"PCD\"\n | \"PCV\";\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\n// Function to transform offset into a string\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (offset === undefined || offset <= 0) {\n return undefined;\n }\n\n // extract days / hours / minutes from it\n let time = extractTime(offset);\n\n // generate part\n let subParts = [\n // days\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n // hours\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n // minutes\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter((s) => s !== undefined);\n\n return subParts.join(\" \");\n}\n\n// Function to transform when[] into a string\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n // Only run when array is not empty\n if (when === undefined || when.length === 0) {\n return undefined;\n }\n\n // Turn it into a string\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n const finalString = fromListToString(i18next, whens);\n\n return finalString;\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let offset = repeat.offset;\n let when = repeat.when;\n\n // If both are undefined, don't do anything\n if (offset === undefined && when === undefined) {\n return undefined;\n }\n\n return [\n // offset part\n transformOffset(i18next, offset),\n // when part\n transformWhen(i18next, when),\n ]\n .filter((s) => s !== undefined)\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\n// To make a list understandable for end-users\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n // Split the array into two parts: all entries except the last one, and the last\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n // concatenate the result\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","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let dayOfWeek = repeat.dayOfWeek;\n\n // If empty, skip it\n if (dayOfWeek === undefined || dayOfWeek.length === 0) {\n return undefined;\n } else {\n // Turn it into a string\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 // Split the time string by \":\"\n var parts = time.split(\":\");\n\n // Check if the last part (seconds) is \"00\", if so, remove it\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n // Join the remaining parts with \":\"\n return parts.join(\":\");\n}\n\n// Function to transform timeOfDay into a string\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let timeOfDay = repeat.timeOfDay;\n\n // If empty, skip it\n if (timeOfDay === undefined || timeOfDay.length === 0) {\n return undefined;\n } else {\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}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\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((s) => s !== undefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // Pickup the interesting attributes\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 } else {\n // merge boolean to make it simpler\n let booleanValue = asNeededBoolean || asNeeded || false;\n\n if (booleanValue) {\n return i18next.t(\"fields.asNeeded\");\n } else {\n return undefined;\n }\n }\n}\n","// Functions\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// types\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\n// Duration to string\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 } else {\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}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsDuration = repeat.boundsDuration;\n\n // Do nothing if no boundsDuration, I am not a wizard\n if (boundsDuration === undefined) {\n return undefined;\n } else {\n let durationText = transformDurationToString(\n i18next,\n boundsDuration,\n config,\n );\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n }\n}\n","// types\nimport type { DisplayOrderParams } from \"../types\";\n\n// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsRange = repeat.boundsRange;\n\n // Do nothing if no boundsRange, I am not a wizard\n if (boundsRange === undefined) {\n return undefined;\n } else {\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let count = repeat.count;\n let countMax = repeat.countMax;\n\n // Do nothing if no count, I am not a wizard\n if (count === undefined && countMax === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Both count & countMax are present\n if (count !== undefined && countMax !== undefined) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (countMax !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.event === undefined ||\n dos.timing.event.length === 0\n ) {\n return undefined;\n }\n\n // Generate the string version of them\n let events = dos.timing.event;\n\n // List to string\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","// types\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 return {\n year:\n options.dateStyle === undefined ? options.year || \"numeric\" : undefined,\n month:\n options.dateStyle === undefined ? options.month || \"2-digit\" : undefined,\n day: options.dateStyle === undefined ? options.day || \"2-digit\" : undefined,\n weekday: options.dateStyle === undefined ? options.weekday : undefined,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n return {\n hour:\n options.timeStyle === undefined ? options.hour || \"2-digit\" : undefined,\n minute:\n options.timeStyle === undefined ? options.minute || \"2-digit\" : undefined,\n second:\n options.timeStyle === undefined ? options.second || \"2-digit\" : undefined,\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 // prepare data for algorithm below\n const entries: MappedDate[] = datetimes.map((datetime) => {\n // Convert it to date\n let date = new Date(datetime);\n\n // other properties\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 // retrieve value from user\n dateStyle: options.dateStyle,\n // fallback if dateStyle is not defined\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 // retrieve value from user\n dateStyle: options.dateStyle,\n timeStyle: options.timeStyle,\n // fallback if dateStyle / timeStyle is not defined\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\n// Function to invoke only one formatDatetimes, with the addition condition that object could be undefined\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n // Can't do magic ;)\n if (datetime === undefined) {\n return undefined;\n }\n\n // Invoke previous function, and pick up the first entry\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.additionalInstruction === undefined ||\n dos.additionalInstruction.length === 0\n ) {\n return undefined;\n }\n\n // Turn it into strings\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter((s) => s !== undefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerLifetime === undefined) {\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","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerAdministration === undefined) {\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","// Functions\nimport { formatDatetime } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.repeat === undefined ||\n dos.timing.repeat.boundsPeriod === undefined\n ) {\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 // Three cases\n\n // 1. Both start and end are present\n if (start !== undefined && end !== undefined) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (start !== undefined) {\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\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerPeriod === undefined) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object\n // 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((s) => s !== undefined) 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
@@ -1029,6 +1029,10 @@ const $9b1af2fba509609e$var$displayOrders = {
1029
1029
  timingExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
1030
1030
  language: config.language,
1031
1031
  extensions: dos.timing?.extension
1032
+ }),
1033
+ timingRepeatExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
1034
+ language: config.language,
1035
+ extensions: dos.timing?.repeat?.extension
1032
1036
  })
1033
1037
  };
1034
1038
  function $9b1af2fba509609e$export$9f330b4bf8c0975c({ entry: entry, ...args }) {
@@ -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/utils/fromCodeableConceptToString.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/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractTimingRepeat.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","// Classe(s)\nimport { Configurator } from \"./classes/Configurator\";\n\n// Functions\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\n\n// Types\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\n// I18n default config\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n // have to cast the function to be webpack / builder friendly\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 // 1. Collect all sequences number\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter((s) => s !== undefined);\n\n // 2. Convert it to a Set\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n // 3. We have a \"sequential\" situation in two cases\n // A) No sequence number were provided\n // B) All sequence numbers are different\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 // Prepare variables\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n // Get dosage object\n const dosage = dosages[idx];\n\n // Get the sequence number (normally, in real world, it should be present in this case)\n // If no sequence number, assume it is idx + 1\n let sequenceNr = dosage.sequence || idx + 1;\n\n // Retrieve of create previous entries for this sequence number\n let localGroup = groups[sequenceNr] || [];\n\n // Add entry\n localGroup.push(dosage);\n\n // Pushback result\n groups[sequenceNr] = localGroup;\n\n // For reminder of the parsed sequence\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 // iterate on each key and generate a string from each part\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((s) => s !== undefined);\n\n // Join each part with a separator\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 // iterate on each key and generate a string from each part\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\n// Default values\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\n// Types\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 // Set up lib, according provided parameters\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n // User config\n this.config = {\n // default attributes\n ...defaultAttributes,\n // attributes set by user\n ...userConfig,\n };\n // I18N config\n this.i18nConfig = {\n // default attributes\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\"common\", \"daysOfWeek\", \"eventTiming\", \"unitsOfTime\"],\n defaultNS: \"common\",\n // attributes set by user\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","// Types\nimport type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\n// default attributes\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 type { Quantity } from \"../types\";\n\n/**\n * Function to turn a quantity unit (e.g UCUM \"ml\") into a string for humans (e.g \"militier\")\n * The choice to handle plural form or not is thus under the hands of people ;)\n */\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\n// Default fromFHIRQuantityUnitToString\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (quantity.code !== undefined) {\n return quantity.code;\n }\n\n if (quantity.unit !== undefined) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","import type { CodeableConcept } from \"../types\";\n\n/**\n * Function to turn codeable concept (e.g SNOMED CT \"311504000\") into a string for humans (e.g \"With or after food\")\n */\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n // If no code, skip it\n if (code === undefined) {\n return undefined;\n }\n\n // Take text first\n if (code.text !== undefined) {\n return code.text;\n }\n\n // If empty, skip it\n if (code.coding === undefined || code.coding.length === 0) {\n return undefined;\n }\n\n // Take first coding; display first then code\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import 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\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n // If no extensions, skip it\n if (extensions === undefined || extensions.length === 0) {\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","// translators\nimport {\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\";\n\n// Types\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\n// Map\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((s) => s !== undefined);\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} 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 // Use map to provide a result without iterate on each key\n return displayOrders[entry](args);\n}\n","// To avoid circular dependancies issue, let's have a single place for exports and imports\n\nexport { 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","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (doseQuantity === undefined) {\n return undefined;\n }\n\n // Otherwise rendering it\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","// Types\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 empty, return undefined\n if (dos.doseAndRate === undefined) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => s[key] !== undefined);\n\n // If not found, skip\n if (doseAndRate === undefined) {\n return undefined;\n }\n\n // return property\n return doseAndRate[key];\n}\n","// Function\n\n// Type\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity, only once\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string | undefined {\n // extract function for the unit display from config\n const { fromFHIRQuantityUnitToString, language } = config;\n\n // Compute the result\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n // If no unit is present (in other words \"\"), we don't put it\n if (unit.length === 0) {\n return i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n });\n } else {\n return i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n }\n}\n","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (doseRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (text === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\n// Quantity unit to string\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n // If common units from HL7, do the job\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 } else {\n // otherwise, it is UCUM, ... so let the user do the job\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n }\n}\n\n// To cover all nasty cases of Range, only once\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n // Extract params\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n // prepare unit display\n let quantityUnit = high || low;\n let hasUnit =\n quantityUnit?.unit !== undefined || quantityUnit?.code !== undefined;\n\n // Four cases\n\n // 1. If we have a empty object, return undefined\n if (lowValue === undefined && highValue === undefined) {\n return undefined;\n }\n\n // quantity unit\n let unit = hasUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (lowValue !== undefined && highValue !== undefined) {\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 (highValue !== undefined) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n // Warning, this case is kind dangerous and clinically unsafe so minimal effort on this ...\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (rateQuantity === undefined) {\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","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRatio === undefined) {\n return undefined;\n }\n\n // Turn ratio to text\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (ratioText === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import type { RatioParams, Quantity } from \"../types\";\n\n// Quantity has an unit ?\nfunction hasUnit(quantity?: Quantity): boolean {\n return (quantity?.unit || quantity?.code) !== undefined;\n}\n\n// To cover all nasty cases of Ratio, only once\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n // Extract params\n const { denominator, numerator } = ratio;\n\n // units as text\n let numeratorUnit = hasUnit(numerator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: numerator!,\n })\n : undefined;\n\n let denominatorUnit = hasUnit(denominator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: denominator!,\n })\n : undefined;\n\n // quantity\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n // Collect results\n const parts: string[] = [];\n let noUnits = numeratorUnit === undefined && denominatorUnit === undefined;\n let separator = noUnits ? \"\" : \" \";\n\n // Deal with numerator first\n if (quantityNumerator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n numeratorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const numeratorString = i18next.t(\n `amount.ratio.${technicalKey}.numerator`,\n {\n count: quantityNumerator,\n numeratorUnit: numeratorUnit,\n },\n );\n parts.push(numeratorString);\n }\n\n // Deal with denominator\n if (quantityDenominator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n denominatorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const denominatorString = i18next.t(\n `amount.ratio.${technicalKey}.denominator`,\n {\n count: quantityDenominator,\n denominatorUnit: denominatorUnit,\n },\n );\n parts.push(denominatorString);\n }\n\n // Concatenate the result\n if (parts.length === 0) {\n return undefined;\n } else {\n return parts.join(separator);\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let duration = repeat.duration;\n let max = repeat.durationMax;\n let unit = repeat.durationUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n return [\n // duration\n duration !== undefined &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n // durationMax\n max !== undefined &&\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}\n","import type { Dosage } from \"../types\";\n\nexport function extractTimingRepeat(dos: Dosage) {\n // If empty, return undefined\n if (dos.timing === undefined || dos.timing.repeat === undefined) {\n return undefined;\n }\n\n return dos.timing.repeat;\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let frequency = repeat.frequency;\n let max = repeat.frequencyMax;\n\n // Do nothing if no frequency / frequencyMax, I am not a wizard\n if (frequency === undefined && max === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Frequency and frequencyMax are present\n if (frequency !== undefined && max !== undefined) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (max !== undefined) {\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}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let period = repeat.period;\n let max = repeat.periodMax;\n let unit = repeat.periodUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. period and periodMax are present\n if (period !== undefined && max !== undefined) {\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 (max !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\nimport type { DisplayOrderParams, I18N } from \"../types\";\n\ntype TimeKeys =\n | \"MORN\"\n | \"MORN.early\"\n | \"MORN.late\"\n | \"NOON\"\n | \"AFT\"\n | \"AFT.early\"\n | \"AFT.late\"\n | \"EVE\"\n | \"EVE.early\"\n | \"EVE.late\"\n | \"NIGHT\"\n | \"PHS\"\n | \"IMD\"\n | \"HS\"\n | \"WAKE\"\n | \"C\"\n | \"CM\"\n | \"CD\"\n | \"CV\"\n | \"AC\"\n | \"ACM\"\n | \"ACD\"\n | \"ACV\"\n | \"PC\"\n | \"PCM\"\n | \"PCD\"\n | \"PCV\";\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\n// Function to transform offset into a string\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (offset === undefined || offset <= 0) {\n return undefined;\n }\n\n // extract days / hours / minutes from it\n let time = extractTime(offset);\n\n // generate part\n let subParts = [\n // days\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n // hours\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n // minutes\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter((s) => s !== undefined);\n\n return subParts.join(\" \");\n}\n\n// Function to transform when[] into a string\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n // Only run when array is not empty\n if (when === undefined || when.length === 0) {\n return undefined;\n }\n\n // Turn it into a string\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n const finalString = fromListToString(i18next, whens);\n\n return finalString;\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let offset = repeat.offset;\n let when = repeat.when;\n\n // If both are undefined, don't do anything\n if (offset === undefined && when === undefined) {\n return undefined;\n }\n\n return [\n // offset part\n transformOffset(i18next, offset),\n // when part\n transformWhen(i18next, when),\n ]\n .filter((s) => s !== undefined)\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\n// To make a list understandable for end-users\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n // Split the array into two parts: all entries except the last one, and the last\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n // concatenate the result\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","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let dayOfWeek = repeat.dayOfWeek;\n\n // If empty, skip it\n if (dayOfWeek === undefined || dayOfWeek.length === 0) {\n return undefined;\n } else {\n // Turn it into a string\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 // Split the time string by \":\"\n var parts = time.split(\":\");\n\n // Check if the last part (seconds) is \"00\", if so, remove it\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n // Join the remaining parts with \":\"\n return parts.join(\":\");\n}\n\n// Function to transform timeOfDay into a string\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let timeOfDay = repeat.timeOfDay;\n\n // If empty, skip it\n if (timeOfDay === undefined || timeOfDay.length === 0) {\n return undefined;\n } else {\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}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\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((s) => s !== undefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // Pickup the interesting attributes\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 } else {\n // merge boolean to make it simpler\n let booleanValue = asNeededBoolean || asNeeded || false;\n\n if (booleanValue) {\n return i18next.t(\"fields.asNeeded\");\n } else {\n return undefined;\n }\n }\n}\n","// Functions\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// types\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\n// Duration to string\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 } else {\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}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsDuration = repeat.boundsDuration;\n\n // Do nothing if no boundsDuration, I am not a wizard\n if (boundsDuration === undefined) {\n return undefined;\n } else {\n let durationText = transformDurationToString(\n i18next,\n boundsDuration,\n config,\n );\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n }\n}\n","// types\nimport type { DisplayOrderParams } from \"../types\";\n\n// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsRange = repeat.boundsRange;\n\n // Do nothing if no boundsRange, I am not a wizard\n if (boundsRange === undefined) {\n return undefined;\n } else {\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let count = repeat.count;\n let countMax = repeat.countMax;\n\n // Do nothing if no count, I am not a wizard\n if (count === undefined && countMax === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Both count & countMax are present\n if (count !== undefined && countMax !== undefined) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (countMax !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.event === undefined ||\n dos.timing.event.length === 0\n ) {\n return undefined;\n }\n\n // Generate the string version of them\n let events = dos.timing.event;\n\n // List to string\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","// types\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 return {\n year:\n options.dateStyle === undefined ? options.year || \"numeric\" : undefined,\n month:\n options.dateStyle === undefined ? options.month || \"2-digit\" : undefined,\n day: options.dateStyle === undefined ? options.day || \"2-digit\" : undefined,\n weekday: options.dateStyle === undefined ? options.weekday : undefined,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n return {\n hour:\n options.timeStyle === undefined ? options.hour || \"2-digit\" : undefined,\n minute:\n options.timeStyle === undefined ? options.minute || \"2-digit\" : undefined,\n second:\n options.timeStyle === undefined ? options.second || \"2-digit\" : undefined,\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 // prepare data for algorithm below\n const entries: MappedDate[] = datetimes.map((datetime) => {\n // Convert it to date\n let date = new Date(datetime);\n\n // other properties\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 // retrieve value from user\n dateStyle: options.dateStyle,\n // fallback if dateStyle is not defined\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 // retrieve value from user\n dateStyle: options.dateStyle,\n timeStyle: options.timeStyle,\n // fallback if dateStyle / timeStyle is not defined\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\n// Function to invoke only one formatDatetimes, with the addition condition that object could be undefined\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n // Can't do magic ;)\n if (datetime === undefined) {\n return undefined;\n }\n\n // Invoke previous function, and pick up the first entry\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.additionalInstruction === undefined ||\n dos.additionalInstruction.length === 0\n ) {\n return undefined;\n }\n\n // Turn it into strings\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter((s) => s !== undefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerLifetime === undefined) {\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","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerAdministration === undefined) {\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","// Functions\nimport { formatDatetime } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.repeat === undefined ||\n dos.timing.repeat.boundsPeriod === undefined\n ) {\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 // Three cases\n\n // 1. Both start and end are present\n if (start !== undefined && end !== undefined) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (start !== undefined) {\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\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerPeriod === undefined) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object\n // 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((s) => s !== undefined) 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/utils/fromCodeableConceptToString.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/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractTimingRepeat.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","// Classe(s)\nimport { Configurator } from \"./classes/Configurator\";\n\n// Functions\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\n\n// Types\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\n// I18n default config\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n // have to cast the function to be webpack / builder friendly\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 // 1. Collect all sequences number\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter((s) => s !== undefined);\n\n // 2. Convert it to a Set\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n // 3. We have a \"sequential\" situation in two cases\n // A) No sequence number were provided\n // B) All sequence numbers are different\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 // Prepare variables\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n // Get dosage object\n const dosage = dosages[idx];\n\n // Get the sequence number (normally, in real world, it should be present in this case)\n // If no sequence number, assume it is idx + 1\n let sequenceNr = dosage.sequence || idx + 1;\n\n // Retrieve of create previous entries for this sequence number\n let localGroup = groups[sequenceNr] || [];\n\n // Add entry\n localGroup.push(dosage);\n\n // Pushback result\n groups[sequenceNr] = localGroup;\n\n // For reminder of the parsed sequence\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 // iterate on each key and generate a string from each part\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((s) => s !== undefined);\n\n // Join each part with a separator\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 // iterate on each key and generate a string from each part\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\n// Default values\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\n// Types\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 // Set up lib, according provided parameters\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n // User config\n this.config = {\n // default attributes\n ...defaultAttributes,\n // attributes set by user\n ...userConfig,\n };\n // I18N config\n this.i18nConfig = {\n // default attributes\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\"common\", \"daysOfWeek\", \"eventTiming\", \"unitsOfTime\"],\n defaultNS: \"common\",\n // attributes set by user\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","// Types\nimport type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\n// default attributes\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 type { Quantity } from \"../types\";\n\n/**\n * Function to turn a quantity unit (e.g UCUM \"ml\") into a string for humans (e.g \"militier\")\n * The choice to handle plural form or not is thus under the hands of people ;)\n */\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\n// Default fromFHIRQuantityUnitToString\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (quantity.code !== undefined) {\n return quantity.code;\n }\n\n if (quantity.unit !== undefined) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","import type { CodeableConcept } from \"../types\";\n\n/**\n * Function to turn codeable concept (e.g SNOMED CT \"311504000\") into a string for humans (e.g \"With or after food\")\n */\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n // If no code, skip it\n if (code === undefined) {\n return undefined;\n }\n\n // Take text first\n if (code.text !== undefined) {\n return code.text;\n }\n\n // If empty, skip it\n if (code.coding === undefined || code.coding.length === 0) {\n return undefined;\n }\n\n // Take first coding; display first then code\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import 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\n// Default fromCodeableConceptToString\n// End-users can create their own version to fit their needs\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n // If no extensions, skip it\n if (extensions === undefined || extensions.length === 0) {\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","// translators\nimport {\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\";\n\n// Types\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\n// Map\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((s) => s !== undefined);\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} 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 // Use map to provide a result without iterate on each key\n return displayOrders[entry](args);\n}\n","// To avoid circular dependancies issue, let's have a single place for exports and imports\n\nexport { 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","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (doseQuantity === undefined) {\n return undefined;\n }\n\n // Otherwise rendering it\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","// Types\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 empty, return undefined\n if (dos.doseAndRate === undefined) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => s[key] !== undefined);\n\n // If not found, skip\n if (doseAndRate === undefined) {\n return undefined;\n }\n\n // return property\n return doseAndRate[key];\n}\n","// Function\n\n// Type\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity, only once\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string | undefined {\n // extract function for the unit display from config\n const { fromFHIRQuantityUnitToString, language } = config;\n\n // Compute the result\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n\n // If no unit is present (in other words \"\"), we don't put it\n if (unit.length === 0) {\n return i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n });\n } else {\n return i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n }\n}\n","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (doseRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (text === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\n// Quantity unit to string\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n // If common units from HL7, do the job\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 } else {\n // otherwise, it is UCUM, ... so let the user do the job\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n }\n}\n\n// To cover all nasty cases of Range, only once\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n // Extract params\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n // prepare unit display\n let quantityUnit = high || low;\n let hasUnit =\n quantityUnit?.unit !== undefined || quantityUnit?.code !== undefined;\n\n // Four cases\n\n // 1. If we have a empty object, return undefined\n if (lowValue === undefined && highValue === undefined) {\n return undefined;\n }\n\n // quantity unit\n let unit = hasUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (lowValue !== undefined && highValue !== undefined) {\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 (highValue !== undefined) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n // Warning, this case is kind dangerous and clinically unsafe so minimal effort on this ...\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","// Functions\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\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 not found, skip\n if (rateQuantity === undefined) {\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","// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRange === undefined) {\n return undefined;\n }\n\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\n\n// types\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 not found, skip\n if (rateRatio === undefined) {\n return undefined;\n }\n\n // Turn ratio to text\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (ratioText === undefined) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import type { RatioParams, Quantity } from \"../types\";\n\n// Quantity has an unit ?\nfunction hasUnit(quantity?: Quantity): boolean {\n return (quantity?.unit || quantity?.code) !== undefined;\n}\n\n// To cover all nasty cases of Ratio, only once\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n // Extract params\n const { denominator, numerator } = ratio;\n\n // units as text\n let numeratorUnit = hasUnit(numerator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: numerator!,\n })\n : undefined;\n\n let denominatorUnit = hasUnit(denominator)\n ? config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: denominator!,\n })\n : undefined;\n\n // quantity\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n // Collect results\n const parts: string[] = [];\n let noUnits = numeratorUnit === undefined && denominatorUnit === undefined;\n let separator = noUnits ? \"\" : \" \";\n\n // Deal with numerator first\n if (quantityNumerator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n numeratorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const numeratorString = i18next.t(\n `amount.ratio.${technicalKey}.numerator`,\n {\n count: quantityNumerator,\n numeratorUnit: numeratorUnit,\n },\n );\n parts.push(numeratorString);\n }\n\n // Deal with denominator\n if (quantityDenominator !== undefined) {\n let technicalKey: \"withUnit\" | \"withoutUnit\" =\n denominatorUnit !== undefined ? \"withUnit\" : \"withoutUnit\";\n const denominatorString = i18next.t(\n `amount.ratio.${technicalKey}.denominator`,\n {\n count: quantityDenominator,\n denominatorUnit: denominatorUnit,\n },\n );\n parts.push(denominatorString);\n }\n\n // Concatenate the result\n if (parts.length === 0) {\n return undefined;\n } else {\n return parts.join(separator);\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let duration = repeat.duration;\n let max = repeat.durationMax;\n let unit = repeat.durationUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n return [\n // duration\n duration !== undefined &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n // durationMax\n max !== undefined &&\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}\n","import type { Dosage } from \"../types\";\n\nexport function extractTimingRepeat(dos: Dosage) {\n // If empty, return undefined\n if (dos.timing === undefined || dos.timing.repeat === undefined) {\n return undefined;\n }\n\n return dos.timing.repeat;\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let frequency = repeat.frequency;\n let max = repeat.frequencyMax;\n\n // Do nothing if no frequency / frequencyMax, I am not a wizard\n if (frequency === undefined && max === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Frequency and frequencyMax are present\n if (frequency !== undefined && max !== undefined) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (max !== undefined) {\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}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let period = repeat.period;\n let max = repeat.periodMax;\n let unit = repeat.periodUnit;\n\n // Do nothing if no unit, I am not a wizard\n if (unit === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. period and periodMax are present\n if (period !== undefined && max !== undefined) {\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 (max !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\nimport type { DisplayOrderParams, I18N } from \"../types\";\n\ntype TimeKeys =\n | \"MORN\"\n | \"MORN.early\"\n | \"MORN.late\"\n | \"NOON\"\n | \"AFT\"\n | \"AFT.early\"\n | \"AFT.late\"\n | \"EVE\"\n | \"EVE.early\"\n | \"EVE.late\"\n | \"NIGHT\"\n | \"PHS\"\n | \"IMD\"\n | \"HS\"\n | \"WAKE\"\n | \"C\"\n | \"CM\"\n | \"CD\"\n | \"CV\"\n | \"AC\"\n | \"ACM\"\n | \"ACD\"\n | \"ACV\"\n | \"PC\"\n | \"PCM\"\n | \"PCD\"\n | \"PCV\";\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\n// Function to transform offset into a string\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (offset === undefined || offset <= 0) {\n return undefined;\n }\n\n // extract days / hours / minutes from it\n let time = extractTime(offset);\n\n // generate part\n let subParts = [\n // days\n time.days > 0\n ? i18next.t(\"unitsOfTime:withCount.d\", { count: time.days })\n : undefined,\n // hours\n time.hours > 0\n ? i18next.t(\"unitsOfTime:withCount.h\", { count: time.hours })\n : undefined,\n // minutes\n time.minutes > 0\n ? i18next.t(\"unitsOfTime:withCount.min\", { count: time.minutes })\n : undefined,\n ].filter((s) => s !== undefined);\n\n return subParts.join(\" \");\n}\n\n// Function to transform when[] into a string\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n // Only run when array is not empty\n if (when === undefined || when.length === 0) {\n return undefined;\n }\n\n // Turn it into a string\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n const finalString = fromListToString(i18next, whens);\n\n return finalString;\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let offset = repeat.offset;\n let when = repeat.when;\n\n // If both are undefined, don't do anything\n if (offset === undefined && when === undefined) {\n return undefined;\n }\n\n return [\n // offset part\n transformOffset(i18next, offset),\n // when part\n transformWhen(i18next, when),\n ]\n .filter((s) => s !== undefined)\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\n// To make a list understandable for end-users\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n // Split the array into two parts: all entries except the last one, and the last\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n // concatenate the result\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","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let dayOfWeek = repeat.dayOfWeek;\n\n // If empty, skip it\n if (dayOfWeek === undefined || dayOfWeek.length === 0) {\n return undefined;\n } else {\n // Turn it into a string\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// Types\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 // Split the time string by \":\"\n var parts = time.split(\":\");\n\n // Check if the last part (seconds) is \"00\", if so, remove it\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n // Join the remaining parts with \":\"\n return parts.join(\":\");\n}\n\n// Function to transform timeOfDay into a string\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let timeOfDay = repeat.timeOfDay;\n\n // If empty, skip it\n if (timeOfDay === undefined || timeOfDay.length === 0) {\n return undefined;\n } else {\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}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\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((s) => s !== undefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // Pickup the interesting attributes\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 } else {\n // merge boolean to make it simpler\n let booleanValue = asNeededBoolean || asNeeded || false;\n\n if (booleanValue) {\n return i18next.t(\"fields.asNeeded\");\n } else {\n return undefined;\n }\n }\n}\n","// Functions\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\n// types\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\n// Duration to string\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 } else {\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}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsDuration = repeat.boundsDuration;\n\n // Do nothing if no boundsDuration, I am not a wizard\n if (boundsDuration === undefined) {\n return undefined;\n } else {\n let durationText = transformDurationToString(\n i18next,\n boundsDuration,\n config,\n );\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n }\n}\n","// types\nimport type { DisplayOrderParams } from \"../types\";\n\n// Utility function\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let boundsRange = repeat.boundsRange;\n\n // Do nothing if no boundsRange, I am not a wizard\n if (boundsRange === undefined) {\n return undefined;\n } else {\n // Turn range into a text\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n // Reject if empty\n if (rangeText === undefined) {\n return undefined;\n }\n\n // return the final string\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n }\n}\n","import { extractTimingRepeat } from \"../internal/extractTimingRepeat\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let repeat = extractTimingRepeat(dos);\n\n // If empty, return undefined\n if (repeat === undefined) {\n return undefined;\n }\n\n // Pickup the repeat interesting attributes\n let count = repeat.count;\n let countMax = repeat.countMax;\n\n // Do nothing if no count, I am not a wizard\n if (count === undefined && countMax === undefined) {\n return undefined;\n } else {\n // Three cases\n\n // 1. Both count & countMax are present\n if (count !== undefined && countMax !== undefined) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (countMax !== undefined) {\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}\n","// Functions\nimport { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.event === undefined ||\n dos.timing.event.length === 0\n ) {\n return undefined;\n }\n\n // Generate the string version of them\n let events = dos.timing.event;\n\n // List to string\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","// types\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 return {\n year:\n options.dateStyle === undefined ? options.year || \"numeric\" : undefined,\n month:\n options.dateStyle === undefined ? options.month || \"2-digit\" : undefined,\n day: options.dateStyle === undefined ? options.day || \"2-digit\" : undefined,\n weekday: options.dateStyle === undefined ? options.weekday : undefined,\n };\n}\n\n// Function to clean up the params for timeStyle situation\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n return {\n hour:\n options.timeStyle === undefined ? options.hour || \"2-digit\" : undefined,\n minute:\n options.timeStyle === undefined ? options.minute || \"2-digit\" : undefined,\n second:\n options.timeStyle === undefined ? options.second || \"2-digit\" : undefined,\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 // prepare data for algorithm below\n const entries: MappedDate[] = datetimes.map((datetime) => {\n // Convert it to date\n let date = new Date(datetime);\n\n // other properties\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 // retrieve value from user\n dateStyle: options.dateStyle,\n // fallback if dateStyle is not defined\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 // retrieve value from user\n dateStyle: options.dateStyle,\n timeStyle: options.timeStyle,\n // fallback if dateStyle / timeStyle is not defined\n ...generateDateStyleFormatOptions(options),\n ...generateTimeStyleFormatOptions(options),\n });\n return df4.format(date);\n });\n\n return result;\n}\n\n// Function to invoke only one formatDatetimes, with the addition condition that object could be undefined\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n // Can't do magic ;)\n if (datetime === undefined) {\n return undefined;\n }\n\n // Invoke previous function, and pick up the first entry\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","// Function\nimport { fromListToString } from \"../utils/fromListToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.additionalInstruction === undefined ||\n dos.additionalInstruction.length === 0\n ) {\n return undefined;\n }\n\n // Turn it into strings\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter((s) => s !== undefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerLifetime === undefined) {\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","// Functions\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerAdministration === undefined) {\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","// Functions\nimport { formatDatetime } from \"../utils/formatDatetimes\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (\n dos.timing === undefined ||\n dos.timing.repeat === undefined ||\n dos.timing.repeat.boundsPeriod === undefined\n ) {\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 // Three cases\n\n // 1. Both start and end are present\n if (start !== undefined && end !== undefined) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (start !== undefined) {\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\";\n\n// types\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n // If empty, return undefined\n if (dos.maxDosePerPeriod === undefined) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object\n // 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((s) => s !== undefined) 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"}
package/dist/types.d.ts CHANGED
@@ -153,7 +153,11 @@ export enum DisplayOrderEnum {
153
153
  /**
154
154
  * Display "timing.extension"
155
155
  */
156
- timingExtension = "timingExtension"
156
+ timingExtension = "timingExtension",
157
+ /**
158
+ * Display "timing.repeat.extension"
159
+ */
160
+ timingRepeatExtension = "timingRepeatExtension"
157
161
  }
158
162
  type DisplayOrder = keyof typeof DisplayOrderEnum;
159
163
  export interface Params {
@@ -235,7 +239,7 @@ declare class Configurator {
235
239
  /**
236
240
  * Get display order
237
241
  */
238
- getDisplayOrder(): ("code" | "text" | "method" | "doseQuantity" | "doseRange" | "rateRatio" | "rateQuantity" | "rateRange" | "durationDurationMax" | "frequencyFrequencyMax" | "periodPeriodMax" | "frequencyFrequencyMaxPeriodPeriodMax" | "offsetWhen" | "dayOfWeek" | "timeOfDay" | "route" | "site" | "asNeeded" | "boundsDuration" | "boundsPeriod" | "boundsRange" | "countCountMax" | "event" | "maxDosePerPeriod" | "maxDosePerAdministration" | "maxDosePerLifetime" | "additionalInstruction" | "patientInstruction" | "extension" | "timingExtension")[];
242
+ getDisplayOrder(): ("code" | "text" | "method" | "doseQuantity" | "doseRange" | "rateRatio" | "rateQuantity" | "rateRange" | "durationDurationMax" | "frequencyFrequencyMax" | "periodPeriodMax" | "frequencyFrequencyMaxPeriodPeriodMax" | "offsetWhen" | "dayOfWeek" | "timeOfDay" | "route" | "site" | "asNeeded" | "boundsDuration" | "boundsPeriod" | "boundsRange" | "countCountMax" | "event" | "maxDosePerPeriod" | "maxDosePerAdministration" | "maxDosePerLifetime" | "additionalInstruction" | "patientInstruction" | "extension" | "timingExtension" | "timingRepeatExtension")[];
239
243
  /**
240
244
  * Get display separator
241
245
  */
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/src/utils/fromFHIRQuantityUnitToString.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/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/extractTimingRepeat.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,"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":";;;AAEA;;;GAGG;AACH,wCAA+C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AACF,uCAA8C,CAC5C,KAAK,EAAE,gCAAgC,KACpC,MAAM,CAAC;ACVZ;;GAEG;AACH,uCAA8C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC;AACF,sCAA6C,CAC3C,KAAK,EAAE,+BAA+B,KACnC,MAAM,GAAG,SAAS,CAAC;ACTxB;;GAEG;AACH,kCAAyC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC;AACF,iCAAwC,CACtC,KAAK,EAAE,0BAA0B,KAC9B,MAAM,GAAG,SAAS,CAAC;ACmBxB,cAAqB,QAAQ,GAAG,QAAQ,CAAC;AACzC,uBAA8B,iBAAiB,GAAG,iBAAiB,CAAC;AACpE,gBAAuB,UAAU,GAAG,UAAU,CAAC;AAE/C,iBAAwB,WAAW,GAAG,WAAW,CAAC;AAOlD;;GAEG;AACH;IACE;;OAEG;IACH,MAAM,WAAW;IACjB;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,mBAAmB,wBAAwB;IAC3C;;OAEG;IACH,qBAAqB,0BAA0B;IAC/C;;OAEG;IACH,eAAe,oBAAoB;IACnC;;OAEG;IACH,oCAAoC,yCAAyC;IAC7E;;OAEG;IACH,UAAU,eAAe;IACzB;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,KAAK,UAAU;IACf;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,QAAQ,aAAa;IACrB;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;OAEG;IACH,WAAW,gBAAgB;IAC3B;;OAEG;IACH,aAAa,kBAAkB;IAC/B;;OAEG;IACH,KAAK,UAAU;IACf;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,gBAAgB,qBAAqB;IACrC;;OAEG;IACH,wBAAwB,6BAA6B;IACrD;;OAEG;IACH,kBAAkB,uBAAuB;IACzC;;OAEG;IACH,qBAAqB,0BAA0B;IAC/C;;OAEG;IACH,kBAAkB,uBAAuB;IACzC;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,SAAS,cAAc;IACvB;;OAEG;IACH,eAAe,oBAAoB;IACnC;;OAEG;IACH,qBAAqB,0BAA0B;CAChD;AAED,oBAA2B,MAAM,uBAAuB,CAAC;AASzD;IACE;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,4BAA4B,CAAC,EAAE,+BAA+B,CAAC;IAC/D;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,8BAA8B,CAAC;IAC7D;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,yBAAyB,CAAC;IACnD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,KAAK,qBAAqB,CAAC;CACpD;AAGD,cAAqB,QAAQ,CAAC,MAAM,CAAC,CAAC;AAStC;;;GAGG;AACH,6BAA6B,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC;AEpO9E;IAEE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC;IAGlC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC;IAG7B,SAAS,aAAa,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,cAAc;IAqBtE;;OAEG;cACa,IAAI;IAMpB;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM;IAQhC;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE;IAOxC;;OAEG;IACH,eAAe;IAIf;;OAEG;IACH,mBAAmB;IAInB;;OAEG;IACH,sBAAsB,CAAC,GAAG,EAAE,MAAM;IAOlC;;OAEG;IACH,wBAAwB;IAIxB;;OAEG;IACH,2BAA2B,CAAC,IAAI,EAAE,KAAK,qBAAqB;CAM7D;A+B9FD,6BAA6B,SAAQ,YAAY;IAC/C;;OAEG;WACU,KAAK,CAChB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,GAAE,cAAkC;IAOhD;;OAEG;IACH,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;IAkB9D;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE;IAiCjC;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM;IAiBxD;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMrC;;OAEG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;CA8BpD;AChKD,eAAe,eAAe,CAAC","sources":["src/src/utils/fromFHIRQuantityUnitToString.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/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/extractTimingRepeat.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,"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.6.0",
3
+ "version": "1.7.0",
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"