@medplum/core 0.9.27 → 0.9.30

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.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/cache.d.ts +34 -0
  3. package/dist/cjs/client.d.ts +1093 -0
  4. package/dist/cjs/crypto.d.ts +9 -0
  5. package/dist/cjs/eventtarget.d.ts +13 -0
  6. package/dist/cjs/fhirpath/atoms.d.ts +150 -0
  7. package/dist/cjs/fhirpath/date.d.ts +1 -0
  8. package/dist/cjs/fhirpath/functions.d.ts +5 -0
  9. package/dist/cjs/fhirpath/index.d.ts +4 -0
  10. package/dist/cjs/fhirpath/parse.d.ts +24 -0
  11. package/dist/cjs/fhirpath/tokenize.d.ts +5 -0
  12. package/dist/cjs/fhirpath/utils.d.ts +95 -0
  13. package/dist/cjs/format.d.ts +21 -0
  14. package/dist/cjs/hl7.d.ts +43 -0
  15. package/dist/cjs/index.d.ts +12 -0
  16. package/dist/cjs/index.js +257 -48
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/index.min.js +1 -1
  19. package/dist/cjs/index.min.js.map +1 -1
  20. package/dist/cjs/jwt.d.ts +5 -0
  21. package/dist/cjs/outcomes.d.ts +30 -0
  22. package/dist/cjs/readablepromise.d.ts +48 -0
  23. package/dist/cjs/search.d.ts +64 -0
  24. package/dist/cjs/searchparams.d.ts +35 -0
  25. package/dist/cjs/storage.d.ts +47 -0
  26. package/dist/cjs/types.d.ts +148 -0
  27. package/dist/cjs/utils.d.ts +239 -0
  28. package/dist/esm/client.d.ts +11 -11
  29. package/dist/esm/client.js +50 -38
  30. package/dist/esm/client.js.map +1 -1
  31. package/dist/esm/fhirpath/utils.js +12 -3
  32. package/dist/esm/fhirpath/utils.js.map +1 -1
  33. package/dist/esm/format.d.ts +7 -1
  34. package/dist/esm/format.js +108 -1
  35. package/dist/esm/format.js.map +1 -1
  36. package/dist/esm/index.js +3 -3
  37. package/dist/esm/index.min.js +1 -1
  38. package/dist/esm/index.min.js.map +1 -1
  39. package/dist/esm/outcomes.d.ts +9 -1
  40. package/dist/esm/outcomes.js +63 -7
  41. package/dist/esm/outcomes.js.map +1 -1
  42. package/dist/esm/utils.d.ts +15 -0
  43. package/dist/esm/utils.js +18 -1
  44. package/dist/esm/utils.js.map +1 -1
  45. package/package.json +3 -3
  46. package/stats.html +4034 -0
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/fhirpath/utils.ts"],"sourcesContent":["import { Period, Quantity, Resource } from '@medplum/fhirtypes';\nimport { buildTypeName, globalSchema, PropertyType, TypeSchema } from '../types';\nimport { capitalize } from '../utils';\nimport { TypedValue } from './atoms';\n\n/**\n * Returns a single element array with a typed boolean value.\n * @param value The primitive boolean value.\n * @returns Single element array with a typed boolean value.\n */\nexport function booleanToTypedValue(value: boolean): [TypedValue] {\n return [{ type: PropertyType.boolean, value }];\n}\n\n/**\n * Returns a \"best guess\" TypedValue for a given value.\n * @param value The unknown value to check.\n * @returns A \"best guess\" TypedValue for the given value.\n */\nexport function toTypedValue(value: unknown): TypedValue {\n if (value === null || value === undefined) {\n return { type: 'undefined', value: undefined };\n } else if (Number.isSafeInteger(value)) {\n return { type: PropertyType.integer, value };\n } else if (typeof value === 'number') {\n return { type: PropertyType.decimal, value };\n } else if (typeof value === 'boolean') {\n return { type: PropertyType.boolean, value };\n } else if (typeof value === 'string') {\n return { type: PropertyType.string, value };\n } else if (isQuantity(value)) {\n return { type: PropertyType.Quantity, value };\n } else if (typeof value === 'object' && 'resourceType' in value) {\n return { type: (value as Resource).resourceType, value };\n } else {\n return { type: PropertyType.BackboneElement, value };\n }\n}\n\n/**\n * Converts unknown object into a JavaScript boolean.\n * Note that this is different than the FHIRPath \"toBoolean\",\n * which has particular semantics around arrays, empty arrays, and type conversions.\n * @param obj Any value or array of values.\n * @returns The converted boolean value according to FHIRPath rules.\n */\nexport function toJsBoolean(obj: TypedValue[]): boolean {\n return obj.length === 0 ? false : !!obj[0].value;\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param input The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nexport function getTypedPropertyValue(input: TypedValue, path: string): TypedValue[] | TypedValue | undefined {\n if (!input?.value) {\n return undefined;\n }\n\n const typeSchema = globalSchema.types[input.type];\n if (typeSchema) {\n const typedResult = getTypedPropertyValueWithSchema(input, path, typeSchema);\n if (typedResult) {\n return typedResult;\n }\n }\n\n return getTypedPropertyValueWithoutSchema(input, path);\n}\n\n/**\n * Returns the value of the property and the property type using a type schema.\n * @param input The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @param typeSchema The input type schema.\n * @returns The value of the property and the property type.\n */\nfunction getTypedPropertyValueWithSchema(\n input: TypedValue,\n path: string,\n typeSchema: TypeSchema\n): TypedValue[] | TypedValue | undefined {\n const property = typeSchema.properties[path] ?? typeSchema.properties[path + '[x]'];\n if (!property) {\n return undefined;\n }\n\n const types = property.type;\n if (!types || types.length === 0) {\n return undefined;\n }\n\n let propertyName: string | undefined = undefined;\n let resultValue: any = undefined;\n let resultType = 'undefined';\n\n if (types.length === 1) {\n propertyName = path;\n resultValue = input.value[path];\n resultType = types[0].code as string;\n } else {\n for (const type of types) {\n const path2 = path.replace('[x]', '') + capitalize(type.code as string);\n if (path2 in input.value) {\n propertyName = path2;\n resultValue = input.value[path2];\n resultType = type.code as string;\n break;\n }\n }\n }\n\n if (resultValue === undefined) {\n return undefined;\n }\n\n if (resultType === 'BackboneElement') {\n resultType = buildTypeName([input.type, propertyName as string]);\n }\n\n if (Array.isArray(resultValue)) {\n return resultValue.map((element) => ({ value: element, type: resultType }));\n } else {\n return { value: resultValue, type: resultType };\n }\n}\n\n/**\n * Returns the value of the property and the property type using a type schema.\n * Note that because the type schema is not available, this function may be inaccurate.\n * In some cases, that is the desired behavior.\n * @param typedValue The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nfunction getTypedPropertyValueWithoutSchema(\n typedValue: TypedValue,\n path: string\n): TypedValue[] | TypedValue | undefined {\n const input = typedValue.value;\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n let result: any = undefined;\n if (path in input) {\n result = (input as { [key: string]: unknown })[path];\n } else {\n const propertyName = Object.keys(input).find((k) => k.startsWith(path));\n if (propertyName) {\n result = (input as { [key: string]: unknown })[propertyName];\n }\n }\n\n if (result === undefined) {\n return undefined;\n }\n\n if (Array.isArray(result)) {\n return result.map(toTypedValue);\n } else {\n return toTypedValue(result);\n }\n}\n\n/**\n * Removes duplicates in array using FHIRPath equality rules.\n * @param arr The input array.\n * @returns The result array with duplicates removed.\n */\nexport function removeDuplicates(arr: TypedValue[]): TypedValue[] {\n const result: TypedValue[] = [];\n for (const i of arr) {\n let found = false;\n for (const j of result) {\n if (toJsBoolean(fhirPathEquals(i, j))) {\n found = true;\n break;\n }\n }\n if (!found) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * Returns a negated FHIRPath boolean expression.\n * @param input The input array.\n * @returns The negated type value array.\n */\nexport function fhirPathNot(input: TypedValue[]): TypedValue[] {\n return booleanToTypedValue(!toJsBoolean(input));\n}\n\n/**\n * Determines if two arrays are equal according to FHIRPath equality rules.\n * @param x The first array.\n * @param y The second array.\n * @returns FHIRPath true if the arrays are equal.\n */\nexport function fhirPathArrayEquals(x: TypedValue[], y: TypedValue[]): TypedValue[] {\n if (x.length === 0 || y.length === 0) {\n return [];\n }\n if (x.length !== y.length) {\n return booleanToTypedValue(false);\n }\n return booleanToTypedValue(x.every((val, index) => toJsBoolean(fhirPathEquals(val, y[index]))));\n}\n\n/**\n * Determines if two values are equal according to FHIRPath equality rules.\n * @param x The first value.\n * @param y The second value.\n * @returns True if equal.\n */\nexport function fhirPathEquals(x: TypedValue, y: TypedValue): TypedValue[] {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n return booleanToTypedValue(Math.abs(xValue - yValue) < 1e-8);\n }\n if (isQuantity(xValue) && isQuantity(yValue)) {\n return booleanToTypedValue(isQuantityEquivalent(xValue, yValue));\n }\n if (typeof xValue === 'object' && typeof yValue === 'object') {\n return booleanToTypedValue(deepEquals(x, y));\n }\n return booleanToTypedValue(xValue === yValue);\n}\n\n/**\n * Determines if two arrays are equivalent according to FHIRPath equality rules.\n * @param x The first array.\n * @param y The second array.\n * @returns FHIRPath true if the arrays are equivalent.\n */\nexport function fhirPathArrayEquivalent(x: TypedValue[], y: TypedValue[]): TypedValue[] {\n if (x.length === 0 && y.length === 0) {\n return booleanToTypedValue(true);\n }\n if (x.length !== y.length) {\n return booleanToTypedValue(false);\n }\n x.sort(fhirPathEquivalentCompare);\n y.sort(fhirPathEquivalentCompare);\n return booleanToTypedValue(x.every((val, index) => toJsBoolean(fhirPathEquivalent(val, y[index]))));\n}\n\n/**\n * Determines if two values are equivalent according to FHIRPath equality rules.\n * @param x The first value.\n * @param y The second value.\n * @returns True if equivalent.\n */\nexport function fhirPathEquivalent(x: TypedValue, y: TypedValue): TypedValue[] {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n // Use more generous threshold than equality\n // Decimal: values must be equal, comparison is done on values rounded to the precision of the least precise operand.\n // Trailing zeroes after the decimal are ignored in determining precision.\n return booleanToTypedValue(Math.abs(xValue - yValue) < 0.01);\n }\n if (isQuantity(xValue) && isQuantity(yValue)) {\n return booleanToTypedValue(isQuantityEquivalent(xValue, yValue));\n }\n if (typeof xValue === 'object' && typeof yValue === 'object') {\n return booleanToTypedValue(deepEquals(xValue, yValue));\n }\n if (typeof xValue === 'string' && typeof yValue === 'string') {\n // String: the strings must be the same, ignoring case and locale, and normalizing whitespace\n // (see String Equivalence for more details).\n return booleanToTypedValue(xValue.toLowerCase() === yValue.toLowerCase());\n }\n return booleanToTypedValue(xValue === yValue);\n}\n\n/**\n * Returns the sort order of two values for FHIRPath array equivalence.\n * @param x The first value.\n * @param y The second value.\n * @returns The sort order of the values.\n */\nfunction fhirPathEquivalentCompare(x: TypedValue, y: TypedValue): number {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n return xValue - yValue;\n }\n if (typeof xValue === 'string' && typeof yValue === 'string') {\n return xValue.localeCompare(yValue);\n }\n return 0;\n}\n\n/**\n * Determines if the typed value is the desired type.\n * @param typedValue The typed value to check.\n * @param desiredType The desired type name.\n * @returns True if the typed value is of the desired type.\n */\nexport function fhirPathIs(typedValue: TypedValue, desiredType: string): boolean {\n const { value } = typedValue;\n if (value === undefined || value === null) {\n return false;\n }\n\n switch (desiredType) {\n case 'Boolean':\n return typeof value === 'boolean';\n case 'Decimal':\n case 'Integer':\n return typeof value === 'number';\n case 'Date':\n return typeof value === 'string' && !!value.match(/^\\d{4}(-\\d{2}(-\\d{2})?)?/);\n case 'DateTime':\n return typeof value === 'string' && !!value.match(/^\\d{4}(-\\d{2}(-\\d{2})?)?T/);\n case 'Time':\n return typeof value === 'string' && !!value.match(/^T\\d/);\n case 'Period':\n return isPeriod(value);\n case 'Quantity':\n return isQuantity(value);\n default:\n return typeof value === 'object' && value?.resourceType === desiredType;\n }\n}\n\n/**\n * Determines if the input is a Period object.\n * This is heuristic based, as we do not have strong typing at runtime.\n * @param input The input value.\n * @returns True if the input is a period.\n */\nexport function isPeriod(input: unknown): input is Period {\n return !!(input && typeof input === 'object' && 'start' in input);\n}\n\n/**\n * Determines if the input is a Quantity object.\n * This is heuristic based, as we do not have strong typing at runtime.\n * @param input The input value.\n * @returns True if the input is a quantity.\n */\nexport function isQuantity(input: unknown): input is Quantity {\n return !!(input && typeof input === 'object' && 'value' in input && typeof (input as Quantity).value === 'number');\n}\n\nexport function isQuantityEquivalent(x: Quantity, y: Quantity): boolean {\n return (\n Math.abs((x.value as number) - (y.value as number)) < 0.01 &&\n (x.unit === y.unit || x.code === y.code || x.unit === y.code || x.code === y.unit)\n );\n}\n\n/**\n * Resource equality.\n * Ignores meta.versionId and meta.lastUpdated.\n * See: https://dmitripavlutin.com/how-to-compare-objects-in-javascript/#4-deep-equality\n * @param object1 The first object.\n * @param object2 The second object.\n * @returns True if the objects are equal.\n */\nfunction deepEquals<T1, T2>(object1: T1, object2: T2): boolean {\n const keys1 = Object.keys(object1) as (keyof T1)[];\n const keys2 = Object.keys(object2) as (keyof T2)[];\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n const val1 = object1[key] as unknown;\n const val2 = object2[key as unknown as keyof T2] as unknown;\n if (isObject(val1) && isObject(val2)) {\n if (!deepEquals(val1, val2)) {\n return false;\n }\n } else {\n if (val1 !== val2) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction isObject(object: unknown): boolean {\n return object !== null && typeof object === 'object';\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/fhirpath/utils.ts"],"sourcesContent":["import { Period, Quantity, Resource } from '@medplum/fhirtypes';\nimport { buildTypeName, globalSchema, PropertyType, TypeSchema } from '../types';\nimport { capitalize } from '../utils';\nimport { TypedValue } from './atoms';\n\n/**\n * Returns a single element array with a typed boolean value.\n * @param value The primitive boolean value.\n * @returns Single element array with a typed boolean value.\n */\nexport function booleanToTypedValue(value: boolean): [TypedValue] {\n return [{ type: PropertyType.boolean, value }];\n}\n\n/**\n * Returns a \"best guess\" TypedValue for a given value.\n * @param value The unknown value to check.\n * @returns A \"best guess\" TypedValue for the given value.\n */\nexport function toTypedValue(value: unknown): TypedValue {\n if (value === null || value === undefined) {\n return { type: 'undefined', value: undefined };\n } else if (Number.isSafeInteger(value)) {\n return { type: PropertyType.integer, value };\n } else if (typeof value === 'number') {\n return { type: PropertyType.decimal, value };\n } else if (typeof value === 'boolean') {\n return { type: PropertyType.boolean, value };\n } else if (typeof value === 'string') {\n return { type: PropertyType.string, value };\n } else if (isQuantity(value)) {\n return { type: PropertyType.Quantity, value };\n } else if (typeof value === 'object' && 'resourceType' in value) {\n return { type: (value as Resource).resourceType, value };\n } else {\n return { type: PropertyType.BackboneElement, value };\n }\n}\n\n/**\n * Converts unknown object into a JavaScript boolean.\n * Note that this is different than the FHIRPath \"toBoolean\",\n * which has particular semantics around arrays, empty arrays, and type conversions.\n * @param obj Any value or array of values.\n * @returns The converted boolean value according to FHIRPath rules.\n */\nexport function toJsBoolean(obj: TypedValue[]): boolean {\n return obj.length === 0 ? false : !!obj[0].value;\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param input The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nexport function getTypedPropertyValue(input: TypedValue, path: string): TypedValue[] | TypedValue | undefined {\n if (!input?.value) {\n return undefined;\n }\n\n const typeSchema = globalSchema.types[input.type];\n if (typeSchema) {\n const typedResult = getTypedPropertyValueWithSchema(input, path, typeSchema);\n if (typedResult) {\n return typedResult;\n }\n }\n\n return getTypedPropertyValueWithoutSchema(input, path);\n}\n\n/**\n * Returns the value of the property and the property type using a type schema.\n * @param input The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @param typeSchema The input type schema.\n * @returns The value of the property and the property type.\n */\nfunction getTypedPropertyValueWithSchema(\n input: TypedValue,\n path: string,\n typeSchema: TypeSchema\n): TypedValue[] | TypedValue | undefined {\n const property = typeSchema.properties[path] ?? typeSchema.properties[path + '[x]'];\n if (!property) {\n return undefined;\n }\n\n const types = property.type;\n if (!types || types.length === 0) {\n return undefined;\n }\n\n let propertyName: string | undefined = undefined;\n let resultValue: any = undefined;\n let resultType = 'undefined';\n\n if (types.length === 1) {\n propertyName = path;\n resultValue = input.value[path];\n resultType = types[0].code as string;\n } else {\n for (const type of types) {\n const path2 = path.replace('[x]', '') + capitalize(type.code as string);\n if (path2 in input.value) {\n propertyName = path2;\n resultValue = input.value[path2];\n resultType = type.code as string;\n break;\n }\n }\n }\n\n if (resultValue === undefined) {\n return undefined;\n }\n\n if (resultType === 'BackboneElement') {\n resultType = buildTypeName([input.type, propertyName as string]);\n }\n\n if (Array.isArray(resultValue)) {\n return resultValue.map((element) => ({ value: element, type: resultType }));\n } else {\n return { value: resultValue, type: resultType };\n }\n}\n\n/**\n * Returns the value of the property and the property type using a type schema.\n * Note that because the type schema is not available, this function may be inaccurate.\n * In some cases, that is the desired behavior.\n * @param typedValue The base context (FHIR resource or backbone element).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nfunction getTypedPropertyValueWithoutSchema(\n typedValue: TypedValue,\n path: string\n): TypedValue[] | TypedValue | undefined {\n const input = typedValue.value;\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n let result: any = undefined;\n if (path in input) {\n result = (input as { [key: string]: unknown })[path];\n } else {\n // Only support property names that would be valid types\n // Examples:\n // value + valueString = ok, because \"string\" is valid\n // value + valueDecimal = ok, because \"decimal\" is valid\n // id + identifiier = not ok, because \"entifier\" is not a valid type\n // resource + resourceType = not ok, because \"type\" is not a valid type\n for (const propertyType in PropertyType) {\n const propertyName = path + capitalize(propertyType);\n if (propertyName in input) {\n result = (input as { [key: string]: unknown })[propertyName];\n break;\n }\n }\n }\n\n if (result === undefined) {\n return undefined;\n }\n\n if (Array.isArray(result)) {\n return result.map(toTypedValue);\n } else {\n return toTypedValue(result);\n }\n}\n\n/**\n * Removes duplicates in array using FHIRPath equality rules.\n * @param arr The input array.\n * @returns The result array with duplicates removed.\n */\nexport function removeDuplicates(arr: TypedValue[]): TypedValue[] {\n const result: TypedValue[] = [];\n for (const i of arr) {\n let found = false;\n for (const j of result) {\n if (toJsBoolean(fhirPathEquals(i, j))) {\n found = true;\n break;\n }\n }\n if (!found) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * Returns a negated FHIRPath boolean expression.\n * @param input The input array.\n * @returns The negated type value array.\n */\nexport function fhirPathNot(input: TypedValue[]): TypedValue[] {\n return booleanToTypedValue(!toJsBoolean(input));\n}\n\n/**\n * Determines if two arrays are equal according to FHIRPath equality rules.\n * @param x The first array.\n * @param y The second array.\n * @returns FHIRPath true if the arrays are equal.\n */\nexport function fhirPathArrayEquals(x: TypedValue[], y: TypedValue[]): TypedValue[] {\n if (x.length === 0 || y.length === 0) {\n return [];\n }\n if (x.length !== y.length) {\n return booleanToTypedValue(false);\n }\n return booleanToTypedValue(x.every((val, index) => toJsBoolean(fhirPathEquals(val, y[index]))));\n}\n\n/**\n * Determines if two values are equal according to FHIRPath equality rules.\n * @param x The first value.\n * @param y The second value.\n * @returns True if equal.\n */\nexport function fhirPathEquals(x: TypedValue, y: TypedValue): TypedValue[] {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n return booleanToTypedValue(Math.abs(xValue - yValue) < 1e-8);\n }\n if (isQuantity(xValue) && isQuantity(yValue)) {\n return booleanToTypedValue(isQuantityEquivalent(xValue, yValue));\n }\n if (typeof xValue === 'object' && typeof yValue === 'object') {\n return booleanToTypedValue(deepEquals(x, y));\n }\n return booleanToTypedValue(xValue === yValue);\n}\n\n/**\n * Determines if two arrays are equivalent according to FHIRPath equality rules.\n * @param x The first array.\n * @param y The second array.\n * @returns FHIRPath true if the arrays are equivalent.\n */\nexport function fhirPathArrayEquivalent(x: TypedValue[], y: TypedValue[]): TypedValue[] {\n if (x.length === 0 && y.length === 0) {\n return booleanToTypedValue(true);\n }\n if (x.length !== y.length) {\n return booleanToTypedValue(false);\n }\n x.sort(fhirPathEquivalentCompare);\n y.sort(fhirPathEquivalentCompare);\n return booleanToTypedValue(x.every((val, index) => toJsBoolean(fhirPathEquivalent(val, y[index]))));\n}\n\n/**\n * Determines if two values are equivalent according to FHIRPath equality rules.\n * @param x The first value.\n * @param y The second value.\n * @returns True if equivalent.\n */\nexport function fhirPathEquivalent(x: TypedValue, y: TypedValue): TypedValue[] {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n // Use more generous threshold than equality\n // Decimal: values must be equal, comparison is done on values rounded to the precision of the least precise operand.\n // Trailing zeroes after the decimal are ignored in determining precision.\n return booleanToTypedValue(Math.abs(xValue - yValue) < 0.01);\n }\n if (isQuantity(xValue) && isQuantity(yValue)) {\n return booleanToTypedValue(isQuantityEquivalent(xValue, yValue));\n }\n if (typeof xValue === 'object' && typeof yValue === 'object') {\n return booleanToTypedValue(deepEquals(xValue, yValue));\n }\n if (typeof xValue === 'string' && typeof yValue === 'string') {\n // String: the strings must be the same, ignoring case and locale, and normalizing whitespace\n // (see String Equivalence for more details).\n return booleanToTypedValue(xValue.toLowerCase() === yValue.toLowerCase());\n }\n return booleanToTypedValue(xValue === yValue);\n}\n\n/**\n * Returns the sort order of two values for FHIRPath array equivalence.\n * @param x The first value.\n * @param y The second value.\n * @returns The sort order of the values.\n */\nfunction fhirPathEquivalentCompare(x: TypedValue, y: TypedValue): number {\n const xValue = x.value;\n const yValue = y.value;\n if (typeof xValue === 'number' && typeof yValue === 'number') {\n return xValue - yValue;\n }\n if (typeof xValue === 'string' && typeof yValue === 'string') {\n return xValue.localeCompare(yValue);\n }\n return 0;\n}\n\n/**\n * Determines if the typed value is the desired type.\n * @param typedValue The typed value to check.\n * @param desiredType The desired type name.\n * @returns True if the typed value is of the desired type.\n */\nexport function fhirPathIs(typedValue: TypedValue, desiredType: string): boolean {\n const { value } = typedValue;\n if (value === undefined || value === null) {\n return false;\n }\n\n switch (desiredType) {\n case 'Boolean':\n return typeof value === 'boolean';\n case 'Decimal':\n case 'Integer':\n return typeof value === 'number';\n case 'Date':\n return typeof value === 'string' && !!value.match(/^\\d{4}(-\\d{2}(-\\d{2})?)?/);\n case 'DateTime':\n return typeof value === 'string' && !!value.match(/^\\d{4}(-\\d{2}(-\\d{2})?)?T/);\n case 'Time':\n return typeof value === 'string' && !!value.match(/^T\\d/);\n case 'Period':\n return isPeriod(value);\n case 'Quantity':\n return isQuantity(value);\n default:\n return typeof value === 'object' && value?.resourceType === desiredType;\n }\n}\n\n/**\n * Determines if the input is a Period object.\n * This is heuristic based, as we do not have strong typing at runtime.\n * @param input The input value.\n * @returns True if the input is a period.\n */\nexport function isPeriod(input: unknown): input is Period {\n return !!(input && typeof input === 'object' && 'start' in input);\n}\n\n/**\n * Determines if the input is a Quantity object.\n * This is heuristic based, as we do not have strong typing at runtime.\n * @param input The input value.\n * @returns True if the input is a quantity.\n */\nexport function isQuantity(input: unknown): input is Quantity {\n return !!(input && typeof input === 'object' && 'value' in input && typeof (input as Quantity).value === 'number');\n}\n\nexport function isQuantityEquivalent(x: Quantity, y: Quantity): boolean {\n return (\n Math.abs((x.value as number) - (y.value as number)) < 0.01 &&\n (x.unit === y.unit || x.code === y.code || x.unit === y.code || x.code === y.unit)\n );\n}\n\n/**\n * Resource equality.\n * Ignores meta.versionId and meta.lastUpdated.\n * See: https://dmitripavlutin.com/how-to-compare-objects-in-javascript/#4-deep-equality\n * @param object1 The first object.\n * @param object2 The second object.\n * @returns True if the objects are equal.\n */\nfunction deepEquals<T1, T2>(object1: T1, object2: T2): boolean {\n const keys1 = Object.keys(object1) as (keyof T1)[];\n const keys2 = Object.keys(object2) as (keyof T2)[];\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n const val1 = object1[key] as unknown;\n const val2 = object2[key as unknown as keyof T2] as unknown;\n if (isObject(val1) && isObject(val2)) {\n if (!deepEquals(val1, val2)) {\n return false;\n }\n } else {\n if (val1 !== val2) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction isObject(object: unknown): boolean {\n return object !== null && typeof object === 'object';\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Address, HumanName } from '@medplum/fhirtypes';
1
+ import { Address, HumanName, Period, Timing } from '@medplum/fhirtypes';
2
2
  export interface AddressFormatOptions {
3
3
  all?: boolean;
4
4
  use?: boolean;
@@ -13,3 +13,9 @@ export declare function formatAddress(address: Address, options?: AddressFormatO
13
13
  export declare function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string;
14
14
  export declare function formatGivenName(name: HumanName): string;
15
15
  export declare function formatFamilyName(name: HumanName): string;
16
+ export declare function isValidDate(date: Date): boolean;
17
+ export declare function formatDate(date: string | undefined, options?: Intl.DateTimeFormatOptions): string;
18
+ export declare function formatTime(time: string | undefined, options?: Intl.DateTimeFormatOptions): string;
19
+ export declare function formatDateTime(dateTime: string | undefined, options?: Intl.DateTimeFormatOptions): string;
20
+ export declare function formatPeriod(period: Period | undefined): string;
21
+ export declare function formatTiming(timing: Timing | undefined): string;
@@ -1,3 +1,5 @@
1
+ import { capitalize } from './utils.js';
2
+
1
3
  function formatAddress(address, options) {
2
4
  const builder = [];
3
5
  if (address.line) {
@@ -46,6 +48,111 @@ function formatGivenName(name) {
46
48
  function formatFamilyName(name) {
47
49
  return name.family || '';
48
50
  }
51
+ function isValidDate(date) {
52
+ return date instanceof Date && !isNaN(date.getTime());
53
+ }
54
+ function formatDate(date, options) {
55
+ if (!date) {
56
+ return '';
57
+ }
58
+ const d = new Date(date);
59
+ if (!isValidDate(d)) {
60
+ return '';
61
+ }
62
+ return d.toLocaleDateString(undefined, options);
63
+ }
64
+ function formatTime(time, options) {
65
+ if (!time) {
66
+ return '';
67
+ }
68
+ const d = new Date('2000-01-01T' + time + 'Z');
69
+ if (!isValidDate(d)) {
70
+ return '';
71
+ }
72
+ return d.toLocaleTimeString(undefined, options);
73
+ }
74
+ function formatDateTime(dateTime, options) {
75
+ if (!dateTime) {
76
+ return '';
77
+ }
78
+ const d = new Date(dateTime);
79
+ if (!isValidDate(d)) {
80
+ return '';
81
+ }
82
+ return d.toLocaleString(undefined, options);
83
+ }
84
+ function formatPeriod(period) {
85
+ if (!period || (!period.start && !period.end)) {
86
+ return '';
87
+ }
88
+ return formatDateTime(period.start) + ' - ' + formatDateTime(period.end);
89
+ }
90
+ const unitAdverbForm = {
91
+ s: 'every second',
92
+ min: 'every minute',
93
+ h: 'hourly',
94
+ d: 'daily',
95
+ wk: 'weekly',
96
+ mo: 'monthly',
97
+ a: 'annually',
98
+ };
99
+ const singularUnits = {
100
+ s: 'second',
101
+ min: 'minute',
102
+ h: 'hour',
103
+ d: 'day',
104
+ wk: 'week',
105
+ mo: 'month',
106
+ a: 'year',
107
+ };
108
+ const pluralUnits = {
109
+ s: 'seconds',
110
+ min: 'minutes',
111
+ h: 'hours',
112
+ d: 'days',
113
+ wk: 'weeks',
114
+ mo: 'months',
115
+ a: 'years',
116
+ };
117
+ function formatTiming(timing) {
118
+ var _a;
119
+ if (!timing) {
120
+ return '';
121
+ }
122
+ const builder = [];
123
+ if ((_a = timing.repeat) === null || _a === void 0 ? void 0 : _a.periodUnit) {
124
+ const frequency = timing.repeat.frequency || 1;
125
+ const period = timing.repeat.period || 1;
126
+ const periodUnit = timing.repeat.periodUnit;
127
+ if (frequency === 1 && period === 1) {
128
+ builder.push(unitAdverbForm[periodUnit]);
129
+ }
130
+ else {
131
+ if (frequency === 1) {
132
+ builder.push('once');
133
+ }
134
+ else {
135
+ builder.push(frequency + ' times');
136
+ }
137
+ if (period === 1) {
138
+ builder.push('per ' + singularUnits[periodUnit]);
139
+ }
140
+ else {
141
+ builder.push('per ' + period + ' ' + pluralUnits[periodUnit]);
142
+ }
143
+ }
144
+ if (timing.repeat.dayOfWeek) {
145
+ builder.push('on ' + timing.repeat.dayOfWeek.map(capitalize).join(', '));
146
+ }
147
+ if (timing.repeat.timeOfDay) {
148
+ builder.push('at ' + timing.repeat.timeOfDay.map((t) => formatTime(t)).join(', '));
149
+ }
150
+ }
151
+ if (timing.event) {
152
+ builder.push(timing.event.map((d) => formatDateTime(d)).join(', '));
153
+ }
154
+ return capitalize(builder.join(' ').trim());
155
+ }
49
156
 
50
- export { formatAddress, formatFamilyName, formatGivenName, formatHumanName };
157
+ export { formatAddress, formatDate, formatDateTime, formatFamilyName, formatGivenName, formatHumanName, formatPeriod, formatTime, formatTiming, isValidDate };
51
158
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sources":["../../src/format.ts"],"sourcesContent":["import { Address, HumanName } from '@medplum/fhirtypes';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\nexport function formatAddress(address: Address, options?: AddressFormatOptions): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city) {\n builder.push(address.city);\n }\n\n if (address.state) {\n builder.push(address.state);\n }\n\n if (address.postalCode) {\n builder.push(address.postalCode);\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(', ').trim();\n}\n\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && (options?.all || options?.prefix)) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && (options?.all || options?.suffix)) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n\nexport function formatGivenName(name: HumanName): string {\n const builder: string[] = [];\n if (name.given) {\n builder.push(...name.given);\n }\n return builder.join(' ').trim();\n}\n\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sources":["../../src/format.ts"],"sourcesContent":["import { Address, HumanName, Period, Timing } from '@medplum/fhirtypes';\nimport { capitalize } from './utils';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\nexport function formatAddress(address: Address, options?: AddressFormatOptions): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city) {\n builder.push(address.city);\n }\n\n if (address.state) {\n builder.push(address.state);\n }\n\n if (address.postalCode) {\n builder.push(address.postalCode);\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(', ').trim();\n}\n\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && (options?.all || options?.prefix)) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && (options?.all || options?.suffix)) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n\nexport function formatGivenName(name: HumanName): string {\n const builder: string[] = [];\n if (name.given) {\n builder.push(...name.given);\n }\n return builder.join(' ').trim();\n}\n\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\nexport function formatDate(date: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!date) {\n return '';\n }\n const d = new Date(date);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleDateString(undefined, options);\n}\n\nexport function formatTime(time: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!time) {\n return '';\n }\n const d = new Date('2000-01-01T' + time + 'Z');\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleTimeString(undefined, options);\n}\n\nexport function formatDateTime(dateTime: string | undefined, options?: Intl.DateTimeFormatOptions): string {\n if (!dateTime) {\n return '';\n }\n const d = new Date(dateTime);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleString(undefined, options);\n}\n\nexport function formatPeriod(period: Period | undefined): string {\n if (!period || (!period.start && !period.end)) {\n return '';\n }\n return formatDateTime(period.start) + ' - ' + formatDateTime(period.end);\n}\n\nconst unitAdverbForm: Record<string, string> = {\n s: 'every second',\n min: 'every minute',\n h: 'hourly',\n d: 'daily',\n wk: 'weekly',\n mo: 'monthly',\n a: 'annually',\n};\n\nconst singularUnits: Record<string, string> = {\n s: 'second',\n min: 'minute',\n h: 'hour',\n d: 'day',\n wk: 'week',\n mo: 'month',\n a: 'year',\n};\n\nconst pluralUnits: Record<string, string> = {\n s: 'seconds',\n min: 'minutes',\n h: 'hours',\n d: 'days',\n wk: 'weeks',\n mo: 'months',\n a: 'years',\n};\n\nexport function formatTiming(timing: Timing | undefined): string {\n if (!timing) {\n return '';\n }\n\n const builder: string[] = [];\n\n if (timing.repeat?.periodUnit) {\n const frequency = timing.repeat.frequency || 1;\n const period = timing.repeat.period || 1;\n const periodUnit = timing.repeat.periodUnit;\n\n if (frequency === 1 && period === 1) {\n builder.push(unitAdverbForm[periodUnit]);\n } else {\n if (frequency === 1) {\n builder.push('once');\n } else {\n builder.push(frequency + ' times');\n }\n\n if (period === 1) {\n builder.push('per ' + singularUnits[periodUnit]);\n } else {\n builder.push('per ' + period + ' ' + pluralUnits[periodUnit]);\n }\n }\n\n if (timing.repeat.dayOfWeek) {\n builder.push('on ' + timing.repeat.dayOfWeek.map(capitalize).join(', '));\n }\n\n if (timing.repeat.timeOfDay) {\n builder.push('at ' + timing.repeat.timeOfDay.map((t) => formatTime(t)).join(', '));\n }\n }\n\n if (timing.event) {\n builder.push(timing.event.map((d) => formatDateTime(d)).join(', '));\n }\n\n return capitalize(builder.join(' ').trim());\n}\n"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  export { LRUCache } from './cache.js';
2
2
  export { MedplumClient } from './client.js';
