fhir-dosage-utils 1.10.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/api.ts","src/classes/Configurator.ts","src/internal/defaultAttributes.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n","import { Configurator } from \"./classes/Configurator\";\n\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type {\n Params,\n Dosage,\n DisplayOrder,\n I18InitOptions,\n NamespacesLocale,\n} from \"./types\";\n\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nconst defaultI18NConfig: I18InitOptions = {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n};\n\nexport class FhirDosageUtils extends Configurator {\n /**\n * Factory to create a fine-tuned instance of the utility class\n */\n static async build(\n userConfig?: Params,\n i18nConfig: I18InitOptions = defaultI18NConfig,\n ) {\n const instance = new FhirDosageUtils(userConfig, i18nConfig);\n await instance.init();\n return instance;\n }\n\n /**\n * Does this array of Dosage objects contains only \"sequential\" instructions ?\n */\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n\n return (\n encounteredSequenceNumbers.size === 0 ||\n encounteredSequenceNumbers.size === dosages.length\n );\n }\n\n /**\n * Turn this array of Dosage objects into a data structure useful to handle \"sequential\" and \"concurrent\" instructions (cf. \"sequence\" property).\n * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.\n */\n groupBySequence(dosages: Dosage[]) {\n let groups: Record<number, Dosage[]> = {};\n let sequences = new Set<number>();\n\n for (let idx = 0; idx < dosages.length; idx++) {\n const dosage = dosages[idx];\n\n let sequenceNr = dosage.sequence || idx + 1;\n let localGroup = groups[sequenceNr] || [];\n\n localGroup.push(dosage);\n groups[sequenceNr] = localGroup;\n\n sequences.add(sequenceNr);\n }\n\n // By using the Set values, we are sure it is returned in the way Dosages were written\n return Array.from(sequences, (sequence) => groups[sequence]);\n }\n\n /**\n * From a single dosage, extract specific field(s) requested by user.\n * Some use cases could request to split part of the object for given needs (quantity and timing separately)\n */\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n /**\n * Turn a FHIR Dosage object into text\n */\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n /**\n * Turn multiple FHIR Dosage objects into text\n */\n fromMultipleDosageToText(dosages: Dosage[]): string {\n // As we can have concurrent / sequential instructions, we need a generic algorithm to do the job\n const hasOnlySequentialInstructions =\n this.containsOnlySequentialInstructions(dosages);\n\n // Sequential instructions\n if (hasOnlySequentialInstructions) {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n // We have both \"sequential\" and \"concurrent\" instructions - time to see what is the configuration\n let sortedDosages = this.groupBySequence(dosages);\n\n // Now that data structures are filled, it is a piece of cake to generate the result\n let sequentialInstructions: string[] = sortedDosages.map(\n (concurrentInstructions) => {\n let concurrentInstructionsAsString = concurrentInstructions.map(\n (dosage) => this.fromDosageToText(dosage),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n },\n );\n\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"../internal/defaultAttributes\";\n\nimport type {\n Config,\n DisplayOrder,\n I18N,\n Params,\n InitOptions,\n I18InitOptions,\n} from \"../types\";\n\nexport class Configurator {\n // User Configuration\n protected config: Config;\n // i18next config\n protected i18nConfig: InitOptions;\n // i18next instance\n // When multiple instances of the class are used, they must act independantly regardless of the others\n protected i18nInstance: I18N;\n\n protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions) {\n this.config = {\n ...defaultAttributes,\n ...userConfig,\n };\n this.i18nConfig = {\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...i18nConfig,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n /**\n * To init i18next properly according requested criteria\n */\n protected async init() {\n // You should wait for init to complete (wait for the callback or promise resolution)\n // before using the t function!\n return await this.i18nInstance.use(ChainedBackend).init(this.i18nConfig);\n }\n\n /**\n * To change language\n */\n async changeLanguage(lng: string) {\n this.config = {\n ...this.config,\n language: lng,\n };\n return this.i18nInstance.changeLanguage(lng);\n }\n\n /**\n * Get current language\n */\n getLanguage() {\n return this.config.language;\n }\n\n /**\n * To change display order\n */\n changeDisplayOrder(order: DisplayOrder[]) {\n this.config = {\n ...this.config,\n displayOrder: order,\n };\n }\n\n /**\n * Get display order\n */\n getDisplayOrder() {\n return this.config.displayOrder;\n }\n\n /**\n * Get display separator\n */\n getDisplaySeparator() {\n return this.config.displaySeparator;\n }\n\n /**\n * Set display separator\n */\n changeDisplaySeparator(sep: string) {\n this.config = {\n ...this.config,\n displaySeparator: sep,\n };\n }\n\n /**\n * Get date time format options\n */\n getDateTimeFormatOptions() {\n return this.config.dateTimeFormatOptions;\n }\n\n /**\n * Set date time format options\n */\n changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions) {\n this.config = {\n ...this.config,\n dateTimeFormatOptions: opts,\n };\n }\n}\n","import type { Config } from \"../types\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"../utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"../utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"../utils/fromExtensionsToString\";\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\n/**\n * Function to turn extensions into a string for humans.\n */\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n\n // KIS implementation : print it as provided, without doing anything\n // Extensions have so many cases btw, that having a basic function does the trick\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n // Find the first entry that match criteria\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n let comparatorCode = quantity.comparator;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n if (!isNotUndefined(comparatorCode)) {\n return quantityString;\n }\n\n let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);\n\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n // 1. If we have a empty object, return undefined\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n let unit = hasQuantityUnit\n ? transformQuantityUnitToString(i18next, quantityUnit!, config)\n : \"\";\n let technicalKey: \"withUnit\" | \"withoutUnit\" = hasQuantityUnit\n ? \"withUnit\"\n : \"withoutUnit\";\n\n // 2. Both low & high are present\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`amount.range.${technicalKey}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n // 3. Only high is present\n if (isNotUndefined(highValue)) {\n return i18next.t(`amount.range.${technicalKey}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n // 4. Only low is present\n return i18next.t(`amount.range.${technicalKey}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n // 1. Frequency and frequencyMax are present\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n // 2. Only frequencyMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n // 3. Only frequency is present\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n // 1. period and periodMax are present\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 2. Only periodMax is present\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n // 3. Only period present\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type {\n DisplayOrderParams,\n I18N,\n WhenTimeKeys as TimeKeys,\n} from \"../types\";\n\nfunction extractTime(minutes: number) {\n let d = Math.floor(minutes / 1440);\n let h = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { d, h, min: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n let order = [\"d\", \"h\", \"min\"] as (keyof typeof time)[];\n\n return order\n .map((unit) =>\n time[unit] > 0\n ? i18next.t(`unitsOfTime:withCount.${unit}`, { count: time[unit] })\n : undefined,\n )\n .filter(isNotUndefined)\n .join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n// Function to transform dayOfWeek into a string\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n // If empty, skip it\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n // If empty, skip it\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n // Turn it into a string\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n Dosage,\n} from \"../types\";\n\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nfunction extractCodeableList(dos: Dosage): CodeableConcept[] {\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n return (\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : [])\n );\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeeded = (dos as DosageR5).asNeeded;\n let codeableList = extractCodeableList(dos);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(i18next, codeableList, config),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n // 1. Both count & countMax are present\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n // 2. Only countMax is present\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n // 3. Only count is present\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\ntype RenderStrategy = \"yearOnly\" | \"yearAndMonthOnly\" | \"dateOnly\" | \"dateTime\";\ntype RenderFunction = (params: RenderParams) => string;\ntype RenderParams = {\n config: Config;\n date: Date;\n};\n\nconst strategies = {\n yearOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, { year: \"numeric\" }).format(date),\n // e.g. 2024-03 => May 2024\n yearAndMonthOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n }).format(date),\n dateOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n dateTime: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n ...generateTimeStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n} satisfies Record<RenderStrategy, RenderFunction>;\n\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction fromDateToMappedDate(datetime: string): MappedDate {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n}\n\n/**\n * Generic function to map datetimes to user friendly date\n * e.g. from 2018, 1973-06, 1905-08-23, 2015-02-07T13:28:17-05:00 or 2017-01-01T00:00:00.000Z\n */\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n const entries = datetimes.map(fromDateToMappedDate);\n\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n const chosenStrategy: RenderStrategy = !hasMonths\n ? \"yearOnly\"\n : !hasDays\n ? \"yearAndMonthOnly\"\n : !hasTimePart\n ? \"dateOnly\"\n : \"dateTime\";\n\n return strategies[chosenStrategy]({ config, date });\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n // Generate the string version of them\n const boundsPeriod = dos.timing.repeat.boundsPeriod;\n\n let start = formatDatetime({ config, datetime: boundsPeriod.start });\n let end = formatDatetime({ config, datetime: boundsPeriod.end });\n\n // 1. Both start and end are present\n if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n // 2. Only start is present\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n // 3. Only end is present\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n // So better to have a generic approach\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\n // Only consider not empty array\n if (values.length === 0) {\n return undefined;\n }\n\n // Periods are expressed as ratio (like rateRatio)\n const valuesAsString = values\n .map((period) => {\n return fromRatioToString({ config, i18next, ratio: period });\n })\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["src/index.ts","src/api.ts","src/configurator.ts","src/utils/fromFHIRQuantityUnitToString.ts","src/internal/undefinedChecks.ts","src/utils/fromCodeableConceptToString.ts","src/internal/isEmptyArray.ts","src/utils/fromExtensionsToString.ts","src/dosageUtils.ts","src/utils/fromDisplayOrderToResult.ts","src/translators/index.ts","src/translators/doseQuantity.ts","src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/utils/fromQuantityToString.ts","src/translators/doseRange.ts","src/utils/fromRangeToString.ts","src/internal/hasUnit.ts","src/translators/rateQuantity.ts","src/translators/rateRange.ts","src/translators/rateRatio.ts","src/utils/fromRatioToString.ts","src/translators/durationDurationMax.ts","src/internal/extractMatchingTimingRepeat.ts","src/translators/frequencyFrequencyMax.ts","src/translators/periodPeriodMax.ts","src/translators/offsetWhen.ts","src/utils/fromListToString.ts","src/translators/dayOfWeek.ts","src/translators/timeOfDay.ts","src/translators/asNeeded.ts","src/translators/boundsDuration.ts","src/translators/boundsRange.ts","src/translators/countCountMax.ts","src/translators/event.ts","src/utils/formatDatetimes.ts","src/translators/additionalInstruction.ts","src/translators/maxDosePerLifetime.ts","src/translators/maxDosePerAdministration.ts","src/translators/boundsPeriod.ts","src/translators/maxDosePerPeriod.ts"],"sourcesContent":["// Export utility class\nexport { FhirDosageUtils } from \"./api\";\n\n// Export types as it can be used in client codes\nexport type { Config, DisplayOrderEnum, I18InitOptions } from \"./types\";\n","import i18next from \"i18next\";\nimport ChainedBackend from \"i18next-chained-backend\";\n\nimport { defaultAttributes } from \"./configurator\";\nimport { Utils } from \"./dosageUtils\";\nimport { fromDisplayOrderToResult } from \"./utils/fromDisplayOrderToResult\";\nimport { fromListToString } from \"./utils/fromListToString\";\nimport { isNotUndefined } from \"./internal/undefinedChecks\";\n\nimport type { I18N, Dosage, DisplayOrder, Config } from \"./types\";\ntype PropertyKey = keyof Config;\ntype SettableProperties = Exclude<PropertyKey, \"language\">;\n\nexport class FhirDosageUtils extends Utils {\n protected config: Config;\n protected i18nInstance: I18N;\n\n protected constructor(config: Partial<Config>) {\n super();\n this.config = {\n ...defaultAttributes,\n ...config,\n };\n this.i18nInstance = i18next.createInstance();\n }\n\n protected async init() {\n return await this.i18nInstance.use(ChainedBackend).init({\n fallbackLng: \"en\",\n lng: this.config.language,\n ns: [\n \"common\",\n \"daysOfWeek\",\n \"eventTiming\",\n \"unitsOfTime\",\n \"quantityComparator\",\n ],\n defaultNS: \"common\",\n ...this.config.i18nConfig,\n });\n }\n\n static async build(config: Partial<Config> = {}) {\n const instance = new FhirDosageUtils(config);\n await instance.init();\n return instance;\n }\n\n getProperty<T extends PropertyKey>(key: T): Config[T] {\n return this.config[key];\n }\n\n setProperty<T extends SettableProperties>(\n key: T,\n value: Config[T],\n ): undefined {\n this.config[key] = value;\n }\n\n async changeLanguage(lng: string) {\n this.config[\"language\"] = lng;\n return this.i18nInstance.changeLanguage(lng);\n }\n\n getFields(dos: Dosage, ...order: DisplayOrder[]): string {\n let parts = order\n .map((entry) =>\n fromDisplayOrderToResult({\n config: this.config,\n dos: dos,\n entry: entry,\n i18next: this.i18nInstance,\n }),\n )\n .filter(isNotUndefined);\n\n return parts.join(this.config.displaySeparator);\n }\n\n fromDosageToText(dos: Dosage): string {\n let order = this.config.displayOrder;\n return this.getFields(dos, ...order);\n }\n\n fromMultipleDosageToText(dosages: Dosage[]): string {\n if (this.containsOnlySequentialInstructions(dosages)) {\n return this.convertSequentialDosagesToText(dosages);\n }\n return this.convertGroupedDosagesToText(dosages);\n }\n\n private convertSequentialDosagesToText(dosages: Dosage[]): string {\n const dosagesAsText = dosages.map((d) => this.fromDosageToText(d));\n return fromListToString(this.i18nInstance, dosagesAsText, \"then\");\n }\n\n private convertConcurrentDosagesToText(dosages: Dosage[]): string {\n const concurrentInstructionsAsString = dosages.map((d) =>\n this.fromDosageToText(d),\n );\n return fromListToString(\n this.i18nInstance,\n concurrentInstructionsAsString,\n \"and\",\n );\n }\n\n private convertGroupedDosagesToText(dosages: Dosage[]): string {\n const sortedDosages = this.groupBySequence(dosages);\n const sequentialInstructions = sortedDosages.map((d) =>\n this.convertConcurrentDosagesToText(d),\n );\n return fromListToString(this.i18nInstance, sequentialInstructions, \"then\");\n }\n}\n","import resourcesToBackend from \"i18next-resources-to-backend\";\n\nimport { defaultFromFHIRQuantityUnitToString } from \"./utils/fromFHIRQuantityUnitToString\";\nimport { defaultFromCodeableConceptToString } from \"./utils/fromCodeableConceptToString\";\nimport { defaultFromExtensionsToString } from \"./utils/fromExtensionsToString\";\n\nimport type { FromFHIRQuantityUnitToStringFct } from \"./utils/fromFHIRQuantityUnitToString\";\nimport type { FromCodeableConceptToStringFct } from \"./utils/fromCodeableConceptToString\";\nimport type { FromExtensionsToStringFct } from \"./utils/fromExtensionsToString\";\n\nimport type { DisplayOrder, I18InitOptions, NamespacesLocale } from \"./types\";\n\nexport interface Config {\n /**\n * BCP 47 language code to setup the library with\n * @defaultValue \"en\" (English)\n * @see [FAQ](https://jy95.github.io/fhir-dosage-utils/docs/faq) for the built-in languages\n * @see [I18next documentation](https://www.i18next.com/how-to/faq#how-should-the-language-codes-be-formatted) for the reasons behind BCP 47\n */\n language: string;\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 * @see [defaultFromFHIRQuantityUnitToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromFHIRQuantityUnitToString.ts) for default implementation\n * @see [FHIR definition of Quantity](https://build.fhir.org/datatypes.html#Quantity) for more info about the type itself\n */\n fromFHIRQuantityUnitToString: FromFHIRQuantityUnitToStringFct;\n /**\n * Function to turn a codeable concept (e.g SNOMED CT \"311504000\") into a string for humans (e.g \"With or after food\")\n * The choice to handle extension, local valueset, ... is thus under the hands of people ;)\n * @see [defaultFromCodeableConceptToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromCodeableConceptToString.ts) for default implementation\n * @see [FHIR definition of CodeableConcept](https://build.fhir.org/datatypes.html#CodeableConcept) for more info about the type itself\n */\n fromCodeableConceptToString: FromCodeableConceptToStringFct;\n /**\n * Function to turn extension(s) into a string for humans.\n * The choice to handle national extensions, ... is thus under the hands of people ;)\n * @see [defaultFromExtensionsToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromExtensionsToString.ts) for default implementation\n * @see [FHIR definition of Extension](https://build.fhir.org/extensibility.html#Extension) for more info about the type itself\n */\n fromExtensionsToString: FromExtensionsToStringFct;\n /**\n * Control the display order used by the algorithm\n * Useful when you want to turn on / off some specific rules for some reason\n * @defaultValue [\"method\", \"doseQuantity\", \"doseRange\", \"rateRatio\", \"rateQuantity\", \"rateRange\", \"durationDurationMax\", \"frequencyFrequencyMaxPeriodPeriodMax\", \"offsetWhen\", \"dayOfWeek\", \"timeOfDay\", \"route\", \"site\", \"asNeeded\", \"boundsDuration\", \"boundsPeriod\", \"boundsRange\", \"countCountMax\", \"event\", \"code\", \"maxDosePerPeriod\", \"maxDosePerAdministration\", \"maxDosePerLifetime\", \"additionalInstruction\", \"patientInstruction\"]\n * @see [DisplayOrderEnum](../enum/DisplayOrderEnum) for more info\n */\n displayOrder: DisplayOrder[];\n /**\n * Override separator between each part of \"Dosage\"\n * @defaultValue \" - \"\n */\n displaySeparator: string;\n /**\n * To control the formatting of dateTime objects.\n * If not provided, will use the defaults according locale e.g. \"20/01/2024\"\n * @defaultValue {}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options\n */\n dateTimeFormatOptions: Intl.DateTimeFormatOptions;\n /**\n * I18next config\n * @see https://www.i18next.com/overview/configuration-options\n */\n i18nConfig: I18InitOptions;\n}\n\nexport const defaultAttributes: Config = {\n language: \"en\",\n fromFHIRQuantityUnitToString: defaultFromFHIRQuantityUnitToString,\n fromCodeableConceptToString: defaultFromCodeableConceptToString,\n fromExtensionsToString: defaultFromExtensionsToString,\n displayOrder: [\n \"method\",\n \"doseQuantity\",\n \"doseRange\",\n \"rateRatio\",\n \"rateQuantity\",\n \"rateRange\",\n \"durationDurationMax\",\n \"frequencyFrequencyMaxPeriodPeriodMax\",\n \"offsetWhen\",\n \"dayOfWeek\",\n \"timeOfDay\",\n \"route\",\n \"site\",\n \"asNeeded\",\n \"boundsDuration\",\n \"boundsPeriod\",\n \"boundsRange\",\n \"countCountMax\",\n \"event\",\n \"code\",\n \"maxDosePerPeriod\",\n \"maxDosePerAdministration\",\n \"maxDosePerLifetime\",\n \"additionalInstruction\",\n \"patientInstruction\",\n ] as DisplayOrder[],\n displaySeparator: \" - \",\n dateTimeFormatOptions: {},\n i18nConfig: {\n backend: {\n backends: [\n resourcesToBackend(\n async (lng: string, ns: NamespacesLocale) =>\n import(`./locales/${lng}/${ns}.json`),\n ),\n ],\n },\n },\n};\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\nimport type { Quantity } from \"../types\";\n\nexport type FromFHIRQuantityUnitToStringArgs = {\n language: string;\n quantity: Quantity;\n};\nexport type FromFHIRQuantityUnitToStringFct = (\n input: FromFHIRQuantityUnitToStringArgs,\n) => string;\n\nexport function defaultFromFHIRQuantityUnitToString({\n quantity,\n}: FromFHIRQuantityUnitToStringArgs) {\n if (isNotUndefined(quantity.code)) {\n return quantity.code;\n }\n\n if (isNotUndefined(quantity.unit)) {\n return quantity.unit;\n }\n\n return \"\";\n}\n","export function isNotUndefined<T>(val: T | undefined): val is T {\n return val !== undefined;\n}\n\nexport function noUndefinedInArray<T>(...args: (T | undefined)[]) {\n return args.every(isNotUndefined);\n}\n\nexport function allUndefinedInArray<T>(...args: (T | any | undefined)[]) {\n return !args.some(isNotUndefined);\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { CodeableConcept } from \"../types\";\n\nexport type FromCodeableConceptToStringArgs = {\n language: string;\n code?: CodeableConcept;\n};\nexport type FromCodeableConceptToStringFct = (\n input: FromCodeableConceptToStringArgs,\n) => string | undefined;\n\nexport function defaultFromCodeableConceptToString({\n code,\n}: FromCodeableConceptToStringArgs) {\n if (!isNotUndefined(code)) {\n return undefined;\n }\n\n if (isNotUndefined(code.text)) {\n return code.text;\n }\n\n if (isArrayEmpty(code.coding)) {\n return undefined;\n }\n\n let firstCode = code.coding[0];\n return firstCode.display || firstCode.code;\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\nexport function isArrayEmpty(array?: any[]): array is undefined | [] {\n return !isNotUndefined(array) || array.length === 0;\n}\n","import { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { Extension } from \"../types\";\n\nexport type FromExtensionsToStringArgs = {\n language: string;\n extensions?: Extension[];\n};\nexport type FromExtensionsToStringFct = (\n input: FromExtensionsToStringArgs,\n) => string | undefined;\n\nexport function defaultFromExtensionsToString({\n extensions,\n}: FromExtensionsToStringArgs) {\n if (isArrayEmpty(extensions)) {\n return undefined;\n }\n return extensions.map((extension) => JSON.stringify(extension)).join(\" \");\n}\n","import { isNotUndefined } from \"./internal/undefinedChecks\";\nimport type { Dosage } from \"./types\";\n\nexport class Utils {\n containsOnlySequentialInstructions(dosages: Dosage[]): boolean {\n let sequencesNumbers = dosages\n .map((d) => d.sequence)\n .filter(isNotUndefined);\n\n let encounteredSequenceNumbers = new Set(sequencesNumbers);\n return [0, dosages.length].includes(encounteredSequenceNumbers.size);\n }\n\n groupBySequence(dosages: Dosage[]) {\n let sequences = new Set<number | undefined>();\n let sequencesMap = new Map<number | undefined, Dosage[]>();\n\n for (let dosage of dosages) {\n let sequenceNr = dosage.sequence;\n let localGroup = sequencesMap.get(sequenceNr) ?? [];\n localGroup.push(dosage);\n sequencesMap.set(sequenceNr, localGroup);\n sequences.add(sequenceNr);\n }\n\n return Array.from(\n sequences,\n (sequence) => sequencesMap.get(sequence) as Dosage[],\n );\n }\n}\n","import {\n transformDoseQuantityToText,\n transformDoseRangeToText,\n transformRateQuantityToText,\n transformRateRangeToText,\n transformRateRatioToText,\n transformDurationDurationMaxToText,\n transformFrequencyFrequencyMaxToText,\n transformPeriodPeriodMaxToText,\n transformOffsetWhenToText,\n transformDayOfWeekToText,\n transformTimeOfDayToText,\n transformAsNeededToText,\n transformBoundsDurationToText,\n transformBoundsRangeToText,\n transformCountCountMaxToText,\n transformEventToText,\n transformAdditionalInstructionToText,\n transformMaxDosePerLifetimeToText,\n transformMaxDosePerAdministrationToText,\n transformBoundsPeriodToText,\n transformMaxDosePerPeriodToText,\n} from \"../translators\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrder, DisplayOrderParams } from \"../types\";\ntype ResultFct = (args: DisplayOrderParams) => string | undefined;\n\nconst displayOrders = {\n additionalInstruction: (input) => transformAdditionalInstructionToText(input),\n asNeeded: (input) => transformAsNeededToText(input),\n boundsDuration: (input) => transformBoundsDurationToText(input),\n boundsRange: (input) => transformBoundsRangeToText(input),\n boundsPeriod: (input) => transformBoundsPeriodToText(input),\n code: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.timing?.code,\n }),\n countCountMax: (input) => transformCountCountMaxToText(input),\n dayOfWeek: (input) => transformDayOfWeekToText(input),\n doseQuantity: (input) => transformDoseQuantityToText(input),\n doseRange: (input) => transformDoseRangeToText(input),\n durationDurationMax: (input) => transformDurationDurationMaxToText(input),\n event: (input) => transformEventToText(input),\n extension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.extension,\n }),\n frequencyFrequencyMax: (input) => transformFrequencyFrequencyMaxToText(input),\n frequencyFrequencyMaxPeriodPeriodMax: (input) => {\n let subParts = [\n transformFrequencyFrequencyMaxToText(input),\n transformPeriodPeriodMaxToText(input),\n ].filter(isNotUndefined);\n return subParts.length > 0 ? subParts.join(\" \") : undefined;\n },\n maxDosePerAdministration: (input) =>\n transformMaxDosePerAdministrationToText(input),\n maxDosePerLifetime: (input) => transformMaxDosePerLifetimeToText(input),\n maxDosePerPeriod: (input) => transformMaxDosePerPeriodToText(input),\n method: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.method,\n }),\n offsetWhen: (input) => transformOffsetWhenToText(input),\n patientInstruction: ({ dos }) => dos.patientInstruction,\n periodPeriodMax: (input) => transformPeriodPeriodMaxToText(input),\n rateQuantity: (input) => transformRateQuantityToText(input),\n rateRange: (input) => transformRateRangeToText(input),\n rateRatio: (input) => transformRateRatioToText(input),\n route: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.route,\n }),\n site: ({ dos, config }) =>\n config.fromCodeableConceptToString({\n language: config.language,\n code: dos.site,\n }),\n text: ({ dos }) => dos.text,\n timeOfDay: (input) => transformTimeOfDayToText(input),\n timingExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.extension,\n }),\n timingRepeatExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.repeat?.extension,\n }),\n modifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.modifierExtension,\n }),\n timingModifierExtension: ({ dos, config }) =>\n config.fromExtensionsToString({\n language: config.language,\n extensions: dos.timing?.modifierExtension,\n }),\n} satisfies Record<DisplayOrder, ResultFct>;\n\ntype fromDisplayOrderToResultFct = DisplayOrderParams & {\n entry: DisplayOrder;\n};\n\nexport function fromDisplayOrderToResult({\n entry,\n ...args\n}: fromDisplayOrderToResultFct): string | undefined {\n return displayOrders[entry](args);\n}\n","export { transformDoseQuantityToText } from \"./doseQuantity\";\nexport { transformDoseRangeToText } from \"./doseRange\";\nexport { transformRateQuantityToText } from \"./rateQuantity\";\nexport { transformRateRangeToText } from \"./rateRange\";\nexport { transformRateRatioToText } from \"./rateRatio\";\nexport { transformDurationDurationMaxToText } from \"./durationDurationMax\";\nexport { transformFrequencyFrequencyMaxToText } from \"./frequencyFrequencyMax\";\nexport { transformPeriodPeriodMaxToText } from \"./periodPeriodMax\";\nexport { transformOffsetWhenToText } from \"./offsetWhen\";\nexport { transformDayOfWeekToText } from \"./dayOfWeek\";\nexport { transformTimeOfDayToText } from \"./timeOfDay\";\nexport { transformAsNeededToText } from \"./asNeeded\";\nexport { transformBoundsDurationToText } from \"./boundsDuration\";\nexport { transformBoundsRangeToText } from \"./boundsRange\";\nexport { transformCountCountMaxToText } from \"./countCountMax\";\nexport { transformEventToText } from \"./event\";\nexport { transformAdditionalInstructionToText } from \"./additionalInstruction\";\nexport { transformMaxDosePerLifetimeToText } from \"./maxDosePerLifetime\";\nexport { transformMaxDosePerAdministrationToText } from \"./maxDosePerAdministration\";\nexport { transformBoundsPeriodToText } from \"./boundsPeriod\";\nexport { transformMaxDosePerPeriodToText } from \"./maxDosePerPeriod\";\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseQuantityToText({\n config,\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"doseQuantity\");\n\n if (!isNotUndefined(doseQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseQuantity\", {\n quantityText: fromQuantityToString({\n quantity: doseQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, DoseAndRate } from \"../types\";\ntype KeyType = keyof DoseAndRate;\n\nexport function extractMatchingDoseAndRateFirstEntry<T extends KeyType>(\n dos: Dosage,\n key: T,\n): DoseAndRate[T] | undefined {\n if (!isNotUndefined(dos.doseAndRate)) {\n return undefined;\n }\n\n let doseAndRate = dos.doseAndRate.find((s) => isNotUndefined(s[key]));\n\n if (!isNotUndefined(doseAndRate)) {\n return undefined;\n }\n\n return doseAndRate[key];\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { QuantityParams } from \"../types\";\n\n// To cover all nasty cases of Quantity\n// https://build.fhir.org/datatypes.html#Quantity\nexport function fromQuantityToString({\n quantity,\n config,\n i18next,\n}: QuantityParams): string {\n const { fromFHIRQuantityUnitToString, language } = config;\n let unit = fromFHIRQuantityUnitToString({ language, quantity });\n let value = quantity.value || 1;\n let comparatorCode = quantity.comparator;\n\n let quantityString =\n unit.length === 0\n ? i18next.t(\"amount.quantity.withoutUnit\", {\n quantity: value,\n })\n : i18next.t(\"amount.quantity.withUnit\", {\n quantity: value,\n unit: unit,\n });\n\n if (!isNotUndefined(comparatorCode)) {\n return quantityString;\n }\n\n let comparatorString = i18next.t(`quantityComparator:${comparatorCode}`);\n return `${comparatorString} ${quantityString}`;\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDoseRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let doseRange = extractMatchingDoseAndRateFirstEntry(dos, \"doseRange\");\n\n if (!isNotUndefined(doseRange)) {\n return undefined;\n }\n\n const text = fromRangeToString({\n range: doseRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(text)) {\n return undefined;\n }\n\n return i18next.t(\"fields.doseRange\", {\n rangeText: text,\n });\n}\n","import { hasUnit } from \"../internal/hasUnit\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { RangeParams, Config, Quantity, I18N } from \"../types\";\n\nfunction transformQuantityUnitToString(\n i18next: I18N,\n quantity: Quantity,\n config: Config,\n): string {\n let quantityValue = quantity.value!;\n\n if (quantity.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = quantity.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withoutCount.${code}`, {\n count: quantityValue,\n });\n }\n\n return config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: quantity,\n });\n}\n\ntype UnitType = \"withUnit\" | \"withoutUnit\";\ntype ResultUnitType = { prefix: `amount.range.${UnitType}`; unit: string };\nfunction getParams({ range, config, i18next }: RangeParams): ResultUnitType {\n const { low, high } = range;\n let quantityUnit = high || low;\n let hasQuantityUnit = hasUnit(quantityUnit);\n\n if (hasQuantityUnit) {\n return {\n prefix: `amount.range.withUnit`,\n unit: transformQuantityUnitToString(i18next, quantityUnit!, config),\n };\n }\n\n return {\n prefix: `amount.range.withoutUnit`,\n unit: \"\",\n };\n}\n\n// To cover all nasty cases of Range\n// https://build.fhir.org/datatypes.html#Range\nexport function fromRangeToString({\n range,\n config,\n i18next,\n}: RangeParams): string | undefined {\n const { low, high } = range;\n const lowValue = low?.value;\n const highValue = high?.value;\n\n if (allUndefinedInArray(lowValue, highValue)) {\n return undefined;\n }\n\n const { prefix, unit } = getParams({ range, config, i18next });\n\n if (noUndefinedInArray(lowValue, highValue)) {\n return i18next.t(`${prefix}.lowAndHigh`, {\n low: lowValue,\n high: highValue,\n unit: unit,\n });\n }\n\n if (isNotUndefined(highValue)) {\n return i18next.t(`${prefix}.onlyHigh`, {\n high: highValue,\n unit: unit,\n });\n }\n\n return i18next.t(`${prefix}.onlyLow`, {\n low: lowValue,\n unit: unit,\n });\n}\n","import { isNotUndefined } from \"./undefinedChecks\";\n\nimport type { Quantity } from \"../types\";\n\nexport function hasUnit(quantity?: Quantity): boolean {\n return [quantity?.unit, quantity?.code].some(isNotUndefined);\n}\n","import { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateQuantityToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateQuantity = extractMatchingDoseAndRateFirstEntry(dos, \"rateQuantity\");\n\n if (!isNotUndefined(rateQuantity)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateQuantity\", {\n quantityText: fromQuantityToString({\n quantity: rateQuantity,\n config,\n i18next,\n }),\n });\n}\n","import { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRange = extractMatchingDoseAndRateFirstEntry(dos, \"rateRange\");\n\n if (!isNotUndefined(rateRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: rateRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRange\", {\n rangeText: rangeText,\n });\n}\n","import { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { extractMatchingDoseAndRateFirstEntry } from \"../internal/extractMatchingDoseAndRateFirstEntry\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformRateRatioToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let rateRatio = extractMatchingDoseAndRateFirstEntry(dos, \"rateRatio\");\n\n if (!isNotUndefined(rateRatio)) {\n return undefined;\n }\n\n const ratioText = fromRatioToString({\n config,\n i18next,\n ratio: rateRatio,\n });\n\n if (!isNotUndefined(ratioText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.rateRatio\", {\n ratioText: ratioText,\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { hasUnit } from \"../internal/hasUnit\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { RatioParams, QuantityParams } from \"../types\";\n\n// To cover all nasty cases of denominator\nfunction fromDenominatorToString({\n config,\n i18next,\n quantity,\n}: QuantityParams): string {\n let hasUnitDenominator = hasUnit(quantity);\n let value = quantity.value!;\n\n if (!hasUnitDenominator) return `:${value}`;\n\n let linkword = i18next.t(\"amount.ratio.denominatorLinkword\", {\n count: value,\n });\n\n let quantityText =\n value !== 1\n ? fromQuantityToString({ quantity, config, i18next })\n : config.fromFHIRQuantityUnitToString({\n quantity,\n language: config.language,\n });\n\n // The space before is intentional so that numerator and denominator are well printed regardless of situation\n return ` ${linkword} ${quantityText}`;\n}\n\n// To cover all nasty cases of Ratio\n// https://build.fhir.org/datatypes.html#Ratio\nexport function fromRatioToString({\n ratio,\n config,\n i18next,\n}: RatioParams): string | undefined {\n const { denominator, numerator } = ratio;\n\n let quantityNumerator = numerator?.value;\n let quantityDenominator = denominator?.value;\n\n const parts: string[] = [];\n\n if (isNotUndefined(quantityNumerator)) {\n const numeratorString = fromQuantityToString({\n quantity: numerator!,\n config,\n i18next,\n });\n parts.push(numeratorString);\n }\n\n if (isNotUndefined(quantityDenominator)) {\n const denominatorString = fromDenominatorToString({\n config,\n i18next,\n quantity: denominator!,\n });\n parts.push(denominatorString);\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDurationDurationMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let duration = extractMatchingTimeRepeatField(dos, \"duration\");\n let max = extractMatchingTimeRepeatField(dos, \"durationMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"durationUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n return [\n isNotUndefined(duration) &&\n i18next.t(\"fields.duration\", {\n durationText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: duration,\n }),\n }),\n isNotUndefined(max) &&\n i18next.t(\"fields.durationMax\", {\n durationMaxText: i18next.t(`unitsOfTime:withCount.${unit}`, {\n count: max,\n }),\n }),\n ]\n .filter((s) => s !== false)\n .join(\" \");\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage, TimingRepeat } from \"../types\";\ntype KeyType = keyof TimingRepeat;\n\nexport function extractMatchingTimeRepeatField<T extends KeyType>(\n dos: Dosage,\n key: T,\n): TimingRepeat[T] | undefined {\n if (!isNotUndefined(dos.timing?.repeat)) {\n return undefined;\n }\n\n return dos.timing.repeat[key];\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformFrequencyFrequencyMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let frequency = extractMatchingTimeRepeatField(dos, \"frequency\");\n let max = extractMatchingTimeRepeatField(dos, \"frequencyMax\");\n\n if (allUndefinedInArray(frequency, max)) {\n return undefined;\n }\n\n if (noUndefinedInArray(frequency, max)) {\n return i18next.t(\"fields.frequency.withfrequencyMax\", {\n count: max,\n frequency: frequency,\n });\n }\n\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.frequencyMax.frequencyMax\", { count: max });\n }\n\n return i18next.t(\"fields.frequency.onlyFrequency\", { count: frequency });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformPeriodPeriodMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let period = extractMatchingTimeRepeatField(dos, \"period\");\n let max = extractMatchingTimeRepeatField(dos, \"periodMax\");\n let unit = extractMatchingTimeRepeatField(dos, \"periodUnit\");\n\n if (!isNotUndefined(unit)) {\n return undefined;\n }\n\n if (noUndefinedInArray(period, max)) {\n return i18next.t(\"fields.periodMax.withPeriod\", {\n period: period,\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n if (isNotUndefined(max)) {\n return i18next.t(\"fields.periodMax.onlyPeriodMax\", {\n count: max,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: max }),\n });\n }\n\n return i18next.t(\"fields.period.period\", {\n count: period,\n unit: i18next.t(`unitsOfTime:withoutCount.${unit}`, { count: period }),\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport {\n isNotUndefined,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { 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\nfunction extractTime(minutes: number) {\n let d = Math.floor(minutes / 1440);\n let h = Math.floor((minutes % 1440) / 60);\n let remainingMinutes = minutes % 60;\n\n return { d, h, min: remainingMinutes };\n}\n\nfunction transformOffset(i18next: I18N, offset?: number): string | undefined {\n if (!isNotUndefined(offset) || offset <= 0) {\n return undefined;\n }\n\n let time = extractTime(offset);\n let order = [\"d\", \"h\", \"min\"] as (keyof typeof time)[];\n\n return order\n .filter((unit) => time[unit] > 0)\n .map((unit) =>\n i18next.t(`unitsOfTime:withCount.${unit}`, { count: time[unit] }),\n )\n .join(\" \");\n}\n\nfunction transformWhen(i18next: I18N, when?: string[]): string | undefined {\n if (isArrayEmpty(when)) {\n return undefined;\n }\n\n const whens = (when as TimeKeys[]).map((whenCode) =>\n i18next.t(`eventTiming:${whenCode}`),\n );\n return fromListToString(i18next, whens);\n}\n\nexport function transformOffsetWhenToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let offset = extractMatchingTimeRepeatField(dos, \"offset\");\n let when = extractMatchingTimeRepeatField(dos, \"when\");\n\n if (allUndefinedInArray(offset, when)) {\n return undefined;\n }\n\n return [transformOffset(i18next, offset), transformWhen(i18next, when)]\n .filter(isNotUndefined)\n .join(\" \");\n}\n","import type { I18N } from \"../types\";\n\ntype LinkwordChoice = \"and\" | \"then\";\ntype TechnicalKey = \"linkwords.and\" | \"linkwords.then\";\n\nconst linkworsdMap = {\n and: \"linkwords.and\",\n then: \"linkwords.then\",\n} satisfies Record<LinkwordChoice, TechnicalKey>;\n\nexport function fromListToString(\n i18next: I18N,\n arr: string[],\n linkWord: LinkwordChoice = \"and\",\n): string {\n const firstString = arr.slice(0, -1).join(\", \");\n const lastString = arr.slice(-1).join(\"\");\n\n const linkWordTechnicalKey = linkworsdMap[linkWord];\n const linkWordAsString =\n arr.length > 1 ? ` ${i18next.t(linkWordTechnicalKey)} ` : \"\";\n const finalString = firstString + linkWordAsString + lastString;\n return finalString;\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformDayOfWeekToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let dayOfWeek = extractMatchingTimeRepeatField(dos, \"dayOfWeek\");\n\n if (isArrayEmpty(dayOfWeek)) {\n return undefined;\n }\n\n const dayOfWeeks = dayOfWeek.map((dayCode) =>\n i18next.t(`daysOfWeek:${dayCode}`),\n );\n const dayOfWeeksAsString = fromListToString(i18next, dayOfWeeks);\n\n return i18next.t(\"fields.dayOfWeek.dayOfWeek\", {\n count: dayOfWeek.length,\n dayOfWeek: dayOfWeeksAsString,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\n/**\n * time during the day, in the format hh:mm:ss (a subset of [ISO8601] icon).\n * There is no date specified. Seconds must be provided due to schema type constraints but may be zero-filled\n * and may be ignored at receiver discretion\n */\nfunction formatString(time: string): string {\n var parts = time.split(\":\");\n\n if (parts.length > 2 && parts[2] === \"00\") {\n parts.pop();\n }\n\n return parts.join(\":\");\n}\n\nexport function transformTimeOfDayToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let timeOfDay = extractMatchingTimeRepeatField(dos, \"timeOfDay\");\n\n if (isArrayEmpty(timeOfDay)) {\n return undefined;\n }\n\n const timeOfDays = timeOfDay.map(formatString);\n const timeOfDaysAsString = fromListToString(i18next, timeOfDays);\n\n return i18next.t(\"fields.timeOfDay\", {\n timeOfDay: timeOfDaysAsString,\n count: timeOfDays.length,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Dosage as DosageR4 } from \"fhir/r4\";\nimport type { Dosage as DosageR5 } from \"fhir/r5\";\nimport type {\n Config,\n CodeableConcept,\n DisplayOrderParams,\n I18N,\n Dosage,\n} from \"../types\";\n\nfunction fromCodeableConceptArrayToString(\n i18next: I18N,\n codes: CodeableConcept[],\n config: Config,\n): string | undefined {\n const codesAsString = codes\n .map((code) =>\n config.fromCodeableConceptToString({\n code: code,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, codesAsString as string[]);\n}\n\nfunction extractCodeableList(dos: Dosage): CodeableConcept[] {\n let asNeededCodeableConcept = (dos as DosageR4).asNeededCodeableConcept;\n let asNeededFor = (dos as DosageR5).asNeededFor;\n return (\n asNeededFor ||\n (asNeededCodeableConcept !== undefined ? [asNeededCodeableConcept] : [])\n );\n}\n\nexport function transformAsNeededToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let asNeededBoolean = (dos as DosageR4).asNeededBoolean;\n let asNeeded = (dos as DosageR5).asNeeded;\n let codeableList = extractCodeableList(dos);\n\n if (codeableList.length > 0) {\n return i18next.t(\"fields.asNeededFor\", {\n reasons: fromCodeableConceptArrayToString(i18next, codeableList, config),\n });\n }\n\n let booleanValue = [asNeededBoolean, asNeeded].includes(true);\n return booleanValue ? i18next.t(\"fields.asNeeded\") : undefined;\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config, Duration, DisplayOrderParams, I18N } from \"../types\";\n\nfunction transformDurationToString(\n i18next: I18N,\n duration: Duration,\n config: Config,\n): string {\n let quantity = duration.value!;\n\n // If common units from HL7, do the job\n if (duration.system === \"http://hl7.org/fhir/ValueSet/duration-units\") {\n let code = duration.code! as \"s\" | \"min\" | \"h\" | \"d\" | \"wk\" | \"mo\" | \"a\";\n return i18next.t(`unitsOfTime:withCount.${code}`, { count: quantity });\n }\n\n // otherwise, it is UCUM, ... so let the user do the job\n let unit = config.fromFHIRQuantityUnitToString({\n language: config.language,\n quantity: duration,\n });\n return `${quantity} ${unit}`;\n}\n\nexport function transformBoundsDurationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsDuration = extractMatchingTimeRepeatField(dos, \"boundsDuration\");\n\n if (!isNotUndefined(boundsDuration)) {\n return undefined;\n }\n\n let durationText = transformDurationToString(i18next, boundsDuration, config);\n\n return i18next.t(\"fields.boundsDuration\", { durationText: durationText });\n}\n","import type { DisplayOrderParams } from \"../types\";\n\nimport { fromRangeToString } from \"../utils/fromRangeToString\";\nimport { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nexport function transformBoundsRangeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let boundsRange = extractMatchingTimeRepeatField(dos, \"boundsRange\");\n\n if (!isNotUndefined(boundsRange)) {\n return undefined;\n }\n\n const rangeText = fromRangeToString({\n range: boundsRange,\n config,\n i18next,\n });\n\n if (!isNotUndefined(rangeText)) {\n return undefined;\n }\n\n return i18next.t(\"fields.boundsRange\", {\n rangeText: rangeText,\n });\n}\n","import { extractMatchingTimeRepeatField } from \"../internal/extractMatchingTimingRepeat\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n allUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformCountCountMaxToText({\n dos,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let count = extractMatchingTimeRepeatField(dos, \"count\");\n let countMax = extractMatchingTimeRepeatField(dos, \"countMax\");\n\n if (allUndefinedInArray(count, countMax)) {\n return undefined;\n }\n\n if (noUndefinedInArray(count, countMax)) {\n return i18next.t(\"fields.countMax.countMax\", {\n count: countMax,\n low: count,\n });\n }\n\n if (isNotUndefined(countMax)) {\n return i18next.t(\"fields.count.count\", { count: countMax });\n }\n\n return i18next.t(\"fields.count.count\", { count: count });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { formatDatetimes } from \"../utils/formatDatetimes\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformEventToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n let events = dos.timing?.event;\n if (isArrayEmpty(events)) {\n return undefined;\n }\n\n let eventList = formatDatetimes({ config, datetimes: events });\n let eventsAsString = fromListToString(i18next, eventList);\n\n return i18next.t(\"fields.event.event\", {\n count: events.length,\n event: eventsAsString,\n });\n}\n","import { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { Config } from \"../types\";\n\ntype Args = { config: Config; datetimes: string[] };\ntype Args2 = { config: Config; datetime: string | undefined };\ntype MappedDate = {\n date: Date;\n hasTimePart: boolean;\n hasMonths: boolean;\n hasDays: boolean;\n};\ntype RenderStrategy = \"yearOnly\" | \"yearAndMonthOnly\" | \"dateOnly\" | \"dateTime\";\ntype RenderFunction = (params: RenderParams) => string;\ntype RenderParams = {\n config: Config;\n date: Date;\n};\n\nconst strategies = {\n yearOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, { year: \"numeric\" }).format(date),\n // e.g. 2024-03 => May 2024\n yearAndMonthOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n year: \"numeric\",\n month: \"long\",\n }).format(date),\n dateOnly: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n dateTime: ({ config, date }) =>\n new Intl.DateTimeFormat(config.language, {\n ...generateDateStyleFormatOptions(config.dateTimeFormatOptions),\n ...generateTimeStyleFormatOptions(config.dateTimeFormatOptions),\n }).format(date),\n} satisfies Record<RenderStrategy, RenderFunction>;\n\nfunction generateDateStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.dateStyle)) {\n return {\n dateStyle: options.dateStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction generateTimeStyleFormatOptions(\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormatOptions {\n if (isNotUndefined(options.timeStyle)) {\n return {\n timeStyle: options.timeStyle,\n };\n }\n\n const defaults: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n };\n\n return {\n ...options,\n ...defaults,\n };\n}\n\nfunction fromDateToMappedDate(datetime: string): MappedDate {\n let date = new Date(datetime);\n\n let hasTimePart = datetime.includes(\"T\");\n let hyphensCount = datetime.split(\"-\").length - 1;\n let hasMonths = hyphensCount >= 1;\n let hasDays = hyphensCount >= 2;\n\n return {\n date,\n hasTimePart,\n hasMonths,\n hasDays,\n };\n}\n\n// 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\nexport function formatDatetimes({ config, datetimes }: Args): string[] {\n const entries = datetimes.map(fromDateToMappedDate);\n\n const result = entries.map(({ date, hasTimePart, hasMonths, hasDays }) => {\n const chosenStrategy: RenderStrategy = !hasMonths\n ? \"yearOnly\"\n : !hasDays\n ? \"yearAndMonthOnly\"\n : !hasTimePart\n ? \"dateOnly\"\n : \"dateTime\";\n\n return strategies[chosenStrategy]({ config, date });\n });\n\n return result;\n}\n\nexport function formatDatetime({\n config,\n datetime,\n}: Args2): string | undefined {\n if (!isNotUndefined(datetime)) {\n return undefined;\n }\n\n const result = formatDatetimes({ config, datetimes: [datetime] });\n return result[0];\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { isArrayEmpty } from \"../internal/isEmptyArray\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformAdditionalInstructionToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (isArrayEmpty(dos.additionalInstruction)) {\n return undefined;\n }\n\n let additionalInstructions = dos.additionalInstruction\n .map((instruction) =>\n config.fromCodeableConceptToString({\n code: instruction,\n language: config.language,\n }),\n )\n .filter(isNotUndefined);\n\n return fromListToString(i18next, additionalInstructions as string[]);\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerLifetimeToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerLifetime)) {\n return undefined;\n }\n\n const maxDosePerLifetime = dos.maxDosePerLifetime;\n\n return i18next.t(\"fields.maxDosePerLifetime\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerLifetime,\n config,\n i18next,\n }),\n });\n}\n","import { fromQuantityToString } from \"../utils/fromQuantityToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerAdministrationToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerAdministration)) {\n return undefined;\n }\n\n const maxDosePerAdministration = dos.maxDosePerAdministration;\n\n return i18next.t(\"fields.maxDosePerAdministration\", {\n quantityText: fromQuantityToString({\n quantity: maxDosePerAdministration,\n config,\n i18next,\n }),\n });\n}\n","import { formatDatetime } from \"../utils/formatDatetimes\";\nimport {\n isNotUndefined,\n noUndefinedInArray,\n} from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformBoundsPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.timing?.repeat?.boundsPeriod)) {\n return undefined;\n }\n\n 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 if (noUndefinedInArray(start, end)) {\n return i18next.t(\"fields.boundsPeriod.startAndEnd\", {\n start: start,\n end: end,\n });\n }\n\n if (isNotUndefined(start)) {\n return i18next.t(\"fields.boundsPeriod.onlyStart\", {\n start: start,\n });\n }\n\n return i18next.t(\"fields.boundsPeriod.onlyEnd\", {\n end: end,\n });\n}\n","import { fromListToString } from \"../utils/fromListToString\";\nimport { fromRatioToString } from \"../utils/fromRatioToString\";\nimport { isNotUndefined } from \"../internal/undefinedChecks\";\n\nimport type { DisplayOrderParams } from \"../types\";\n\nexport function transformMaxDosePerPeriodToText({\n dos,\n config,\n i18next,\n}: DisplayOrderParams): string | undefined {\n if (!isNotUndefined(dos.maxDosePerPeriod)) {\n return undefined;\n }\n\n const maxDosePerPeriod = dos.maxDosePerPeriod;\n\n // In R4, it was a single object / In R5, it is an array\n const values = Array.isArray(maxDosePerPeriod)\n ? maxDosePerPeriod\n : [maxDosePerPeriod];\n\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) => fromRatioToString({ config, i18next, ratio: period }))\n .filter(isNotUndefined) as string[];\n\n const maxDosePerPeriodText = fromListToString(i18next, valuesAsString);\n\n return i18next.t(\"fields.maxDosePerPeriod\", {\n count: values.length,\n maxDosePerPeriodText: maxDosePerPeriodText,\n });\n}\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -1,24 +1,11 @@
1
1
  import { i18n, InitOptions } from "i18next";
