@medplum/core 2.0.14 → 2.0.16

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 (61) hide show
  1. package/dist/cjs/index.cjs +1244 -1101
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.min.cjs +1 -1
  4. package/dist/esm/base64.mjs +33 -0
  5. package/dist/esm/base64.mjs.map +1 -0
  6. package/dist/esm/cache.mjs +17 -23
  7. package/dist/esm/cache.mjs.map +1 -1
  8. package/dist/esm/client.mjs +500 -413
  9. package/dist/esm/client.mjs.map +1 -1
  10. package/dist/esm/eventtarget.mjs +6 -11
  11. package/dist/esm/eventtarget.mjs.map +1 -1
  12. package/dist/esm/fhirlexer/parse.mjs +15 -23
  13. package/dist/esm/fhirlexer/parse.mjs.map +1 -1
  14. package/dist/esm/fhirlexer/tokenize.mjs +190 -180
  15. package/dist/esm/fhirlexer/tokenize.mjs.map +1 -1
  16. package/dist/esm/fhirmapper/parse.mjs +264 -252
  17. package/dist/esm/fhirmapper/parse.mjs.map +1 -1
  18. package/dist/esm/fhirmapper/tokenize.mjs +0 -1
  19. package/dist/esm/fhirmapper/tokenize.mjs.map +1 -1
  20. package/dist/esm/fhirpath/atoms.mjs +0 -1
  21. package/dist/esm/fhirpath/atoms.mjs.map +1 -1
  22. package/dist/esm/fhirpath/parse.mjs +0 -1
  23. package/dist/esm/fhirpath/parse.mjs.map +1 -1
  24. package/dist/esm/fhirpath/tokenize.mjs +0 -1
  25. package/dist/esm/fhirpath/tokenize.mjs.map +1 -1
  26. package/dist/esm/filter/parse.mjs +0 -2
  27. package/dist/esm/filter/parse.mjs.map +1 -1
  28. package/dist/esm/filter/tokenize.mjs +0 -1
  29. package/dist/esm/filter/tokenize.mjs.map +1 -1
  30. package/dist/esm/format.mjs +24 -15
  31. package/dist/esm/format.mjs.map +1 -1
  32. package/dist/esm/index.min.mjs +1 -1
  33. package/dist/esm/index.mjs +2 -2
  34. package/dist/esm/jwt.mjs +2 -9
  35. package/dist/esm/jwt.mjs.map +1 -1
  36. package/dist/esm/outcomes.mjs +15 -1
  37. package/dist/esm/outcomes.mjs.map +1 -1
  38. package/dist/esm/readablepromise.mjs +18 -23
  39. package/dist/esm/readablepromise.mjs.map +1 -1
  40. package/dist/esm/schema.mjs +146 -123
  41. package/dist/esm/schema.mjs.map +1 -1
  42. package/dist/esm/search/match.mjs +0 -2
  43. package/dist/esm/search/match.mjs.map +1 -1
  44. package/dist/esm/search/search.mjs +15 -9
  45. package/dist/esm/search/search.mjs.map +1 -1
  46. package/dist/esm/storage.mjs +13 -19
  47. package/dist/esm/storage.mjs.map +1 -1
  48. package/dist/types/base64.d.ts +14 -0
  49. package/dist/types/cache.d.ts +3 -1
  50. package/dist/types/client.d.ts +153 -1
  51. package/dist/types/eventtarget.d.ts +1 -1
  52. package/dist/types/fhirlexer/parse.d.ts +5 -2
  53. package/dist/types/fhirlexer/tokenize.d.ts +28 -1
  54. package/dist/types/format.d.ts +3 -1
  55. package/dist/types/outcomes.d.ts +1 -0
  56. package/dist/types/readablepromise.d.ts +4 -1
  57. package/dist/types/schema.d.ts +33 -1
  58. package/dist/types/storage.d.ts +2 -2
  59. package/package.json +1 -1
  60. package/dist/esm/node_modules/tslib/tslib.es6.mjs +0 -30
  61. package/dist/esm/node_modules/tslib/tslib.es6.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parse.mjs","sources":["../../../src/fhirmapper/parse.ts"],"sourcesContent":["import {\n StructureMap,\n StructureMapGroup,\n StructureMapGroupInput,\n StructureMapGroupRule,\n StructureMapGroupRuleDependent,\n StructureMapGroupRuleSource,\n StructureMapGroupRuleTarget,\n StructureMapStructure,\n} from '@medplum/fhirtypes';\nimport { Parser } from '../fhirlexer';\nimport { FunctionAtom, initFhirPathParserBuilder, LiteralAtom, OperatorPrecedence, SymbolAtom } from '../fhirpath';\nimport { tokenize } from './tokenize';\n\nclass StructureMapParser {\n readonly structureMap: StructureMap = { resourceType: 'StructureMap' };\n constructor(readonly parser: Parser) {}\n\n parse(): StructureMap {\n // 'map' url '=' identifier\n // map \"http://hl7.org/fhir/StructureMap/tutorial\" = tutorial\n this.parser.consume('Symbol', 'map');\n this.structureMap.url = this.parser.consume('String').value;\n this.parser.consume('=');\n this.structureMap.name = this.parser.consume().value;\n while (this.parser.hasMore()) {\n const next = this.parser.peek()?.value;\n switch (next) {\n case 'uses':\n this.#parseUses();\n break;\n case 'imports':\n this.#parseImport();\n break;\n case 'group':\n this.#parseGroup();\n break;\n case 'conceptmap':\n this.#parseConceptMap();\n break;\n default:\n throw new Error(`Unexpected token: ${next}`);\n }\n }\n return this.structureMap;\n }\n\n #parseUses(): void {\n // 'uses' url structureAlias? 'as' modelMode\n // uses \"http://hl7.org/fhir/StructureDefinition/tutorial-left\" as source\n this.parser.consume('Symbol', 'uses');\n const result: StructureMapStructure = {};\n result.url = this.parser.consume('String').value;\n if (this.parser.peek()?.value === 'alias') {\n this.parser.consume('Symbol', 'alias');\n result.alias = this.parser.consume('Symbol').value;\n }\n this.parser.consume('Symbol', 'as');\n result.mode = this.parser.consume().value as 'source' | 'queried' | 'target' | 'produced';\n if (!this.structureMap.structure) {\n this.structureMap.structure = [];\n }\n this.structureMap.structure.push(result);\n }\n\n #parseImport(): void {\n this.parser.consume('Symbol', 'imports');\n if (!this.structureMap.import) {\n this.structureMap.import = [];\n }\n this.structureMap.import.push(this.parser.consume('String').value);\n }\n\n #parseGroup(): void {\n // 'group' identifier parameters extends? typeMode? rules\n // group tutorial(source src : TLeft, target tgt : TRight) {\n const result: StructureMapGroup = {};\n this.parser.consume('Symbol', 'group');\n result.name = this.parser.consume('Symbol').value;\n result.input = this.#parseParameters();\n\n if (this.parser.peek()?.value === 'extends') {\n this.parser.consume('Symbol', 'extends');\n result.extends = this.parser.consume('Symbol').value;\n }\n\n if (this.parser.peek()?.value === '<<') {\n this.parser.consume('<<');\n result.typeMode = this.parser.consume().value as 'none' | 'types' | 'type-and-types';\n if (this.parser.peek()?.value === '+') {\n this.parser.consume('+');\n result.typeMode = 'type-and-types';\n }\n this.parser.consume('>>');\n } else {\n result.typeMode = 'none';\n }\n\n result.rule = this.#parseRules();\n\n if (!this.structureMap.group) {\n this.structureMap.group = [];\n }\n this.structureMap.group.push(result);\n }\n\n #parseParameters(): StructureMapGroupInput[] {\n const parameters: StructureMapGroupInput[] = [];\n this.parser.consume('(');\n while (this.parser.hasMore() && this.parser.peek()?.value !== ')') {\n parameters.push(this.#parseParameter());\n if (this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n }\n }\n this.parser.consume(')');\n return parameters;\n }\n\n #parseParameter(): StructureMapGroupInput {\n // inputMode identifier type?\n // ':' identifier\n // source src : TLeft\n const result: StructureMapGroupInput = {};\n result.mode = this.parser.consume().value as 'source' | 'target';\n result.name = this.parser.consume('Symbol').value;\n if (this.parser.peek()?.value === ':') {\n this.parser.consume(':');\n result.type = this.parser.consume('Symbol').value;\n }\n return result;\n }\n\n #parseRules(): StructureMapGroupRule[] {\n const rules = [];\n this.parser.consume('{');\n while (this.parser.hasMore() && this.parser.peek()?.value !== '}') {\n rules.push(this.#parseRule());\n }\n this.parser.consume('}');\n return rules;\n }\n\n #parseRule(): StructureMapGroupRule {\n const result: StructureMapGroupRule = {\n source: this.#parseRuleSources(),\n };\n\n if (this.parser.peek()?.value === '->') {\n this.parser.consume('->');\n result.target = this.#parseRuleTargets();\n }\n\n if (this.parser.peek()?.value === 'then') {\n this.parser.consume('Symbol', 'then');\n if (this.parser.peek()?.id === '{') {\n result.rule = this.#parseRules();\n } else {\n result.dependent = this.#parseRuleDependents();\n }\n }\n\n if (this.parser.peek()?.id === 'String') {\n result.name = this.parser.consume().value;\n } else {\n result.name = result.source?.[0]?.element;\n }\n\n this.parser.consume(';');\n return result;\n }\n\n #parseRuleSources(): StructureMapGroupRuleSource[] {\n const sources = [this.#parseRuleSource()];\n while (this.parser.hasMore() && this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n sources.push(this.#parseRuleSource());\n }\n return sources;\n }\n\n #parseRuleSource(): StructureMapGroupRuleSource {\n const result: StructureMapGroupRuleSource = {};\n\n const context = this.#parseRuleContext();\n if (context.includes('.')) {\n const parts = context.split('.');\n result.context = parts[0];\n result.element = parts[1];\n } else {\n result.context = context;\n }\n\n if (this.parser.hasMore() && this.parser.peek()?.value === ':') {\n this.parser.consume(':');\n result.type = this.parser.consume().value;\n }\n\n if (this.parser.hasMore() && this.parser.peek()?.value === 'default') {\n this.parser.consume('default');\n this.parser.consumeAndParse();\n }\n\n if (\n this.parser.peek()?.value === 'first' ||\n this.parser.peek()?.value === 'not_first' ||\n this.parser.peek()?.value === 'last' ||\n this.parser.peek()?.value === 'not_last' ||\n this.parser.peek()?.value === 'only_one'\n ) {\n result.listMode = this.parser.consume().value as 'first' | 'not_first' | 'last' | 'not_last' | 'only_one';\n }\n\n if (this.parser.peek()?.value === 'as') {\n this.parser.consume('Symbol', 'as');\n result.variable = this.parser.consume().value;\n }\n\n if (this.parser.peek()?.value === 'where') {\n this.parser.consume('Symbol', 'where');\n const whereFhirPath = this.parser.consumeAndParse(OperatorPrecedence.Arrow);\n result.condition = whereFhirPath.toString();\n }\n\n if (this.parser.peek()?.value === 'check') {\n this.parser.consume('Symbol', 'check');\n const checkFhirPath = this.parser.consumeAndParse(OperatorPrecedence.Arrow);\n result.check = checkFhirPath.toString();\n }\n\n return result;\n }\n\n #parseRuleTargets(): StructureMapGroupRuleTarget[] {\n const targets = [this.#parseRuleTarget()];\n while (this.parser.hasMore() && this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n targets.push(this.#parseRuleTarget());\n }\n return targets;\n }\n\n #parseRuleTarget(): StructureMapGroupRuleTarget {\n const result: StructureMapGroupRuleTarget = {};\n\n const context = this.#parseRuleContext();\n if (context.includes('.')) {\n const parts = context.split('.');\n result.contextType = 'variable';\n result.context = parts[0];\n result.element = parts[1];\n } else {\n result.context = context;\n }\n\n if (this.parser.peek()?.value === '=') {\n this.parser.consume('=');\n this.#parseRuleTargetTransform(result);\n }\n\n if (this.parser.peek()?.value === 'as') {\n this.parser.consume('Symbol', 'as');\n result.variable = this.parser.consume().value;\n }\n\n if (\n this.parser.peek()?.value === 'first' ||\n this.parser.peek()?.value === 'share' ||\n this.parser.peek()?.value === 'last' ||\n this.parser.peek()?.value === 'collate'\n ) {\n result.listMode = [this.parser.consume().value as 'first' | 'share' | 'last' | 'collate'];\n }\n\n return result;\n }\n\n #parseRuleTargetTransform(result: StructureMapGroupRuleTarget): void {\n result.transform = 'copy';\n\n const transformFhirPath = this.parser.consumeAndParse(OperatorPrecedence.As);\n if (transformFhirPath instanceof SymbolAtom) {\n this.#parseRuleTargetSymbol(result, transformFhirPath);\n } else if (transformFhirPath instanceof FunctionAtom) {\n this.#parseRuleTargetFunction(result, transformFhirPath);\n } else if (transformFhirPath instanceof LiteralAtom) {\n this.#parseRuleTargetLiteral(result, transformFhirPath);\n } else {\n throw new Error(`Unexpected FHIRPath: ${transformFhirPath}`);\n }\n }\n\n #parseRuleTargetSymbol(result: StructureMapGroupRuleTarget, literalAtom: SymbolAtom): void {\n result.parameter = [{ valueId: literalAtom.name }];\n }\n\n #parseRuleTargetFunction(result: StructureMapGroupRuleTarget, functionAtom: FunctionAtom): void {\n const functionName = functionAtom.name;\n switch (functionName) {\n case 'create':\n result.parameter = [\n {\n valueString: (functionAtom.args?.[0] as LiteralAtom).value.value as string,\n },\n ];\n break;\n\n case 'translate':\n result.parameter = [{}];\n break;\n\n default:\n throw new Error('Unknown target function: ' + functionName);\n }\n }\n\n #parseRuleTargetLiteral(result: StructureMapGroupRuleTarget, literalAtom: LiteralAtom): void {\n switch (literalAtom.value.type) {\n case 'boolean':\n result.parameter = [{ valueBoolean: literalAtom.value.value as boolean }];\n break;\n case 'decimal':\n result.parameter = [{ valueDecimal: literalAtom.value.value as number }];\n break;\n case 'string':\n result.parameter = [{ valueString: literalAtom.value.value as string }];\n break;\n default:\n throw new Error('Unknown target literal type: ' + literalAtom.value.type);\n }\n }\n\n #parseRuleContext(): string {\n let identifier = this.parser.consume().value;\n while (this.parser.peek()?.value === '.') {\n this.parser.consume('.');\n identifier += '.' + this.parser.consume().value;\n }\n return identifier;\n }\n\n #parseRuleDependents(): StructureMapGroupRuleDependent[] | undefined {\n const atom = this.parser.consumeAndParse(OperatorPrecedence.Arrow) as FunctionAtom;\n return [\n {\n name: atom.name,\n variable: atom.args.map((arg) => (arg as SymbolAtom).name),\n },\n ];\n }\n\n #parseConceptMap(): void {\n while (this.parser.peek()?.value !== '}') {\n this.parser.consume();\n }\n this.parser.consume('}');\n }\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder()\n .registerInfix('->', { precedence: OperatorPrecedence.Arrow })\n .registerInfix(';', { precedence: OperatorPrecedence.Semicolon });\n\n/**\n * Parses a FHIR Mapping Language document into an AST.\n * @param input The FHIR Mapping Language document to parse.\n * @returns The AST representing the document.\n */\nexport function parseMappingLanguage(input: string): StructureMap {\n const parser = fhirPathParserBuilder.construct(tokenize(input));\n parser.removeComments();\n return new StructureMapParser(parser).parse();\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcA,MAAM,kBAAkB,CAAA;AAEtB,IAAA,WAAA,CAAqB,MAAc,EAAA;;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAD1B,QAAA,IAAA,CAAA,YAAY,GAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;KAChC;IAEvC,KAAK,GAAA;;;QAGH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AACrD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;AACvC,YAAA,QAAQ,IAAI;AACV,gBAAA,KAAK,MAAM;AACT,oBAAA,sBAAA,CAAA,IAAI,EAAA,6BAAA,EAAA,GAAA,EAAA,6BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;oBAClB,MAAM;AACR,gBAAA,KAAK,SAAS;AACZ,oBAAA,sBAAA,CAAA,IAAI,EAAA,6BAAA,EAAA,GAAA,EAAA,+BAAA,CAAa,CAAjB,IAAA,CAAA,IAAI,CAAe,CAAC;oBACpB,MAAM;AACR,gBAAA,KAAK,OAAO;AACV,oBAAA,sBAAA,CAAA,IAAI,EAAA,6BAAA,EAAA,GAAA,EAAA,8BAAA,CAAY,CAAhB,IAAA,CAAA,IAAI,CAAc,CAAC;oBACnB,MAAM;AACR,gBAAA,KAAK,YAAY;AACf,oBAAA,sBAAA,CAAA,IAAI,EAAA,6BAAA,EAAA,GAAA,EAAA,mCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC;oBACxB,MAAM;AACR,gBAAA;AACE,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAA,CAAE,CAAC,CAAC;AAChD,aAAA;AACF,SAAA;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;AAwTF,CAAA;;;;IAnTG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAA0B,EAAE,CAAC;AACzC,IAAA,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO,EAAE;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AACpD,KAAA;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAqD,CAAC;AAC1F,IAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC;AAClC,KAAA;IACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC,EAAA,+BAAA,GAAA,SAAA,+BAAA,GAAA;IAGC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACzC,IAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;AAC/B,KAAA;AACD,IAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC,EAAA,8BAAA,GAAA,SAAA,8BAAA,GAAA;;;IAKC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,IAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IAClD,MAAM,CAAC,KAAK,GAAG,sBAAA,CAAA,IAAI,EAAiB,6BAAA,EAAA,GAAA,EAAA,mCAAA,CAAA,CAAA,IAAA,CAArB,IAAI,CAAmB,CAAC;IAEvC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,SAAS,EAAE;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACzC,QAAA,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AACtD,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAA4C,CAAC;QACrF,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,YAAA,MAAM,CAAC,QAAQ,GAAG,gBAAgB,CAAC;AACpC,SAAA;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3B,KAAA;AAAM,SAAA;AACL,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;AAC1B,KAAA;IAED,MAAM,CAAC,IAAI,GAAG,sBAAA,CAAA,IAAI,EAAY,6BAAA,EAAA,GAAA,EAAA,8BAAA,CAAA,CAAA,IAAA,CAAhB,IAAI,CAAc,CAAC;AAEjC,IAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC;AAC9B,KAAA;IACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC,EAAA,mCAAA,GAAA,SAAA,mCAAA,GAAA;IAGC,MAAM,UAAU,GAA6B,EAAE,CAAC;AAChD,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;QACjE,UAAU,CAAC,IAAI,CAAC,sBAAA,CAAA,IAAI,yEAAgB,CAApB,IAAA,CAAA,IAAI,CAAkB,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,SAAA;AACF,KAAA;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,IAAA,OAAO,UAAU,CAAC;AACpB,CAAC,EAAA,kCAAA,GAAA,SAAA,kCAAA,GAAA;;;;IAMC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAA4B,CAAC;AACjE,IAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AACnD,KAAA;AACD,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC,EAAA,8BAAA,GAAA,SAAA,8BAAA,GAAA;IAGC,MAAM,KAAK,GAAG,EAAE,CAAC;AACjB,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;QACjE,KAAK,CAAC,IAAI,CAAC,sBAAA,CAAA,IAAI,oEAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC,CAAC;AAC/B,KAAA;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC,EAAA,6BAAA,GAAA,SAAA,6BAAA,GAAA;AAGC,IAAA,MAAM,MAAM,GAA0B;AACpC,QAAA,MAAM,EAAE,sBAAA,CAAA,IAAI,EAAkB,6BAAA,EAAA,GAAA,EAAA,oCAAA,CAAA,CAAA,IAAA,CAAtB,IAAI,CAAoB;KACjC,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,GAAG,sBAAA,CAAA,IAAI,EAAkB,6BAAA,EAAA,GAAA,EAAA,oCAAA,CAAA,CAAA,IAAA,CAAtB,IAAI,CAAoB,CAAC;AAC1C,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,MAAM,EAAE;QACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE;YAClC,MAAM,CAAC,IAAI,GAAG,sBAAA,CAAA,IAAI,EAAY,6BAAA,EAAA,GAAA,EAAA,8BAAA,CAAA,CAAA,IAAA,CAAhB,IAAI,CAAc,CAAC;AAClC,SAAA;AAAM,aAAA;YACL,MAAM,CAAC,SAAS,GAAG,sBAAA,CAAA,IAAI,EAAqB,6BAAA,EAAA,GAAA,EAAA,uCAAA,CAAA,CAAA,IAAA,CAAzB,IAAI,CAAuB,CAAC;AAChD,SAAA;AACF,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,QAAQ,EAAE;QACvC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AAC3C,KAAA;AAAM,SAAA;AACL,QAAA,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;AAC3C,KAAA;AAED,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC,EAAA,oCAAA,GAAA,SAAA,oCAAA,GAAA;IAGC,MAAM,OAAO,GAAG,CAAC,sBAAA,CAAA,IAAI,0EAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC,CAAC;AAC1C,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACjE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,sBAAA,CAAA,IAAI,0EAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC,CAAC;AACvC,KAAA;AACD,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC,EAAA,mCAAA,GAAA,SAAA,mCAAA,GAAA;IAGC,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,MAAM,OAAO,GAAG,sBAAA,CAAA,IAAI,2EAAkB,CAAtB,IAAA,CAAA,IAAI,CAAoB,CAAC;AACzC,IAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,QAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,KAAA;AAAM,SAAA;AACL,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B,KAAA;AAED,IAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AAC9D,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AAC3C,KAAA;AAED,IAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,SAAS,EAAE;AACpE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;AAC/B,KAAA;IAED,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,WAAW;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,MAAM;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,UAAU;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,UAAU,EACxC;QACA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAiE,CAAC;AAC3G,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AAC/C,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO,EAAE;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,oCAA0B,CAAC;AAC5E,QAAA,MAAM,CAAC,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;AAC7C,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO,EAAE;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,oCAA0B,CAAC;AAC5E,QAAA,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;AACzC,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC,EAAA,oCAAA,GAAA,SAAA,oCAAA,GAAA;IAGC,MAAM,OAAO,GAAG,CAAC,sBAAA,CAAA,IAAI,0EAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC,CAAC;AAC1C,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACjE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,sBAAA,CAAA,IAAI,0EAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC,CAAC;AACvC,KAAA;AACD,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC,EAAA,mCAAA,GAAA,SAAA,mCAAA,GAAA;IAGC,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,MAAM,OAAO,GAAG,sBAAA,CAAA,IAAI,2EAAkB,CAAtB,IAAA,CAAA,IAAI,CAAoB,CAAC;AACzC,IAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,QAAA,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;AAChC,QAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,KAAA;AAAM,SAAA;AACL,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA,sBAAA,CAAA,IAAI,EAA0B,6BAAA,EAAA,GAAA,EAAA,4CAAA,CAAA,CAAA,IAAA,CAA9B,IAAI,EAA2B,MAAM,CAAC,CAAC;AACxC,KAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AAC/C,KAAA;IAED,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,OAAO;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,MAAM;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,SAAS,EACvC;AACA,QAAA,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAA+C,CAAC,CAAC;AAC3F,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC,uGAEyB,MAAmC,EAAA;AAC3D,IAAA,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;IAE1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,+BAAuB,CAAC;IAC7E,IAAI,iBAAiB,YAAY,UAAU,EAAE;QAC3C,sBAAA,CAAA,IAAI,gFAAuB,CAA3B,IAAA,CAAA,IAAI,EAAwB,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACxD,KAAA;SAAM,IAAI,iBAAiB,YAAY,YAAY,EAAE;QACpD,sBAAA,CAAA,IAAI,kFAAyB,CAA7B,IAAA,CAAA,IAAI,EAA0B,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAC1D,KAAA;SAAM,IAAI,iBAAiB,YAAY,WAAW,EAAE;QACnD,sBAAA,CAAA,IAAI,iFAAwB,CAA5B,IAAA,CAAA,IAAI,EAAyB,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACzD,KAAA;AAAM,SAAA;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,iBAAiB,CAAA,CAAE,CAAC,CAAC;AAC9D,KAAA;AACH,CAAC,EAAA,yCAAA,GAAA,SAAA,yCAAA,CAEsB,MAAmC,EAAE,WAAuB,EAAA;AACjF,IAAA,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC,EAAA,2CAAA,GAAA,SAAA,2CAAA,CAEwB,MAAmC,EAAE,YAA0B,EAAA;AACtF,IAAA,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC,IAAA,QAAQ,YAAY;AAClB,QAAA,KAAK,QAAQ;YACX,MAAM,CAAC,SAAS,GAAG;AACjB,gBAAA;AACE,oBAAA,WAAW,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAiB,EAAC,KAAK,CAAC,KAAe;AAC3E,iBAAA;aACF,CAAC;YACF,MAAM;AAER,QAAA,KAAK,WAAW;AACd,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM;AAER,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,YAAY,CAAC,CAAC;AAC/D,KAAA;AACH,CAAC,EAAA,0CAAA,GAAA,SAAA,0CAAA,CAEuB,MAAmC,EAAE,WAAwB,EAAA;AACnF,IAAA,QAAQ,WAAW,CAAC,KAAK,CAAC,IAAI;AAC5B,QAAA,KAAK,SAAS;AACZ,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,KAAgB,EAAE,CAAC,CAAC;YAC1E,MAAM;AACR,QAAA,KAAK,SAAS;AACZ,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,KAAe,EAAE,CAAC,CAAC;YACzE,MAAM;AACR,QAAA,KAAK,QAAQ;AACX,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,KAAe,EAAE,CAAC,CAAC;YACxE,MAAM;AACR,QAAA;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7E,KAAA;AACH,CAAC,EAAA,oCAAA,GAAA,SAAA,oCAAA,GAAA;IAGC,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;IAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AACjD,KAAA;AACD,IAAA,OAAO,UAAU,CAAC;AACpB,CAAC,EAAA,uCAAA,GAAA,SAAA,uCAAA,GAAA;IAGC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,oCAA0C,CAAC;IACnF,OAAO;AACL,QAAA;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAM,GAAkB,CAAC,IAAI,CAAC;AAC3D,SAAA;KACF,CAAC;AACJ,CAAC,EAAA,mCAAA,GAAA,SAAA,mCAAA,GAAA;IAGC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACvB,KAAA;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAA;AAGH,MAAM,qBAAqB,GAAG,yBAAyB,EAAE;AACtD,KAAA,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAA,GAAA,iCAA4B,CAAC;KAC7D,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAA8B,GAAA,qCAAE,CAAC,CAAC;AAEpE;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;AAChD;;;;"}
1
+ {"version":3,"file":"parse.mjs","sources":["../../../src/fhirmapper/parse.ts"],"sourcesContent":["import {\n StructureMap,\n StructureMapGroup,\n StructureMapGroupInput,\n StructureMapGroupRule,\n StructureMapGroupRuleDependent,\n StructureMapGroupRuleSource,\n StructureMapGroupRuleTarget,\n StructureMapStructure,\n} from '@medplum/fhirtypes';\nimport { Parser } from '../fhirlexer';\nimport { FunctionAtom, initFhirPathParserBuilder, LiteralAtom, OperatorPrecedence, SymbolAtom } from '../fhirpath';\nimport { tokenize } from './tokenize';\n\nclass StructureMapParser {\n readonly structureMap: StructureMap = { resourceType: 'StructureMap' };\n constructor(readonly parser: Parser) {}\n\n parse(): StructureMap {\n // 'map' url '=' identifier\n // map \"http://hl7.org/fhir/StructureMap/tutorial\" = tutorial\n this.parser.consume('Symbol', 'map');\n this.structureMap.url = this.parser.consume('String').value;\n this.parser.consume('=');\n this.structureMap.name = this.parser.consume().value;\n while (this.parser.hasMore()) {\n const next = this.parser.peek()?.value;\n switch (next) {\n case 'uses':\n this.parseUses();\n break;\n case 'imports':\n this.parseImport();\n break;\n case 'group':\n this.parseGroup();\n break;\n case 'conceptmap':\n this.parseConceptMap();\n break;\n default:\n throw new Error(`Unexpected token: ${next}`);\n }\n }\n return this.structureMap;\n }\n\n private parseUses(): void {\n // 'uses' url structureAlias? 'as' modelMode\n // uses \"http://hl7.org/fhir/StructureDefinition/tutorial-left\" as source\n this.parser.consume('Symbol', 'uses');\n const result: StructureMapStructure = {};\n result.url = this.parser.consume('String').value;\n if (this.parser.peek()?.value === 'alias') {\n this.parser.consume('Symbol', 'alias');\n result.alias = this.parser.consume('Symbol').value;\n }\n this.parser.consume('Symbol', 'as');\n result.mode = this.parser.consume().value as 'source' | 'queried' | 'target' | 'produced';\n if (!this.structureMap.structure) {\n this.structureMap.structure = [];\n }\n this.structureMap.structure.push(result);\n }\n\n private parseImport(): void {\n this.parser.consume('Symbol', 'imports');\n if (!this.structureMap.import) {\n this.structureMap.import = [];\n }\n this.structureMap.import.push(this.parser.consume('String').value);\n }\n\n private parseGroup(): void {\n // 'group' identifier parameters extends? typeMode? rules\n // group tutorial(source src : TLeft, target tgt : TRight) {\n const result: StructureMapGroup = {};\n this.parser.consume('Symbol', 'group');\n result.name = this.parser.consume('Symbol').value;\n result.input = this.parseParameters();\n\n if (this.parser.peek()?.value === 'extends') {\n this.parser.consume('Symbol', 'extends');\n result.extends = this.parser.consume('Symbol').value;\n }\n\n if (this.parser.peek()?.value === '<<') {\n this.parser.consume('<<');\n result.typeMode = this.parser.consume().value as 'none' | 'types' | 'type-and-types';\n if (this.parser.peek()?.value === '+') {\n this.parser.consume('+');\n result.typeMode = 'type-and-types';\n }\n this.parser.consume('>>');\n } else {\n result.typeMode = 'none';\n }\n\n result.rule = this.parseRules();\n\n if (!this.structureMap.group) {\n this.structureMap.group = [];\n }\n this.structureMap.group.push(result);\n }\n\n private parseParameters(): StructureMapGroupInput[] {\n const parameters: StructureMapGroupInput[] = [];\n this.parser.consume('(');\n while (this.parser.hasMore() && this.parser.peek()?.value !== ')') {\n parameters.push(this.parseParameter());\n if (this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n }\n }\n this.parser.consume(')');\n return parameters;\n }\n\n private parseParameter(): StructureMapGroupInput {\n // inputMode identifier type?\n // ':' identifier\n // source src : TLeft\n const result: StructureMapGroupInput = {};\n result.mode = this.parser.consume().value as 'source' | 'target';\n result.name = this.parser.consume('Symbol').value;\n if (this.parser.peek()?.value === ':') {\n this.parser.consume(':');\n result.type = this.parser.consume('Symbol').value;\n }\n return result;\n }\n\n private parseRules(): StructureMapGroupRule[] {\n const rules = [];\n this.parser.consume('{');\n while (this.parser.hasMore() && this.parser.peek()?.value !== '}') {\n rules.push(this.parseRule());\n }\n this.parser.consume('}');\n return rules;\n }\n\n private parseRule(): StructureMapGroupRule {\n const result: StructureMapGroupRule = {\n source: this.parseRuleSources(),\n };\n\n if (this.parser.peek()?.value === '->') {\n this.parser.consume('->');\n result.target = this.parseRuleTargets();\n }\n\n if (this.parser.peek()?.value === 'then') {\n this.parser.consume('Symbol', 'then');\n if (this.parser.peek()?.id === '{') {\n result.rule = this.parseRules();\n } else {\n result.dependent = this.parseRuleDependents();\n }\n }\n\n if (this.parser.peek()?.id === 'String') {\n result.name = this.parser.consume().value;\n } else {\n result.name = result.source?.[0]?.element;\n }\n\n this.parser.consume(';');\n return result;\n }\n\n private parseRuleSources(): StructureMapGroupRuleSource[] {\n const sources = [this.parseRuleSource()];\n while (this.parser.hasMore() && this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n sources.push(this.parseRuleSource());\n }\n return sources;\n }\n\n private parseRuleSource(): StructureMapGroupRuleSource {\n const result: StructureMapGroupRuleSource = {};\n\n const context = this.parseRuleContext();\n if (context.includes('.')) {\n const parts = context.split('.');\n result.context = parts[0];\n result.element = parts[1];\n } else {\n result.context = context;\n }\n\n if (this.parser.hasMore() && this.parser.peek()?.value === ':') {\n this.parser.consume(':');\n result.type = this.parser.consume().value;\n }\n\n if (this.parser.hasMore() && this.parser.peek()?.value === 'default') {\n this.parser.consume('default');\n this.parser.consumeAndParse();\n }\n\n if (\n this.parser.peek()?.value === 'first' ||\n this.parser.peek()?.value === 'not_first' ||\n this.parser.peek()?.value === 'last' ||\n this.parser.peek()?.value === 'not_last' ||\n this.parser.peek()?.value === 'only_one'\n ) {\n result.listMode = this.parser.consume().value as 'first' | 'not_first' | 'last' | 'not_last' | 'only_one';\n }\n\n if (this.parser.peek()?.value === 'as') {\n this.parser.consume('Symbol', 'as');\n result.variable = this.parser.consume().value;\n }\n\n if (this.parser.peek()?.value === 'where') {\n this.parser.consume('Symbol', 'where');\n const whereFhirPath = this.parser.consumeAndParse(OperatorPrecedence.Arrow);\n result.condition = whereFhirPath.toString();\n }\n\n if (this.parser.peek()?.value === 'check') {\n this.parser.consume('Symbol', 'check');\n const checkFhirPath = this.parser.consumeAndParse(OperatorPrecedence.Arrow);\n result.check = checkFhirPath.toString();\n }\n\n return result;\n }\n\n private parseRuleTargets(): StructureMapGroupRuleTarget[] {\n const targets = [this.parseRuleTarget()];\n while (this.parser.hasMore() && this.parser.peek()?.value === ',') {\n this.parser.consume(',');\n targets.push(this.parseRuleTarget());\n }\n return targets;\n }\n\n private parseRuleTarget(): StructureMapGroupRuleTarget {\n const result: StructureMapGroupRuleTarget = {};\n\n const context = this.parseRuleContext();\n if (context.includes('.')) {\n const parts = context.split('.');\n result.contextType = 'variable';\n result.context = parts[0];\n result.element = parts[1];\n } else {\n result.context = context;\n }\n\n if (this.parser.peek()?.value === '=') {\n this.parser.consume('=');\n this.parseRuleTargetTransform(result);\n }\n\n if (this.parser.peek()?.value === 'as') {\n this.parser.consume('Symbol', 'as');\n result.variable = this.parser.consume().value;\n }\n\n if (\n this.parser.peek()?.value === 'first' ||\n this.parser.peek()?.value === 'share' ||\n this.parser.peek()?.value === 'last' ||\n this.parser.peek()?.value === 'collate'\n ) {\n result.listMode = [this.parser.consume().value as 'first' | 'share' | 'last' | 'collate'];\n }\n\n return result;\n }\n\n private parseRuleTargetTransform(result: StructureMapGroupRuleTarget): void {\n result.transform = 'copy';\n\n const transformFhirPath = this.parser.consumeAndParse(OperatorPrecedence.As);\n if (transformFhirPath instanceof SymbolAtom) {\n this.parseRuleTargetSymbol(result, transformFhirPath);\n } else if (transformFhirPath instanceof FunctionAtom) {\n this.parseRuleTargetFunction(result, transformFhirPath);\n } else if (transformFhirPath instanceof LiteralAtom) {\n this.parseRuleTargetLiteral(result, transformFhirPath);\n } else {\n throw new Error(`Unexpected FHIRPath: ${transformFhirPath}`);\n }\n }\n\n private parseRuleTargetSymbol(result: StructureMapGroupRuleTarget, literalAtom: SymbolAtom): void {\n result.parameter = [{ valueId: literalAtom.name }];\n }\n\n private parseRuleTargetFunction(result: StructureMapGroupRuleTarget, functionAtom: FunctionAtom): void {\n const functionName = functionAtom.name;\n switch (functionName) {\n case 'create':\n result.parameter = [\n {\n valueString: (functionAtom.args?.[0] as LiteralAtom).value.value as string,\n },\n ];\n break;\n\n case 'translate':\n result.parameter = [{}];\n break;\n\n default:\n throw new Error('Unknown target function: ' + functionName);\n }\n }\n\n private parseRuleTargetLiteral(result: StructureMapGroupRuleTarget, literalAtom: LiteralAtom): void {\n switch (literalAtom.value.type) {\n case 'boolean':\n result.parameter = [{ valueBoolean: literalAtom.value.value as boolean }];\n break;\n case 'decimal':\n result.parameter = [{ valueDecimal: literalAtom.value.value as number }];\n break;\n case 'string':\n result.parameter = [{ valueString: literalAtom.value.value as string }];\n break;\n default:\n throw new Error('Unknown target literal type: ' + literalAtom.value.type);\n }\n }\n\n private parseRuleContext(): string {\n let identifier = this.parser.consume().value;\n while (this.parser.peek()?.value === '.') {\n this.parser.consume('.');\n identifier += '.' + this.parser.consume().value;\n }\n return identifier;\n }\n\n private parseRuleDependents(): StructureMapGroupRuleDependent[] | undefined {\n const atom = this.parser.consumeAndParse(OperatorPrecedence.Arrow) as FunctionAtom;\n return [\n {\n name: atom.name,\n variable: atom.args.map((arg) => (arg as SymbolAtom).name),\n },\n ];\n }\n\n private parseConceptMap(): void {\n while (this.parser.peek()?.value !== '}') {\n this.parser.consume();\n }\n this.parser.consume('}');\n }\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder()\n .registerInfix('->', { precedence: OperatorPrecedence.Arrow })\n .registerInfix(';', { precedence: OperatorPrecedence.Semicolon });\n\n/**\n * Parses a FHIR Mapping Language document into an AST.\n * @param input The FHIR Mapping Language document to parse.\n * @returns The AST representing the document.\n */\nexport function parseMappingLanguage(input: string): StructureMap {\n const parser = fhirPathParserBuilder.construct(tokenize(input));\n parser.removeComments();\n return new StructureMapParser(parser).parse();\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import '../fhirlexer/parse.mjs';
2
1
  import { Tokenizer } from '../fhirlexer/tokenize.mjs';
3
2
  import '../types.mjs';
4
3
  import '../utils.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirmapper/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\nimport { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS } from '../fhirpath';\n\nconst MAPPING_LANGUAGE_OPERATORS = [...FHIRPATH_OPERATORS, '->', '<<', '>>'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, MAPPING_LANGUAGE_OPERATORS).tokenize();\n}\n"],"names":[],"mappings":";;;;;;;AAGA,MAAM,0BAA0B,GAAG,CAAC,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvE,SAAU,QAAQ,CAAC,GAAW,EAAA;AAClC,IAAA,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,0BAA0B,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtF;;;;"}
1
+ {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirmapper/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\nimport { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS } from '../fhirpath';\n\nconst MAPPING_LANGUAGE_OPERATORS = [...FHIRPATH_OPERATORS, '->', '<<', '>>'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, MAPPING_LANGUAGE_OPERATORS).tokenize();\n}\n"],"names":[],"mappings":";;;;;;AAGA,MAAM,0BAA0B,GAAG,CAAC,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvE,SAAU,QAAQ,CAAC,GAAW,EAAA;AAClC,IAAA,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,0BAA0B,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtF;;;;"}
@@ -1,5 +1,4 @@
1
1
  import { PrefixOperatorAtom, InfixOperatorAtom } from '../fhirlexer/parse.mjs';
2
- import '../fhirlexer/tokenize.mjs';
3
2
  import { isResource, PropertyType } from '../types.mjs';
4
3
  import { functions } from './functions.mjs';
5
4
  import { getTypedPropertyValue, isQuantity, booleanToTypedValue, toTypedValue, removeDuplicates, fhirPathArrayEquals, fhirPathNot, fhirPathArrayEquivalent, fhirPathIs, toJsBoolean } from './utils.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"atoms.mjs","sources":["../../../src/fhirpath/atoms.ts"],"sourcesContent":["import { Atom, InfixOperatorAtom, PrefixOperatorAtom } from '../fhirlexer';\nimport { PropertyType, TypedValue, isResource } from '../types';\nimport { functions } from './functions';\nimport {\n booleanToTypedValue,\n fhirPathArrayEquals,\n fhirPathArrayEquivalent,\n fhirPathIs,\n fhirPathNot,\n getTypedPropertyValue,\n isQuantity,\n removeDuplicates,\n toJsBoolean,\n toTypedValue,\n} from './utils';\n\nexport class FhirPathAtom implements Atom {\n constructor(public readonly original: string, public readonly child: Atom) {}\n\n eval(context: TypedValue[]): TypedValue[] {\n try {\n if (context.length > 0) {\n return context.map((e) => this.child.eval([e])).flat();\n } else {\n return this.child.eval([]);\n }\n } catch (error) {\n throw new Error(`FhirPathError on \"${this.original}\": ${error}`);\n }\n }\n\n toString(): string {\n return this.child.toString();\n }\n}\n\nexport class LiteralAtom implements Atom {\n constructor(public readonly value: TypedValue) {}\n eval(): TypedValue[] {\n return [this.value];\n }\n\n toString(): string {\n const value = this.value.value;\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n return value.toString();\n }\n}\n\nexport class SymbolAtom implements Atom {\n constructor(public readonly name: string) {}\n eval(context: TypedValue[]): TypedValue[] {\n if (this.name === '$this') {\n return context;\n }\n return context.flatMap((e) => this.evalValue(e)).filter((e) => e?.value !== undefined) as TypedValue[];\n }\n\n private evalValue(typedValue: TypedValue): TypedValue[] | TypedValue | undefined {\n const input = typedValue.value;\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n if (isResource(input) && input.resourceType === this.name) {\n return typedValue;\n }\n\n return getTypedPropertyValue(typedValue, this.name);\n }\n\n toString(): string {\n return this.name;\n }\n}\n\nexport class EmptySetAtom implements Atom {\n eval(): [] {\n return [];\n }\n\n toString(): string {\n return '{}';\n }\n}\n\nexport class UnaryOperatorAtom extends PrefixOperatorAtom {\n constructor(operator: string, child: Atom, public readonly impl: (x: TypedValue[]) => TypedValue[]) {\n super(operator, child);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return this.impl(this.child.eval(context));\n }\n\n toString(): string {\n return this.child.toString();\n }\n}\n\nexport class AsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('as', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return functions.ofType(this.left.eval(context), this.right);\n }\n}\n\nexport class ArithemticOperatorAtom extends InfixOperatorAtom {\n constructor(\n operator: string,\n left: Atom,\n right: Atom,\n public readonly impl: (x: number, y: number) => number | boolean\n ) {\n super(operator, left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftEvalResult = this.left.eval(context);\n if (leftEvalResult.length !== 1) {\n return [];\n }\n const rightEvalResult = this.right.eval(context);\n if (rightEvalResult.length !== 1) {\n return [];\n }\n const leftValue = leftEvalResult[0].value;\n const rightValue = rightEvalResult[0].value;\n const leftNumber = isQuantity(leftValue) ? leftValue.value : leftValue;\n const rightNumber = isQuantity(rightValue) ? rightValue.value : rightValue;\n const result = this.impl(leftNumber, rightNumber);\n if (typeof result === 'boolean') {\n return booleanToTypedValue(result);\n } else if (isQuantity(leftValue)) {\n return [{ type: PropertyType.Quantity, value: { ...leftValue, value: result } }];\n } else {\n return [toTypedValue(result)];\n }\n }\n}\n\nexport class ConcatAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('&', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n const result = [...leftValue, ...rightValue];\n if (result.length > 0 && result.every((e) => typeof e.value === 'string')) {\n return [{ type: PropertyType.string, value: result.map((e) => e.value as string).join('') }];\n }\n return result;\n }\n}\n\nexport class ContainsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('contains', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return booleanToTypedValue(leftValue.some((e) => e.value === rightValue[0].value));\n }\n}\n\nexport class InAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('in', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return booleanToTypedValue(rightValue.some((e) => e.value === leftValue[0].value));\n }\n}\n\nexport class DotAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('.', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return this.right.eval(this.left.eval(context));\n }\n\n toString(): string {\n return `${this.left.toString()}.${this.right.toString()}`;\n }\n}\n\nexport class UnionAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('|', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context);\n const rightResult = this.right.eval(context);\n return removeDuplicates([...leftResult, ...rightResult]);\n }\n}\n\nexport class EqualsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('=', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathArrayEquals(leftValue, rightValue);\n }\n}\n\nexport class NotEqualsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('!=', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathNot(fhirPathArrayEquals(leftValue, rightValue));\n }\n}\n\nexport class EquivalentAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('~', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathArrayEquivalent(leftValue, rightValue);\n }\n}\n\nexport class NotEquivalentAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('!~', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathNot(fhirPathArrayEquivalent(leftValue, rightValue));\n }\n}\n\nexport class IsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('is', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n if (leftValue.length !== 1) {\n return [];\n }\n const typeName = (this.right as SymbolAtom).name;\n return booleanToTypedValue(fhirPathIs(leftValue[0], typeName));\n }\n}\n\n/**\n * 6.5.1. and\n * Returns true if both operands evaluate to true,\n * false if either operand evaluates to false,\n * and the empty collection otherwise.\n */\nexport class AndAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('and', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n if (leftValue[0]?.value === true && rightValue[0]?.value === true) {\n return booleanToTypedValue(true);\n }\n if (leftValue[0]?.value === false || rightValue[0]?.value === false) {\n return booleanToTypedValue(false);\n }\n return [];\n }\n}\n\nexport class OrAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('or', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n if (toJsBoolean(leftValue)) {\n return leftValue;\n }\n\n const rightValue = this.right.eval(context);\n if (toJsBoolean(rightValue)) {\n return rightValue;\n }\n\n return [];\n }\n}\n\n/**\n * 6.5.4. xor\n * Returns true if exactly one of the operands evaluates to true,\n * false if either both operands evaluate to true or both operands evaluate to false,\n * and the empty collection otherwise.\n */\nexport class XorAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('xor', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context);\n const rightResult = this.right.eval(context);\n if (leftResult.length === 0 && rightResult.length === 0) {\n return [];\n }\n const leftValue = leftResult.length === 0 ? null : leftResult[0].value;\n const rightValue = rightResult.length === 0 ? null : rightResult[0].value;\n if ((leftValue === true && rightValue !== true) || (leftValue !== true && rightValue === true)) {\n return booleanToTypedValue(true);\n }\n if ((leftValue === true && rightValue === true) || (leftValue === false && rightValue === false)) {\n return booleanToTypedValue(false);\n }\n return [];\n }\n}\n\nexport class FunctionAtom implements Atom {\n constructor(public readonly name: string, public readonly args: Atom[]) {}\n eval(context: TypedValue[]): TypedValue[] {\n const impl = functions[this.name];\n if (!impl) {\n throw new Error('Unrecognized function: ' + this.name);\n }\n return impl(context, ...this.args);\n }\n\n toString(): string {\n return `${this.name}(${this.args.map((arg) => arg.toString()).join(', ')})`;\n }\n}\n\nexport class IndexerAtom implements Atom {\n constructor(public readonly left: Atom, public readonly expr: Atom) {}\n eval(context: TypedValue[]): TypedValue[] {\n const evalResult = this.expr.eval(context);\n if (evalResult.length !== 1) {\n return [];\n }\n const index = evalResult[0].value;\n if (typeof index !== 'number') {\n throw new Error(`Invalid indexer expression: should return integer}`);\n }\n const leftResult = this.left.eval(context);\n if (!(index in leftResult)) {\n return [];\n }\n return [leftResult[index]];\n }\n\n toString(): string {\n return `${this.left.toString()}[${this.expr.toString()}]`;\n }\n}\n"],"names":[],"mappings":";;;;;;MAgBa,YAAY,CAAA;IACvB,WAA4B,CAAA,QAAgB,EAAkB,KAAW,EAAA;QAA7C,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;QAAkB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAM;KAAI;AAE7E,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,IAAI;AACF,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,aAAA;AAAM,iBAAA;gBACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,aAAA;AACF,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,CAAqB,kBAAA,EAAA,IAAI,CAAC,QAAQ,CAAM,GAAA,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;AAClE,SAAA;KACF;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9B;AACF,CAAA;MAEY,WAAW,CAAA;AACtB,IAAA,WAAA,CAA4B,KAAiB,EAAA;QAAjB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;KAAI;IACjD,IAAI,GAAA;AACF,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACrB;IAED,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAC;AACrB,SAAA;AACD,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KACzB;AACF,CAAA;MAEY,UAAU,CAAA;AACrB,IAAA,WAAA,CAA4B,IAAY,EAAA;QAAZ,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAAI;AAC5C,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;AACzB,YAAA,OAAO,OAAO,CAAC;AAChB,SAAA;AACD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,SAAS,CAAiB,CAAC;KACxG;AAEO,IAAA,SAAS,CAAC,UAAsB,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE;AACzD,YAAA,OAAO,UAAU,CAAC;AACnB,SAAA;QAED,OAAO,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KACrD;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;AACF,CAAA;MAEY,YAAY,CAAA;IACvB,IAAI,GAAA;AACF,QAAA,OAAO,EAAE,CAAC;KACX;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC;KACb;AACF,CAAA;AAEK,MAAO,iBAAkB,SAAQ,kBAAkB,CAAA;AACvD,IAAA,WAAA,CAAY,QAAgB,EAAE,KAAW,EAAkB,IAAuC,EAAA;AAChG,QAAA,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QADkC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAmC;KAEjG;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KAC5C;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9B;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9D;AACF,CAAA;AAEK,MAAO,sBAAuB,SAAQ,iBAAiB,CAAA;AAC3D,IAAA,WAAA,CACE,QAAgB,EAChB,IAAU,EACV,KAAW,EACK,IAAgD,EAAA;AAEhE,QAAA,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAFb,IAAI,CAAA,IAAA,GAAJ,IAAI,CAA4C;KAGjE;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,QAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjD,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;AACvE,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAClD,QAAA,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;AAC/B,YAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,SAAA;AAAM,aAAA,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE;YAChC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAClF,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,SAAA;KACF;AACF,CAAA;AAEK,MAAO,UAAW,SAAQ,iBAAiB,CAAA;IAC/C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE;AACzE,YAAA,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9F,SAAA;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AACF,CAAA;AAEK,MAAO,YAAa,SAAQ,iBAAiB,CAAA;IACjD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAChC;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACpF;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACpF;AACF,CAAA;AAEK,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KACjD;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC3D;AACF,CAAA;AAEK,MAAO,SAAU,SAAQ,iBAAiB,CAAA;IAC9C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,gBAAgB,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;KAC1D;AACF,CAAA;AAEK,MAAO,UAAW,SAAQ,iBAAiB,CAAA;IAC/C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,OAAO,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KACnD;AACF,CAAA;AAEK,MAAO,aAAc,SAAQ,iBAAiB,CAAA;IAClD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;KAChE;AACF,CAAA;AAEK,MAAO,cAAe,SAAQ,iBAAiB,CAAA;IACnD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,OAAO,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KACvD;AACF,CAAA;AAEK,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;IACtD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;KACpE;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAoB,CAAC,IAAI,CAAC;AACjD,QAAA,OAAO,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;KAChE;AACF,CAAA;AAED;;;;;AAKG;AACG,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE;AACjE,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAClC,SAAA;AACD,QAAA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,EAAE;AACnE,YAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;AAC1B,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE;AAC3B,YAAA,OAAO,UAAU,CAAC;AACnB,SAAA;AAED,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;AAED;;;;;AAKG;AACG,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AACvD,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1E,QAAA,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,EAAE;AAC9F,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAClC,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,MAAM,SAAS,KAAK,KAAK,IAAI,UAAU,KAAK,KAAK,CAAC,EAAE;AAChG,YAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;MAEY,YAAY,CAAA;IACvB,WAA4B,CAAA,IAAY,EAAkB,IAAY,EAAA;QAA1C,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QAAkB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAAI;AAC1E,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,SAAA;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;KACpC;IAED,QAAQ,GAAA;QACN,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;KAC7E;AACF,CAAA;MAEY,WAAW,CAAA;IACtB,WAA4B,CAAA,IAAU,EAAkB,IAAU,EAAA;QAAtC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAM;QAAkB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAM;KAAI;AACtE,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kDAAA,CAAoD,CAAC,CAAC;AACvE,SAAA;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,QAAA,IAAI,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;KAC5B;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;KAC3D;AACF;;;;"}
1
+ {"version":3,"file":"atoms.mjs","sources":["../../../src/fhirpath/atoms.ts"],"sourcesContent":["import { Atom, InfixOperatorAtom, PrefixOperatorAtom } from '../fhirlexer';\nimport { PropertyType, TypedValue, isResource } from '../types';\nimport { functions } from './functions';\nimport {\n booleanToTypedValue,\n fhirPathArrayEquals,\n fhirPathArrayEquivalent,\n fhirPathIs,\n fhirPathNot,\n getTypedPropertyValue,\n isQuantity,\n removeDuplicates,\n toJsBoolean,\n toTypedValue,\n} from './utils';\n\nexport class FhirPathAtom implements Atom {\n constructor(public readonly original: string, public readonly child: Atom) {}\n\n eval(context: TypedValue[]): TypedValue[] {\n try {\n if (context.length > 0) {\n return context.map((e) => this.child.eval([e])).flat();\n } else {\n return this.child.eval([]);\n }\n } catch (error) {\n throw new Error(`FhirPathError on \"${this.original}\": ${error}`);\n }\n }\n\n toString(): string {\n return this.child.toString();\n }\n}\n\nexport class LiteralAtom implements Atom {\n constructor(public readonly value: TypedValue) {}\n eval(): TypedValue[] {\n return [this.value];\n }\n\n toString(): string {\n const value = this.value.value;\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n return value.toString();\n }\n}\n\nexport class SymbolAtom implements Atom {\n constructor(public readonly name: string) {}\n eval(context: TypedValue[]): TypedValue[] {\n if (this.name === '$this') {\n return context;\n }\n return context.flatMap((e) => this.evalValue(e)).filter((e) => e?.value !== undefined) as TypedValue[];\n }\n\n private evalValue(typedValue: TypedValue): TypedValue[] | TypedValue | undefined {\n const input = typedValue.value;\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n if (isResource(input) && input.resourceType === this.name) {\n return typedValue;\n }\n\n return getTypedPropertyValue(typedValue, this.name);\n }\n\n toString(): string {\n return this.name;\n }\n}\n\nexport class EmptySetAtom implements Atom {\n eval(): [] {\n return [];\n }\n\n toString(): string {\n return '{}';\n }\n}\n\nexport class UnaryOperatorAtom extends PrefixOperatorAtom {\n constructor(operator: string, child: Atom, public readonly impl: (x: TypedValue[]) => TypedValue[]) {\n super(operator, child);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return this.impl(this.child.eval(context));\n }\n\n toString(): string {\n return this.child.toString();\n }\n}\n\nexport class AsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('as', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return functions.ofType(this.left.eval(context), this.right);\n }\n}\n\nexport class ArithemticOperatorAtom extends InfixOperatorAtom {\n constructor(\n operator: string,\n left: Atom,\n right: Atom,\n public readonly impl: (x: number, y: number) => number | boolean\n ) {\n super(operator, left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftEvalResult = this.left.eval(context);\n if (leftEvalResult.length !== 1) {\n return [];\n }\n const rightEvalResult = this.right.eval(context);\n if (rightEvalResult.length !== 1) {\n return [];\n }\n const leftValue = leftEvalResult[0].value;\n const rightValue = rightEvalResult[0].value;\n const leftNumber = isQuantity(leftValue) ? leftValue.value : leftValue;\n const rightNumber = isQuantity(rightValue) ? rightValue.value : rightValue;\n const result = this.impl(leftNumber, rightNumber);\n if (typeof result === 'boolean') {\n return booleanToTypedValue(result);\n } else if (isQuantity(leftValue)) {\n return [{ type: PropertyType.Quantity, value: { ...leftValue, value: result } }];\n } else {\n return [toTypedValue(result)];\n }\n }\n}\n\nexport class ConcatAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('&', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n const result = [...leftValue, ...rightValue];\n if (result.length > 0 && result.every((e) => typeof e.value === 'string')) {\n return [{ type: PropertyType.string, value: result.map((e) => e.value as string).join('') }];\n }\n return result;\n }\n}\n\nexport class ContainsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('contains', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return booleanToTypedValue(leftValue.some((e) => e.value === rightValue[0].value));\n }\n}\n\nexport class InAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('in', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return booleanToTypedValue(rightValue.some((e) => e.value === leftValue[0].value));\n }\n}\n\nexport class DotAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('.', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n return this.right.eval(this.left.eval(context));\n }\n\n toString(): string {\n return `${this.left.toString()}.${this.right.toString()}`;\n }\n}\n\nexport class UnionAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('|', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context);\n const rightResult = this.right.eval(context);\n return removeDuplicates([...leftResult, ...rightResult]);\n }\n}\n\nexport class EqualsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('=', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathArrayEquals(leftValue, rightValue);\n }\n}\n\nexport class NotEqualsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('!=', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathNot(fhirPathArrayEquals(leftValue, rightValue));\n }\n}\n\nexport class EquivalentAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('~', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathArrayEquivalent(leftValue, rightValue);\n }\n}\n\nexport class NotEquivalentAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('!~', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n return fhirPathNot(fhirPathArrayEquivalent(leftValue, rightValue));\n }\n}\n\nexport class IsAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('is', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n if (leftValue.length !== 1) {\n return [];\n }\n const typeName = (this.right as SymbolAtom).name;\n return booleanToTypedValue(fhirPathIs(leftValue[0], typeName));\n }\n}\n\n/**\n * 6.5.1. and\n * Returns true if both operands evaluate to true,\n * false if either operand evaluates to false,\n * and the empty collection otherwise.\n */\nexport class AndAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('and', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n const rightValue = this.right.eval(context);\n if (leftValue[0]?.value === true && rightValue[0]?.value === true) {\n return booleanToTypedValue(true);\n }\n if (leftValue[0]?.value === false || rightValue[0]?.value === false) {\n return booleanToTypedValue(false);\n }\n return [];\n }\n}\n\nexport class OrAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('or', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context);\n if (toJsBoolean(leftValue)) {\n return leftValue;\n }\n\n const rightValue = this.right.eval(context);\n if (toJsBoolean(rightValue)) {\n return rightValue;\n }\n\n return [];\n }\n}\n\n/**\n * 6.5.4. xor\n * Returns true if exactly one of the operands evaluates to true,\n * false if either both operands evaluate to true or both operands evaluate to false,\n * and the empty collection otherwise.\n */\nexport class XorAtom extends InfixOperatorAtom {\n constructor(left: Atom, right: Atom) {\n super('xor', left, right);\n }\n\n eval(context: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context);\n const rightResult = this.right.eval(context);\n if (leftResult.length === 0 && rightResult.length === 0) {\n return [];\n }\n const leftValue = leftResult.length === 0 ? null : leftResult[0].value;\n const rightValue = rightResult.length === 0 ? null : rightResult[0].value;\n if ((leftValue === true && rightValue !== true) || (leftValue !== true && rightValue === true)) {\n return booleanToTypedValue(true);\n }\n if ((leftValue === true && rightValue === true) || (leftValue === false && rightValue === false)) {\n return booleanToTypedValue(false);\n }\n return [];\n }\n}\n\nexport class FunctionAtom implements Atom {\n constructor(public readonly name: string, public readonly args: Atom[]) {}\n eval(context: TypedValue[]): TypedValue[] {\n const impl = functions[this.name];\n if (!impl) {\n throw new Error('Unrecognized function: ' + this.name);\n }\n return impl(context, ...this.args);\n }\n\n toString(): string {\n return `${this.name}(${this.args.map((arg) => arg.toString()).join(', ')})`;\n }\n}\n\nexport class IndexerAtom implements Atom {\n constructor(public readonly left: Atom, public readonly expr: Atom) {}\n eval(context: TypedValue[]): TypedValue[] {\n const evalResult = this.expr.eval(context);\n if (evalResult.length !== 1) {\n return [];\n }\n const index = evalResult[0].value;\n if (typeof index !== 'number') {\n throw new Error(`Invalid indexer expression: should return integer}`);\n }\n const leftResult = this.left.eval(context);\n if (!(index in leftResult)) {\n return [];\n }\n return [leftResult[index]];\n }\n\n toString(): string {\n return `${this.left.toString()}[${this.expr.toString()}]`;\n }\n}\n"],"names":[],"mappings":";;;;;MAgBa,YAAY,CAAA;IACvB,WAA4B,CAAA,QAAgB,EAAkB,KAAW,EAAA;QAA7C,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;QAAkB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAM;KAAI;AAE7E,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,IAAI;AACF,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,aAAA;AAAM,iBAAA;gBACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,aAAA;AACF,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,CAAqB,kBAAA,EAAA,IAAI,CAAC,QAAQ,CAAM,GAAA,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;AAClE,SAAA;KACF;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9B;AACF,CAAA;MAEY,WAAW,CAAA;AACtB,IAAA,WAAA,CAA4B,KAAiB,EAAA;QAAjB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;KAAI;IACjD,IAAI,GAAA;AACF,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACrB;IAED,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAC;AACrB,SAAA;AACD,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KACzB;AACF,CAAA;MAEY,UAAU,CAAA;AACrB,IAAA,WAAA,CAA4B,IAAY,EAAA;QAAZ,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAAI;AAC5C,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;AACzB,YAAA,OAAO,OAAO,CAAC;AAChB,SAAA;AACD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,SAAS,CAAiB,CAAC;KACxG;AAEO,IAAA,SAAS,CAAC,UAAsB,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE;AACzD,YAAA,OAAO,UAAU,CAAC;AACnB,SAAA;QAED,OAAO,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KACrD;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;AACF,CAAA;MAEY,YAAY,CAAA;IACvB,IAAI,GAAA;AACF,QAAA,OAAO,EAAE,CAAC;KACX;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC;KACb;AACF,CAAA;AAEK,MAAO,iBAAkB,SAAQ,kBAAkB,CAAA;AACvD,IAAA,WAAA,CAAY,QAAgB,EAAE,KAAW,EAAkB,IAAuC,EAAA;AAChG,QAAA,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QADkC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAmC;KAEjG;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KAC5C;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9B;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9D;AACF,CAAA;AAEK,MAAO,sBAAuB,SAAQ,iBAAiB,CAAA;AAC3D,IAAA,WAAA,CACE,QAAgB,EAChB,IAAU,EACV,KAAW,EACK,IAAgD,EAAA;AAEhE,QAAA,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAFb,IAAI,CAAA,IAAA,GAAJ,IAAI,CAA4C;KAGjE;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,QAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjD,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;AACvE,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAClD,QAAA,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;AAC/B,YAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,SAAA;AAAM,aAAA,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE;YAChC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAClF,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,SAAA;KACF;AACF,CAAA;AAEK,MAAO,UAAW,SAAQ,iBAAiB,CAAA;IAC/C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE;AACzE,YAAA,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9F,SAAA;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AACF,CAAA;AAEK,MAAO,YAAa,SAAQ,iBAAiB,CAAA;IACjD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAChC;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACpF;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACpF;AACF,CAAA;AAEK,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KACjD;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC3D;AACF,CAAA;AAEK,MAAO,SAAU,SAAQ,iBAAiB,CAAA;IAC9C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,gBAAgB,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;KAC1D;AACF,CAAA;AAEK,MAAO,UAAW,SAAQ,iBAAiB,CAAA;IAC/C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,OAAO,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KACnD;AACF,CAAA;AAEK,MAAO,aAAc,SAAQ,iBAAiB,CAAA;IAClD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;KAChE;AACF,CAAA;AAEK,MAAO,cAAe,SAAQ,iBAAiB,CAAA;IACnD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,OAAO,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KACvD;AACF,CAAA;AAEK,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;IACtD,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;KACpE;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAoB,CAAC,IAAI,CAAC;AACjD,QAAA,OAAO,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;KAChE;AACF,CAAA;AAED;;;;;AAKG;AACG,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE;AACjE,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAClC,SAAA;AACD,QAAA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,EAAE;AACnE,YAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,iBAAiB,CAAA;IAC3C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;AAC1B,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,QAAA,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE;AAC3B,YAAA,OAAO,UAAU,CAAC;AACnB,SAAA;AAED,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;AAED;;;;;AAKG;AACG,MAAO,OAAQ,SAAQ,iBAAiB,CAAA;IAC5C,WAAY,CAAA,IAAU,EAAE,KAAW,EAAA;AACjC,QAAA,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AACvD,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1E,QAAA,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,EAAE;AAC9F,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAClC,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,MAAM,SAAS,KAAK,KAAK,IAAI,UAAU,KAAK,KAAK,CAAC,EAAE;AAChG,YAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AACF,CAAA;MAEY,YAAY,CAAA;IACvB,WAA4B,CAAA,IAAY,EAAkB,IAAY,EAAA;QAA1C,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QAAkB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAAI;AAC1E,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,SAAA;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;KACpC;IAED,QAAQ,GAAA;QACN,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;KAC7E;AACF,CAAA;MAEY,WAAW,CAAA;IACtB,WAA4B,CAAA,IAAU,EAAkB,IAAU,EAAA;QAAtC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAM;QAAkB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAM;KAAI;AACtE,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kDAAA,CAAoD,CAAC,CAAC;AACvE,SAAA;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,QAAA,IAAI,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;KAC5B;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;KAC3D;AACF;;;;"}
@@ -1,5 +1,4 @@
1
1
  import { ParserBuilder } from '../fhirlexer/parse.mjs';
2
- import '../fhirlexer/tokenize.mjs';
3
2
  import { PropertyType } from '../types.mjs';
4
3
  import { LiteralAtom, SymbolAtom, EmptySetAtom, UnaryOperatorAtom, ArithemticOperatorAtom, DotAtom, UnionAtom, EqualsAtom, NotEqualsAtom, EquivalentAtom, NotEquivalentAtom, ConcatAtom, AndAtom, AsAtom, ContainsAtom, InAtom, IsAtom, OrAtom, XorAtom, FhirPathAtom, IndexerAtom, FunctionAtom } from './atoms.mjs';
5
4
  import { parseDateString } from './date.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"parse.mjs","sources":["../../../src/fhirpath/parse.ts"],"sourcesContent":["import { Quantity } from '@medplum/fhirtypes';\nimport { Atom, InfixParselet, Parser, ParserBuilder, PrefixParselet } from '../fhirlexer';\nimport { PropertyType, TypedValue } from '../types';\nimport {\n AndAtom,\n ArithemticOperatorAtom,\n AsAtom,\n ConcatAtom,\n ContainsAtom,\n DotAtom,\n EmptySetAtom,\n EqualsAtom,\n EquivalentAtom,\n FhirPathAtom,\n FunctionAtom,\n InAtom,\n IndexerAtom,\n IsAtom,\n LiteralAtom,\n NotEqualsAtom,\n NotEquivalentAtom,\n OrAtom,\n SymbolAtom,\n UnaryOperatorAtom,\n UnionAtom,\n XorAtom,\n} from './atoms';\nimport { parseDateString } from './date';\nimport { tokenize } from './tokenize';\nimport { toTypedValue } from './utils';\n\n/**\n * Operator precedence\n * See: https://hl7.org/fhirpath/#operator-precedence\n */\nexport const enum OperatorPrecedence {\n FunctionCall = 0,\n Dot = 1,\n Indexer = 2,\n UnaryAdd = 3,\n UnarySubtract = 3,\n Multiply = 4,\n Divide = 4,\n IntegerDivide = 4,\n Modulo = 4,\n Add = 5,\n Subtract = 5,\n Ampersand = 5,\n Is = 6,\n As = 6,\n Union = 7,\n GreaterThan = 8,\n GreaterThanOrEquals = 8,\n LessThan = 8,\n LessThanOrEquals = 8,\n Equals = 9,\n Equivalent = 9,\n NotEquals = 9,\n NotEquivalent = 9,\n In = 10,\n Contains = 10,\n And = 11,\n Xor = 12,\n Or = 12,\n Implies = 13,\n Arrow = 100,\n Semicolon = 200,\n}\n\nconst PARENTHESES_PARSELET: PrefixParselet = {\n parse(parser: Parser) {\n const expr = parser.consumeAndParse();\n if (!parser.match(')')) {\n throw new Error('Parse error: expected `)` got `' + parser.peek()?.value + '`');\n }\n return expr;\n },\n};\n\nconst INDEXER_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n const expr = parser.consumeAndParse();\n if (!parser.match(']')) {\n throw new Error('Parse error: expected `]`');\n }\n return new IndexerAtom(left, expr);\n },\n\n precedence: OperatorPrecedence.Indexer,\n};\n\nconst FUNCTION_CALL_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n if (!(left instanceof SymbolAtom)) {\n throw new Error('Unexpected parentheses');\n }\n\n const args = [];\n while (!parser.match(')')) {\n args.push(parser.consumeAndParse());\n parser.match(',');\n }\n\n return new FunctionAtom(left.name, args); //, functions[left.name]);\n },\n precedence: OperatorPrecedence.FunctionCall,\n};\n\nfunction parseQuantity(str: string): Quantity {\n const parts = str.split(' ');\n const value = parseFloat(parts[0]);\n let unit = parts[1];\n if (unit && unit.startsWith(\"'\") && unit.endsWith(\"'\")) {\n unit = unit.substring(1, unit.length - 1);\n } else {\n unit = '{' + unit + '}';\n }\n return { value, unit };\n}\n\nexport function initFhirPathParserBuilder(): ParserBuilder {\n return new ParserBuilder()\n .registerPrefix('String', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.string, value: token.value }),\n })\n .registerPrefix('DateTime', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.dateTime, value: parseDateString(token.value) }),\n })\n .registerPrefix('Quantity', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.Quantity, value: parseQuantity(token.value) }),\n })\n .registerPrefix('Number', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.decimal, value: parseFloat(token.value) }),\n })\n .registerPrefix('true', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: true }) })\n .registerPrefix('false', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: false }) })\n .registerPrefix('Symbol', { parse: (_, token) => new SymbolAtom(token.value) })\n .registerPrefix('{}', { parse: () => new EmptySetAtom() })\n .registerPrefix('(', PARENTHESES_PARSELET)\n .registerInfix('[', INDEXER_PARSELET)\n .registerInfix('(', FUNCTION_CALL_PARSELET)\n .prefix('+', OperatorPrecedence.UnaryAdd, (_, right) => new UnaryOperatorAtom('+', right, (x) => x))\n .prefix(\n '-',\n OperatorPrecedence.UnarySubtract,\n (_, right) => new ArithemticOperatorAtom('-', right, right, (_, y) => -y)\n )\n .infixLeft('.', OperatorPrecedence.Dot, (left, _, right) => new DotAtom(left, right))\n .infixLeft(\n '/',\n OperatorPrecedence.Divide,\n (left, _, right) => new ArithemticOperatorAtom('/', left, right, (x, y) => x / y)\n )\n .infixLeft(\n '*',\n OperatorPrecedence.Multiply,\n (left, _, right) => new ArithemticOperatorAtom('*', left, right, (x, y) => x * y)\n )\n .infixLeft(\n '+',\n OperatorPrecedence.Add,\n (left, _, right) => new ArithemticOperatorAtom('+', left, right, (x, y) => x + y)\n )\n .infixLeft(\n '-',\n OperatorPrecedence.Subtract,\n (left, _, right) => new ArithemticOperatorAtom('-', left, right, (x, y) => x - y)\n )\n .infixLeft('|', OperatorPrecedence.Union, (left, _, right) => new UnionAtom(left, right))\n .infixLeft('=', OperatorPrecedence.Equals, (left, _, right) => new EqualsAtom(left, right))\n .infixLeft('!=', OperatorPrecedence.Equals, (left, _, right) => new NotEqualsAtom(left, right))\n .infixLeft('~', OperatorPrecedence.Equivalent, (left, _, right) => new EquivalentAtom(left, right))\n .infixLeft('!~', OperatorPrecedence.NotEquivalent, (left, _, right) => new NotEquivalentAtom(left, right))\n .infixLeft(\n '<',\n OperatorPrecedence.LessThan,\n (left, _, right) => new ArithemticOperatorAtom('<', left, right, (x, y) => x < y)\n )\n .infixLeft(\n '<=',\n OperatorPrecedence.LessThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom('<=', left, right, (x, y) => x <= y)\n )\n .infixLeft(\n '>',\n OperatorPrecedence.GreaterThan,\n (left, _, right) => new ArithemticOperatorAtom('>', left, right, (x, y) => x > y)\n )\n .infixLeft(\n '>=',\n OperatorPrecedence.GreaterThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom('>=', left, right, (x, y) => x >= y)\n )\n .infixLeft('&', OperatorPrecedence.Ampersand, (left, _, right) => new ConcatAtom(left, right))\n .infixLeft('and', OperatorPrecedence.Is, (left, _, right) => new AndAtom(left, right))\n .infixLeft('as', OperatorPrecedence.Is, (left, _, right) => new AsAtom(left, right))\n .infixLeft('contains', OperatorPrecedence.Is, (left, _, right) => new ContainsAtom(left, right))\n .infixLeft(\n 'div',\n OperatorPrecedence.Is,\n (left, _, right) => new ArithemticOperatorAtom('div', left, right, (x, y) => (x / y) | 0)\n )\n .infixLeft('in', OperatorPrecedence.Is, (left, _, right) => new InAtom(left, right))\n .infixLeft('is', OperatorPrecedence.Is, (left, _, right) => new IsAtom(left, right))\n .infixLeft(\n 'mod',\n OperatorPrecedence.Is,\n (left, _, right) => new ArithemticOperatorAtom('mod', left, right, (x, y) => x % y)\n )\n .infixLeft('or', OperatorPrecedence.Is, (left, _, right) => new OrAtom(left, right))\n .infixLeft('xor', OperatorPrecedence.Is, (left, _, right) => new XorAtom(left, right));\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder();\n\n/**\n * Parses a FHIRPath expression into an AST.\n * The result can be used to evaluate the expression against a resource or other object.\n * This method is useful if you know that you will evaluate the same expression many times\n * against different resources.\n * @param input The FHIRPath expression to parse.\n * @returns The AST representing the expression.\n */\nexport function parseFhirPath(input: string): FhirPathAtom {\n return new FhirPathAtom(input, fhirPathParserBuilder.construct(tokenize(input)).consumeAndParse());\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPath(expression: string, input: unknown): unknown[] {\n // eval requires a TypedValue array\n // As a convenience, we can accept array or non-array, and TypedValue or unknown value\n const array = Array.isArray(input) ? input : [input];\n for (let i = 0; i < array.length; i++) {\n const el = array[i];\n if (!(typeof el === 'object' && 'type' in el && 'value' in el)) {\n array[i] = toTypedValue(array[i]);\n }\n }\n return evalFhirPathTyped(expression, array).map((e) => e.value);\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPathTyped(expression: string, input: TypedValue[]): TypedValue[] {\n return parseFhirPath(expression).eval(input);\n}\n"],"names":[],"mappings":";;;;;;;;AAqEA,MAAM,oBAAoB,GAAmB;AAC3C,IAAA,KAAK,CAAC,MAAc,EAAA;AAClB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;AACjF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAkB;IACtC,KAAK,CAAC,MAAc,EAAE,IAAU,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC9C,SAAA;AACD,QAAA,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpC;AAED,IAAA,UAAU,EAA4B,CAAA;CACvC,CAAC;AAEF,MAAM,sBAAsB,GAAkB;IAC5C,KAAK,CAAC,MAAc,EAAE,IAAU,EAAA;AAC9B,QAAA,IAAI,EAAE,IAAI,YAAY,UAAU,CAAC,EAAE;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC3C,SAAA;QAED,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,QAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;AACpC,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnB,SAAA;QAED,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC1C;AACD,IAAA,UAAU,EAAiC,CAAA;CAC5C,CAAC;AAEF,SAAS,aAAa,CAAC,GAAW,EAAA;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,IAAA,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACpB,IAAA,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACtD,QAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3C,KAAA;AAAM,SAAA;AACL,QAAA,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACzB,KAAA;AACD,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;SAEe,yBAAyB,GAAA;IACvC,OAAO,IAAI,aAAa,EAAE;SACvB,cAAc,CAAC,QAAQ,EAAE;QACxB,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;KACxF,CAAC;SACD,cAAc,CAAC,UAAU,EAAE;QAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;KAC3G,CAAC;SACD,cAAc,CAAC,UAAU,EAAE;QAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;KACzG,CAAC;SACD,cAAc,CAAC,QAAQ,EAAE;QACxB,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;KACrG,CAAC;SACD,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACrG,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SACvG,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9E,SAAA,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,EAAE,CAAC;AACzD,SAAA,cAAc,CAAC,GAAG,EAAE,oBAAoB,CAAC;AACzC,SAAA,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC;AACpC,SAAA,aAAa,CAAC,GAAG,EAAE,sBAAsB,CAAC;SAC1C,MAAM,CAAC,GAAG,EAAA,CAAA,oCAA+B,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnG,SAAA,MAAM,CACL,GAAG,EAEH,CAAA,yCAAA,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1E;AACA,SAAA,SAAS,CAAC,GAAG,EAAA,CAAA,+BAA0B,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACpF,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,kCAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,oCAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,+BAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,oCAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CAAC,GAAG,EAAA,CAAA,iCAA4B,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxF,SAAA,SAAS,CAAC,GAAG,EAAA,CAAA,kCAA6B,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1F,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,kCAA6B,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9F,SAAA,SAAS,CAAC,GAAG,EAAA,CAAA,sCAAiC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAClG,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,yCAAoC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzG,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,oCAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CACR,IAAI,EAEJ,CAAA,4CAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACpF;AACA,SAAA,SAAS,CACR,GAAG,EAEH,CAAA,uCAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClF;AACA,SAAA,SAAS,CACR,IAAI,EAEJ,CAAA,+CAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACpF;AACA,SAAA,SAAS,CAAC,GAAG,EAAA,CAAA,qCAAgC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7F,SAAA,SAAS,CAAC,KAAK,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACrF,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnF,SAAA,SAAS,CAAC,UAAU,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/F,SAAA,SAAS,CACR,KAAK,EAAA,CAAA,8BAEL,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC1F;AACA,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnF,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnF,SAAA,SAAS,CACR,KAAK,EAEL,CAAA,8BAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CACpF;AACA,SAAA,SAAS,CAAC,IAAI,EAAA,CAAA,8BAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACnF,SAAS,CAAC,KAAK,EAAyB,CAAA,8BAAA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,qBAAqB,GAAG,yBAAyB,EAAE,CAAC;AAE1D;;;;;;;AAOG;AACG,SAAU,aAAa,CAAC,KAAa,EAAA;AACzC,IAAA,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;AACrG,CAAC;AAED;;;;;AAKG;AACa,SAAA,YAAY,CAAC,UAAkB,EAAE,KAAc,EAAA;;;AAG7D,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AACrD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACpB,QAAA,IAAI,EAAE,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,EAAE;YAC9D,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,SAAA;AACF,KAAA;AACD,IAAA,OAAO,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;AAKG;AACa,SAAA,iBAAiB,CAAC,UAAkB,EAAE,KAAmB,EAAA;IACvE,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/C;;;;"}