3
- export { formatAddress, formatFamilyName, formatGivenName, formatHumanName } from './format.js';
3
+ export { formatAddress, formatDate, formatDateTime, formatFamilyName, formatGivenName, formatHumanName, formatPeriod, formatTime, formatTiming, isValidDate } from './format.js';
4
4
  export { COMPONENT_SEPARATOR, FIELD_SEPARATOR, Hl7Field, Hl7Message, Hl7Segment, SEGMENT_SEPARATOR } from './hl7.js';
5
5
  export { parseJWTPayload } from './jwt.js';
6
- export { OperationOutcomeError, accessDenied, allOk, assertOk, badRequest, created, getStatus, gone, isGone, isNotFound, isOk, notFound, notModified } from './outcomes.js';
6
+ export { OperationOutcomeError, allOk, assertOk, badRequest, created, forbidden, getStatus, gone, isGone, isNotFound, isOk, normalizeErrorString, notFound, notModified, tooManyRequests, unauthorized } from './outcomes.js';
7
7
  export { ReadablePromise } from './readablepromise.js';
8
8
  export { DEFAULT_SEARCH_COUNT, Operator, formatSearchQuery, parseSearchDefinition } from './search.js';
9
9
  export { SearchParameterType, getExpressionForResourceType, getSearchParameterDetails } from './searchparams.js';
