@medplum/core 2.0.22 → 2.0.24

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 (62) hide show
  1. package/dist/cjs/index.cjs +14080 -13218
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.min.cjs +1 -1
  4. package/dist/esm/access.mjs +142 -0
  5. package/dist/esm/access.mjs.map +1 -0
  6. package/dist/esm/bundle.mjs +3 -3
  7. package/dist/esm/bundle.mjs.map +1 -1
  8. package/dist/esm/client.mjs +111 -34
  9. package/dist/esm/client.mjs.map +1 -1
  10. package/dist/esm/fhirlexer/parse.mjs.map +1 -1
  11. package/dist/esm/fhirlexer/tokenize.mjs +2 -2
  12. package/dist/esm/fhirlexer/tokenize.mjs.map +1 -1
  13. package/dist/esm/fhirmapper/parse.mjs +1 -1
  14. package/dist/esm/fhirmapper/parse.mjs.map +1 -1
  15. package/dist/esm/fhirpath/atoms.mjs +63 -56
  16. package/dist/esm/fhirpath/atoms.mjs.map +1 -1
  17. package/dist/esm/fhirpath/functions.mjs +196 -128
  18. package/dist/esm/fhirpath/functions.mjs.map +1 -1
  19. package/dist/esm/fhirpath/parse.mjs +6 -3
  20. package/dist/esm/fhirpath/parse.mjs.map +1 -1
  21. package/dist/esm/fhirpath/utils.mjs +4 -5
  22. package/dist/esm/fhirpath/utils.mjs.map +1 -1
  23. package/dist/esm/format.mjs +1 -1
  24. package/dist/esm/format.mjs.map +1 -1
  25. package/dist/esm/hl7.mjs +6 -6
  26. package/dist/esm/hl7.mjs.map +1 -1
  27. package/dist/esm/index.min.mjs +1 -1
  28. package/dist/esm/index.mjs +5 -2
  29. package/dist/esm/index.mjs.map +1 -1
  30. package/dist/esm/outcomes.mjs +51 -24
  31. package/dist/esm/outcomes.mjs.map +1 -1
  32. package/dist/esm/readablepromise.mjs +1 -1
  33. package/dist/esm/readablepromise.mjs.map +1 -1
  34. package/dist/esm/schema.mjs +1 -1
  35. package/dist/esm/schema.mjs.map +1 -1
  36. package/dist/esm/search/details.mjs +18 -20
  37. package/dist/esm/search/details.mjs.map +1 -1
  38. package/dist/esm/search/match.mjs +7 -5
  39. package/dist/esm/search/match.mjs.map +1 -1
  40. package/dist/esm/search/search.mjs +14 -5
  41. package/dist/esm/search/search.mjs.map +1 -1
  42. package/dist/esm/types.mjs +1 -1
  43. package/dist/esm/types.mjs.map +1 -1
  44. package/dist/esm/typeschema/types.mjs +278 -0
  45. package/dist/esm/typeschema/types.mjs.map +1 -0
  46. package/dist/esm/typeschema/validation.mjs +262 -0
  47. package/dist/esm/typeschema/validation.mjs.map +1 -0
  48. package/dist/esm/utils.mjs +3 -3
  49. package/dist/esm/utils.mjs.map +1 -1
  50. package/dist/types/access.d.ts +48 -0
  51. package/dist/types/client.d.ts +69 -25
  52. package/dist/types/fhirlexer/parse.d.ts +12 -7
  53. package/dist/types/fhirpath/atoms.d.ts +21 -21
  54. package/dist/types/fhirpath/functions.d.ts +2 -4
  55. package/dist/types/fhirpath/parse.d.ts +2 -1
  56. package/dist/types/index.d.ts +3 -0
  57. package/dist/types/outcomes.d.ts +10 -2
  58. package/dist/types/search/search.d.ts +7 -0
  59. package/dist/types/typeschema/types.d.ts +5 -2
  60. package/dist/types/typeschema/validation.d.ts +2 -0
  61. package/dist/types/utils.d.ts +1 -8
  62. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parse.mjs","sources":["../../../src/fhirlexer/parse.ts"],"sourcesContent":["import { TypedValue } from '../types';\nimport { Token } from './tokenize';\n\nexport interface Atom {\n eval(context: TypedValue[]): TypedValue[];\n}\n\nexport abstract class PrefixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly child: Atom) {}\n\n abstract eval(context: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.operator}(${this.child.toString()})`;\n }\n}\n\nexport abstract class InfixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly left: Atom, public readonly right: Atom) {}\n\n abstract eval(context: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.left.toString()} ${this.operator} ${this.right.toString()}`;\n }\n}\n\nexport interface PrefixParselet {\n parse(parser: Parser, token: Token): Atom;\n}\n\nexport interface InfixParselet {\n precedence: number;\n parse?(parser: Parser, left: Atom, token: Token): Atom;\n}\n\nexport class ParserBuilder {\n private readonly prefixParselets: Record<string, PrefixParselet> = {};\n private readonly infixParselets: Record<string, InfixParselet> = {};\n\n public registerInfix(tokenType: string, parselet: InfixParselet): ParserBuilder {\n this.infixParselets[tokenType] = parselet;\n return this;\n }\n\n public registerPrefix(tokenType: string, parselet: PrefixParselet): ParserBuilder {\n this.prefixParselets[tokenType] = parselet;\n return this;\n }\n\n public prefix(tokenType: string, precedence: number, builder: (token: Token, right: Atom) => Atom): ParserBuilder {\n return this.registerPrefix(tokenType, {\n parse(parser, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(token, right);\n },\n });\n }\n\n public infixLeft(\n tokenType: string,\n precedence: number,\n builder: (left: Atom, token: Token, right: Atom) => Atom\n ): ParserBuilder {\n return this.registerInfix(tokenType, {\n parse(parser, left, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(left, token, right);\n },\n precedence,\n });\n }\n\n public construct(input: Token[]): Parser {\n return new Parser(input, this.prefixParselets, this.infixParselets);\n }\n}\n\nexport class Parser {\n private tokens: Token[];\n private prefixParselets: Record<string, PrefixParselet>;\n private infixParselets: Record<string, InfixParselet>;\n\n constructor(\n tokens: Token[],\n prefixParselets: Record<string, PrefixParselet>,\n infixParselets: Record<string, InfixParselet>\n ) {\n this.tokens = tokens;\n this.prefixParselets = prefixParselets;\n this.infixParselets = infixParselets;\n }\n\n hasMore(): boolean {\n return this.tokens.length > 0;\n }\n\n match(expected: string): boolean {\n const token = this.peek();\n if (token?.id !== expected) {\n return false;\n }\n\n this.consume();\n return true;\n }\n\n consumeAndParse(precedence = Infinity): Atom {\n const token = this.consume();\n const prefix = this.prefixParselets[token.id];\n if (!prefix) {\n throw Error(\n `Parse error at \"${token.value}\" (line ${token.line}, column ${token.column}). No matching prefix parselet.`\n );\n }\n\n let left = prefix.parse(this, token);\n\n while (precedence > this.getPrecedence()) {\n const next = this.consume();\n const infix = this.getInfixParselet(next) as InfixParselet;\n left = (infix.parse as (parser: Parser, left: Atom, token: Token) => Atom)(this, left, next);\n }\n\n return left;\n }\n\n getPrecedence(): number {\n const nextToken = this.peek();\n if (!nextToken) {\n return Infinity;\n }\n const parser = this.getInfixParselet(nextToken);\n if (parser) {\n return parser.precedence;\n }\n return Infinity;\n }\n\n consume(expectedId?: string, expectedValue?: string): Token {\n if (!this.tokens.length) {\n throw Error('Cant consume unknown more tokens.');\n }\n if (expectedId && this.peek()?.id !== expectedId) {\n const actual = this.peek() as Token;\n throw Error(`Expected ${expectedId} but got \"${actual.id}\" at line ${actual.line} column ${actual.column}.`);\n }\n if (expectedValue && this.peek()?.value !== expectedValue) {\n const actual = this.peek() as Token;\n throw Error(\n `Expected \"${expectedValue}\" but got \"${actual.value}\" at line ${actual.line} column ${actual.column}.`\n );\n }\n return this.tokens.shift() as Token;\n }\n\n peek(): Token | undefined {\n return this.tokens.length > 0 ? this.tokens[0] : undefined;\n }\n\n removeComments(): void {\n this.tokens = this.tokens.filter((t) => t.id !== 'Comment');\n }\n\n getInfixParselet(token: Token): InfixParselet | undefined {\n return this.infixParselets[token.id === 'Symbol' ? token.value : token.id];\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.mjs","sources":["../../../src/fhirlexer/parse.ts"],"sourcesContent":["import { TypedValue } from '../types';\nimport { Token } from './tokenize';\n\nexport interface AtomContext {\n parent?: AtomContext;\n variables: Record<string, TypedValue>;\n}\nexport interface Atom {\n eval(context: AtomContext, input: TypedValue[]): TypedValue[];\n\n toString(): string;\n}\n\nexport abstract class PrefixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly child: Atom) {}\n\n abstract eval(context: AtomContext, input: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.operator}(${this.child.toString()})`;\n }\n}\n\nexport abstract class InfixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly left: Atom, public readonly right: Atom) {}\n\n abstract eval(context: AtomContext, input: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.left.toString()} ${this.operator} ${this.right.toString()}`;\n }\n}\n\nexport interface PrefixParselet {\n parse(parser: Parser, token: Token): Atom;\n}\n\nexport interface InfixParselet {\n precedence: number;\n parse?(parser: Parser, left: Atom, token: Token): Atom;\n}\n\nexport class ParserBuilder {\n private readonly prefixParselets: Record<string, PrefixParselet> = {};\n private readonly infixParselets: Record<string, InfixParselet> = {};\n\n public registerInfix(tokenType: string, parselet: InfixParselet): this {\n this.infixParselets[tokenType] = parselet;\n return this;\n }\n\n public registerPrefix(tokenType: string, parselet: PrefixParselet): this {\n this.prefixParselets[tokenType] = parselet;\n return this;\n }\n\n public prefix(tokenType: string, precedence: number, builder: (token: Token, right: Atom) => Atom): this {\n return this.registerPrefix(tokenType, {\n parse(parser, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(token, right);\n },\n });\n }\n\n public infixLeft(\n tokenType: string,\n precedence: number,\n builder: (left: Atom, token: Token, right: Atom) => Atom\n ): this {\n return this.registerInfix(tokenType, {\n parse(parser, left, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(left, token, right);\n },\n precedence,\n });\n }\n\n public construct(input: Token[]): Parser {\n return new Parser(input, this.prefixParselets, this.infixParselets);\n }\n}\n\nexport class Parser {\n private tokens: Token[];\n private prefixParselets: Record<string, PrefixParselet>;\n private infixParselets: Record<string, InfixParselet>;\n\n constructor(\n tokens: Token[],\n prefixParselets: Record<string, PrefixParselet>,\n infixParselets: Record<string, InfixParselet>\n ) {\n this.tokens = tokens;\n this.prefixParselets = prefixParselets;\n this.infixParselets = infixParselets;\n }\n\n hasMore(): boolean {\n return this.tokens.length > 0;\n }\n\n match(expected: string): boolean {\n const token = this.peek();\n if (token?.id !== expected) {\n return false;\n }\n\n this.consume();\n return true;\n }\n\n consumeAndParse(precedence = Infinity): Atom {\n const token = this.consume();\n const prefix = this.prefixParselets[token.id];\n if (!prefix) {\n throw Error(\n `Parse error at \"${token.value}\" (line ${token.line}, column ${token.column}). No matching prefix parselet.`\n );\n }\n\n let left = prefix.parse(this, token);\n\n while (precedence > this.getPrecedence()) {\n const next = this.consume();\n const infix = this.getInfixParselet(next) as InfixParselet;\n left = (infix.parse as (parser: Parser, left: Atom, token: Token) => Atom)(this, left, next);\n }\n\n return left;\n }\n\n getPrecedence(): number {\n const nextToken = this.peek();\n if (!nextToken) {\n return Infinity;\n }\n const parser = this.getInfixParselet(nextToken);\n if (parser) {\n return parser.precedence;\n }\n return Infinity;\n }\n\n consume(expectedId?: string, expectedValue?: string): Token {\n if (!this.tokens.length) {\n throw Error('Cant consume unknown more tokens.');\n }\n if (expectedId && this.peek()?.id !== expectedId) {\n const actual = this.peek() as Token;\n throw Error(`Expected ${expectedId} but got \"${actual.id}\" at line ${actual.line} column ${actual.column}.`);\n }\n if (expectedValue && this.peek()?.value !== expectedValue) {\n const actual = this.peek() as Token;\n throw Error(\n `Expected \"${expectedValue}\" but got \"${actual.value}\" at line ${actual.line} column ${actual.column}.`\n );\n }\n return this.tokens.shift() as Token;\n }\n\n peek(): Token | undefined {\n return this.tokens.length > 0 ? this.tokens[0] : undefined;\n }\n\n removeComments(): void {\n this.tokens = this.tokens.filter((t) => t.id !== 'Comment');\n }\n\n getInfixParselet(token: Token): InfixParselet | undefined {\n return this.infixParselets[token.id === 'Symbol' ? token.value : token.id];\n }\n}\n"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ class Tokenizer {
