fhir-dosage-utils 1.4.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +5 -1
- package/dist/main.js.map +1 -1
- package/dist/module.js +5 -1
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +12 -28
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
@@ -1041,7 +1041,11 @@ const $2c21ace90ecdbde6$var$displayOrders = {
|
|
1041
1041
|
code: dos.site
|
1042
1042
|
}),
|
1043
1043
|
text: ({ dos: dos })=>dos.text,
|
1044
|
-
timeOfDay: (input)=>(0, $a846209a7dd119d4$export$ee205fa48981886d)(input)
|
1044
|
+
timeOfDay: (input)=>(0, $a846209a7dd119d4$export$ee205fa48981886d)(input),
|
1045
|
+
timingExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
|
1046
|
+
language: config.language,
|
1047
|
+
extensions: dos.timing?.extension
|
1048
|
+
})
|
1045
1049
|
};
|
1046
1050
|
function $2c21ace90ecdbde6$export$9f330b4bf8c0975c({ entry: entry, ...args }) {
|
1047
1051
|
// Use map to provide a result without iterate on each key
|
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 Language,\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: Language, 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 Language,\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: Language) {\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} 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} 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
@@ -1025,7 +1025,11 @@ const $9b1af2fba509609e$var$displayOrders = {
|
|
1025
1025
|
code: dos.site
|
1026
1026
|
}),
|
1027
1027
|
text: ({ dos: dos })=>dos.text,
|
1028
|
-
timeOfDay: (input)=>(0, $a1b58a85293e76cc$export$ee205fa48981886d)(input)
|
1028
|
+
timeOfDay: (input)=>(0, $a1b58a85293e76cc$export$ee205fa48981886d)(input),
|
1029
|
+
timingExtension: ({ dos: dos, config: config })=>config.fromExtensionsToString({
|
1030
|
+
language: config.language,
|
1031
|
+
extensions: dos.timing?.extension
|
1032
|
+
})
|
1029
1033
|
};
|
1030
1034
|
function $9b1af2fba509609e$export$9f330b4bf8c0975c({ entry: entry, ...args }) {
|
1031
1035
|
// Use map to provide a result without iterate on each key
|
package/dist/module.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 Language,\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: Language, 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 Language,\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: Language) {\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} 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} 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
@@ -30,28 +30,6 @@ type Dosage = _Dosage1 | _Dosage2;
|
|
30
30
|
type CodeableConcept = _CodeableConcept1 | _CodeableConcept2;
|
31
31
|
type Quantity = _Quantity1 | _Quantity2;
|
32
32
|
type Extension = _Extension1 | _Extension2;
|
33
|
-
/**
|
34
|
-
* Represents supported languages.
|
35
|
-
*/
|
36
|
-
enum LanguageEnum {
|
37
|
-
/**
|
38
|
-
* English
|
39
|
-
*/
|
40
|
-
en = "en",
|
41
|
-
/**
|
42
|
-
* French
|
43
|
-
*/
|
44
|
-
fr = "fr",
|
45
|
-
/**
|
46
|
-
* Dutch
|
47
|
-
*/
|
48
|
-
nl = "nl",
|
49
|
-
/**
|
50
|
-
* German
|
51
|
-
*/
|
52
|
-
de = "de"
|
53
|
-
}
|
54
|
-
type Language = keyof typeof LanguageEnum;
|
55
33
|
/**
|
56
34
|
* Represents the available display orders
|
57
35
|
*/
|
@@ -171,15 +149,21 @@ export enum DisplayOrderEnum {
|
|
171
149
|
/**
|
172
150
|
* Display "extension"
|
173
151
|
*/
|
174
|
-
extension = "extension"
|
152
|
+
extension = "extension",
|
153
|
+
/**
|
154
|
+
* Display "timing.extension"
|
155
|
+
*/
|
156
|
+
timingExtension = "timingExtension"
|
175
157
|
}
|
176
158
|
type DisplayOrder = keyof typeof DisplayOrderEnum;
|
177
159
|
export interface Params {
|
178
160
|
/**
|
179
|
-
*
|
161
|
+
* BCP 47 language code to setup the library with
|
180
162
|
* @defaultValue "en" (English)
|
163
|
+
* @see [FAQ](https://jy95.github.io/fhir-dosage-utils/docs/faq) for the built-in languages
|
164
|
+
* @see [I18next documentation](https://www.i18next.com/how-to/faq#how-should-the-language-codes-be-formatted) for the reasons behind BCP 47
|
181
165
|
*/
|
182
|
-
language?:
|
166
|
+
language?: string;
|
183
167
|
/**
|
184
168
|
* Function to turn a quantity unit (e.g UCUM "ml") into a string for humans (e.g "militier")
|
185
169
|
* The choice to handle plural form or not is thus under the hands of people ;)
|
@@ -239,11 +223,11 @@ declare class Configurator {
|
|
239
223
|
/**
|
240
224
|
* To change language
|
241
225
|
*/
|
242
|
-
changeLanguage(lng:
|
226
|
+
changeLanguage(lng: string): Promise<import("i18next").TFunction<"translation", undefined>>;
|
243
227
|
/**
|
244
228
|
* Get current language
|
245
229
|
*/
|
246
|
-
getLanguage():
|
230
|
+
getLanguage(): string;
|
247
231
|
/**
|
248
232
|
* To change display order
|
249
233
|
*/
|
@@ -251,7 +235,7 @@ declare class Configurator {
|
|
251
235
|
/**
|
252
236
|
* Get display order
|
253
237
|
*/
|
254
|
-
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")[];
|
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")[];
|
255
239
|
/**
|
256
240
|
* Get display separator
|
257
241
|
*/
|
package/dist/types.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
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,
|
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;CACpC;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;AEhO9E;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"}
|