2
2
  import { Dosage as _Dosage1, CodeableConcept as _CodeableConcept1, Extension as _Extension1, Quantity as _Quantity1 } from "fhir/r4";
3
3
  import { Dosage as _Dosage2, CodeableConcept as _CodeableConcept2, Extension as _Extension2, Quantity as _Quantity2 } from "fhir/r5";
4
- type FromFHIRQuantityUnitToStringArgs = {
5
- language: string;
6
- quantity: Quantity;
7
- };
8
- type FromFHIRQuantityUnitToStringFct = (input: FromFHIRQuantityUnitToStringArgs) => string;
9
4
  type FromCodeableConceptToStringArgs = {
10
5
  language: string;
11
6
  code?: CodeableConcept;
12
7
  };
13
8
  type FromCodeableConceptToStringFct = (input: FromCodeableConceptToStringArgs) => string | undefined;
14
- /**
15
- * Function to turn extensions into a string for humans.
16
- */
17
- type FromExtensionsToStringArgs = {
18
- language: string;
19
- extensions?: Extension[];
20
- };
21
- type FromExtensionsToStringFct = (input: FromExtensionsToStringArgs) => string | undefined;
22
9
  type Dosage = _Dosage1 | _Dosage2;
23
10
  type CodeableConcept = _CodeableConcept1 | _CodeableConcept2;