10
10
  export { PropertyType, buildTypeName, createSchema, createTypeSchema, getPropertyDisplayName, globalSchema, indexSearchParameter, indexStructureDefinition, indexStructureDefinitionBundle } from './types.js';
11
- export { arrayBufferToBase64, arrayBufferToHex, calculateAge, calculateAgeString, capitalize, createReference, deepEquals, findObservationInterval, findObservationReferenceRange, getCodeBySystem, getDateProperty, getDisplayString, getExtensionValue, getIdentifier, getImageSrc, getQuestionnaireAnswers, getReferenceString, isLowerCase, isObject, isProfileResource, isStringArray, isUUID, matchesRange, preciseEquals, preciseGreaterThan, preciseGreaterThanOrEquals, preciseLessThan, preciseLessThanOrEquals, resolveId, setCodeBySystem, stringify } from './utils.js';
11
+ export { arrayBufferToBase64, arrayBufferToHex, calculateAge, calculateAgeString, capitalize, createReference, deepClone, deepEquals, findObservationInterval, findObservationReferenceRange, getCodeBySystem, getDateProperty, getDisplayString, getExtensionValue, getIdentifier, getImageSrc, getQuestionnaireAnswers, getReferenceString, isLowerCase, isObject, isProfileResource, isStringArray, isUUID, matchesRange, preciseEquals, preciseGreaterThan, preciseGreaterThanOrEquals, preciseLessThan, preciseLessThanOrEquals, resolveId, setCodeBySystem, stringify } from './utils.js';
12
12
  export { AndAtom, ArithemticOperatorAtom, AsAtom, ConcatAtom, ContainsAtom, DotAtom, EmptySetAtom, EqualsAtom, EquivalentAtom, FhirPathAtom, FunctionAtom, InAtom, IndexerAtom, IsAtom, LiteralAtom, NotEqualsAtom, NotEquivalentAtom, OrAtom, SymbolAtom, UnaryOperatorAtom, UnionAtom, XorAtom } from './fhirpath/atoms.js';
13
13
  export { evalFhirPath, evalFhirPathTyped, parseFhirPath } from './fhirpath/parse.js';
14
14
  export { tokenize } from './fhirpath/tokenize.js';