1
+ {"version":3,"file":"parse.mjs","sources":["../../../src/fhirpath/parse.ts"],"sourcesContent":["import { Quantity } from '@medplum/fhirtypes';\nimport { Atom, InfixParselet, Parser, ParserBuilder, PrefixParselet } from '../fhirlexer';\nimport { PropertyType, TypedValue } from '../types';\nimport {\n AndAtom,\n ArithemticOperatorAtom,\n AsAtom,\n ConcatAtom,\n ContainsAtom,\n DotAtom,\n EmptySetAtom,\n EqualsAtom,\n EquivalentAtom,\n FhirPathAtom,\n FunctionAtom,\n InAtom,\n IndexerAtom,\n IsAtom,\n LiteralAtom,\n NotEqualsAtom,\n NotEquivalentAtom,\n OrAtom,\n SymbolAtom,\n UnaryOperatorAtom,\n UnionAtom,\n XorAtom,\n} from './atoms';\nimport { parseDateString } from './date';\nimport { tokenize } from './tokenize';\nimport { toTypedValue } from './utils';\n\n/**\n * Operator precedence\n * See: https://hl7.org/fhirpath/#operator-precedence\n */\nexport const enum OperatorPrecedence {\n FunctionCall = 0,\n Dot = 1,\n Indexer = 2,\n UnaryAdd = 3,\n UnarySubtract = 3,\n Multiply = 4,\n Divide = 4,\n IntegerDivide = 4,\n Modulo = 4,\n Add = 5,\n Subtract = 5,\n Ampersand = 5,\n Is = 6,\n As = 6,\n Union = 7,\n GreaterThan = 8,\n GreaterThanOrEquals = 8,\n LessThan = 8,\n LessThanOrEquals = 8,\n Equals = 9,\n Equivalent = 9,\n NotEquals = 9,\n NotEquivalent = 9,\n In = 10,\n Contains = 10,\n And = 11,\n Xor = 12,\n Or = 12,\n Implies = 13,\n Arrow = 100,\n Semicolon = 200,\n}\n\nconst PARENTHESES_PARSELET: PrefixParselet = {\n parse(parser: Parser) {\n const expr = parser.consumeAndParse();\n if (!parser.match(')')) {\n throw new Error('Parse error: expected `)` got `' + parser.peek()?.value + '`');\n }\n return expr;\n },\n};\n\nconst INDEXER_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n const expr = parser.consumeAndParse();\n if (!parser.match(']')) {\n throw new Error('Parse error: expected `]`');\n }\n return new IndexerAtom(left, expr);\n },\n\n precedence: OperatorPrecedence.Indexer,\n};\n\nconst FUNCTION_CALL_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n if (!(left instanceof SymbolAtom)) {\n throw new Error('Unexpected parentheses');\n }\n\n const args = [];\n while (!parser.match(')')) {\n args.push(parser.consumeAndParse());\n parser.match(',');\n }\n\n return new FunctionAtom(left.name, args); //, functions[left.name]);\n },\n precedence: OperatorPrecedence.FunctionCall,\n};\n\nfunction parseQuantity(str: string): Quantity {\n const parts = str.split(' ');\n const value = parseFloat(parts[0]);\n let unit = parts[1];\n if (unit && unit.startsWith(\"'\") && unit.endsWith(\"'\")) {\n unit = unit.substring(1, unit.length - 1);\n } else {\n unit = '{' + unit + '}';\n }\n return { value, unit };\n}\n\nexport function initFhirPathParserBuilder(): ParserBuilder {\n return new ParserBuilder()\n .registerPrefix('String', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.string, value: token.value }),\n })\n .registerPrefix('DateTime', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.dateTime, value: parseDateString(token.value) }),\n })\n .registerPrefix('Quantity', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.Quantity, value: parseQuantity(token.value) }),\n })\n .registerPrefix('Number', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.decimal, value: parseFloat(token.value) }),\n })\n .registerPrefix('true', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: true }) })\n .registerPrefix('false', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: false }) })\n .registerPrefix('Symbol', { parse: (_, token) => new SymbolAtom(token.value) })\n .registerPrefix('{}', { parse: () => new EmptySetAtom() })\n .registerPrefix('(', PARENTHESES_PARSELET)\n .registerInfix('[', INDEXER_PARSELET)\n .registerInfix('(', FUNCTION_CALL_PARSELET)\n .prefix('+', OperatorPrecedence.UnaryAdd, (_, right) => new UnaryOperatorAtom('+', right, (x) => x))\n .prefix(\n '-',\n OperatorPrecedence.UnarySubtract,\n (_, right) => new ArithemticOperatorAtom('-', right, right, (_, y) => -y)\n )\n .infixLeft('.', OperatorPrecedence.Dot, (left, _, right) => new DotAtom(left, right))\n .infixLeft(\n '/',\n OperatorPrecedence.Divide,\n (left, _, right) => new ArithemticOperatorAtom('/', left, right, (x, y) => x / y)\n )\n .infixLeft(\n '*',\n OperatorPrecedence.Multiply,\n (left, _, right) => new ArithemticOperatorAtom('*', left, right, (x, y) => x * y)\n )\n .infixLeft(\n '+',\n OperatorPrecedence.Add,\n (left, _, right) => new ArithemticOperatorAtom('+', left, right, (x, y) => x + y)\n )\n .infixLeft(\n '-',\n OperatorPrecedence.Subtract,\n (left, _, right) => new ArithemticOperatorAtom('-', left, right, (x, y) => x - y)\n )\n .infixLeft('|', OperatorPrecedence.Union, (left, _, right) => new UnionAtom(left, right))\n .infixLeft('=', OperatorPrecedence.Equals, (left, _, right) => new EqualsAtom(left, right))\n .infixLeft('!=', OperatorPrecedence.Equals, (left, _, right) => new NotEqualsAtom(left, right))\n .infixLeft('~', OperatorPrecedence.Equivalent, (left, _, right) => new EquivalentAtom(left, right))\n .infixLeft('!~', OperatorPrecedence.NotEquivalent, (left, _, right) => new NotEquivalentAtom(left, right))\n .infixLeft(\n '<',\n OperatorPrecedence.LessThan,\n (left, _, right) => new ArithemticOperatorAtom('<', left, right, (x, y) => x < y)\n )\n .infixLeft(\n '<=',\n OperatorPrecedence.LessThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom('<=', left, right, (x, y) => x <= y)\n )\n .infixLeft(\n '>',\n OperatorPrecedence.GreaterThan,\n (left, _, right) => new ArithemticOperatorAtom('>', left, right, (x, y) => x > y)\n )\n .infixLeft(\n '>=',\n OperatorPrecedence.GreaterThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom('>=', left, right, (x, y) => x >= y)\n )\n .infixLeft('&', OperatorPrecedence.Ampersand, (left, _, right) => new ConcatAtom(left, right))\n .infixLeft('and', OperatorPrecedence.Is, (left, _, right) => new AndAtom(left, right))\n .infixLeft('as', OperatorPrecedence.Is, (left, _, right) => new AsAtom(left, right))\n .infixLeft('contains', OperatorPrecedence.Is, (left, _, right) => new ContainsAtom(left, right))\n .infixLeft(\n 'div',\n OperatorPrecedence.Is,\n (left, _, right) => new ArithemticOperatorAtom('div', left, right, (x, y) => (x / y) | 0)\n )\n .infixLeft('in', OperatorPrecedence.Is, (left, _, right) => new InAtom(left, right))\n .infixLeft('is', OperatorPrecedence.Is, (left, _, right) => new IsAtom(left, right))\n .infixLeft(\n 'mod',\n OperatorPrecedence.Is,\n (left, _, right) => new ArithemticOperatorAtom('mod', left, right, (x, y) => x % y)\n )\n .infixLeft('or', OperatorPrecedence.Is, (left, _, right) => new OrAtom(left, right))\n .infixLeft('xor', OperatorPrecedence.Is, (left, _, right) => new XorAtom(left, right));\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder();\n\n/**\n * Parses a FHIRPath expression into an AST.\n * The result can be used to evaluate the expression against a resource or other object.\n * This method is useful if you know that you will evaluate the same expression many times\n * against different resources.\n * @param input The FHIRPath expression to parse.\n * @returns The AST representing the expression.\n */\nexport function parseFhirPath(input: string): FhirPathAtom {\n return new FhirPathAtom(input, fhirPathParserBuilder.construct(tokenize(input)).consumeAndParse());\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPath(expression: string, input: unknown): unknown[] {\n // eval requires a TypedValue array\n // As a convenience, we can accept array or non-array, and TypedValue or unknown value\n const array = Array.isArray(input) ? input : [input];\n for (let i = 0; i < array.length; i++) {\n const el = array[i];\n if (!(typeof el === 'object' && 'type' in el && 'value' in el)) {\n array[i] = toTypedValue(array[i]);\n }\n }\n return evalFhirPathTyped(expression, array).map((e) => e.value);\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPathTyped(expression: string, input: TypedValue[]): TypedValue[] {\n return parseFhirPath(expression).eval(input);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import '../fhirlexer/parse.mjs';
2
1
  import { Tokenizer } from '../fhirlexer/tokenize.mjs';
3
2
 
4
3
  const FHIRPATH_KEYWORDS = ['true', 'false'];
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirpath/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\n\nexport const FHIRPATH_KEYWORDS = ['true', 'false'];\nexport const FHIRPATH_OPERATORS = ['!=', '!~', '<=', '>=', '{}', '->'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS).tokenize();\n}\n"],"names":[],"mappings":";;;MAEa,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE;AACtC,MAAA,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAEjE,SAAU,QAAQ,CAAC,GAAW,EAAA;AAClC,IAAA,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC9E;;;;"}
1
+ {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirpath/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\n\nexport const FHIRPATH_KEYWORDS = ['true', 'false'];\nexport const FHIRPATH_OPERATORS = ['!=', '!~', '<=', '>=', '{}', '->'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS).tokenize();\n}\n"],"names":[],"mappings":";;MAEa,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE;AACtC,MAAA,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAEjE,SAAU,QAAQ,CAAC,GAAW,EAAA;AAClC,IAAA,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC9E;;;;"}
@@ -1,5 +1,3 @@
1
- import '../fhirlexer/parse.mjs';
2
- import '../fhirlexer/tokenize.mjs';
3
1
  import '../types.mjs';
4
2
  import '../utils.mjs';
5
3
  import { initFhirPathParserBuilder } from '../fhirpath/parse.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"parse.mjs","sources":["../../../src/filter/parse.ts"],"sourcesContent":["import { Parser } from '../fhirlexer';\nimport { initFhirPathParserBuilder } from '../fhirpath';\nimport { tokenize } from './tokenize';\nimport { FhirFilterComparison, FhirFilterConnective, FhirFilterExpression, FhirFilterNegation } from './types';\n\nclass FilterParameterParser {\n constructor(readonly parser: Parser) {}\n\n parse(): FhirFilterExpression {\n let result: FhirFilterExpression;\n\n if (this.parser.peek()?.value === '(') {\n this.parser.consume('(');\n result = this.parse();\n this.parser.consume(')');\n } else if (this.parser.peek()?.value === 'not') {\n this.parser.consume('Symbol', 'not');\n this.parser.consume('(');\n result = new FhirFilterNegation(this.parse());\n this.parser.consume(')');\n } else {\n result = new FhirFilterComparison(\n this.parser.consume('Symbol').value,\n this.parser.consume('Symbol').value,\n this.parser.consume().value\n );\n }\n\n const next = this.parser.peek()?.value;\n if (next === 'and' || next === 'or') {\n this.parser.consume('Symbol', next);\n return new FhirFilterConnective(next, result, this.parse());\n }\n\n return result;\n }\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder();\n\n/**\n * Parses a FHIR _filter parameter expression into an AST.\n * @param input The FHIR _filter parameter expression.\n * @returns The AST representing the filters.\n */\nexport function parseFilterParameter(input: string): FhirFilterExpression {\n const parser = fhirPathParserBuilder.construct(tokenize(input));\n parser.removeComments();\n return new FilterParameterParser(parser).parse();\n}\n"],"names":[],"mappings":";;;;;;;;AAKA,MAAM,qBAAqB,CAAA;AACzB,IAAA,WAAA,CAAqB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAAI;IAEvC,KAAK,GAAA;AACH,QAAA,IAAI,MAA4B,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,YAAA,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,SAAA;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,KAAK,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,GAAG,IAAI,oBAAoB,CAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EACnC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAC5B,CAAC;AACH,SAAA;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;AACvC,QAAA,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AACF,CAAA;AAED,MAAM,qBAAqB,GAAG,yBAAyB,EAAE,CAAC;AAE1D;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;AACnD;;;;"}
1
+ {"version":3,"file":"parse.mjs","sources":["../../../src/filter/parse.ts"],"sourcesContent":["import { Parser } from '../fhirlexer';\nimport { initFhirPathParserBuilder } from '../fhirpath';\nimport { tokenize } from './tokenize';\nimport { FhirFilterComparison, FhirFilterConnective, FhirFilterExpression, FhirFilterNegation } from './types';\n\nclass FilterParameterParser {\n constructor(readonly parser: Parser) {}\n\n parse(): FhirFilterExpression {\n let result: FhirFilterExpression;\n\n if (this.parser.peek()?.value === '(') {\n this.parser.consume('(');\n result = this.parse();\n this.parser.consume(')');\n } else if (this.parser.peek()?.value === 'not') {\n this.parser.consume('Symbol', 'not');\n this.parser.consume('(');\n result = new FhirFilterNegation(this.parse());\n this.parser.consume(')');\n } else {\n result = new FhirFilterComparison(\n this.parser.consume('Symbol').value,\n this.parser.consume('Symbol').value,\n this.parser.consume().value\n );\n }\n\n const next = this.parser.peek()?.value;\n if (next === 'and' || next === 'or') {\n this.parser.consume('Symbol', next);\n return new FhirFilterConnective(next, result, this.parse());\n }\n\n return result;\n }\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder();\n\n/**\n * Parses a FHIR _filter parameter expression into an AST.\n * @param input The FHIR _filter parameter expression.\n * @returns The AST representing the filters.\n */\nexport function parseFilterParameter(input: string): FhirFilterExpression {\n const parser = fhirPathParserBuilder.construct(tokenize(input));\n parser.removeComments();\n return new FilterParameterParser(parser).parse();\n}\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,qBAAqB,CAAA;AACzB,IAAA,WAAA,CAAqB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAAI;IAEvC,KAAK,GAAA;AACH,QAAA,IAAI,MAA4B,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,YAAA,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,SAAA;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,KAAK,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,GAAG,IAAI,oBAAoB,CAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EACnC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAC5B,CAAC;AACH,SAAA;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;AACvC,QAAA,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AACF,CAAA;AAED,MAAM,qBAAqB,GAAG,yBAAyB,EAAE,CAAC;AAE1D;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;AACnD;;;;"}
@@ -1,4 +1,3 @@
1
- import '../fhirlexer/parse.mjs';
2
1
  import { Tokenizer } from '../fhirlexer/tokenize.mjs';
3
2
  import '../types.mjs';
4
3
  import '../utils.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.mjs","sources":["../../../src/filter/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\nimport { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS } from '../fhirpath';\n\nconst MAPPING_LANGUAGE_OPERATORS = [...FHIRPATH_OPERATORS, 'eq', 'ne', 'co'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, MAPPING_LANGUAGE_OPERATORS, {\n dateTimeLiterals: true,\n symbolRegex: /[^\\s\\])]/,\n }).tokenize();\n}\n"],"names":[],"mappings":";;;;;;;AAGA,MAAM,0BAA0B,GAAG,CAAC,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvE,SAAU,QAAQ,CAAC,GAAW,EAAA;IAClC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,0BAA0B,EAAE;AACvE,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAChB;;;;"}
1
+ {"version":3,"file":"tokenize.mjs","sources":["../../../src/filter/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\nimport { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS } from '../fhirpath';\n\nconst MAPPING_LANGUAGE_OPERATORS = [...FHIRPATH_OPERATORS, 'eq', 'ne', 'co'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, MAPPING_LANGUAGE_OPERATORS, {\n dateTimeLiterals: true,\n symbolRegex: /[^\\s\\])]/,\n }).tokenize();\n}\n"],"names":[],"mappings":";;;;;;AAGA,MAAM,0BAA0B,GAAG,CAAC,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvE,SAAU,QAAQ,CAAC,GAAW,EAAA;IAClC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,0BAA0B,EAAE;AACvE,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAChB;;;;"}
@@ -222,8 +222,9 @@ function formatTiming(timing) {
222
222
  return capitalize(builder.join(' ').trim());
223
223
  }
224
224
  /**
225
- * Returns a human-readable string for a FHIR Range datatype, taking into account comparators and one-sided ranges
225
+ * Returns a human-readable string for a FHIR Range datatype, taking into account one-sided ranges
226
226
  * @param range A FHIR Range element
227
+ * @param precision Number of decimal places to display in the rendered quantity values
227
228
  * @param exclusive If true, one-sided ranges will be rendered with the '>' or '<' bounds rather than '>=' or '<='
228
229
  * @returns A human-readable string representation of the Range
229
230
  */
@@ -231,33 +232,41 @@ function formatRange(range, precision, exclusive = false) {
231
232
  if (exclusive && precision === undefined) {
232
233
  throw new Error('Precision must be specified for exclusive ranges');
233
234
  }
234
- const low = range?.low && { ...range.low };
235
- const high = range?.high && { ...range.high };
236
- if (!range || (low?.value === undefined && high?.value === undefined)) {
235
+ // Extract high and low range endpoints, explicitly ignoring any comparator
236
+ // since Range uses SimpleQuantity variants (see http://www.hl7.org/fhir/datatypes.html#Range)
237
+ const low = range?.low && { ...range.low, comparator: undefined };
238
+ const high = range?.high && { ...range.high, comparator: undefined };
239
+ if (low?.value === undefined && high?.value === undefined) {
237
240
  return '';
238
241
  }
239
- if (range.low?.value !== undefined && range.high?.value === undefined) {
242
+ if (low?.value !== undefined && high?.value === undefined) {
243
+ // Lower bound only
240
244
  if (exclusive && precision !== undefined) {
241
- range.low.value = preciseDecrement(range.low.value, precision);
242
- return `> ${formatQuantity(range.low, precision)}`;
245
+ low.value = preciseDecrement(low.value, precision);
246
+ return `> ${formatQuantity(low, precision)}`;
243
247
  }
244
- return `>= ${formatQuantity(range.low, precision)}`;
248
+ return `>= ${formatQuantity(low, precision)}`;
245
249
  }
246
- if (range.low?.value === undefined && range.high?.value !== undefined) {
250
+ else if (low?.value === undefined && high?.value !== undefined) {
251
+ // Upper bound only
247
252
  if (exclusive && precision !== undefined) {
248
- range.high.value = preciseIncrement(range.high.value, precision);
249
- return `< ${formatQuantity(range.high, precision)}`;
253
+ high.value = preciseIncrement(high.value, precision);
254
+ return `< ${formatQuantity(high, precision)}`;
250
255
  }
251
- return `<= ${formatQuantity(range.high, precision)}`;
256
+ return `<= ${formatQuantity(high, precision)}`;
252
257
  }
253
- if (low?.unit === high?.unit) {
254
- delete low?.unit;
258
+ else {
259
+ // Double-sided range
260
+ if (low?.unit === high?.unit) {
261
+ delete low?.unit; // Format like "X - Y units" instead of "X units - Y units"
262
+ }
263
+ return `${formatQuantity(low, precision)} - ${formatQuantity(high, precision)}`;
255
264
  }
256
- return `${formatQuantity(low, precision)} - ${formatQuantity(high, precision)}`;
257
265
  }
258
266
  /**
259
267
  * Returns a human-readable string for a FHIR Quantity datatype, taking into account units and comparators
260
268
  * @param quantity A FHIR Quantity element
269
+ * @param precision Number of decimal places to display in the rendered quantity values
261
270
  * @returns A human-readable string representation of the Quantity
262
271
  */
263
272
  function formatQuantity(quantity, precision) {
@@ -1 +1 @@
1
- {"version":3,"file":"format.mjs","sources":["../../src/format.ts"],"sourcesContent":["import {\n Address,\n CodeableConcept,\n Coding,\n HumanName,\n Money,\n Observation,\n ObservationComponent,\n Period,\n Quantity,\n Range,\n Timing,\n} from '@medplum/fhirtypes';\nimport { capitalize } from './utils';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n lineSeparator?: string;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\n/**\n * Formats a FHIR Address as a string.\n * @param address The address to format.\n * @param options Optional address format options.\n * @returns The formatted address string.\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 || address.state || address.postalCode) {\n const cityStateZip = [];\n if (address.city) {\n cityStateZip.push(address.city);\n }\n if (address.state) {\n cityStateZip.push(address.state);\n }\n if (address.postalCode) {\n cityStateZip.push(address.postalCode);\n }\n builder.push(cityStateZip.join(', '));\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(options?.lineSeparator || ', ').trim();\n}\n\n/**\n * Formats a FHIR HumanName as a string.\n * @param name The name to format.\n * @param options Optional name format options.\n * @returns The formatted name string.\n */\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\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?.suffix !== false) {\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\n/**\n * Formats the given name portion of a FHIR HumanName element.\n * @param name The name to format.\n * @returns The formatted given name string.\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\n/**\n * Formats the family name portion of a FHIR HumanName element.\n * @param name The name to format.\n * @returns The formatted family name string.\n */\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n\n/**\n * Returns true if the given date object is a valid date.\n * Dates can be invalid if created by parsing an invalid string.\n * @param date A date object.\n * @returns Returns true if the date is a valid date.\n */\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * Formats a FHIR date string as a human readable string.\n * Handles missing values and invalid dates.\n * @param date The date to format.\n * @param locales Optional locales.\n * @param options Optional date format options.\n * @returns The formatted date string.\n */\nexport function formatDate(\n date: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!date) {\n return '';\n }\n const d = new Date(date);\n if (!isValidDate(d)) {\n return '';\n }\n d.setUTCHours(0, 0, 0, 0);\n return d.toLocaleDateString(locales, { timeZone: 'UTC', ...options });\n}\n\n/**\n * Formats a FHIR time string as a human readable string.\n * Handles missing values and invalid dates.\n * @param time The date to format.\n * @param locales Optional locales.\n * @param options Optional time format options.\n * @returns The formatted time string.\n */\nexport function formatTime(\n time: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): 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(locales, options);\n}\n\n/**\n * Formats a FHIR dateTime string as a human readable string.\n * Handles missing values and invalid dates.\n * @param dateTime The dateTime to format.\n * @param locales Optional locales.\n * @param options Optional dateTime format options.\n * @returns The formatted dateTime string.\n */\nexport function formatDateTime(\n dateTime: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!dateTime) {\n return '';\n }\n const d = new Date(dateTime);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleString(locales, options);\n}\n\n/**\n * Formats a FHIR Period as a human readable string.\n * @param period The period to format.\n * @param locales Optional locales.\n * @param options Optional period format options.\n * @returns The formatted period string.\n */\nexport function formatPeriod(\n period: Period | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!period || (!period.start && !period.end)) {\n return '';\n }\n return formatDateTime(period.start, locales, options) + ' - ' + formatDateTime(period.end, locales, options);\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\n/**\n * Formats a FHIR Timing as a human readable string.\n * @param timing The timing to format.\n * @returns The formatted timing string.\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\n/**\n * Returns a human-readable string for a FHIR Range datatype, taking into account comparators and one-sided ranges\n * @param range A FHIR Range element\n * @param exclusive If true, one-sided ranges will be rendered with the '>' or '<' bounds rather than '>=' or '<='\n * @returns A human-readable string representation of the Range\n */\nexport function formatRange(range: Range | undefined, precision?: number, exclusive = false): string {\n if (exclusive && precision === undefined) {\n throw new Error('Precision must be specified for exclusive ranges');\n }\n\n const low = range?.low && { ...range.low };\n const high = range?.high && { ...range.high };\n if (!range || (low?.value === undefined && high?.value === undefined)) {\n return '';\n }\n\n if (range.low?.value !== undefined && range.high?.value === undefined) {\n if (exclusive && precision !== undefined) {\n range.low.value = preciseDecrement(range.low.value, precision);\n return `> ${formatQuantity(range.low, precision)}`;\n }\n return `>= ${formatQuantity(range.low, precision)}`;\n }\n\n if (range.low?.value === undefined && range.high?.value !== undefined) {\n if (exclusive && precision !== undefined) {\n range.high.value = preciseIncrement(range.high.value, precision);\n return `< ${formatQuantity(range.high, precision)}`;\n }\n return `<= ${formatQuantity(range.high, precision)}`;\n }\n\n if (low?.unit === high?.unit) {\n delete low?.unit;\n }\n return `${formatQuantity(low, precision)} - ${formatQuantity(high, precision)}`;\n}\n\n/**\n * Returns a human-readable string for a FHIR Quantity datatype, taking into account units and comparators\n * @param quantity A FHIR Quantity element\n * @returns A human-readable string representation of the Quantity\n */\nexport function formatQuantity(quantity: Quantity | undefined, precision?: number): string {\n if (!quantity) {\n return '';\n }\n\n const result = [];\n\n if (quantity.comparator) {\n result.push(quantity.comparator);\n result.push(' ');\n }\n\n if (quantity.value !== undefined) {\n if (precision !== undefined) {\n result.push(quantity.value.toFixed(precision));\n } else {\n result.push(quantity.value);\n }\n }\n\n if (quantity.unit) {\n if (quantity.unit !== '%' && result[result.length - 1] !== ' ') {\n result.push(' ');\n }\n result.push(quantity.unit);\n }\n\n return result.join('').trim();\n}\n\nexport function formatMoney(money: Money | undefined): string {\n if (money?.value === undefined) {\n return '';\n }\n\n return money.value.toLocaleString(undefined, {\n style: 'currency',\n currency: money.currency || 'USD',\n currencyDisplay: 'narrowSymbol',\n });\n}\n\n/**\n * Formats a CodeableConcept element as a string.\n * @param codeableConcept A FHIR CodeableConcept element\n * @returns The codeable concept as a string.\n */\nexport function formatCodeableConcept(codeableConcept: CodeableConcept | undefined): string {\n if (!codeableConcept) {\n return '';\n }\n if (codeableConcept.text) {\n return codeableConcept.text;\n }\n if (codeableConcept.coding) {\n return codeableConcept.coding.map((c) => formatCoding(c)).join(', ');\n }\n return '';\n}\n\n/**\n * Formats a Coding element as a string.\n * @param coding A FHIR Coding element\n * @returns The coding as a string.\n */\nexport function formatCoding(coding: Coding | undefined): string {\n return coding?.display || coding?.code || '';\n}\n\n/**\n * Formats a FHIR Observation resource value as a string.\n * @param obs A FHIR Observation resource.\n * @returns A human-readable string representation of the Observation.\n */\nexport function formatObservationValue(obs: Observation | ObservationComponent | undefined): string {\n if (!obs) {\n return '';\n }\n\n if ('component' in obs) {\n return (obs.component as ObservationComponent[]).map((c) => formatObservationValue(c)).join(' / ');\n }\n\n if (obs?.valueQuantity) {\n return formatQuantity(obs.valueQuantity);\n }\n\n if (obs.valueCodeableConcept) {\n return formatCodeableConcept(obs.valueCodeableConcept);\n }\n\n if (obs.valueString) {\n return obs.valueString;\n }\n\n return '';\n}\n\n/**\n * Returns the input number increased by the `n` units of the specified precision\n * @param a The input number\n * @param precision The precision in number of digits.\n * @param n (default 1) The number of units to add\n */\nfunction preciseIncrement(a: number, precision: number, n = 1): number {\n return (toPreciseInteger(a, precision) + n) * Math.pow(10, -precision);\n}\n\n/**\n * Returns the input number decreased by the `n` units of the specified precision\n * @param a The input number\n * @param precision The precision in number of digits.\n * @param n (default 1) The number of units to subtract\n */\nfunction preciseDecrement(a: number, precision: number, n = 1): number {\n return (toPreciseInteger(a, precision) - n) * Math.pow(10, -precision);\n}\n\n/**\n * Returns an integer representation of the number with the given precision.\n * For example, if precision is 2, then 1.2345 will be returned as 123.\n * @param a The number.\n * @param precision Optional precision in number of digits.\n * @returns The integer with the given precision.\n */\nfunction toPreciseInteger(a: number, precision?: number): number {\n if (precision === undefined) {\n return a;\n }\n return Math.round(a * Math.pow(10, precision));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.mjs","sources":["../../src/format.ts"],"sourcesContent":["import {\n Address,\n CodeableConcept,\n Coding,\n HumanName,\n Money,\n Observation,\n ObservationComponent,\n Period,\n Quantity,\n Range,\n Timing,\n} from '@medplum/fhirtypes';\nimport { capitalize } from './utils';\n\nexport interface AddressFormatOptions {\n all?: boolean;\n use?: boolean;\n lineSeparator?: string;\n}\n\nexport interface HumanNameFormatOptions {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n}\n\n/**\n * Formats a FHIR Address as a string.\n * @param address The address to format.\n * @param options Optional address format options.\n * @returns The formatted address string.\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 || address.state || address.postalCode) {\n const cityStateZip = [];\n if (address.city) {\n cityStateZip.push(address.city);\n }\n if (address.state) {\n cityStateZip.push(address.state);\n }\n if (address.postalCode) {\n cityStateZip.push(address.postalCode);\n }\n builder.push(cityStateZip.join(', '));\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(options?.lineSeparator || ', ').trim();\n}\n\n/**\n * Formats a FHIR HumanName as a string.\n * @param name The name to format.\n * @param options Optional name format options.\n * @returns The formatted name string.\n */\nexport function formatHumanName(name: HumanName, options?: HumanNameFormatOptions): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\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?.suffix !== false) {\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\n/**\n * Formats the given name portion of a FHIR HumanName element.\n * @param name The name to format.\n * @returns The formatted given name string.\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\n/**\n * Formats the family name portion of a FHIR HumanName element.\n * @param name The name to format.\n * @returns The formatted family name string.\n */\nexport function formatFamilyName(name: HumanName): string {\n return name.family || '';\n}\n\n/**\n * Returns true if the given date object is a valid date.\n * Dates can be invalid if created by parsing an invalid string.\n * @param date A date object.\n * @returns Returns true if the date is a valid date.\n */\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * Formats a FHIR date string as a human readable string.\n * Handles missing values and invalid dates.\n * @param date The date to format.\n * @param locales Optional locales.\n * @param options Optional date format options.\n * @returns The formatted date string.\n */\nexport function formatDate(\n date: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!date) {\n return '';\n }\n const d = new Date(date);\n if (!isValidDate(d)) {\n return '';\n }\n d.setUTCHours(0, 0, 0, 0);\n return d.toLocaleDateString(locales, { timeZone: 'UTC', ...options });\n}\n\n/**\n * Formats a FHIR time string as a human readable string.\n * Handles missing values and invalid dates.\n * @param time The date to format.\n * @param locales Optional locales.\n * @param options Optional time format options.\n * @returns The formatted time string.\n */\nexport function formatTime(\n time: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): 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(locales, options);\n}\n\n/**\n * Formats a FHIR dateTime string as a human readable string.\n * Handles missing values and invalid dates.\n * @param dateTime The dateTime to format.\n * @param locales Optional locales.\n * @param options Optional dateTime format options.\n * @returns The formatted dateTime string.\n */\nexport function formatDateTime(\n dateTime: string | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!dateTime) {\n return '';\n }\n const d = new Date(dateTime);\n if (!isValidDate(d)) {\n return '';\n }\n return d.toLocaleString(locales, options);\n}\n\n/**\n * Formats a FHIR Period as a human readable string.\n * @param period The period to format.\n * @param locales Optional locales.\n * @param options Optional period format options.\n * @returns The formatted period string.\n */\nexport function formatPeriod(\n period: Period | undefined,\n locales?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions | undefined\n): string {\n if (!period || (!period.start && !period.end)) {\n return '';\n }\n return formatDateTime(period.start, locales, options) + ' - ' + formatDateTime(period.end, locales, options);\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\n/**\n * Formats a FHIR Timing as a human readable string.\n * @param timing The timing to format.\n * @returns The formatted timing string.\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\n/**\n * Returns a human-readable string for a FHIR Range datatype, taking into account one-sided ranges\n * @param range A FHIR Range element\n * @param precision Number of decimal places to display in the rendered quantity values\n * @param exclusive If true, one-sided ranges will be rendered with the '>' or '<' bounds rather than '>=' or '<='\n * @returns A human-readable string representation of the Range\n */\nexport function formatRange(range: Range | undefined, precision?: number, exclusive = false): string {\n if (exclusive && precision === undefined) {\n throw new Error('Precision must be specified for exclusive ranges');\n }\n\n // Extract high and low range endpoints, explicitly ignoring any comparator\n // since Range uses SimpleQuantity variants (see http://www.hl7.org/fhir/datatypes.html#Range)\n const low = range?.low && { ...range.low, comparator: undefined };\n const high = range?.high && { ...range.high, comparator: undefined };\n if (low?.value === undefined && high?.value === undefined) {\n return '';\n }\n\n if (low?.value !== undefined && high?.value === undefined) {\n // Lower bound only\n if (exclusive && precision !== undefined) {\n low.value = preciseDecrement(low.value, precision);\n return `> ${formatQuantity(low, precision)}`;\n }\n return `>= ${formatQuantity(low, precision)}`;\n } else if (low?.value === undefined && high?.value !== undefined) {\n // Upper bound only\n if (exclusive && precision !== undefined) {\n high.value = preciseIncrement(high.value, precision);\n return `< ${formatQuantity(high, precision)}`;\n }\n return `<= ${formatQuantity(high, precision)}`;\n } else {\n // Double-sided range\n if (low?.unit === high?.unit) {\n delete low?.unit; // Format like \"X - Y units\" instead of \"X units - Y units\"\n }\n return `${formatQuantity(low, precision)} - ${formatQuantity(high, precision)}`;\n }\n}\n\n/**\n * Returns a human-readable string for a FHIR Quantity datatype, taking into account units and comparators\n * @param quantity A FHIR Quantity element\n * @param precision Number of decimal places to display in the rendered quantity values\n * @returns A human-readable string representation of the Quantity\n */\nexport function formatQuantity(quantity: Quantity | undefined, precision?: number): string {\n if (!quantity) {\n return '';\n }\n\n const result = [];\n\n if (quantity.comparator) {\n result.push(quantity.comparator);\n result.push(' ');\n }\n\n if (quantity.value !== undefined) {\n if (precision !== undefined) {\n result.push(quantity.value.toFixed(precision));\n } else {\n result.push(quantity.value);\n }\n }\n\n if (quantity.unit) {\n if (quantity.unit !== '%' && result[result.length - 1] !== ' ') {\n result.push(' ');\n }\n result.push(quantity.unit);\n }\n\n return result.join('').trim();\n}\n\nexport function formatMoney(money: Money | undefined): string {\n if (money?.value === undefined) {\n return '';\n }\n\n return money.value.toLocaleString(undefined, {\n style: 'currency',\n currency: money.currency || 'USD',\n currencyDisplay: 'narrowSymbol',\n });\n}\n\n/**\n * Formats a CodeableConcept element as a string.\n * @param codeableConcept A FHIR CodeableConcept element\n * @returns The codeable concept as a string.\n */\nexport function formatCodeableConcept(codeableConcept: CodeableConcept | undefined): string {\n if (!codeableConcept) {\n return '';\n }\n if (codeableConcept.text) {\n return codeableConcept.text;\n }\n if (codeableConcept.coding) {\n return codeableConcept.coding.map((c) => formatCoding(c)).join(', ');\n }\n return '';\n}\n\n/**\n * Formats a Coding element as a string.\n * @param coding A FHIR Coding element\n * @returns The coding as a string.\n */\nexport function formatCoding(coding: Coding | undefined): string {\n return coding?.display || coding?.code || '';\n}\n\n/**\n * Formats a FHIR Observation resource value as a string.\n * @param obs A FHIR Observation resource.\n * @returns A human-readable string representation of the Observation.\n */\nexport function formatObservationValue(obs: Observation | ObservationComponent | undefined): string {\n if (!obs) {\n return '';\n }\n\n if ('component' in obs) {\n return (obs.component as ObservationComponent[]).map((c) => formatObservationValue(c)).join(' / ');\n }\n\n if (obs?.valueQuantity) {\n return formatQuantity(obs.valueQuantity);\n }\n\n if (obs.valueCodeableConcept) {\n return formatCodeableConcept(obs.valueCodeableConcept);\n }\n\n if (obs.valueString) {\n return obs.valueString;\n }\n\n return '';\n}\n\n/**\n * Returns the input number increased by the `n` units of the specified precision\n * @param a The input number\n * @param precision The precision in number of digits.\n * @param n (default 1) The number of units to add\n */\nfunction preciseIncrement(a: number, precision: number, n = 1): number {\n return (toPreciseInteger(a, precision) + n) * Math.pow(10, -precision);\n}\n\n/**\n * Returns the input number decreased by the `n` units of the specified precision\n * @param a The input number\n * @param precision The precision in number of digits.\n * @param n (default 1) The number of units to subtract\n */\nfunction preciseDecrement(a: number, precision: number, n = 1): number {\n return (toPreciseInteger(a, precision) - n) * Math.pow(10, -precision);\n}\n\n/**\n * Returns an integer representation of the number with the given precision.\n * For example, if precision is 2, then 1.2345 will be returned as 123.\n * @param a The number.\n * @param precision Optional precision in number of digits.\n * @returns The integer with the given precision.\n */\nfunction toPreciseInteger(a: number, precision?: number): number {\n if (precision === undefined) {\n return a;\n }\n return Math.round(a * Math.pow(10, precision));\n}\n"],"names":[],"mappings":"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"}