@medplum/core 0.9.35 → 0.9.37
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/client.d.ts +14 -5
- package/dist/cjs/fhirlexer/index.d.ts +2 -0
- package/dist/cjs/fhirlexer/parse.d.ts +31 -0
- package/dist/cjs/fhirlexer/tokenize.d.ts +14 -0
- package/dist/cjs/fhirmapper/atoms.d.ts +67 -0
- package/dist/cjs/fhirmapper/parse.d.ts +7 -0
- package/dist/cjs/fhirmapper/tokenize.d.ts +2 -0
- package/dist/cjs/fhirpath/atoms.d.ts +2 -7
- package/dist/cjs/fhirpath/functions.d.ts +2 -1
- package/dist/cjs/fhirpath/parse.d.ts +8 -5
- package/dist/cjs/fhirpath/tokenize.d.ts +3 -4
- package/dist/cjs/fhirpath/utils.d.ts +1 -1
- package/dist/cjs/index.js +310 -272
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +1 -1
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/types.d.ts +4 -0
- package/dist/esm/client.d.ts +14 -5
- package/dist/esm/client.js +58 -45
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/fhirlexer/index.d.ts +2 -0
- package/dist/esm/fhirlexer/parse.d.ts +31 -0
- package/dist/esm/fhirlexer/parse.js +105 -0
- package/dist/esm/fhirlexer/parse.js.map +1 -0
- package/dist/esm/fhirlexer/tokenize.d.ts +14 -0
- package/dist/esm/fhirlexer/tokenize.js +212 -0
- package/dist/esm/fhirlexer/tokenize.js.map +1 -0
- package/dist/esm/fhirmapper/atoms.d.ts +67 -0
- package/dist/esm/fhirmapper/parse.d.ts +7 -0
- package/dist/esm/fhirmapper/tokenize.d.ts +2 -0
- package/dist/esm/fhirpath/atoms.d.ts +2 -7
- package/dist/esm/fhirpath/atoms.js.map +1 -1
- package/dist/esm/fhirpath/functions.d.ts +2 -1
- package/dist/esm/fhirpath/functions.js.map +1 -1
- package/dist/esm/fhirpath/parse.d.ts +8 -5
- package/dist/esm/fhirpath/parse.js +57 -169
- package/dist/esm/fhirpath/parse.js.map +1 -1
- package/dist/esm/fhirpath/tokenize.d.ts +3 -4
- package/dist/esm/fhirpath/tokenize.js +5 -180
- package/dist/esm/fhirpath/tokenize.js.map +1 -1
- package/dist/esm/fhirpath/utils.d.ts +1 -1
- package/dist/esm/fhirpath/utils.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/outcomes.js +1 -1
- package/dist/esm/outcomes.js.map +1 -1
- package/dist/esm/types.d.ts +4 -0
- package/dist/esm/types.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,98 +1,11 @@
|
|
|
1
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from '../node_modules/tslib/tslib.es6.js';
|
|
2
1
|
import { PropertyType } from '../types.js';
|
|
3
|
-
import { LiteralAtom, SymbolAtom, EmptySetAtom, UnaryOperatorAtom, ArithemticOperatorAtom, DotAtom, UnionAtom, EqualsAtom, NotEqualsAtom, EquivalentAtom, NotEquivalentAtom, ConcatAtom,
|
|
2
|
+
import { LiteralAtom, SymbolAtom, EmptySetAtom, UnaryOperatorAtom, ArithemticOperatorAtom, DotAtom, UnionAtom, EqualsAtom, NotEqualsAtom, EquivalentAtom, NotEquivalentAtom, ConcatAtom, AndAtom, AsAtom, ContainsAtom, InAtom, IsAtom, OrAtom, XorAtom, FhirPathAtom, IndexerAtom, FunctionAtom } from './atoms.js';
|
|
4
3
|
import { parseDateString } from './date.js';
|
|
5
4
|
import { functions } from './functions.js';
|
|
6
5
|
import { tokenize } from './tokenize.js';
|
|
7
6
|
import { toTypedValue } from './utils.js';
|
|
7
|
+
import { ParserBuilder } from '../fhirlexer/parse.js';
|
|
8
8
|
|
|
9
|
-
var _ParserBuilder_prefixParselets, _ParserBuilder_infixParselets, _Parser_instances, _Parser_tokens, _Parser_prefixParselets, _Parser_infixParselets, _Parser_getPrecedence, _Parser_consume, _Parser_look;
|
|
10
|
-
class ParserBuilder {
|
|
11
|
-
constructor() {
|
|
12
|
-
_ParserBuilder_prefixParselets.set(this, {});
|
|
13
|
-
_ParserBuilder_infixParselets.set(this, {});
|
|
14
|
-
}
|
|
15
|
-
registerInfix(tokenType, parselet) {
|
|
16
|
-
__classPrivateFieldGet(this, _ParserBuilder_infixParselets, "f")[tokenType] = parselet;
|
|
17
|
-
return this;
|
|
18
|
-
}
|
|
19
|
-
registerPrefix(tokenType, parselet) {
|
|
20
|
-
__classPrivateFieldGet(this, _ParserBuilder_prefixParselets, "f")[tokenType] = parselet;
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
prefix(tokenType, precedence, builder) {
|
|
24
|
-
return this.registerPrefix(tokenType, {
|
|
25
|
-
parse(parser, token) {
|
|
26
|
-
const right = parser.consumeAndParse(precedence);
|
|
27
|
-
return builder(token, right);
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
infixLeft(tokenType, precedence, builder) {
|
|
32
|
-
return this.registerInfix(tokenType, {
|
|
33
|
-
parse(parser, left, token) {
|
|
34
|
-
const right = parser.consumeAndParse(precedence);
|
|
35
|
-
return builder(left, token, right);
|
|
36
|
-
},
|
|
37
|
-
precedence,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
construct(input) {
|
|
41
|
-
return new Parser(tokenize(input), __classPrivateFieldGet(this, _ParserBuilder_prefixParselets, "f"), __classPrivateFieldGet(this, _ParserBuilder_infixParselets, "f"));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
_ParserBuilder_prefixParselets = new WeakMap(), _ParserBuilder_infixParselets = new WeakMap();
|
|
45
|
-
class Parser {
|
|
46
|
-
constructor(tokens, prefixParselets, infixParselets) {
|
|
47
|
-
_Parser_instances.add(this);
|
|
48
|
-
_Parser_tokens.set(this, void 0);
|
|
49
|
-
_Parser_prefixParselets.set(this, void 0);
|
|
50
|
-
_Parser_infixParselets.set(this, void 0);
|
|
51
|
-
__classPrivateFieldSet(this, _Parser_tokens, tokens, "f");
|
|
52
|
-
__classPrivateFieldSet(this, _Parser_prefixParselets, prefixParselets, "f");
|
|
53
|
-
__classPrivateFieldSet(this, _Parser_infixParselets, infixParselets, "f");
|
|
54
|
-
}
|
|
55
|
-
match(expected) {
|
|
56
|
-
const token = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_look).call(this);
|
|
57
|
-
if ((token === null || token === void 0 ? void 0 : token.id) !== expected) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
__classPrivateFieldGet(this, _Parser_instances, "m", _Parser_consume).call(this);
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
consumeAndParse(precedence = 100 /* Precedence.MaximumPrecedence */) {
|
|
64
|
-
const token = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_consume).call(this);
|
|
65
|
-
const prefix = __classPrivateFieldGet(this, _Parser_prefixParselets, "f")[token.id];
|
|
66
|
-
if (!prefix) {
|
|
67
|
-
throw Error(`Parse error at ${token.value}. No matching prefix parselet.`);
|
|
68
|
-
}
|
|
69
|
-
let left = prefix.parse(this, token);
|
|
70
|
-
while (precedence > __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_getPrecedence).call(this)) {
|
|
71
|
-
const next = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_consume).call(this);
|
|
72
|
-
const infix = __classPrivateFieldGet(this, _Parser_infixParselets, "f")[next.id];
|
|
73
|
-
left = infix.parse(this, left, next);
|
|
74
|
-
}
|
|
75
|
-
return left;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
_Parser_tokens = new WeakMap(), _Parser_prefixParselets = new WeakMap(), _Parser_infixParselets = new WeakMap(), _Parser_instances = new WeakSet(), _Parser_getPrecedence = function _Parser_getPrecedence() {
|
|
79
|
-
const nextToken = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_look).call(this);
|
|
80
|
-
if (!nextToken) {
|
|
81
|
-
return 100 /* Precedence.MaximumPrecedence */;
|
|
82
|
-
}
|
|
83
|
-
const parser = __classPrivateFieldGet(this, _Parser_infixParselets, "f")[nextToken.id];
|
|
84
|
-
if (parser) {
|
|
85
|
-
return parser.precedence;
|
|
86
|
-
}
|
|
87
|
-
return 100 /* Precedence.MaximumPrecedence */;
|
|
88
|
-
}, _Parser_consume = function _Parser_consume() {
|
|
89
|
-
if (!__classPrivateFieldGet(this, _Parser_tokens, "f").length) {
|
|
90
|
-
throw Error('Cant consume unknown more tokens.');
|
|
91
|
-
}
|
|
92
|
-
return __classPrivateFieldGet(this, _Parser_tokens, "f").shift();
|
|
93
|
-
}, _Parser_look = function _Parser_look() {
|
|
94
|
-
return __classPrivateFieldGet(this, _Parser_tokens, "f").length > 0 ? __classPrivateFieldGet(this, _Parser_tokens, "f")[0] : undefined;
|
|
95
|
-
};
|
|
96
9
|
const PARENTHESES_PARSELET = {
|
|
97
10
|
parse(parser) {
|
|
98
11
|
const expr = parser.consumeAndParse();
|
|
@@ -141,75 +54,55 @@ function parseQuantity(str) {
|
|
|
141
54
|
}
|
|
142
55
|
return { value, unit };
|
|
143
56
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
case 'as':
|
|
194
|
-
return new AsAtom(left, right);
|
|
195
|
-
case 'contains':
|
|
196
|
-
return new ContainsAtom(left, right);
|
|
197
|
-
case 'div':
|
|
198
|
-
return new ArithemticOperatorAtom(left, right, (x, y) => (x / y) | 0);
|
|
199
|
-
case 'in':
|
|
200
|
-
return new InAtom(left, right);
|
|
201
|
-
case 'is':
|
|
202
|
-
return new IsAtom(left, right);
|
|
203
|
-
case 'mod':
|
|
204
|
-
return new ArithemticOperatorAtom(left, right, (x, y) => x % y);
|
|
205
|
-
case 'or':
|
|
206
|
-
return new OrAtom(left, right);
|
|
207
|
-
case 'xor':
|
|
208
|
-
return new XorAtom(left, right);
|
|
209
|
-
default:
|
|
210
|
-
throw new Error('Cannot use ' + symbol.value + ' as infix operator');
|
|
211
|
-
}
|
|
212
|
-
});
|
|
57
|
+
function initFhirPathParserBuilder() {
|
|
58
|
+
return new ParserBuilder()
|
|
59
|
+
.registerPrefix('String', {
|
|
60
|
+
parse: (_, token) => new LiteralAtom({ type: PropertyType.string, value: token.value }),
|
|
61
|
+
})
|
|
62
|
+
.registerPrefix('DateTime', {
|
|
63
|
+
parse: (_, token) => new LiteralAtom({ type: PropertyType.dateTime, value: parseDateString(token.value) }),
|
|
64
|
+
})
|
|
65
|
+
.registerPrefix('Quantity', {
|
|
66
|
+
parse: (_, token) => new LiteralAtom({ type: PropertyType.Quantity, value: parseQuantity(token.value) }),
|
|
67
|
+
})
|
|
68
|
+
.registerPrefix('Number', {
|
|
69
|
+
parse: (_, token) => new LiteralAtom({ type: PropertyType.decimal, value: parseFloat(token.value) }),
|
|
70
|
+
})
|
|
71
|
+
.registerPrefix('true', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: true }) })
|
|
72
|
+
.registerPrefix('false', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: false }) })
|
|
73
|
+
.registerPrefix('Symbol', { parse: (_, token) => new SymbolAtom(token.value) })
|
|
74
|
+
.registerPrefix('{}', { parse: () => new EmptySetAtom() })
|
|
75
|
+
.registerPrefix('(', PARENTHESES_PARSELET)
|
|
76
|
+
.registerInfix('[', INDEXER_PARSELET)
|
|
77
|
+
.registerInfix('(', FUNCTION_CALL_PARSELET)
|
|
78
|
+
.prefix('+', 3 /* Precedence.UnaryAdd */, (_, right) => new UnaryOperatorAtom(right, (x) => x))
|
|
79
|
+
.prefix('-', 3 /* Precedence.UnarySubtract */, (_, right) => new ArithemticOperatorAtom(right, right, (_, y) => -y))
|
|
80
|
+
.infixLeft('.', 1 /* Precedence.Dot */, (left, _, right) => new DotAtom(left, right))
|
|
81
|
+
.infixLeft('/', 4 /* Precedence.Divide */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x / y))
|
|
82
|
+
.infixLeft('*', 4 /* Precedence.Multiply */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x * y))
|
|
83
|
+
.infixLeft('+', 5 /* Precedence.Add */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x + y))
|
|
84
|
+
.infixLeft('-', 5 /* Precedence.Subtract */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x - y))
|
|
85
|
+
.infixLeft('|', 7 /* Precedence.Union */, (left, _, right) => new UnionAtom(left, right))
|
|
86
|
+
.infixLeft('=', 9 /* Precedence.Equals */, (left, _, right) => new EqualsAtom(left, right))
|
|
87
|
+
.infixLeft('!=', 9 /* Precedence.Equals */, (left, _, right) => new NotEqualsAtom(left, right))
|
|
88
|
+
.infixLeft('~', 9 /* Precedence.Equivalent */, (left, _, right) => new EquivalentAtom(left, right))
|
|
89
|
+
.infixLeft('!~', 9 /* Precedence.NotEquivalent */, (left, _, right) => new NotEquivalentAtom(left, right))
|
|
90
|
+
.infixLeft('<', 8 /* Precedence.LessThan */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x < y))
|
|
91
|
+
.infixLeft('<=', 8 /* Precedence.LessThanOrEquals */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x <= y))
|
|
92
|
+
.infixLeft('>', 8 /* Precedence.GreaterThan */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x > y))
|
|
93
|
+
.infixLeft('>=', 8 /* Precedence.GreaterThanOrEquals */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x >= y))
|
|
94
|
+
.infixLeft('&', 5 /* Precedence.Ampersand */, (left, _, right) => new ConcatAtom(left, right))
|
|
95
|
+
.infixLeft('and', 6 /* Precedence.Is */, (left, _, right) => new AndAtom(left, right))
|
|
96
|
+
.infixLeft('as', 6 /* Precedence.Is */, (left, _, right) => new AsAtom(left, right))
|
|
97
|
+
.infixLeft('contains', 6 /* Precedence.Is */, (left, _, right) => new ContainsAtom(left, right))
|
|
98
|
+
.infixLeft('div', 6 /* Precedence.Is */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => (x / y) | 0))
|
|
99
|
+
.infixLeft('in', 6 /* Precedence.Is */, (left, _, right) => new InAtom(left, right))
|
|
100
|
+
.infixLeft('is', 6 /* Precedence.Is */, (left, _, right) => new IsAtom(left, right))
|
|
101
|
+
.infixLeft('mod', 6 /* Precedence.Is */, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x % y))
|
|
102
|
+
.infixLeft('or', 6 /* Precedence.Is */, (left, _, right) => new OrAtom(left, right))
|
|
103
|
+
.infixLeft('xor', 6 /* Precedence.Is */, (left, _, right) => new XorAtom(left, right));
|
|
104
|
+
}
|
|
105
|
+
const fhirPathParserBuilder = initFhirPathParserBuilder();
|
|
213
106
|
/**
|
|
214
107
|
* Parses a FHIRPath expression into an AST.
|
|
215
108
|
* The result can be used to evaluate the expression against a resource or other object.
|
|
@@ -219,17 +112,12 @@ const parserBuilder = new ParserBuilder()
|
|
|
219
112
|
* @returns The AST representing the expression.
|
|
220
113
|
*/
|
|
221
114
|
function parseFhirPath(input) {
|
|
222
|
-
|
|
223
|
-
return new FhirPathAtom(input, parserBuilder.construct(input).consumeAndParse());
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
throw new Error(`FhirPathError on "${input}": ${error}`);
|
|
227
|
-
}
|
|
115
|
+
return new FhirPathAtom(input, fhirPathParserBuilder.construct(tokenize(input)).consumeAndParse());
|
|
228
116
|
}
|
|
229
117
|
/**
|
|
230
118
|
* Evaluates a FHIRPath expression against a resource or other object.
|
|
231
|
-
* @param
|
|
232
|
-
* @param
|
|
119
|
+
* @param expression The FHIRPath expression to parse.
|
|
120
|
+
* @param input The resource or object to evaluate the expression against.
|
|
233
121
|
* @returns The result of the FHIRPath expression against the resource or object.
|
|
234
122
|
*/
|
|
235
123
|
function evalFhirPath(expression, input) {
|
|
@@ -246,13 +134,13 @@ function evalFhirPath(expression, input) {
|
|
|
246
134
|
}
|
|
247
135
|
/**
|
|
248
136
|
* Evaluates a FHIRPath expression against a resource or other object.
|
|
249
|
-
* @param
|
|
250
|
-
* @param
|
|
137
|
+
* @param expression The FHIRPath expression to parse.
|
|
138
|
+
* @param input The resource or object to evaluate the expression against.
|
|
251
139
|
* @returns The result of the FHIRPath expression against the resource or object.
|
|
252
140
|
*/
|
|
253
141
|
function evalFhirPathTyped(expression, input) {
|
|
254
142
|
return parseFhirPath(expression).eval(input);
|
|
255
143
|
}
|
|
256
144
|
|
|
257
|
-
export { evalFhirPath, evalFhirPathTyped, parseFhirPath };
|
|
145
|
+
export { evalFhirPath, evalFhirPathTyped, initFhirPathParserBuilder, parseFhirPath };
|
|
258
146
|
//# sourceMappingURL=parse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sources":["../../../src/fhirpath/parse.ts"],"sourcesContent":["import { Quantity } from '@medplum/fhirtypes';\nimport { PropertyType } from '../types';\nimport {\n AndAtom,\n ArithemticOperatorAtom,\n AsAtom,\n Atom,\n ConcatAtom,\n ContainsAtom,\n DotAtom,\n EmptySetAtom,\n EqualsAtom,\n EquivalentAtom,\n FhirPathAtom,\n FunctionAtom,\n InAtom,\n IndexerAtom,\n IsAtom,\n LiteralAtom,\n NotEqualsAtom,\n NotEquivalentAtom,\n OrAtom,\n SymbolAtom,\n TypedValue,\n UnaryOperatorAtom,\n UnionAtom,\n XorAtom,\n} from './atoms';\nimport { parseDateString } from './date';\nimport { functions } from './functions';\nimport { Token, tokenize } from './tokenize';\nimport { toTypedValue } from './utils';\n\ninterface PrefixParselet {\n parse(parser: Parser, token: Token): Atom;\n}\n\ninterface InfixParselet {\n precedence: number;\n parse(parser: Parser, left: Atom, token: Token): Atom;\n}\n\nclass ParserBuilder {\n readonly #prefixParselets: Record<string, PrefixParselet> = {};\n 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: string): Parser {\n return new Parser(tokenize(input), this.#prefixParselets, this.#infixParselets);\n }\n}\n\nclass Parser {\n #tokens: Token[];\n #prefixParselets: Record<string, PrefixParselet>;\n #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 public match(expected: string): boolean {\n const token = this.#look();\n if (token?.id !== expected) {\n return false;\n }\n\n this.#consume();\n return true;\n }\n\n public consumeAndParse(precedence = Precedence.MaximumPrecedence): Atom {\n const token = this.#consume();\n const prefix = this.#prefixParselets[token.id];\n if (!prefix) {\n throw Error(`Parse error at ${token.value}. No matching prefix parselet.`);\n }\n\n let left = prefix.parse(this, token);\n\n while (precedence > this.#getPrecedence()) {\n const next = this.#consume();\n const infix = this.#infixParselets[next.id];\n left = infix.parse(this, left, next);\n }\n\n return left;\n }\n\n #getPrecedence(): number {\n const nextToken = this.#look();\n if (!nextToken) {\n return Precedence.MaximumPrecedence;\n }\n const parser = this.#infixParselets[nextToken.id];\n if (parser) {\n return parser.precedence;\n }\n return Precedence.MaximumPrecedence;\n }\n\n #consume(): Token {\n if (!this.#tokens.length) {\n throw Error('Cant consume unknown more tokens.');\n }\n return this.#tokens.shift() as Token;\n }\n\n #look(): Token | undefined {\n return this.#tokens.length > 0 ? this.#tokens[0] : undefined;\n }\n}\n\n/**\n * Operator precedence\n * See: https://hl7.org/fhirpath/#operator-precedence\n */\nconst enum Precedence {\n FunctionCall = 0,\n Dot = 1,\n Indexer = 2,\n UnaryAdd = 3,\n UnarySubtract = 3,\n Multiply = 4,\n Divide = 4,\n IntegerDivide = 4,\n Modulo = 4,\n Add = 5,\n Subtract = 5,\n Ampersand = 5,\n Is = 6,\n As = 6,\n Union = 7,\n GreaterThan = 8,\n GreaterThanOrEquals = 8,\n LessThan = 8,\n LessThanOrEquals = 8,\n Equals = 9,\n Equivalent = 9,\n NotEquals = 9,\n NotEquivalent = 9,\n In = 10,\n Contains = 10,\n And = 11,\n Xor = 12,\n Or = 12,\n Implies = 13,\n MaximumPrecedence = 100,\n}\n\nconst PARENTHESES_PARSELET: PrefixParselet = {\n parse(parser: Parser) {\n const expr = parser.consumeAndParse();\n if (!parser.match(')')) {\n throw new Error('Parse error: expected `)`');\n }\n return expr;\n },\n};\n\nconst INDEXER_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n const expr = parser.consumeAndParse();\n if (!parser.match(']')) {\n throw new Error('Parse error: expected `]`');\n }\n return new IndexerAtom(left, expr);\n },\n\n precedence: Precedence.Indexer,\n};\n\nconst FUNCTION_CALL_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n if (!(left instanceof SymbolAtom)) {\n throw new Error('Unexpected parentheses');\n }\n\n if (!(left.name in functions)) {\n throw new Error('Unrecognized function: ' + left.name);\n }\n\n const args = [];\n while (!parser.match(')')) {\n args.push(parser.consumeAndParse());\n parser.match(',');\n }\n\n return new FunctionAtom(left.name, args, functions[left.name]);\n },\n precedence: Precedence.FunctionCall,\n};\n\nfunction parseQuantity(str: string): Quantity {\n const parts = str.split(' ');\n const value = parseFloat(parts[0]);\n let unit = parts[1];\n if (unit && unit.startsWith(\"'\") && unit.endsWith(\"'\")) {\n unit = unit.substring(1, unit.length - 1);\n } else {\n unit = '{' + unit + '}';\n }\n return { value, unit };\n}\n\nconst parserBuilder = new ParserBuilder()\n .registerPrefix('String', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.string, value: token.value }),\n })\n .registerPrefix('DateTime', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.dateTime, value: parseDateString(token.value) }),\n })\n .registerPrefix('Quantity', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.Quantity, value: parseQuantity(token.value) }),\n })\n .registerPrefix('Number', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.decimal, value: parseFloat(token.value) }),\n })\n .registerPrefix('Symbol', {\n parse: (_, token) => {\n if (token.value === 'false') {\n return new LiteralAtom({ type: PropertyType.boolean, value: false });\n }\n if (token.value === 'true') {\n return new LiteralAtom({ type: PropertyType.boolean, value: true });\n }\n return new SymbolAtom(token.value);\n },\n })\n .registerPrefix('{}', { parse: () => new EmptySetAtom() })\n .registerPrefix('(', PARENTHESES_PARSELET)\n .registerInfix('[', INDEXER_PARSELET)\n .registerInfix('(', FUNCTION_CALL_PARSELET)\n .prefix('+', Precedence.UnaryAdd, (_, right) => new UnaryOperatorAtom(right, (x) => x))\n .prefix('-', Precedence.UnarySubtract, (_, right) => new ArithemticOperatorAtom(right, right, (_, y) => -y))\n .infixLeft('.', Precedence.Dot, (left, _, right) => new DotAtom(left, right))\n .infixLeft('/', Precedence.Divide, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x / y))\n .infixLeft('*', Precedence.Multiply, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x * y))\n .infixLeft('+', Precedence.Add, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x + y))\n .infixLeft('-', Precedence.Subtract, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x - y))\n .infixLeft('|', Precedence.Union, (left, _, right) => new UnionAtom(left, right))\n .infixLeft('=', Precedence.Equals, (left, _, right) => new EqualsAtom(left, right))\n .infixLeft('!=', Precedence.Equals, (left, _, right) => new NotEqualsAtom(left, right))\n .infixLeft('~', Precedence.Equivalent, (left, _, right) => new EquivalentAtom(left, right))\n .infixLeft('!~', Precedence.NotEquivalent, (left, _, right) => new NotEquivalentAtom(left, right))\n .infixLeft('<', Precedence.LessThan, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x < y))\n .infixLeft(\n '<=',\n Precedence.LessThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x <= y)\n )\n .infixLeft('>', Precedence.GreaterThan, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x > y))\n .infixLeft(\n '>=',\n Precedence.GreaterThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x >= y)\n )\n .infixLeft('&', Precedence.Ampersand, (left, _, right) => new ConcatAtom(left, right))\n .infixLeft('Symbol', Precedence.Is, (left: Atom, symbol: Token, right: Atom) => {\n switch (symbol.value) {\n case 'and':\n return new AndAtom(left, right);\n case 'as':\n return new AsAtom(left, right);\n case 'contains':\n return new ContainsAtom(left, right);\n case 'div':\n return new ArithemticOperatorAtom(left, right, (x, y) => (x / y) | 0);\n case 'in':\n return new InAtom(left, right);\n case 'is':\n return new IsAtom(left, right);\n case 'mod':\n return new ArithemticOperatorAtom(left, right, (x, y) => x % y);\n case 'or':\n return new OrAtom(left, right);\n case 'xor':\n return new XorAtom(left, right);\n default:\n throw new Error('Cannot use ' + symbol.value + ' as infix operator');\n }\n });\n\n/**\n * Parses a FHIRPath expression into an AST.\n * The result can be used to evaluate the expression against a resource or other object.\n * This method is useful if you know that you will evaluate the same expression many times\n * against different resources.\n * @param input The FHIRPath expression to parse.\n * @returns The AST representing the expression.\n */\nexport function parseFhirPath(input: string): FhirPathAtom {\n try {\n return new FhirPathAtom(input, parserBuilder.construct(input).consumeAndParse());\n } catch (error) {\n throw new Error(`FhirPathError on \"${input}\": ${error}`);\n }\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param input The FHIRPath expression to parse.\n * @param context The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPath(expression: string, input: unknown): unknown[] {\n // eval requires a TypedValue array\n // As a convenience, we can accept array or non-array, and TypedValue or unknown value\n const array = Array.isArray(input) ? input : [input];\n for (let i = 0; i < array.length; i++) {\n const el = array[i];\n if (!(typeof el === 'object' && 'type' in el && 'value' in el)) {\n array[i] = toTypedValue(array[i]);\n }\n }\n return evalFhirPathTyped(expression, array).map((e) => e.value);\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param input The FHIRPath expression to parse.\n * @param context The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPathTyped(expression: string, input: TypedValue[]): TypedValue[] {\n return parseFhirPath(expression).eval(input);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse.js","sources":["../../../src/fhirpath/parse.ts"],"sourcesContent":["import { Quantity } from '@medplum/fhirtypes';\nimport { Atom, InfixParselet, Parser, ParserBuilder, PrefixParselet } from '../fhirlexer';\nimport { PropertyType, TypedValue } from '../types';\nimport {\n AndAtom,\n ArithemticOperatorAtom,\n AsAtom,\n ConcatAtom,\n ContainsAtom,\n DotAtom,\n EmptySetAtom,\n EqualsAtom,\n EquivalentAtom,\n FhirPathAtom,\n FunctionAtom,\n InAtom,\n IndexerAtom,\n IsAtom,\n LiteralAtom,\n NotEqualsAtom,\n NotEquivalentAtom,\n OrAtom,\n SymbolAtom,\n UnaryOperatorAtom,\n UnionAtom,\n XorAtom,\n} from './atoms';\nimport { parseDateString } from './date';\nimport { functions } from './functions';\nimport { tokenize } from './tokenize';\nimport { toTypedValue } from './utils';\n\n/**\n * Operator precedence\n * See: https://hl7.org/fhirpath/#operator-precedence\n */\nconst enum Precedence {\n FunctionCall = 0,\n Dot = 1,\n Indexer = 2,\n UnaryAdd = 3,\n UnarySubtract = 3,\n Multiply = 4,\n Divide = 4,\n IntegerDivide = 4,\n Modulo = 4,\n Add = 5,\n Subtract = 5,\n Ampersand = 5,\n Is = 6,\n As = 6,\n Union = 7,\n GreaterThan = 8,\n GreaterThanOrEquals = 8,\n LessThan = 8,\n LessThanOrEquals = 8,\n Equals = 9,\n Equivalent = 9,\n NotEquals = 9,\n NotEquivalent = 9,\n In = 10,\n Contains = 10,\n And = 11,\n Xor = 12,\n Or = 12,\n Implies = 13,\n}\n\nconst PARENTHESES_PARSELET: PrefixParselet = {\n parse(parser: Parser) {\n const expr = parser.consumeAndParse();\n if (!parser.match(')')) {\n throw new Error('Parse error: expected `)`');\n }\n return expr;\n },\n};\n\nconst INDEXER_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n const expr = parser.consumeAndParse();\n if (!parser.match(']')) {\n throw new Error('Parse error: expected `]`');\n }\n return new IndexerAtom(left, expr);\n },\n\n precedence: Precedence.Indexer,\n};\n\nconst FUNCTION_CALL_PARSELET: InfixParselet = {\n parse(parser: Parser, left: Atom) {\n if (!(left instanceof SymbolAtom)) {\n throw new Error('Unexpected parentheses');\n }\n\n if (!(left.name in functions)) {\n throw new Error('Unrecognized function: ' + left.name);\n }\n\n const args = [];\n while (!parser.match(')')) {\n args.push(parser.consumeAndParse());\n parser.match(',');\n }\n\n return new FunctionAtom(left.name, args, functions[left.name]);\n },\n precedence: Precedence.FunctionCall,\n};\n\nfunction parseQuantity(str: string): Quantity {\n const parts = str.split(' ');\n const value = parseFloat(parts[0]);\n let unit = parts[1];\n if (unit && unit.startsWith(\"'\") && unit.endsWith(\"'\")) {\n unit = unit.substring(1, unit.length - 1);\n } else {\n unit = '{' + unit + '}';\n }\n return { value, unit };\n}\n\nexport function initFhirPathParserBuilder(): ParserBuilder {\n return new ParserBuilder()\n .registerPrefix('String', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.string, value: token.value }),\n })\n .registerPrefix('DateTime', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.dateTime, value: parseDateString(token.value) }),\n })\n .registerPrefix('Quantity', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.Quantity, value: parseQuantity(token.value) }),\n })\n .registerPrefix('Number', {\n parse: (_, token) => new LiteralAtom({ type: PropertyType.decimal, value: parseFloat(token.value) }),\n })\n .registerPrefix('true', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: true }) })\n .registerPrefix('false', { parse: () => new LiteralAtom({ type: PropertyType.boolean, value: false }) })\n .registerPrefix('Symbol', { parse: (_, token) => new SymbolAtom(token.value) })\n .registerPrefix('{}', { parse: () => new EmptySetAtom() })\n .registerPrefix('(', PARENTHESES_PARSELET)\n .registerInfix('[', INDEXER_PARSELET)\n .registerInfix('(', FUNCTION_CALL_PARSELET)\n .prefix('+', Precedence.UnaryAdd, (_, right) => new UnaryOperatorAtom(right, (x) => x))\n .prefix('-', Precedence.UnarySubtract, (_, right) => new ArithemticOperatorAtom(right, right, (_, y) => -y))\n .infixLeft('.', Precedence.Dot, (left, _, right) => new DotAtom(left, right))\n .infixLeft('/', Precedence.Divide, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x / y))\n .infixLeft('*', Precedence.Multiply, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x * y))\n .infixLeft('+', Precedence.Add, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x + y))\n .infixLeft('-', Precedence.Subtract, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x - y))\n .infixLeft('|', Precedence.Union, (left, _, right) => new UnionAtom(left, right))\n .infixLeft('=', Precedence.Equals, (left, _, right) => new EqualsAtom(left, right))\n .infixLeft('!=', Precedence.Equals, (left, _, right) => new NotEqualsAtom(left, right))\n .infixLeft('~', Precedence.Equivalent, (left, _, right) => new EquivalentAtom(left, right))\n .infixLeft('!~', Precedence.NotEquivalent, (left, _, right) => new NotEquivalentAtom(left, right))\n .infixLeft('<', Precedence.LessThan, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x < y))\n .infixLeft(\n '<=',\n Precedence.LessThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x <= y)\n )\n .infixLeft(\n '>',\n Precedence.GreaterThan,\n (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x > y)\n )\n .infixLeft(\n '>=',\n Precedence.GreaterThanOrEquals,\n (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x >= y)\n )\n .infixLeft('&', Precedence.Ampersand, (left, _, right) => new ConcatAtom(left, right))\n .infixLeft('and', Precedence.Is, (left, _, right) => new AndAtom(left, right))\n .infixLeft('as', Precedence.Is, (left, _, right) => new AsAtom(left, right))\n .infixLeft('contains', Precedence.Is, (left, _, right) => new ContainsAtom(left, right))\n .infixLeft('div', Precedence.Is, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => (x / y) | 0))\n .infixLeft('in', Precedence.Is, (left, _, right) => new InAtom(left, right))\n .infixLeft('is', Precedence.Is, (left, _, right) => new IsAtom(left, right))\n .infixLeft('mod', Precedence.Is, (left, _, right) => new ArithemticOperatorAtom(left, right, (x, y) => x % y))\n .infixLeft('or', Precedence.Is, (left, _, right) => new OrAtom(left, right))\n .infixLeft('xor', Precedence.Is, (left, _, right) => new XorAtom(left, right));\n}\n\nconst fhirPathParserBuilder = initFhirPathParserBuilder();\n\n/**\n * Parses a FHIRPath expression into an AST.\n * The result can be used to evaluate the expression against a resource or other object.\n * This method is useful if you know that you will evaluate the same expression many times\n * against different resources.\n * @param input The FHIRPath expression to parse.\n * @returns The AST representing the expression.\n */\nexport function parseFhirPath(input: string): FhirPathAtom {\n return new FhirPathAtom(input, fhirPathParserBuilder.construct(tokenize(input)).consumeAndParse());\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPath(expression: string, input: unknown): unknown[] {\n // eval requires a TypedValue array\n // As a convenience, we can accept array or non-array, and TypedValue or unknown value\n const array = Array.isArray(input) ? input : [input];\n for (let i = 0; i < array.length; i++) {\n const el = array[i];\n if (!(typeof el === 'object' && 'type' in el && 'value' in el)) {\n array[i] = toTypedValue(array[i]);\n }\n }\n return evalFhirPathTyped(expression, array).map((e) => e.value);\n}\n\n/**\n * Evaluates a FHIRPath expression against a resource or other object.\n * @param expression The FHIRPath expression to parse.\n * @param input The resource or object to evaluate the expression against.\n * @returns The result of the FHIRPath expression against the resource or object.\n */\nexport function evalFhirPathTyped(expression: string, input: TypedValue[]): TypedValue[] {\n return parseFhirPath(expression).eval(input);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,185 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Tokenizer } from '../fhirlexer/tokenize.js';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const FHIRPATH_KEYWORDS = ['true', 'false', 'and', 'as', 'contains', 'div', 'in', 'is', 'mod', 'or', 'xor'];
|
|
4
|
+
const FHIRPATH_OPERATORS = ['!=', '!~', '<=', '>=', '{}', '->'];
|
|
4
5
|
function tokenize(str) {
|
|
5
|
-
return new Tokenizer(str).tokenize();
|
|
6
|
-
}
|
|
7
|
-
const STANDARD_UNITS = [
|
|
8
|
-
'year',
|
|
9
|
-
'years',
|
|
10
|
-
'month',
|
|
11
|
-
'months',
|
|
12
|
-
'week',
|
|
13
|
-
'weeks',
|
|
14
|
-
'day',
|
|
15
|
-
'days',
|
|
16
|
-
'hour',
|
|
17
|
-
'hours',
|
|
18
|
-
'minute',
|
|
19
|
-
'minutes',
|
|
20
|
-
'second',
|
|
21
|
-
'seconds',
|
|
22
|
-
'millisecond',
|
|
23
|
-
'milliseconds',
|
|
24
|
-
];
|
|
25
|
-
const TWO_CHAR_OPERATORS = ['!=', '!~', '<=', '>=', '{}'];
|
|
26
|
-
class Tokenizer {
|
|
27
|
-
constructor(str) {
|
|
28
|
-
_Tokenizer_instances.add(this);
|
|
29
|
-
_Tokenizer_str.set(this, void 0);
|
|
30
|
-
_Tokenizer_pos.set(this, void 0);
|
|
31
|
-
__classPrivateFieldSet(this, _Tokenizer_str, str, "f");
|
|
32
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, 0, "f");
|
|
33
|
-
}
|
|
34
|
-
tokenize() {
|
|
35
|
-
const result = [];
|
|
36
|
-
while (__classPrivateFieldGet(this, _Tokenizer_pos, "f") < __classPrivateFieldGet(this, _Tokenizer_str, "f").length) {
|
|
37
|
-
const token = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
|
|
38
|
-
if (token) {
|
|
39
|
-
result.push(token);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
_Tokenizer_str = new WeakMap(), _Tokenizer_pos = new WeakMap(), _Tokenizer_instances = new WeakSet(), _Tokenizer_peekToken = function _Tokenizer_peekToken() {
|
|
46
|
-
const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f");
|
|
47
|
-
const token = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
|
|
48
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, start, "f");
|
|
49
|
-
return token;
|
|
50
|
-
}, _Tokenizer_consumeToken = function _Tokenizer_consumeToken() {
|
|
51
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhitespace).call(this);
|
|
52
|
-
const c = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this);
|
|
53
|
-
if (!c) {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
const next = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this);
|
|
57
|
-
if (c === '/' && next === '*') {
|
|
58
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeMultiLineComment).call(this);
|
|
59
|
-
}
|
|
60
|
-
if (c === '/' && next === '/') {
|
|
61
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSingleLineComment).call(this);
|
|
62
|
-
}
|
|
63
|
-
if (c === "'") {
|
|
64
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeString).call(this);
|
|
65
|
-
}
|
|
66
|
-
if (c === '`') {
|
|
67
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeBacktickSymbol).call(this);
|
|
68
|
-
}
|
|
69
|
-
if (c === '@') {
|
|
70
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeDateTime).call(this);
|
|
71
|
-
}
|
|
72
|
-
if (c.match(/\d/)) {
|
|
73
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeNumber).call(this);
|
|
74
|
-
}
|
|
75
|
-
if (c.match(/\w/)) {
|
|
76
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSymbol).call(this);
|
|
77
|
-
}
|
|
78
|
-
if (c === '$' && next.match(/\w/)) {
|
|
79
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSymbol).call(this);
|
|
80
|
-
}
|
|
81
|
-
return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeOperator).call(this);
|
|
82
|
-
}, _Tokenizer_consumeWhitespace = function _Tokenizer_consumeWhitespace() {
|
|
83
|
-
return buildToken('Whitespace', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\s/)));
|
|
84
|
-
}, _Tokenizer_consumeMultiLineComment = function _Tokenizer_consumeMultiLineComment() {
|
|
85
|
-
const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f");
|
|
86
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== '*' || __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this) !== '/');
|
|
87
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, __classPrivateFieldGet(this, _Tokenizer_pos, "f") + 2, "f");
|
|
88
|
-
return buildToken('Comment', __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f")));
|
|
89
|
-
}, _Tokenizer_consumeSingleLineComment = function _Tokenizer_consumeSingleLineComment() {
|
|
90
|
-
return buildToken('Comment', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== '\n'));
|
|
91
|
-
}, _Tokenizer_consumeString = function _Tokenizer_consumeString() {
|
|
92
|
-
var _a, _b;
|
|
93
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
94
|
-
const result = buildToken('String', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_prev).call(this) === '\\' || __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== "'"));
|
|
95
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_b = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _b++, _b), "f");
|
|
96
|
-
return result;
|
|
97
|
-
}, _Tokenizer_consumeBacktickSymbol = function _Tokenizer_consumeBacktickSymbol() {
|
|
98
|
-
var _a, _b;
|
|
99
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
100
|
-
const result = buildToken('Symbol', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== '`'));
|
|
101
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_b = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _b++, _b), "f");
|
|
102
|
-
return result;
|
|
103
|
-
}, _Tokenizer_consumeDateTime = function _Tokenizer_consumeDateTime() {
|
|
104
|
-
var _a, _b, _c, _d, _e;
|
|
105
|
-
const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f");
|
|
106
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
107
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d-]/));
|
|
108
|
-
if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === 'T') {
|
|
109
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_b = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _b++, _b), "f");
|
|
110
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d:]/));
|
|
111
|
-
if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '.' && __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this).match(/\d/)) {
|
|
112
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_c = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _c++, _c), "f");
|
|
113
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d]/));
|
|
114
|
-
}
|
|
115
|
-
if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === 'Z') {
|
|
116
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_d = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _d++, _d), "f");
|
|
117
|
-
}
|
|
118
|
-
else if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '+' || __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '-') {
|
|
119
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_e = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _e++, _e), "f");
|
|
120
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d:]/));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return buildToken('DateTime', __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start + 1, __classPrivateFieldGet(this, _Tokenizer_pos, "f")));
|
|
124
|
-
}, _Tokenizer_consumeNumber = function _Tokenizer_consumeNumber() {
|
|
125
|
-
var _a;
|
|
126
|
-
const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f");
|
|
127
|
-
let id = 'Number';
|
|
128
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\d/));
|
|
129
|
-
if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '.' && __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this).match(/\d/)) {
|
|
130
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
131
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\d/));
|
|
132
|
-
}
|
|
133
|
-
if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === ' ') {
|
|
134
|
-
if (isUnitToken(__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peekToken).call(this))) {
|
|
135
|
-
id = 'Quantity';
|
|
136
|
-
__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return buildToken(id, __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f")));
|
|
140
|
-
}, _Tokenizer_consumeSymbol = function _Tokenizer_consumeSymbol() {
|
|
141
|
-
return buildToken('Symbol', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[$\w]/)));
|
|
142
|
-
}, _Tokenizer_consumeOperator = function _Tokenizer_consumeOperator() {
|
|
143
|
-
var _a;
|
|
144
|
-
const c = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this);
|
|
145
|
-
const next = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this);
|
|
146
|
-
const twoCharOp = c + next;
|
|
147
|
-
if (TWO_CHAR_OPERATORS.includes(twoCharOp)) {
|
|
148
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, __classPrivateFieldGet(this, _Tokenizer_pos, "f") + 2, "f");
|
|
149
|
-
return buildToken(twoCharOp, twoCharOp);
|
|
150
|
-
}
|
|
151
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
152
|
-
return buildToken(c, c);
|
|
153
|
-
}, _Tokenizer_consumeWhile = function _Tokenizer_consumeWhile(condition) {
|
|
154
|
-
var _a;
|
|
155
|
-
const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f");
|
|
156
|
-
while (__classPrivateFieldGet(this, _Tokenizer_pos, "f") < __classPrivateFieldGet(this, _Tokenizer_str, "f").length && condition()) {
|
|
157
|
-
__classPrivateFieldSet(this, _Tokenizer_pos, (_a = __classPrivateFieldGet(this, _Tokenizer_pos, "f"), _a++, _a), "f");
|
|
158
|
-
}
|
|
159
|
-
return __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f"));
|
|
160
|
-
}, _Tokenizer_curr = function _Tokenizer_curr() {
|
|
161
|
-
return __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f")];
|
|
162
|
-
}, _Tokenizer_prev = function _Tokenizer_prev() {
|
|
163
|
-
var _a;
|
|
164
|
-
return (_a = __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f") - 1]) !== null && _a !== void 0 ? _a : '';
|
|
165
|
-
}, _Tokenizer_peek = function _Tokenizer_peek() {
|
|
166
|
-
var _a;
|
|
167
|
-
return (_a = __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f") + 1]) !== null && _a !== void 0 ? _a : '';
|
|
168
|
-
};
|
|
169
|
-
function buildToken(id, value) {
|
|
170
|
-
return { id, value };
|
|
171
|
-
}
|
|
172
|
-
function isUnitToken(token) {
|
|
173
|
-
if (token) {
|
|
174
|
-
if (token.id === 'String') {
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
if (token.id === 'Symbol' && STANDARD_UNITS.includes(token.value)) {
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return false;
|
|
6
|
+
return new Tokenizer(str, FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS).tokenize();
|
|
182
7
|
}
|
|
183
8
|
|
|
184
|
-
export { tokenize };
|
|
9
|
+
export { FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS, tokenize };
|
|
185
10
|
//# sourceMappingURL=tokenize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.js","sources":["../../../src/fhirpath/tokenize.ts"],"sourcesContent":["export interface Token {\n id: string;\n value: string;\n}\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str).tokenize();\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\nconst TWO_CHAR_OPERATORS = ['!=', '!~', '<=', '>=', '{}'];\n\nclass Tokenizer {\n readonly #str: string;\n #pos: number;\n\n constructor(str: string) {\n this.#str = str;\n this.#pos = 0;\n }\n\n tokenize(): Token[] {\n const result: Token[] = [];\n\n while (this.#pos < this.#str.length) {\n const token = this.#consumeToken();\n if (token) {\n result.push(token);\n }\n }\n\n return result;\n }\n\n #peekToken(): Token | undefined {\n const start = this.#pos;\n const token = this.#consumeToken();\n this.#pos = start;\n return token;\n }\n\n #consumeToken(): Token | undefined {\n this.#consumeWhitespace();\n\n const c = this.#curr();\n if (!c) {\n return undefined;\n }\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 === \"'\") {\n return this.#consumeString();\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 #consumeWhitespace(): Token {\n return buildToken(\n 'Whitespace',\n this.#consumeWhile(() => this.#curr().match(/\\s/))\n );\n }\n\n #consumeMultiLineComment(): Token {\n const start = this.#pos;\n this.#consumeWhile(() => this.#curr() !== '*' || this.#peek() !== '/');\n this.#pos += 2;\n return buildToken('Comment', this.#str.substring(start, this.#pos));\n }\n\n #consumeSingleLineComment(): Token {\n return buildToken(\n 'Comment',\n this.#consumeWhile(() => this.#curr() !== '\\n')\n );\n }\n\n #consumeString(): Token {\n this.#pos++;\n const result = buildToken(\n 'String',\n this.#consumeWhile(() => this.#prev() === '\\\\' || this.#curr() !== \"'\")\n );\n this.#pos++;\n return result;\n }\n\n #consumeBacktickSymbol(): Token {\n this.#pos++;\n const result = buildToken(\n 'Symbol',\n this.#consumeWhile(() => this.#curr() !== '`')\n );\n this.#pos++;\n return result;\n }\n\n #consumeDateTime(): Token {\n const start = this.#pos;\n this.#pos++;\n this.#consumeWhile(() => this.#curr().match(/[\\d-]/));\n\n if (this.#curr() === 'T') {\n this.#pos++;\n this.#consumeWhile(() => this.#curr().match(/[\\d:]/));\n\n if (this.#curr() === '.' && this.#peek().match(/\\d/)) {\n this.#pos++;\n this.#consumeWhile(() => this.#curr().match(/[\\d]/));\n }\n\n if (this.#curr() === 'Z') {\n this.#pos++;\n } else if (this.#curr() === '+' || this.#curr() === '-') {\n this.#pos++;\n this.#consumeWhile(() => this.#curr().match(/[\\d:]/));\n }\n }\n\n return buildToken('DateTime', this.#str.substring(start + 1, this.#pos));\n }\n\n #consumeNumber(): Token {\n const start = this.#pos;\n let id = 'Number';\n\n this.#consumeWhile(() => this.#curr().match(/\\d/));\n\n if (this.#curr() === '.' && this.#peek().match(/\\d/)) {\n this.#pos++;\n this.#consumeWhile(() => this.#curr().match(/\\d/));\n }\n\n if (this.#curr() === ' ') {\n if (isUnitToken(this.#peekToken())) {\n id = 'Quantity';\n this.#consumeToken();\n }\n }\n\n return buildToken(id, this.#str.substring(start, this.#pos));\n }\n\n #consumeSymbol(): Token {\n return buildToken(\n 'Symbol',\n this.#consumeWhile(() => this.#curr().match(/[$\\w]/))\n );\n }\n\n #consumeOperator(): Token {\n const c = this.#curr();\n const next = this.#peek();\n const twoCharOp = c + next;\n\n if (TWO_CHAR_OPERATORS.includes(twoCharOp)) {\n this.#pos += 2;\n return buildToken(twoCharOp, twoCharOp);\n }\n\n this.#pos++;\n return buildToken(c, c);\n }\n\n #consumeWhile(condition: () => unknown): string {\n const start = this.#pos;\n\n while (this.#pos < this.#str.length && condition()) {\n this.#pos++;\n }\n\n return this.#str.substring(start, this.#pos);\n }\n\n #curr(): string {\n return this.#str[this.#pos];\n }\n\n #prev(): string {\n return this.#str[this.#pos - 1] ?? '';\n }\n\n #peek(): string {\n return this.#str[this.#pos + 1] ?? '';\n }\n}\n\nfunction buildToken(id: string, value: string): Token {\n return { id, value };\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.js","sources":["../../../src/fhirpath/tokenize.ts"],"sourcesContent":["import { Token, Tokenizer } from '../fhirlexer';\n\nexport const FHIRPATH_KEYWORDS = ['true', 'false', 'and', 'as', 'contains', 'div', 'in', 'is', 'mod', 'or', 'xor'];\nexport const FHIRPATH_OPERATORS = ['!=', '!~', '<=', '>=', '{}', '->'];\n\nexport function tokenize(str: string): Token[] {\n return new Tokenizer(str, FHIRPATH_KEYWORDS, FHIRPATH_OPERATORS).tokenize();\n}\n"],"names":[],"mappings":";;AAEa,MAAA,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;AACtG,MAAA,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAEjE,SAAU,QAAQ,CAAC,GAAW,EAAA;AAClC,IAAA,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC9E;;;;"}
|