24
11
  type Quantity = _Quantity1 | _Quantity2;
@@ -161,131 +148,93 @@ export enum DisplayOrderEnum {
161
148
  timingModifierExtension = "timingModifierExtension"
162
149
  }
163
150
  type DisplayOrder = keyof typeof DisplayOrderEnum;
164
- export interface Params {
151
+ /**
152
+ * Options for the i18next instances
153
+ * @see https://www.i18next.com/overview/configuration-options for more info
154
+ */
155
+ export type I18InitOptions = Exclude<InitOptions, "lng" | "ns" | "defaultNS">;
156
+ type FromFHIRQuantityUnitToStringArgs = {
157
+ language: string;
158
+ quantity: Quantity;
159
+ };
160
+ type FromFHIRQuantityUnitToStringFct = (input: FromFHIRQuantityUnitToStringArgs) => string;
161
+ type FromExtensionsToStringArgs = {
162
+ language: string;
163
+ extensions?: Extension[];
164
+ };
165
+ type FromExtensionsToStringFct = (input: FromExtensionsToStringArgs) => string | undefined;
166
+ export interface Config {
165
167
  /**
166
168
  * BCP 47 language code to setup the library with
167
169
  * @defaultValue "en" (English)
168
170
  * @see [FAQ](https://jy95.github.io/fhir-dosage-utils/docs/faq) for the built-in languages
169
171
  * @see [I18next documentation](https://www.i18next.com/how-to/faq#how-should-the-language-codes-be-formatted) for the reasons behind BCP 47
170
172
  */
171
- language?: string;
173
+ language: string;
172
174
  /**
173
175
  * Function to turn a quantity unit (e.g UCUM "ml") into a string for humans (e.g "militier")
174
176
  * The choice to handle plural form or not is thus under the hands of people ;)
175
177
  * @see [defaultFromFHIRQuantityUnitToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromFHIRQuantityUnitToString.ts) for default implementation
176
178
  * @see [FHIR definition of Quantity](https://build.fhir.org/datatypes.html#Quantity) for more info about the type itself
177
179
  */
178
- fromFHIRQuantityUnitToString?: FromFHIRQuantityUnitToStringFct;
180
+ fromFHIRQuantityUnitToString: FromFHIRQuantityUnitToStringFct;
179
181
  /**
180
182
  * Function to turn a codeable concept (e.g SNOMED CT "311504000") into a string for humans (e.g "With or after food")
181
183
  * The choice to handle extension, local valueset, ... is thus under the hands of people ;)
182
184
  * @see [defaultFromCodeableConceptToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromCodeableConceptToString.ts) for default implementation
183
185
  * @see [FHIR definition of CodeableConcept](https://build.fhir.org/datatypes.html#CodeableConcept) for more info about the type itself
184
186
  */
185
- fromCodeableConceptToString?: FromCodeableConceptToStringFct;
187
+ fromCodeableConceptToString: FromCodeableConceptToStringFct;
186
188
  /**
187
189
  * Function to turn extension(s) into a string for humans.
188
190
  * The choice to handle national extensions, ... is thus under the hands of people ;)
189
191
  * @see [defaultFromExtensionsToString](https://github.com/jy95/fhir-dosage-utils/blob/main/src/utils/fromExtensionsToString.ts) for default implementation
190
192
  * @see [FHIR definition of Extension](https://build.fhir.org/extensibility.html#Extension) for more info about the type itself
191
193
  */
192
- fromExtensionsToString?: FromExtensionsToStringFct;
194
+ fromExtensionsToString: FromExtensionsToStringFct;
193
195
  /**
194
196
  * Control the display order used by the algorithm
195
197
  * Useful when you want to turn on / off some specific rules for some reason
196
198
  * @defaultValue ["method", "doseQuantity", "doseRange", "rateRatio", "rateQuantity", "rateRange", "durationDurationMax", "frequencyFrequencyMaxPeriodPeriodMax", "offsetWhen", "dayOfWeek", "timeOfDay", "route", "site", "asNeeded", "boundsDuration", "boundsPeriod", "boundsRange", "countCountMax", "event", "code", "maxDosePerPeriod", "maxDosePerAdministration", "maxDosePerLifetime", "additionalInstruction", "patientInstruction"]
197
199
  * @see [DisplayOrderEnum](../enum/DisplayOrderEnum) for more info
198
200
  */
199
- displayOrder?: DisplayOrder[];
201
+ displayOrder: DisplayOrder[];
200
202
  /**
201
203
  * Override separator between each part of "Dosage"
202
204
  * @defaultValue " - "
203
205
  */
204
- displaySeparator?: string;
206
+ displaySeparator: string;
205
207
  /**
206
208
  * To control the formatting of dateTime objects.
207
209
  * If not provided, will use the defaults according locale e.g. "20/01/2024"
208
210
  * @defaultValue {}
209
211
  * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options
210
212
  */
211
- dateTimeFormatOptions?: Intl.DateTimeFormatOptions;
212
- }
213
- type Config = Required<Params>;
214
- /**
215
- * Options for the i18next instances
216
- * @see https://www.i18next.com/overview/configuration-options for more info
217
- */
218
- export type I18InitOptions = Exclude<InitOptions, "lng" | "ns" | "defaultNS">;
219
- declare class Configurator {
220
- protected config: Config;
221
- protected i18nConfig: InitOptions;
222
- protected i18nInstance: I18N;
223
- protected constructor(userConfig?: Params, i18nConfig?: I18InitOptions);
213
+ dateTimeFormatOptions: Intl.DateTimeFormatOptions;
224
214
  /**
225
- * To init i18next properly according requested criteria
215
+ * I18next config
216
+ * @see https://www.i18next.com/overview/configuration-options
226
217
  */
227
- protected init(): Promise<import("i18next").TFunction<"translation", undefined>>;
228
- /**
229
- * To change language
230
- */
231
- changeLanguage(lng: string): Promise<import("i18next").TFunction<"translation", undefined>>;
232
- /**
233
- * Get current language
234
- */
235
- getLanguage(): string;
236
- /**
237
- * To change display order
238
- */
239
- changeDisplayOrder(order: DisplayOrder[]): void;
240
- /**
241
- * Get display order
242
- */
243
- getDisplayOrder(): ("code" | "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" | "text" | "extension" | "timingExtension" | "timingRepeatExtension" | "modifierExtension" | "timingModifierExtension")[];
244
- /**
245
- * Get display separator
246
- */
247
- getDisplaySeparator(): string;
248
- /**
249
- * Set display separator
250
- */
251
- changeDisplaySeparator(sep: string): void;
252
- /**
253
- * Get date time format options
254
- */
255
- getDateTimeFormatOptions(): Intl.DateTimeFormatOptions;
256
- /**
257
- * Set date time format options
258
- */
259
- changeDateTimeFormatOptions(opts: Intl.DateTimeFormatOptions): void;
218
+ i18nConfig: I18InitOptions;
260
219
  }
261
- declare class FhirDosageUtils extends Configurator {
262
- /**
263
- * Factory to create a fine-tuned instance of the utility class
264
- */
265
- static build(userConfig?: Params, i18nConfig?: I18InitOptions): Promise<FhirDosageUtils>;
266
- /**
267
- * Does this array of Dosage objects contains only "sequential" instructions ?
268
- */
220
+ declare class Utils {
269
221
  containsOnlySequentialInstructions(dosages: Dosage[]): boolean;
270
- /**
271
- * Turn this array of Dosage objects into a data structure useful to handle "sequential" and "concurrent" instructions (cf. "sequence" property).
272
- * @returns {Dosage[][]} - A two-dimensional array where each inner array contains Dosage objects belonging to the same sequence numberr.
273
- */
274
222
  groupBySequence(dosages: Dosage[]): Dosage[][];
275
- /**
276
- * From a single dosage, extract specific field(s) requested by user.
277
- * Some use cases could request to split part of the object for given needs (quantity and timing separately)
278
- */
223
+ }
224
+ type PropertyKey = keyof Config;
225
+ type SettableProperties = Exclude<PropertyKey, "language">;
226
+ export class FhirDosageUtils extends Utils {
227
+ protected config: Config;
228
+ protected i18nInstance: I18N;
229
+ protected constructor(config: Partial<Config>);
230
+ protected init(): Promise<import("i18next").TFunction<"translation", undefined>>;
231
+ static build(config?: Partial<Config>): Promise<FhirDosageUtils>;
232
+ getProperty<T extends PropertyKey>(key: T): Config[T];
233
+ setProperty<T extends SettableProperties>(key: T, value: Config[T]): undefined;
234
+ changeLanguage(lng: string): Promise<import("i18next").TFunction<"translation", undefined>>;
279
235
  getFields(dos: Dosage, ...order: DisplayOrder[]): string;
280
- /**
281
- * Turn a FHIR Dosage object into text
282
- */
283
236
  fromDosageToText(dos: Dosage): string;
284
- /**
285
- * Turn multiple FHIR Dosage objects into text
286
- */
287
237
  fromMultipleDosageToText(dosages: Dosage[]): string;
288
238
  }
289
- export default FhirDosageUtils;
290
239
 
291
240
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/src/internal/undefinedChecks.ts","src/src/utils/fromFHIRQuantityUnitToString.ts","src/src/internal/isEmptyArray.ts","src/src/utils/fromCodeableConceptToString.ts","src/src/utils/fromExtensionsToString.ts","src/src/types.ts","src/src/internal/defaultAttributes.ts","src/src/classes/Configurator.ts","src/src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/src/utils/fromQuantityToString.ts","src/src/translators/doseQuantity.ts","src/src/internal/hasUnit.ts","src/src/utils/fromRangeToString.ts","src/src/translators/doseRange.ts","src/src/translators/rateQuantity.ts","src/src/translators/rateRange.ts","src/src/utils/fromRatioToString.ts","src/src/translators/rateRatio.ts","src/src/internal/extractMatchingTimingRepeat.ts","src/src/translators/durationDurationMax.ts","src/src/translators/frequencyFrequencyMax.ts","src/src/translators/periodPeriodMax.ts","src/src/utils/fromListToString.ts","src/src/translators/offsetWhen.ts","src/src/translators/dayOfWeek.ts","src/src/translators/timeOfDay.ts","src/src/translators/asNeeded.ts","src/src/translators/boundsDuration.ts","src/src/translators/boundsRange.ts","src/src/translators/countCountMax.ts","src/src/utils/formatDatetimes.ts","src/src/translators/event.ts","src/src/translators/additionalInstruction.ts","src/src/translators/maxDosePerLifetime.ts","src/src/translators/maxDosePerAdministration.ts","src/src/translators/boundsPeriod.ts","src/src/translators/maxDosePerPeriod.ts","src/src/translators/index.ts","src/src/utils/fromDisplayOrderToResult.ts","src/src/api.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import { FhirDosageUtils } from \"./api\";\nimport type { Params, DisplayOrderEnum, I18InitOptions } from \"./types\";\n\n// Default export to make it user-friendly\nexport default FhirDosageUtils;\n\n// Export config type as that it can be used in client codes as well\nexport type { Params, DisplayOrderEnum, I18InitOptions };\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":"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","sources":["src/src/internal/undefinedChecks.ts","src/src/internal/isEmptyArray.ts","src/src/utils/fromCodeableConceptToString.ts","src/src/types.ts","src/src/utils/fromFHIRQuantityUnitToString.ts","src/src/utils/fromExtensionsToString.ts","src/src/configurator.ts","src/src/dosageUtils.ts","src/src/internal/extractMatchingDoseAndRateFirstEntry.ts","src/src/utils/fromQuantityToString.ts","src/src/translators/doseQuantity.ts","src/src/internal/hasUnit.ts","src/src/utils/fromRangeToString.ts","src/src/translators/doseRange.ts","src/src/translators/rateQuantity.ts","src/src/translators/rateRange.ts","src/src/utils/fromRatioToString.ts","src/src/translators/rateRatio.ts","src/src/internal/extractMatchingTimingRepeat.ts","src/src/translators/durationDurationMax.ts","src/src/translators/frequencyFrequencyMax.ts","src/src/translators/periodPeriodMax.ts","src/src/utils/fromListToString.ts","src/src/translators/offsetWhen.ts","src/src/translators/dayOfWeek.ts","src/src/translators/timeOfDay.ts","src/src/translators/asNeeded.ts","src/src/translators/boundsDuration.ts","src/src/translators/boundsRange.ts","src/src/translators/countCountMax.ts","src/src/utils/formatDatetimes.ts","src/src/translators/event.ts","src/src/translators/additionalInstruction.ts","src/src/translators/maxDosePerLifetime.ts","src/src/translators/maxDosePerAdministration.ts","src/src/translators/boundsPeriod.ts","src/src/translators/maxDosePerPeriod.ts","src/src/translators/index.ts","src/src/utils/fromDisplayOrderToResult.ts","src/src/api.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"// Export utility class\nexport { FhirDosageUtils } from \"./api\";\n\n// Export types as it can be used in client codes\nexport type { Config, DisplayOrderEnum, I18InitOptions } from \"./types\";\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fhir-dosage-utils",
3
- "version": "1.10.3",
3
+ "version": "2.0.0",
4
4
  "description": "Turn FHIR Dosage into human readable text in your wanted language (english, french, dutch, ...) and much more",
5
5
  "files": [
6
6
  "dist"
@@ -53,8 +53,8 @@
53
53
  "@types/jest": "^29.5.12",
54
54
  "jest": "^29.7.0",
55
55
  "parcel": "^2.12.0",
56
- "prettier": "3.2.5",
57
- "semantic-release": "^23.0.6",
56
+ "prettier": "3.3.2",
57
+ "semantic-release": "^24.0.0",
58
58
  "ts-jest": "^29.1.2",
59
59
  "typescript": "^5.4.3"
60
60
  },