25
25
  this.keywords = keywords;
26
26
  this.operators = operators;
27
27
  this.dateTimeLiterals = !!options?.dateTimeLiterals;
28
- this.symbolRegex = options?.symbolRegex ?? /[$\w]/;
28
+ this.symbolRegex = options?.symbolRegex ?? /[$\w%]/;
29
29
  }
30
30
  tokenize() {
31
31
  while (this.pos.index < this.str.length) {
@@ -74,7 +74,7 @@ class Tokenizer {
74
74
  if (c.match(/\w/)) {
75
75
  return this.consumeSymbol();
76
76
  }
77
- if (c === '$' && next.match(/\w/)) {
77
+ if ((c === '$' || c === '%') && next.match(/\w/)) {
78
78
  return this.consumeSymbol();
79
79
  }
80
80
  return this.consumeOperator();
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirlexer/tokenize.ts"],"sourcesContent":["export interface Marker {\n index: number;\n line: number;\n column: number;\n}\n\nexport interface Token extends Marker {\n id: string;\n value: string;\n}\n\nconst STANDARD_UNITS = [\n 'year',\n 'years',\n 'month',\n 'months',\n 'week',\n 'weeks',\n 'day',\n 'days',\n 'hour',\n 'hours',\n 'minute',\n 'minutes',\n 'second',\n 'seconds',\n 'millisecond',\n 'milliseconds',\n];\n\nexport interface TokenizerOptions {\n dateTimeLiterals?: boolean;\n symbolRegex?: RegExp;\n}\n\nexport class Tokenizer {\n private readonly str: string;\n private readonly keywords: string[];\n private readonly operators: string[];\n private readonly dateTimeLiterals: boolean;\n private readonly symbolRegex: RegExp;\n private readonly result: Token[] = [];\n private readonly pos: Marker = { index: 0, line: 1, column: 0 };\n private readonly markStack: Marker[] = [];\n\n constructor(str: string, keywords: string[], operators: string[], options?: TokenizerOptions) {\n this.str = str;\n this.keywords = keywords;\n this.operators = operators;\n this.dateTimeLiterals = !!options?.dateTimeLiterals;\n this.symbolRegex = options?.symbolRegex ?? /[$\\w]/;\n }\n\n tokenize(): Token[] {\n while (this.pos.index < this.str.length) {\n const token = this.consumeToken();\n if (token) {\n this.result.push(token);\n }\n }\n\n return this.result;\n }\n\n private prevToken(): Token | undefined {\n return this.result.slice(-1)[0];\n }\n\n private peekToken(): Token | undefined {\n this.mark();\n const token = this.consumeToken();\n this.reset();\n return token;\n }\n\n private consumeToken(): Token | undefined {\n this.consumeWhitespace();\n\n const c = this.curr();\n if (!c) {\n return undefined;\n }\n\n this.mark();\n\n const next = this.peek();\n\n if (c === '/' && next === '*') {\n return this.consumeMultiLineComment();\n }\n\n if (c === '/' && next === '/') {\n return this.consumeSingleLineComment();\n }\n\n if (c === \"'\" || c === '\"') {\n return this.consumeString(c);\n }\n\n if (c === '`') {\n return this.consumeBacktickSymbol();\n }\n\n if (c === '@') {\n return this.consumeDateTime();\n }\n\n if (c.match(/\\d/)) {\n return this.consumeNumber();\n }\n\n if (c.match(/\\w/)) {\n return this.consumeSymbol();\n }\n\n if (c === '$' && next.match(/\\w/)) {\n return this.consumeSymbol();\n }\n\n return this.consumeOperator();\n }\n\n private consumeWhitespace(): void {\n this.consumeWhile(() => this.curr().match(/\\s/));\n }\n\n private consumeMultiLineComment(): Token {\n const start = this.pos.index;\n this.consumeWhile(() => this.curr() !== '*' || this.peek() !== '/');\n this.advance();\n this.advance();\n return this.buildToken('Comment', this.str.substring(start, this.pos.index));\n }\n\n private consumeSingleLineComment(): Token {\n return this.buildToken(\n 'Comment',\n this.consumeWhile(() => this.curr() !== '\\n')\n );\n }\n\n private consumeString(endChar: string): Token {\n this.advance();\n const result = this.buildToken(\n 'String',\n this.consumeWhile(() => this.prev() === '\\\\' || this.curr() !== endChar)\n );\n this.advance();\n return result;\n }\n\n private consumeBacktickSymbol(): Token {\n this.advance();\n const result = this.buildToken(\n 'Symbol',\n this.consumeWhile(() => this.curr() !== '`')\n );\n this.advance();\n return result;\n }\n\n private consumeDateTime(): Token {\n this.advance(); // Consume \"@\"\n\n const start = this.pos.index;\n this.consumeWhile(() => this.curr().match(/[\\d-]/));\n\n if (this.curr() === 'T') {\n this.advance();\n this.consumeWhile(() => this.curr().match(/[\\d:]/));\n\n if (this.curr() === '.' && this.peek().match(/\\d/)) {\n this.advance();\n this.consumeWhile(() => this.curr().match(/\\d/));\n }\n\n if (this.curr() === 'Z') {\n this.advance();\n } else if (this.curr() === '+' || this.curr() === '-') {\n this.advance();\n this.consumeWhile(() => this.curr().match(/[\\d:]/));\n }\n }\n\n return this.buildToken('DateTime', this.str.substring(start, this.pos.index));\n }\n\n private consumeNumber(): Token {\n const start = this.pos.index;\n let id = 'Number';\n this.consumeWhile(() => this.curr().match(/\\d/));\n\n if (this.curr() === '.' && this.peek().match(/\\d/)) {\n this.advance();\n this.consumeWhile(() => this.curr().match(/\\d/));\n }\n\n if (this.curr() === '-' && this.dateTimeLiterals) {\n // Rewind to one character before the start, and then treat as dateTime literal.\n this.pos.index = start - 1;\n return this.consumeDateTime();\n }\n\n if (this.curr() === ' ') {\n if (isUnitToken(this.peekToken())) {\n id = 'Quantity';\n this.consumeToken();\n }\n }\n\n return this.buildToken(id, this.str.substring(start, this.pos.index));\n }\n\n private consumeSymbol(): Token {\n const value = this.consumeWhile(() => this.curr().match(this.symbolRegex));\n if (this.prevToken()?.value !== '.' && this.keywords.includes(value)) {\n return this.buildToken(value, value);\n }\n return this.buildToken('Symbol', value);\n }\n\n private consumeOperator(): Token {\n const c = this.curr();\n const next = this.peek();\n const twoCharOp = c + next;\n\n if (this.operators.includes(twoCharOp)) {\n this.advance();\n this.advance();\n return this.buildToken(twoCharOp, twoCharOp);\n }\n\n this.advance();\n return this.buildToken(c, c);\n }\n\n private consumeWhile(condition: () => unknown): string {\n const start = this.pos.index;\n\n while (this.pos.index < this.str.length && condition()) {\n this.advance();\n }\n\n return this.str.substring(start, this.pos.index);\n }\n\n private curr(): string {\n return this.str[this.pos.index];\n }\n\n private prev(): string {\n return this.str[this.pos.index - 1] ?? '';\n }\n\n private peek(): string {\n return this.str[this.pos.index + 1] ?? '';\n }\n\n private mark(): void {\n this.markStack.push({ ...this.pos });\n }\n\n private reset(): void {\n const mark = this.markStack.pop();\n if (!mark) {\n throw new Error('No mark to reset to');\n }\n this.pos.index = mark.index;\n this.pos.line = mark.line;\n this.pos.column = mark.column;\n }\n\n private advance(): void {\n this.pos.index++;\n if (this.curr() === '\\n') {\n this.pos.line++;\n this.pos.column = 0;\n } else {\n this.pos.column++;\n }\n }\n\n private buildToken(id: string, value: string): Token {\n const mark = this.markStack.pop();\n if (!mark) {\n throw new Error('No mark for token');\n }\n return {\n id,\n value,\n ...mark,\n };\n }\n}\n\nfunction isUnitToken(token: Token | undefined): boolean {\n if (token) {\n if (token.id === 'String') {\n return true;\n }\n\n if (token.id === 'Symbol' && STANDARD_UNITS.includes(token.value)) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"AAWA,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,aAAa;IACb,cAAc;CACf,CAAC;MAOW,SAAS,CAAA;AAUpB,IAAA,WAAA,CAAY,GAAW,EAAE,QAAkB,EAAE,SAAmB,EAAE,OAA0B,EAAA;QAJ3E,IAAM,CAAA,MAAA,GAAY,EAAE,CAAC;AACrB,QAAA,IAAA,CAAA,GAAG,GAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC/C,IAAS,CAAA,SAAA,GAAa,EAAE,CAAC;AAGxC,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC;KACpD;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAClC,YAAA,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,aAAA;AACF,SAAA;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAEO,SAAS,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACjC;IAEO,SAAS,GAAA;QACf,IAAI,CAAC,IAAI,EAAE,CAAC;AACZ,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,QAAA,OAAO,KAAK,CAAC;KACd;IAEO,YAAY,GAAA;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAEzB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,EAAE;AACN,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;AAEZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAEzB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACvC,SAAA;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACxC,SAAA;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC9B,SAAA;QAED,IAAI,CAAC,KAAK,GAAG,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACrC,SAAA;QAED,IAAI,CAAC,KAAK,GAAG,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;AAC/B,SAAA;AAED,QAAA,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7B,SAAA;AAED,QAAA,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7B,SAAA;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7B,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;KAC/B;IAEO,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;KAClD;IAEO,uBAAuB,GAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9E;IAEO,wBAAwB,GAAA;QAC9B,OAAO,IAAI,CAAC,UAAU,CACpB,SAAS,EACT,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAC9C,CAAC;KACH;AAEO,IAAA,aAAa,CAAC,OAAe,EAAA;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAC5B,QAAQ,EACR,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CACzE,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,OAAO,MAAM,CAAC;KACf;IAEO,qBAAqB,GAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAC5B,QAAQ,EACR,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAC7C,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,OAAO,MAAM,CAAC;KACf;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC;AAEf,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpD,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAClD,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,aAAA;AAED,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;AAChB,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;gBACrD,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,aAAA;AACF,SAAA;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KAC/E;IAEO,aAAa,GAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAClD,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,SAAA;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE;;YAEhD,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAC3B,YAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;AAC/B,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACvB,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;gBACjC,EAAE,GAAG,UAAU,CAAC;gBAChB,IAAI,CAAC,YAAY,EAAE,CAAC;AACrB,aAAA;AACF,SAAA;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KACvE;IAEO,aAAa,GAAA;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3E,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACpE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtC,SAAA;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KACzC;IAEO,eAAe,GAAA;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACzB,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC;QAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9C,SAAA;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9B;AAEO,IAAA,YAAY,CAAC,SAAwB,EAAA;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC;AAChB,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAClD;IAEO,IAAI,GAAA;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACjC;IAEO,IAAI,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3C;IAEO,IAAI,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3C;IAEO,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;KACtC;IAEO,KAAK,GAAA;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACxC,SAAA;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;KAC/B;IAEO,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AACjB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAChB,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACrB,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AACnB,SAAA;KACF;IAEO,UAAU,CAAC,EAAU,EAAE,KAAa,EAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACtC,SAAA;QACD,OAAO;YACL,EAAE;YACF,KAAK;AACL,YAAA,GAAG,IAAI;SACR,CAAC;KACH;AACF,CAAA;AAED,SAAS,WAAW,CAAC,KAAwB,EAAA;AAC3C,IAAA,IAAI,KAAK,EAAE;AACT,QAAA,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE;AACzB,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAED,QAAA,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACjE,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACF,KAAA;AAED,IAAA,OAAO,KAAK,CAAC;AACf;;;;"}
1
+ {"version":3,"file":"tokenize.mjs","sources":["../../../src/fhirlexer/tokenize.ts"],"sourcesContent":["export interface Marker {\n index: number;\n line: number;\n column: number;\n}\n\nexport interface Token extends Marker {\n id: string;\n value: string;\n}\n\nconst STANDARD_UNITS = [\n 'year',\n 'years',\n 'month',\n 'months',\n 'week',\n 'weeks',\n 'day',\n 'days',\n 'hour',\n 'hours',\n 'minute',\n 'minutes',\n 'second',\n 'seconds',\n 'millisecond',\n 'milliseconds',\n];\n\nexport interface TokenizerOptions {\n dateTimeLiterals?: boolean;\n symbolRegex?: RegExp;\n}\n\nexport class Tokenizer {\n private readonly str: string;\n private readonly keywords: string[];\n private readonly operators: string[];\n private readonly dateTimeLiterals: boolean;\n private readonly symbolRegex: RegExp;\n private readonly result: Token[] = [];\n private readonly pos: Marker = { index: 0, line: 1, column: 0 };\n private readonly markStack: Marker[] = [];\n\n constructor(str: string, keywords: string[], operators: string[], options?: TokenizerOptions) {\n this.str = str;\n this.keywords = keywords;\n this.operators = operators;\n this.dateTimeLiterals = !!options?.dateTimeLiterals;\n this.symbolRegex = options?.symbolRegex ?? /[$\\w%]/;\n }\n\n tokenize(): Token[] {\n while (this.pos.index < this.str.length) {\n const token = this.consumeToken();\n if (token) {\n this.result.push(token);\n }\n }\n\n return this.result;\n }\n\n private prevToken(): Token | undefined {\n return this.result.slice(-1)[0];\n }\n\n private peekToken(): Token | undefined {\n this.mark();\n const token = this.consumeToken();\n this.reset();\n return token;\n }\n\n private consumeToken(): Token | undefined {\n this.consumeWhitespace();\n\n const c = this.curr();\n if (!c) {\n return undefined;\n }\n\n this.mark();\n\n const next = this.peek();\n\n if (c === '/' && next === '*') {\n return this.consumeMultiLineComment();\n }\n\n if (c === '/' && next === '/') {\n return this.consumeSingleLineComment();\n }\n\n if (c === \"'\" || c === '\"') {\n return this.consumeString(c);\n }\n\n if (c === '`') {\n return this.consumeBacktickSymbol();\n }\n\n if (c === '@') {\n return this.consumeDateTime();\n }\n\n if (c.match(/\\d/)) {\n return this.consumeNumber();\n }\n\n if (c.match(/\\w/)) {\n return this.consumeSymbol();\n }\n\n if ((c === '$' || c === '%') && next.match(/\\w/)) {\n return this.consumeSymbol();\n }\n\n return this.consumeOperator();\n }\n\n private consumeWhitespace(): void {\n this.consumeWhile(() => this.curr().match(/\\s/));\n }\n\n private consumeMultiLineComment(): Token {\n const start = this.pos.index;\n this.consumeWhile(() => this.curr() !== '*' || this.peek() !== '/');\n this.advance();\n this.advance();\n return this.buildToken('Comment', this.str.substring(start, this.pos.index));\n }\n\n private consumeSingleLineComment(): Token {\n return this.buildToken(\n 'Comment',\n this.consumeWhile(() => this.curr() !== '\\n')\n );\n }\n\n private consumeString(endChar: string): Token {\n this.advance();\n const result = this.buildToken(\n 'String',\n this.consumeWhile(() => this.prev() === '\\\\' || this.curr() !== endChar)\n );\n this.advance();\n return result;\n }\n\n private consumeBacktickSymbol(): Token {\n this.advance();\n const result = this.buildToken(\n 'Symbol',\n this.consumeWhile(() => this.curr() !== '`')\n );\n this.advance();\n return result;\n }\n\n private consumeDateTime(): Token {\n this.advance(); // Consume \"@\"\n\n const start = this.pos.index;\n this.consumeWhile(() => this.curr().match(/[\\d-]/));\n\n if (this.curr() === 'T') {\n this.advance();\n this.consumeWhile(() => this.curr().match(/[\\d:]/));\n\n if (this.curr() === '.' && this.peek().match(/\\d/)) {\n this.advance();\n this.consumeWhile(() => this.curr().match(/\\d/));\n }\n\n if (this.curr() === 'Z') {\n this.advance();\n } else if (this.curr() === '+' || this.curr() === '-') {\n this.advance();\n this.consumeWhile(() => this.curr().match(/[\\d:]/));\n }\n }\n\n return this.buildToken('DateTime', this.str.substring(start, this.pos.index));\n }\n\n private consumeNumber(): Token {\n const start = this.pos.index;\n let id = 'Number';\n this.consumeWhile(() => this.curr().match(/\\d/));\n\n if (this.curr() === '.' && this.peek().match(/\\d/)) {\n this.advance();\n this.consumeWhile(() => this.curr().match(/\\d/));\n }\n\n if (this.curr() === '-' && this.dateTimeLiterals) {\n // Rewind to one character before the start, and then treat as dateTime literal.\n this.pos.index = start - 1;\n return this.consumeDateTime();\n }\n\n if (this.curr() === ' ') {\n if (isUnitToken(this.peekToken())) {\n id = 'Quantity';\n this.consumeToken();\n }\n }\n\n return this.buildToken(id, this.str.substring(start, this.pos.index));\n }\n\n private consumeSymbol(): Token {\n const value = this.consumeWhile(() => this.curr().match(this.symbolRegex));\n if (this.prevToken()?.value !== '.' && this.keywords.includes(value)) {\n return this.buildToken(value, value);\n }\n return this.buildToken('Symbol', value);\n }\n\n private consumeOperator(): Token {\n const c = this.curr();\n const next = this.peek();\n const twoCharOp = c + next;\n\n if (this.operators.includes(twoCharOp)) {\n this.advance();\n this.advance();\n return this.buildToken(twoCharOp, twoCharOp);\n }\n\n this.advance();\n return this.buildToken(c, c);\n }\n\n private consumeWhile(condition: () => unknown): string {\n const start = this.pos.index;\n\n while (this.pos.index < this.str.length && condition()) {\n this.advance();\n }\n\n return this.str.substring(start, this.pos.index);\n }\n\n private curr(): string {\n return this.str[this.pos.index];\n }\n\n private prev(): string {\n return this.str[this.pos.index - 1] ?? '';\n }\n\n private peek(): string {\n return this.str[this.pos.index + 1] ?? '';\n }\n\n private mark(): void {\n this.markStack.push({ ...this.pos });\n }\n\n private reset(): void {\n const mark = this.markStack.pop();\n if (!mark) {\n throw new Error('No mark to reset to');\n }\n this.pos.index = mark.index;\n this.pos.line = mark.line;\n this.pos.column = mark.column;\n }\n\n private advance(): void {\n this.pos.index++;\n if (this.curr() === '\\n') {\n this.pos.line++;\n this.pos.column = 0;\n } else {\n this.pos.column++;\n }\n }\n\n private buildToken(id: string, value: string): Token {\n const mark = this.markStack.pop();\n if (!mark) {\n throw new Error('No mark for token');\n }\n return {\n id,\n value,\n ...mark,\n };\n }\n}\n\nfunction isUnitToken(token: Token | undefined): boolean {\n if (token) {\n if (token.id === 'String') {\n return true;\n }\n\n if (token.id === 'Symbol' && STANDARD_UNITS.includes(token.value)) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -261,7 +261,7 @@ class StructureMapParser {
261
261
  case 'create':
262
262
  result.parameter = [
263
263
  {
264
- valueString: (functionAtom.args?.[0]).value.value,
264
+ valueString: functionAtom.args[0].value.value,
265
265
  },
266
266
  ];
267
267
  break;
@@ -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 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
+ {"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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"}
@@ -8,13 +8,13 @@ class FhirPathAtom {
8
8
  this.original = original;
9
9
  this.child = child;
10
10
  }
11
- eval(context) {
11
+ eval(context, input) {
12
12
  try {
13
- if (context.length > 0) {
14
- return context.map((e) => this.child.eval([e])).flat();
13
+ if (input.length > 0) {
14
+ return input.map((e) => this.child.eval(context, [e])).flat();
15
15
  }
16
16
  else {
17
- return this.child.eval([]);
17
+ return this.child.eval(context, []);
18
18
  }
19
19
  }
20
20
  catch (error) {
@@ -44,11 +44,18 @@ class SymbolAtom {
44
44
  constructor(name) {
45
45
  this.name = name;
46
46
  }
47
- eval(context) {
47
+ eval(context, input) {
48
48
  if (this.name === '$this') {
49
- return context;
49
+ return input;
50
50
  }
51
- return context.flatMap((e) => this.evalValue(e)).filter((e) => e?.value !== undefined);
51
+ if (this.name.startsWith('%')) {
52
+ const symbol = context.variables[this.name.slice(1)];
53
+ if (!symbol) {
54
+ throw new Error(`Undefined variable ${this.name}`);
55
+ }
56
+ return [symbol];
57
+ }
58
+ return input.flatMap((e) => this.evalValue(e)).filter((e) => e?.value !== undefined);
52
59
  }
53
60
  evalValue(typedValue) {
54
61
  const input = typedValue.value;
@@ -77,8 +84,8 @@ class UnaryOperatorAtom extends PrefixOperatorAtom {
77
84
  super(operator, child);
78
85
  this.impl = impl;
79
86
  }
80
- eval(context) {
81
- return this.impl(this.child.eval(context));
87
+ eval(context, input) {
88
+ return this.impl(this.child.eval(context, input));
82
89
  }
83
90
  toString() {
84
91
  return this.child.toString();
@@ -88,8 +95,8 @@ class AsAtom extends InfixOperatorAtom {
88
95
  constructor(left, right) {
89
96
  super('as', left, right);
90
97
  }
91
- eval(context) {
92
- return functions.ofType(this.left.eval(context), this.right);
98
+ eval(context, input) {
99
+ return functions.ofType(context, this.left.eval(context, input), this.right);
93
100
  }
94
101
  }
95
102
  class ArithemticOperatorAtom extends InfixOperatorAtom {
@@ -97,12 +104,12 @@ class ArithemticOperatorAtom extends InfixOperatorAtom {
97
104
  super(operator, left, right);
98
105
  this.impl = impl;
99
106
  }
100
- eval(context) {
101
- const leftEvalResult = this.left.eval(context);
107
+ eval(context, input) {
108
+ const leftEvalResult = this.left.eval(context, input);
102
109
  if (leftEvalResult.length !== 1) {
103
110
  return [];
104
111
  }
105
- const rightEvalResult = this.right.eval(context);
112
+ const rightEvalResult = this.right.eval(context, input);
106
113
  if (rightEvalResult.length !== 1) {
107
114
  return [];
108
115
  }
@@ -126,9 +133,9 @@ class ConcatAtom extends InfixOperatorAtom {
126
133
  constructor(left, right) {
127
134
  super('&', left, right);
128
135
  }
129
- eval(context) {
130
- const leftValue = this.left.eval(context);
131
- const rightValue = this.right.eval(context);
136
+ eval(context, input) {
137
+ const leftValue = this.left.eval(context, input);
138
+ const rightValue = this.right.eval(context, input);
132
139
  const result = [...leftValue, ...rightValue];
133
140
  if (result.length > 0 && result.every((e) => typeof e.value === 'string')) {
134
141
  return [{ type: PropertyType.string, value: result.map((e) => e.value).join('') }];
@@ -140,9 +147,9 @@ class ContainsAtom extends InfixOperatorAtom {
140
147
  constructor(left, right) {
141
148
  super('contains', left, right);
142
149
  }
143
- eval(context) {
144
- const leftValue = this.left.eval(context);
145
- const rightValue = this.right.eval(context);
150
+ eval(context, input) {
151
+ const leftValue = this.left.eval(context, input);
152
+ const rightValue = this.right.eval(context, input);
146
153
  return booleanToTypedValue(leftValue.some((e) => e.value === rightValue[0].value));
147
154
  }
148
155
  }
@@ -150,9 +157,9 @@ class InAtom extends InfixOperatorAtom {
150
157
  constructor(left, right) {
151
158
  super('in', left, right);
152
159
  }
153
- eval(context) {
154
- const leftValue = this.left.eval(context);
155
- const rightValue = this.right.eval(context);
160
+ eval(context, input) {
161
+ const leftValue = this.left.eval(context, input);
162
+ const rightValue = this.right.eval(context, input);
156
163
  return booleanToTypedValue(rightValue.some((e) => e.value === leftValue[0].value));
157
164
  }
158
165
  }
@@ -160,8 +167,8 @@ class DotAtom extends InfixOperatorAtom {
160
167
  constructor(left, right) {
161
168
  super('.', left, right);
162
169
  }
163
- eval(context) {
164
- return this.right.eval(this.left.eval(context));
170
+ eval(context, input) {
171
+ return this.right.eval(context, this.left.eval(context, input));
165
172
  }
166
173
  toString() {
167
174
  return `${this.left.toString()}.${this.right.toString()}`;
@@ -171,9 +178,9 @@ class UnionAtom extends InfixOperatorAtom {
171
178
  constructor(left, right) {
172
179
  super('|', left, right);
173
180
  }
174
- eval(context) {
175
- const leftResult = this.left.eval(context);
176
- const rightResult = this.right.eval(context);
181
+ eval(context, input) {
182
+ const leftResult = this.left.eval(context, input);
183
+ const rightResult = this.right.eval(context, input);
177
184
  return removeDuplicates([...leftResult, ...rightResult]);
178
185
  }
179
186
  }
@@ -181,9 +188,9 @@ class EqualsAtom extends InfixOperatorAtom {
181
188
  constructor(left, right) {
182
189
  super('=', left, right);
183
190
  }
184
- eval(context) {
185
- const leftValue = this.left.eval(context);
186
- const rightValue = this.right.eval(context);
191
+ eval(context, input) {
192
+ const leftValue = this.left.eval(context, input);
193
+ const rightValue = this.right.eval(context, input);
187
194
  return fhirPathArrayEquals(leftValue, rightValue);
188
195
  }
189
196
  }
@@ -191,9 +198,9 @@ class NotEqualsAtom extends InfixOperatorAtom {
191
198
  constructor(left, right) {
192
199
  super('!=', left, right);
193
200
  }
194
- eval(context) {
195
- const leftValue = this.left.eval(context);
196
- const rightValue = this.right.eval(context);
201
+ eval(context, input) {
202
+ const leftValue = this.left.eval(context, input);
203
+ const rightValue = this.right.eval(context, input);
197
204
  return fhirPathNot(fhirPathArrayEquals(leftValue, rightValue));
198
205
  }
199
206
  }
@@ -201,9 +208,9 @@ class EquivalentAtom extends InfixOperatorAtom {
201
208
  constructor(left, right) {
202
209
  super('~', left, right);
203
210
  }
204
- eval(context) {
205
- const leftValue = this.left.eval(context);
206
- const rightValue = this.right.eval(context);
211
+ eval(context, input) {
212
+ const leftValue = this.left.eval(context, input);
213
+ const rightValue = this.right.eval(context, input);
207
214
  return fhirPathArrayEquivalent(leftValue, rightValue);
208
215
  }
209
216
  }
@@ -211,9 +218,9 @@ class NotEquivalentAtom extends InfixOperatorAtom {
211
218
  constructor(left, right) {
212
219
  super('!~', left, right);
213
220
  }
214
- eval(context) {
215
- const leftValue = this.left.eval(context);
216
- const rightValue = this.right.eval(context);
221
+ eval(context, input) {
222
+ const leftValue = this.left.eval(context, input);
223
+ const rightValue = this.right.eval(context, input);
217
224
  return fhirPathNot(fhirPathArrayEquivalent(leftValue, rightValue));
218
225
  }
219
226
  }
@@ -221,8 +228,8 @@ class IsAtom extends InfixOperatorAtom {
221
228
  constructor(left, right) {
222
229
  super('is', left, right);
223
230
  }
224
- eval(context) {
225
- const leftValue = this.left.eval(context);
231
+ eval(context, input) {
232
+ const leftValue = this.left.eval(context, input);
226
233
  if (leftValue.length !== 1) {
227
234
  return [];
228
235
  }
@@ -240,9 +247,9 @@ class AndAtom extends InfixOperatorAtom {
240
247
  constructor(left, right) {
241
248
  super('and', left, right);
242
249
  }
243
- eval(context) {
244
- const leftValue = this.left.eval(context);
245
- const rightValue = this.right.eval(context);
250
+ eval(context, input) {
251
+ const leftValue = this.left.eval(context, input);
252
+ const rightValue = this.right.eval(context, input);
246
253
  if (leftValue[0]?.value === true && rightValue[0]?.value === true) {
247
254
  return booleanToTypedValue(true);
248
255
  }
@@ -256,12 +263,12 @@ class OrAtom extends InfixOperatorAtom {
256
263
  constructor(left, right) {
257
264
  super('or', left, right);
258
265
  }
259
- eval(context) {
260
- const leftValue = this.left.eval(context);
266
+ eval(context, input) {
267
+ const leftValue = this.left.eval(context, input);
261
268
  if (toJsBoolean(leftValue)) {
262
269
  return leftValue;
263
270
  }
264
- const rightValue = this.right.eval(context);
271
+ const rightValue = this.right.eval(context, input);
265
272
  if (toJsBoolean(rightValue)) {
266
273
  return rightValue;
267
274
  }
@@ -278,9 +285,9 @@ class XorAtom extends InfixOperatorAtom {
278
285
  constructor(left, right) {
279
286
  super('xor', left, right);
280
287
  }
281
- eval(context) {
282
- const leftResult = this.left.eval(context);
283
- const rightResult = this.right.eval(context);
288
+ eval(context, input) {
289
+ const leftResult = this.left.eval(context, input);
290
+ const rightResult = this.right.eval(context, input);
284
291
  if (leftResult.length === 0 && rightResult.length === 0) {
285
292
  return [];
286
293
  }
@@ -300,12 +307,12 @@ class FunctionAtom {
300
307
  this.name = name;
301
308
  this.args = args;
302
309
  }
303
- eval(context) {
310
+ eval(context, input) {
304
311
  const impl = functions[this.name];
305
312
  if (!impl) {
306
313
  throw new Error('Unrecognized function: ' + this.name);
307
314
  }
308
- return impl(context, ...this.args);
315
+ return impl(context, input, ...this.args);
309
316
  }
310
317
  toString() {
311
318
  return `${this.name}(${this.args.map((arg) => arg.toString()).join(', ')})`;
@@ -316,8 +323,8 @@ class IndexerAtom {
316
323
  this.left = left;
317
324
  this.expr = expr;
318
325
  }
319
- eval(context) {
320
- const evalResult = this.expr.eval(context);
326
+ eval(context, input) {
327
+ const evalResult = this.expr.eval(context, input);
321
328
  if (evalResult.length !== 1) {
322
329
  return [];
323
330
  }
@@ -325,7 +332,7 @@ class IndexerAtom {
325
332
  if (typeof index !== 'number') {
326
333
  throw new Error(`Invalid indexer expression: should return integer}`);
327
334
  }
328
- const leftResult = this.left.eval(context);
335
+ const leftResult = this.left.eval(context, input);
329
336
  if (!(index in leftResult)) {
330
337
  return [];
331
338
  }