@medplum/core 2.0.21 → 2.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +720 -494
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/esm/client.mjs +197 -114
- package/dist/esm/client.mjs.map +1 -1
- package/dist/esm/crypto.mjs +3 -1
- package/dist/esm/crypto.mjs.map +1 -1
- package/dist/esm/fhirlexer/parse.mjs.map +1 -1
- package/dist/esm/fhirlexer/tokenize.mjs +2 -2
- package/dist/esm/fhirlexer/tokenize.mjs.map +1 -1
- package/dist/esm/fhirpath/atoms.mjs +63 -56
- package/dist/esm/fhirpath/atoms.mjs.map +1 -1
- package/dist/esm/fhirpath/functions.mjs +370 -252
- package/dist/esm/fhirpath/functions.mjs.map +1 -1
- package/dist/esm/fhirpath/parse.mjs +4 -2
- package/dist/esm/fhirpath/parse.mjs.map +1 -1
- package/dist/esm/format.mjs +6 -4
- package/dist/esm/format.mjs.map +1 -1
- package/dist/esm/hl7.mjs +1 -1
- package/dist/esm/hl7.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/jwt.mjs +4 -2
- package/dist/esm/jwt.mjs.map +1 -1
- package/dist/esm/outcomes.mjs +14 -11
- package/dist/esm/outcomes.mjs.map +1 -1
- package/dist/esm/schema.mjs +4 -10
- package/dist/esm/schema.mjs.map +1 -1
- package/dist/esm/search/details.mjs +4 -5
- package/dist/esm/search/details.mjs.map +1 -1
- package/dist/esm/search/match.mjs +1 -0
- package/dist/esm/search/match.mjs.map +1 -1
- package/dist/esm/search/search.mjs +1 -1
- package/dist/esm/search/search.mjs.map +1 -1
- package/dist/esm/storage.mjs +8 -0
- package/dist/esm/storage.mjs.map +1 -1
- package/dist/esm/types.mjs +1 -0
- package/dist/esm/types.mjs.map +1 -1
- package/dist/esm/utils.mjs +8 -7
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/types/client.d.ts +128 -69
- package/dist/types/crypto.d.ts +3 -1
- package/dist/types/fhirlexer/parse.d.ts +7 -3
- package/dist/types/fhirpath/atoms.d.ts +21 -21
- package/dist/types/fhirpath/functions.d.ts +2 -2
- package/dist/types/fhirpath/parse.d.ts +2 -1
- package/dist/types/hl7.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/jwt.d.ts +2 -1
- package/dist/types/outcomes.d.ts +7 -1
- package/dist/types/schema.d.ts +4 -10
- package/dist/types/search/details.d.ts +0 -1
- package/dist/types/search/search.d.ts +1 -1
- package/dist/types/storage.d.ts +8 -0
- package/dist/types/typeschema/types.d.ts +0 -1
- package/dist/types/utils.d.ts +5 -12
- package/package.json +1 -1
package/dist/esm/crypto.mjs
CHANGED
|
@@ -2,6 +2,7 @@ import { arrayBufferToHex } from './utils.mjs';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Returns a cryptographically secure random string.
|
|
5
|
+
* @returns A cryptographically secure random string.
|
|
5
6
|
*/
|
|
6
7
|
function getRandomString() {
|
|
7
8
|
const randomItems = new Uint32Array(28);
|
|
@@ -10,7 +11,8 @@ function getRandomString() {
|
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Encrypts a string with SHA256 encryption.
|
|
13
|
-
* @param str
|
|
14
|
+
* @param str The unencrypted input string.
|
|
15
|
+
* @returns The encrypted value in an ArrayBuffer.
|
|
14
16
|
*/
|
|
15
17
|
async function encryptSHA256(str) {
|
|
16
18
|
return crypto.subtle.digest('SHA-256', new TextEncoder().encode(str));
|
package/dist/esm/crypto.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.mjs","sources":["../../src/crypto.ts"],"sourcesContent":["import { arrayBufferToHex } from './utils';\n\n/**\n * Returns a cryptographically secure random string.\n */\nexport function getRandomString(): string {\n const randomItems = new Uint32Array(28);\n crypto.getRandomValues(randomItems);\n return arrayBufferToHex(randomItems.buffer);\n}\n\n/**\n * Encrypts a string with SHA256 encryption.\n * @param str
|
|
1
|
+
{"version":3,"file":"crypto.mjs","sources":["../../src/crypto.ts"],"sourcesContent":["import { arrayBufferToHex } from './utils';\n\n/**\n * Returns a cryptographically secure random string.\n * @returns A cryptographically secure random string.\n */\nexport function getRandomString(): string {\n const randomItems = new Uint32Array(28);\n crypto.getRandomValues(randomItems);\n return arrayBufferToHex(randomItems.buffer);\n}\n\n/**\n * Encrypts a string with SHA256 encryption.\n * @param str The unencrypted input string.\n * @returns The encrypted value in an ArrayBuffer.\n */\nexport async function encryptSHA256(str: string): Promise<ArrayBuffer> {\n return crypto.subtle.digest('SHA-256', new TextEncoder().encode(str));\n}\n"],"names":[],"mappings":";;AAEA;;;AAGG;SACa,eAAe,GAAA;AAC7B,IAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACxC,IAAA,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;AACpC,IAAA,OAAO,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;AAIG;AACI,eAAe,aAAa,CAAC,GAAW,EAAA;AAC7C,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE;;;;"}
|
|
@@ -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":"
|
|
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\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): 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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"}
|
|
@@ -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":"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"}
|
|
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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"}
|
|
@@ -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 (
|
|
14
|
-
return
|
|
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
|
|
49
|
+
return input;
|
|
50
50
|
}
|
|
51
|
-
|
|
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
|
}
|
|
@@ -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, AtomContext, 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';\nexport class FhirPathAtom implements Atom {\n constructor(public readonly original: string, public readonly child: Atom) {}\n\n eval(context: AtomContext, input: TypedValue[]): TypedValue[] {\n try {\n if (input.length > 0) {\n return input.map((e) => this.child.eval(context, [e])).flat();\n } else {\n return this.child.eval(context, []);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n if (this.name === '$this') {\n return input;\n }\n if (this.name.startsWith('%')) {\n const symbol = context.variables[this.name.slice(1)];\n if (!symbol) {\n throw new Error(`Undefined variable ${this.name}`);\n }\n return [symbol];\n }\n return input.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: AtomContext, input: TypedValue[]): TypedValue[] {\n return this.impl(this.child.eval(context, input));\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: AtomContext, input: TypedValue[]): TypedValue[] {\n return functions.ofType(context, this.left.eval(context, input), 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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftEvalResult = this.left.eval(context, input);\n if (leftEvalResult.length !== 1) {\n return [];\n }\n const rightEvalResult = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n return this.right.eval(context, this.left.eval(context, input));\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context, input);\n const rightResult = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftValue = this.left.eval(context, input);\n if (toJsBoolean(leftValue)) {\n return leftValue;\n }\n\n const rightValue = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const leftResult = this.left.eval(context, input);\n const rightResult = this.right.eval(context, input);\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: AtomContext, input: TypedValue[]): TypedValue[] {\n const impl = functions[this.name];\n if (!impl) {\n throw new Error('Unrecognized function: ' + this.name);\n }\n return impl(context, input, ...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: AtomContext, input: TypedValue[]): TypedValue[] {\n const evalResult = this.expr.eval(context, input);\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, input);\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":"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"}
|