@medplum/core 2.0.14 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/cjs/index.cjs +1155 -1060
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.min.cjs +1 -1
  4. package/dist/esm/base64.mjs +33 -0
  5. package/dist/esm/base64.mjs.map +1 -0
  6. package/dist/esm/cache.mjs +17 -23
  7. package/dist/esm/cache.mjs.map +1 -1
  8. package/dist/esm/client.mjs +464 -395
  9. package/dist/esm/client.mjs.map +1 -1
  10. package/dist/esm/eventtarget.mjs +6 -11
  11. package/dist/esm/eventtarget.mjs.map +1 -1
  12. package/dist/esm/fhirlexer/parse.mjs +15 -23
  13. package/dist/esm/fhirlexer/parse.mjs.map +1 -1
  14. package/dist/esm/fhirlexer/tokenize.mjs +190 -180
  15. package/dist/esm/fhirlexer/tokenize.mjs.map +1 -1
  16. package/dist/esm/fhirmapper/parse.mjs +264 -252
  17. package/dist/esm/fhirmapper/parse.mjs.map +1 -1
  18. package/dist/esm/fhirmapper/tokenize.mjs +0 -1
  19. package/dist/esm/fhirmapper/tokenize.mjs.map +1 -1
  20. package/dist/esm/fhirpath/atoms.mjs +0 -1
  21. package/dist/esm/fhirpath/atoms.mjs.map +1 -1
  22. package/dist/esm/fhirpath/parse.mjs +0 -1
  23. package/dist/esm/fhirpath/parse.mjs.map +1 -1
  24. package/dist/esm/fhirpath/tokenize.mjs +0 -1
  25. package/dist/esm/fhirpath/tokenize.mjs.map +1 -1
  26. package/dist/esm/filter/parse.mjs +0 -2
  27. package/dist/esm/filter/parse.mjs.map +1 -1
  28. package/dist/esm/filter/tokenize.mjs +0 -1
  29. package/dist/esm/filter/tokenize.mjs.map +1 -1
  30. package/dist/esm/index.min.mjs +1 -1
  31. package/dist/esm/jwt.mjs +2 -9
  32. package/dist/esm/jwt.mjs.map +1 -1
  33. package/dist/esm/readablepromise.mjs +18 -23
  34. package/dist/esm/readablepromise.mjs.map +1 -1
  35. package/dist/esm/schema.mjs +146 -123
  36. package/dist/esm/schema.mjs.map +1 -1
  37. package/dist/esm/search/match.mjs +0 -2
  38. package/dist/esm/search/match.mjs.map +1 -1
  39. package/dist/esm/storage.mjs +13 -19
  40. package/dist/esm/storage.mjs.map +1 -1
  41. package/dist/types/base64.d.ts +14 -0
  42. package/dist/types/cache.d.ts +3 -1
  43. package/dist/types/client.d.ts +127 -1
  44. package/dist/types/eventtarget.d.ts +1 -1
  45. package/dist/types/fhirlexer/parse.d.ts +5 -2
  46. package/dist/types/fhirlexer/tokenize.d.ts +28 -1
  47. package/dist/types/readablepromise.d.ts +4 -1
  48. package/dist/types/schema.d.ts +33 -1
  49. package/dist/types/storage.d.ts +2 -2
  50. package/package.json +1 -1
  51. package/dist/esm/node_modules/tslib/tslib.es6.mjs +0 -30
  52. package/dist/esm/node_modules/tslib/tslib.es6.mjs.map +0 -1
@@ -1,22 +1,18 @@
1
- import { __classPrivateFieldSet, __classPrivateFieldGet } from './node_modules/tslib/tslib.es6.mjs';
2
-
3
1
  /*
4
2
  * Based on: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
5
3
  */
6
- var _EventTarget_listeners;
7
4
  class EventTarget {
8
5
  constructor() {
9
- _EventTarget_listeners.set(this, void 0);
10
- __classPrivateFieldSet(this, _EventTarget_listeners, {}, "f");
6
+ this.listeners = {};
11
7
  }
12
8
  addEventListener(type, callback) {
13
- if (!__classPrivateFieldGet(this, _EventTarget_listeners, "f")[type]) {
14
- __classPrivateFieldGet(this, _EventTarget_listeners, "f")[type] = [];
9
+ if (!this.listeners[type]) {
10
+ this.listeners[type] = [];
15
11
  }
16
- __classPrivateFieldGet(this, _EventTarget_listeners, "f")[type].push(callback);
12
+ this.listeners[type].push(callback);
17
13
  }
18
14
  removeEventListeneer(type, callback) {
19
- const array = __classPrivateFieldGet(this, _EventTarget_listeners, "f")[type];
15
+ const array = this.listeners[type];
20
16
  if (!array) {
21
17
  return;
22
18
  }
@@ -28,14 +24,13 @@ class EventTarget {
28
24
  }
29
25
  }
30
26
  dispatchEvent(event) {
31
- const array = __classPrivateFieldGet(this, _EventTarget_listeners, "f")[event.type];
27
+ const array = this.listeners[event.type];
32
28
  if (array) {
33
29
  array.forEach((listener) => listener.call(this, event));
34
30
  }
35
31
  return !event.defaultPrevented;
36
32
  }
37
33
  }
38
- _EventTarget_listeners = new WeakMap();
39
34
 
40
35
  export { EventTarget };
41
36
  //# sourceMappingURL=eventtarget.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"eventtarget.mjs","sources":["../../src/eventtarget.ts"],"sourcesContent":["/*\n * Based on: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n */\n\ninterface Event {\n readonly type: string;\n readonly defaultPrevented?: boolean;\n}\n\ntype EventListener = (e: Event) => void;\n\nexport class EventTarget {\n readonly #listeners: Record<string, EventListener[]>;\n\n constructor() {\n this.#listeners = {};\n }\n\n addEventListener(type: string, callback: EventListener): void {\n if (!this.#listeners[type]) {\n this.#listeners[type] = [];\n }\n this.#listeners[type].push(callback);\n }\n\n removeEventListeneer(type: string, callback: EventListener): void {\n const array = this.#listeners[type];\n if (!array) {\n return;\n }\n for (let i = 0; i < array.length; i++) {\n if (array[i] === callback) {\n array.splice(i, 1);\n return;\n }\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const array = this.#listeners[event.type];\n if (array) {\n array.forEach((listener) => listener.call(this, event));\n }\n return !event.defaultPrevented;\n }\n}\n"],"names":[],"mappings":";;AAAA;;AAEG;;MASU,WAAW,CAAA;AAGtB,IAAA,WAAA,GAAA;QAFS,sBAA4C,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAGnD,QAAA,sBAAA,CAAA,IAAI,EAAA,sBAAA,EAAc,EAAE,EAAA,GAAA,CAAA,CAAC;KACtB;IAED,gBAAgB,CAAC,IAAY,EAAE,QAAuB,EAAA;AACpD,QAAA,IAAI,CAAC,sBAAA,CAAA,IAAI,8BAAW,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,sBAAA,CAAA,IAAI,EAAW,sBAAA,EAAA,GAAA,CAAA,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5B,SAAA;QACD,sBAAA,CAAA,IAAI,EAAW,sBAAA,EAAA,GAAA,CAAA,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACtC;IAED,oBAAoB,CAAC,IAAY,EAAE,QAAuB,EAAA;QACxD,MAAM,KAAK,GAAG,sBAAA,CAAA,IAAI,8BAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;AACR,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,OAAO;AACR,aAAA;AACF,SAAA;KACF;AAED,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,MAAM,KAAK,GAAG,sBAAA,CAAA,IAAI,EAAA,sBAAA,EAAA,GAAA,CAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1C,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACzD,SAAA;AACD,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;KAChC;AACF,CAAA;;;;;"}
1
+ {"version":3,"file":"eventtarget.mjs","sources":["../../src/eventtarget.ts"],"sourcesContent":["/*\n * Based on: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n */\n\ninterface Event {\n readonly type: string;\n readonly defaultPrevented?: boolean;\n}\n\ntype EventListener = (e: Event) => void;\n\nexport class EventTarget {\n private readonly listeners: Record<string, EventListener[]>;\n\n constructor() {\n this.listeners = {};\n }\n\n addEventListener(type: string, callback: EventListener): void {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(callback);\n }\n\n removeEventListeneer(type: string, callback: EventListener): void {\n const array = this.listeners[type];\n if (!array) {\n return;\n }\n for (let i = 0; i < array.length; i++) {\n if (array[i] === callback) {\n array.splice(i, 1);\n return;\n }\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const array = this.listeners[event.type];\n if (array) {\n array.forEach((listener) => listener.call(this, event));\n }\n return !event.defaultPrevented;\n }\n}\n"],"names":[],"mappings":"AAAA;;AAEG;MASU,WAAW,CAAA;AAGtB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACrB;IAED,gBAAgB,CAAC,IAAY,EAAE,QAAuB,EAAA;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3B,SAAA;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrC;IAED,oBAAoB,CAAC,IAAY,EAAE,QAAuB,EAAA;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;AACR,SAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,OAAO;AACR,aAAA;AACF,SAAA;KACF;AAED,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACzD,SAAA;AACD,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;KAChC;AACF;;;;"}
@@ -1,6 +1,3 @@
1
- import { __classPrivateFieldGet, __classPrivateFieldSet } from '../node_modules/tslib/tslib.es6.mjs';
2
-
3
- var _ParserBuilder_prefixParselets, _ParserBuilder_infixParselets, _Parser_tokens, _Parser_prefixParselets, _Parser_infixParselets;
4
1
  class PrefixOperatorAtom {
5
2
  constructor(operator, child) {
6
3
  this.operator = operator;
@@ -22,15 +19,15 @@ class InfixOperatorAtom {
22
19
  }
23
20
  class ParserBuilder {
24
21
  constructor() {
25
- _ParserBuilder_prefixParselets.set(this, {});
26
- _ParserBuilder_infixParselets.set(this, {});
22
+ this.prefixParselets = {};
23
+ this.infixParselets = {};
27
24
  }
28
25
  registerInfix(tokenType, parselet) {
29
- __classPrivateFieldGet(this, _ParserBuilder_infixParselets, "f")[tokenType] = parselet;
26
+ this.infixParselets[tokenType] = parselet;
30
27
  return this;
31
28
  }
32
29
  registerPrefix(tokenType, parselet) {
33
- __classPrivateFieldGet(this, _ParserBuilder_prefixParselets, "f")[tokenType] = parselet;
30
+ this.prefixParselets[tokenType] = parselet;
34
31
  return this;
35
32
  }
36
33
  prefix(tokenType, precedence, builder) {
@@ -51,21 +48,17 @@ class ParserBuilder {
51
48
  });
52
49
  }
53
50
  construct(input) {
54
- return new Parser(input, __classPrivateFieldGet(this, _ParserBuilder_prefixParselets, "f"), __classPrivateFieldGet(this, _ParserBuilder_infixParselets, "f"));
51
+ return new Parser(input, this.prefixParselets, this.infixParselets);
55
52
  }
56
53
  }
57
- _ParserBuilder_prefixParselets = new WeakMap(), _ParserBuilder_infixParselets = new WeakMap();
58
54
  class Parser {
59
55
  constructor(tokens, prefixParselets, infixParselets) {
60
- _Parser_tokens.set(this, void 0);
61
- _Parser_prefixParselets.set(this, void 0);
62
- _Parser_infixParselets.set(this, void 0);
63
- __classPrivateFieldSet(this, _Parser_tokens, tokens, "f");
64
- __classPrivateFieldSet(this, _Parser_prefixParselets, prefixParselets, "f");
65
- __classPrivateFieldSet(this, _Parser_infixParselets, infixParselets, "f");
56
+ this.tokens = tokens;
57
+ this.prefixParselets = prefixParselets;
58
+ this.infixParselets = infixParselets;
66
59
  }
67
60
  hasMore() {
68
- return __classPrivateFieldGet(this, _Parser_tokens, "f").length > 0;
61
+ return this.tokens.length > 0;
69
62
  }
70
63
  match(expected) {
71
64
  const token = this.peek();
@@ -77,7 +70,7 @@ class Parser {
77
70
  }
78
71
  consumeAndParse(precedence = Infinity) {
79
72
  const token = this.consume();
80
- const prefix = __classPrivateFieldGet(this, _Parser_prefixParselets, "f")[token.id];
73
+ const prefix = this.prefixParselets[token.id];
81
74
  if (!prefix) {
82
75
  throw Error(`Parse error at "${token.value}" (line ${token.line}, column ${token.column}). No matching prefix parselet.`);
83
76
  }
@@ -101,7 +94,7 @@ class Parser {
101
94
  return Infinity;
102
95
  }
103
96
  consume(expectedId, expectedValue) {
104
- if (!__classPrivateFieldGet(this, _Parser_tokens, "f").length) {
97
+ if (!this.tokens.length) {
105
98
  throw Error('Cant consume unknown more tokens.');
106
99
  }
107
100
  if (expectedId && this.peek()?.id !== expectedId) {
@@ -112,19 +105,18 @@ class Parser {
112
105
  const actual = this.peek();
113
106
  throw Error(`Expected "${expectedValue}" but got "${actual.value}" at line ${actual.line} column ${actual.column}.`);
114
107
  }
115
- return __classPrivateFieldGet(this, _Parser_tokens, "f").shift();
108
+ return this.tokens.shift();
116
109
  }
117
110
  peek() {
118
- return __classPrivateFieldGet(this, _Parser_tokens, "f").length > 0 ? __classPrivateFieldGet(this, _Parser_tokens, "f")[0] : undefined;
111
+ return this.tokens.length > 0 ? this.tokens[0] : undefined;
119
112
  }
120
113
  removeComments() {
121
- __classPrivateFieldSet(this, _Parser_tokens, __classPrivateFieldGet(this, _Parser_tokens, "f").filter((t) => t.id !== 'Comment'), "f");
114
+ this.tokens = this.tokens.filter((t) => t.id !== 'Comment');
122
115
  }
123
116
  getInfixParselet(token) {
124
- return __classPrivateFieldGet(this, _Parser_infixParselets, "f")[token.id === 'Symbol' ? token.value : token.id];
117
+ return this.infixParselets[token.id === 'Symbol' ? token.value : token.id];
125
118
  }
126
119
  }
127
- _Parser_tokens = new WeakMap(), _Parser_prefixParselets = new WeakMap(), _Parser_infixParselets = new WeakMap();
128
120
 
129
121
  export { InfixOperatorAtom, Parser, ParserBuilder, PrefixOperatorAtom };
130
122
  //# sourceMappingURL=parse.mjs.map
@@ -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 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: Token[]): Parser {\n return new Parser(input, this.#prefixParselets, this.#infixParselets);\n }\n}\n\nexport class 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 hasMore(): boolean {\n return this.#tokens.length > 0;\n }\n\n match(expected: string): boolean {\n const token = this.peek();\n if (token?.id !== expected) {\n return false;\n }\n\n this.consume();\n return true;\n }\n\n consumeAndParse(precedence = Infinity): Atom {\n const token = this.consume();\n const prefix = this.#prefixParselets[token.id];\n if (!prefix) {\n throw Error(\n `Parse error at \"${token.value}\" (line ${token.line}, column ${token.column}). No matching prefix parselet.`\n );\n }\n\n let left = prefix.parse(this, token);\n\n while (precedence > this.getPrecedence()) {\n const next = this.consume();\n const infix = this.getInfixParselet(next) as InfixParselet;\n left = (infix.parse as (parser: Parser, left: Atom, token: Token) => Atom)(this, left, next);\n }\n\n return left;\n }\n\n getPrecedence(): number {\n const nextToken = this.peek();\n if (!nextToken) {\n return Infinity;\n }\n const parser = this.getInfixParselet(nextToken);\n if (parser) {\n return parser.precedence;\n }\n return Infinity;\n }\n\n consume(expectedId?: string, expectedValue?: string): Token {\n if (!this.#tokens.length) {\n throw Error('Cant consume unknown more tokens.');\n }\n if (expectedId && this.peek()?.id !== expectedId) {\n const actual = this.peek() as Token;\n throw Error(`Expected ${expectedId} but got \"${actual.id}\" at line ${actual.line} column ${actual.column}.`);\n }\n if (expectedValue && this.peek()?.value !== expectedValue) {\n const actual = this.peek() as Token;\n throw Error(\n `Expected \"${expectedValue}\" but got \"${actual.value}\" at line ${actual.line} column ${actual.column}.`\n );\n }\n return this.#tokens.shift() as Token;\n }\n\n peek(): Token | undefined {\n return this.#tokens.length > 0 ? this.#tokens[0] : undefined;\n }\n\n removeComments(): void {\n this.#tokens = this.#tokens.filter((t) => t.id !== 'Comment');\n }\n\n getInfixParselet(token: Token): InfixParselet | undefined {\n return this.#infixParselets[token.id === 'Symbol' ? token.value : token.id];\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.mjs","sources":["../../../src/fhirlexer/parse.ts"],"sourcesContent":["import { TypedValue } from '../types';\nimport { Token } from './tokenize';\n\nexport interface Atom {\n eval(context: TypedValue[]): TypedValue[];\n}\n\nexport abstract class PrefixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly child: Atom) {}\n\n abstract eval(context: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.operator}(${this.child.toString()})`;\n }\n}\n\nexport abstract class InfixOperatorAtom implements Atom {\n constructor(public readonly operator: string, public readonly left: Atom, public readonly right: Atom) {}\n\n abstract eval(context: TypedValue[]): TypedValue[];\n\n toString(): string {\n return `${this.left.toString()} ${this.operator} ${this.right.toString()}`;\n }\n}\n\nexport interface PrefixParselet {\n parse(parser: Parser, token: Token): Atom;\n}\n\nexport interface InfixParselet {\n precedence: number;\n parse?(parser: Parser, left: Atom, token: Token): Atom;\n}\n\nexport class ParserBuilder {\n private readonly prefixParselets: Record<string, PrefixParselet> = {};\n private readonly infixParselets: Record<string, InfixParselet> = {};\n\n public registerInfix(tokenType: string, parselet: InfixParselet): ParserBuilder {\n this.infixParselets[tokenType] = parselet;\n return this;\n }\n\n public registerPrefix(tokenType: string, parselet: PrefixParselet): ParserBuilder {\n this.prefixParselets[tokenType] = parselet;\n return this;\n }\n\n public prefix(tokenType: string, precedence: number, builder: (token: Token, right: Atom) => Atom): ParserBuilder {\n return this.registerPrefix(tokenType, {\n parse(parser, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(token, right);\n },\n });\n }\n\n public infixLeft(\n tokenType: string,\n precedence: number,\n builder: (left: Atom, token: Token, right: Atom) => Atom\n ): ParserBuilder {\n return this.registerInfix(tokenType, {\n parse(parser, left, token) {\n const right = parser.consumeAndParse(precedence);\n return builder(left, token, right);\n },\n precedence,\n });\n }\n\n public construct(input: Token[]): Parser {\n return new Parser(input, this.prefixParselets, this.infixParselets);\n }\n}\n\nexport class Parser {\n private tokens: Token[];\n private prefixParselets: Record<string, PrefixParselet>;\n private infixParselets: Record<string, InfixParselet>;\n\n constructor(\n tokens: Token[],\n prefixParselets: Record<string, PrefixParselet>,\n infixParselets: Record<string, InfixParselet>\n ) {\n this.tokens = tokens;\n this.prefixParselets = prefixParselets;\n this.infixParselets = infixParselets;\n }\n\n hasMore(): boolean {\n return this.tokens.length > 0;\n }\n\n match(expected: string): boolean {\n const token = this.peek();\n if (token?.id !== expected) {\n return false;\n }\n\n this.consume();\n return true;\n }\n\n consumeAndParse(precedence = Infinity): Atom {\n const token = this.consume();\n const prefix = this.prefixParselets[token.id];\n if (!prefix) {\n throw Error(\n `Parse error at \"${token.value}\" (line ${token.line}, column ${token.column}). No matching prefix parselet.`\n );\n }\n\n let left = prefix.parse(this, token);\n\n while (precedence > this.getPrecedence()) {\n const next = this.consume();\n const infix = this.getInfixParselet(next) as InfixParselet;\n left = (infix.parse as (parser: Parser, left: Atom, token: Token) => Atom)(this, left, next);\n }\n\n return left;\n }\n\n getPrecedence(): number {\n const nextToken = this.peek();\n if (!nextToken) {\n return Infinity;\n }\n const parser = this.getInfixParselet(nextToken);\n if (parser) {\n return parser.precedence;\n }\n return Infinity;\n }\n\n consume(expectedId?: string, expectedValue?: string): Token {\n if (!this.tokens.length) {\n throw Error('Cant consume unknown more tokens.');\n }\n if (expectedId && this.peek()?.id !== expectedId) {\n const actual = this.peek() as Token;\n throw Error(`Expected ${expectedId} but got \"${actual.id}\" at line ${actual.line} column ${actual.column}.`);\n }\n if (expectedValue && this.peek()?.value !== expectedValue) {\n const actual = this.peek() as Token;\n throw Error(\n `Expected \"${expectedValue}\" but got \"${actual.value}\" at line ${actual.line} column ${actual.column}.`\n );\n }\n return this.tokens.shift() as Token;\n }\n\n peek(): Token | undefined {\n return this.tokens.length > 0 ? this.tokens[0] : undefined;\n }\n\n removeComments(): void {\n this.tokens = this.tokens.filter((t) => t.id !== 'Comment');\n }\n\n getInfixParselet(token: Token): InfixParselet | undefined {\n return this.infixParselets[token.id === 'Symbol' ? token.value : token.id];\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
- import { __classPrivateFieldSet, __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.mjs';
2
-
3
- var _Tokenizer_instances, _Tokenizer_str, _Tokenizer_keywords, _Tokenizer_operators, _Tokenizer_dateTimeLiterals, _Tokenizer_symbolRegex, _Tokenizer_result, _Tokenizer_pos, _Tokenizer_markStack, _Tokenizer_prevToken, _Tokenizer_peekToken, _Tokenizer_consumeToken, _Tokenizer_consumeWhitespace, _Tokenizer_consumeMultiLineComment, _Tokenizer_consumeSingleLineComment, _Tokenizer_consumeString, _Tokenizer_consumeBacktickSymbol, _Tokenizer_consumeDateTime, _Tokenizer_consumeNumber, _Tokenizer_consumeSymbol, _Tokenizer_consumeOperator, _Tokenizer_consumeWhile, _Tokenizer_curr, _Tokenizer_prev, _Tokenizer_peek, _Tokenizer_mark, _Tokenizer_reset, _Tokenizer_advance, _Tokenizer_buildToken;
4
1
  const STANDARD_UNITS = [
5
2
  'year',
6
3
  'years',
@@ -21,190 +18,203 @@ const STANDARD_UNITS = [
21
18
  ];
22
19
  class Tokenizer {
23
20
  constructor(str, keywords, operators, options) {
24
- _Tokenizer_instances.add(this);
25
- _Tokenizer_str.set(this, void 0);
26
- _Tokenizer_keywords.set(this, void 0);
27
- _Tokenizer_operators.set(this, void 0);
28
- _Tokenizer_dateTimeLiterals.set(this, void 0);
29
- _Tokenizer_symbolRegex.set(this, void 0);
30
- _Tokenizer_result.set(this, []);
31
- _Tokenizer_pos.set(this, { index: 0, line: 1, column: 0 });
32
- _Tokenizer_markStack.set(this, []);
33
- __classPrivateFieldSet(this, _Tokenizer_str, str, "f");
34
- __classPrivateFieldSet(this, _Tokenizer_keywords, keywords, "f");
35
- __classPrivateFieldSet(this, _Tokenizer_operators, operators, "f");
36
- __classPrivateFieldSet(this, _Tokenizer_dateTimeLiterals, !!options?.dateTimeLiterals, "f");
37
- __classPrivateFieldSet(this, _Tokenizer_symbolRegex, options?.symbolRegex ?? /[$\w]/, "f");
21
+ this.result = [];
22
+ this.pos = { index: 0, line: 1, column: 0 };
23
+ this.markStack = [];
24
+ this.str = str;
25
+ this.keywords = keywords;
26
+ this.operators = operators;
27
+ this.dateTimeLiterals = !!options?.dateTimeLiterals;
28
+ this.symbolRegex = options?.symbolRegex ?? /[$\w]/;
38
29
  }
39
30
  tokenize() {
40
- while (__classPrivateFieldGet(this, _Tokenizer_pos, "f").index < __classPrivateFieldGet(this, _Tokenizer_str, "f").length) {
41
- const token = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
31
+ while (this.pos.index < this.str.length) {
32
+ const token = this.consumeToken();
42
33
  if (token) {
43
- __classPrivateFieldGet(this, _Tokenizer_result, "f").push(token);
34
+ this.result.push(token);
44
35
  }
45
36
  }
46
- return __classPrivateFieldGet(this, _Tokenizer_result, "f");
37
+ return this.result;
38
+ }
39
+ prevToken() {
40
+ return this.result.slice(-1)[0];
41
+ }
42
+ peekToken() {
43
+ this.mark();
44
+ const token = this.consumeToken();
45
+ this.reset();
46
+ return token;
47
+ }
48
+ consumeToken() {
49
+ this.consumeWhitespace();
50
+ const c = this.curr();
51
+ if (!c) {
52
+ return undefined;
53
+ }
54
+ this.mark();
55
+ const next = this.peek();
56
+ if (c === '/' && next === '*') {
57
+ return this.consumeMultiLineComment();
58
+ }
59
+ if (c === '/' && next === '/') {
60
+ return this.consumeSingleLineComment();
61
+ }
62
+ if (c === "'" || c === '"') {
63
+ return this.consumeString(c);
64
+ }
65
+ if (c === '`') {
66
+ return this.consumeBacktickSymbol();
67
+ }
68
+ if (c === '@') {
69
+ return this.consumeDateTime();
70
+ }
71
+ if (c.match(/\d/)) {
72
+ return this.consumeNumber();
73
+ }
74
+ if (c.match(/\w/)) {
75
+ return this.consumeSymbol();
76
+ }
77
+ if (c === '$' && next.match(/\w/)) {
78
+ return this.consumeSymbol();
79
+ }
80
+ return this.consumeOperator();
81
+ }
82
+ consumeWhitespace() {
83
+ this.consumeWhile(() => this.curr().match(/\s/));
84
+ }
85
+ consumeMultiLineComment() {
86
+ const start = this.pos.index;
87
+ this.consumeWhile(() => this.curr() !== '*' || this.peek() !== '/');
88
+ this.advance();
89
+ this.advance();
90
+ return this.buildToken('Comment', this.str.substring(start, this.pos.index));
91
+ }
92
+ consumeSingleLineComment() {
93
+ return this.buildToken('Comment', this.consumeWhile(() => this.curr() !== '\n'));
94
+ }
95
+ consumeString(endChar) {
96
+ this.advance();
97
+ const result = this.buildToken('String', this.consumeWhile(() => this.prev() === '\\' || this.curr() !== endChar));
98
+ this.advance();
99
+ return result;
100
+ }
101
+ consumeBacktickSymbol() {
102
+ this.advance();
103
+ const result = this.buildToken('Symbol', this.consumeWhile(() => this.curr() !== '`'));
104
+ this.advance();
105
+ return result;
106
+ }
107
+ consumeDateTime() {
108
+ this.advance(); // Consume "@"
109
+ const start = this.pos.index;
110
+ this.consumeWhile(() => this.curr().match(/[\d-]/));
111
+ if (this.curr() === 'T') {
112
+ this.advance();
113
+ this.consumeWhile(() => this.curr().match(/[\d:]/));
114
+ if (this.curr() === '.' && this.peek().match(/\d/)) {
115
+ this.advance();
116
+ this.consumeWhile(() => this.curr().match(/\d/));
117
+ }
118
+ if (this.curr() === 'Z') {
119
+ this.advance();
120
+ }
121
+ else if (this.curr() === '+' || this.curr() === '-') {
122
+ this.advance();
123
+ this.consumeWhile(() => this.curr().match(/[\d:]/));
124
+ }
125
+ }
126
+ return this.buildToken('DateTime', this.str.substring(start, this.pos.index));
127
+ }
128
+ consumeNumber() {
129
+ const start = this.pos.index;
130
+ let id = 'Number';
131
+ this.consumeWhile(() => this.curr().match(/\d/));
132
+ if (this.curr() === '.' && this.peek().match(/\d/)) {
133
+ this.advance();
134
+ this.consumeWhile(() => this.curr().match(/\d/));
135
+ }
136
+ if (this.curr() === '-' && this.dateTimeLiterals) {
137
+ // Rewind to one character before the start, and then treat as dateTime literal.
138
+ this.pos.index = start - 1;
139
+ return this.consumeDateTime();
140
+ }
141
+ if (this.curr() === ' ') {
142
+ if (isUnitToken(this.peekToken())) {
143
+ id = 'Quantity';
144
+ this.consumeToken();
145
+ }
146
+ }
147
+ return this.buildToken(id, this.str.substring(start, this.pos.index));
148
+ }
149
+ consumeSymbol() {
150
+ const value = this.consumeWhile(() => this.curr().match(this.symbolRegex));
151
+ if (this.prevToken()?.value !== '.' && this.keywords.includes(value)) {
152
+ return this.buildToken(value, value);
153
+ }
154
+ return this.buildToken('Symbol', value);
155
+ }
156
+ consumeOperator() {
157
+ const c = this.curr();
158
+ const next = this.peek();
159
+ const twoCharOp = c + next;
160
+ if (this.operators.includes(twoCharOp)) {
161
+ this.advance();
162
+ this.advance();
163
+ return this.buildToken(twoCharOp, twoCharOp);
164
+ }
165
+ this.advance();
166
+ return this.buildToken(c, c);
167
+ }
168
+ consumeWhile(condition) {
169
+ const start = this.pos.index;
170
+ while (this.pos.index < this.str.length && condition()) {
171
+ this.advance();
172
+ }
173
+ return this.str.substring(start, this.pos.index);
174
+ }
175
+ curr() {
176
+ return this.str[this.pos.index];
177
+ }
178
+ prev() {
179
+ return this.str[this.pos.index - 1] ?? '';
180
+ }
181
+ peek() {
182
+ return this.str[this.pos.index + 1] ?? '';
183
+ }
184
+ mark() {
185
+ this.markStack.push({ ...this.pos });
186
+ }
187
+ reset() {
188
+ const mark = this.markStack.pop();
189
+ if (!mark) {
190
+ throw new Error('No mark to reset to');
191
+ }
192
+ this.pos.index = mark.index;
193
+ this.pos.line = mark.line;
194
+ this.pos.column = mark.column;
195
+ }
196
+ advance() {
197
+ this.pos.index++;
198
+ if (this.curr() === '\n') {
199
+ this.pos.line++;
200
+ this.pos.column = 0;
201
+ }
202
+ else {
203
+ this.pos.column++;
204
+ }
205
+ }
206
+ buildToken(id, value) {
207
+ const mark = this.markStack.pop();
208
+ if (!mark) {
209
+ throw new Error('No mark for token');
210
+ }
211
+ return {
212
+ id,
213
+ value,
214
+ ...mark,
215
+ };
47
216
  }
48
217
  }
49
- _Tokenizer_str = new WeakMap(), _Tokenizer_keywords = new WeakMap(), _Tokenizer_operators = new WeakMap(), _Tokenizer_dateTimeLiterals = new WeakMap(), _Tokenizer_symbolRegex = new WeakMap(), _Tokenizer_result = new WeakMap(), _Tokenizer_pos = new WeakMap(), _Tokenizer_markStack = new WeakMap(), _Tokenizer_instances = new WeakSet(), _Tokenizer_prevToken = function _Tokenizer_prevToken() {
50
- return __classPrivateFieldGet(this, _Tokenizer_result, "f").slice(-1)[0];
51
- }, _Tokenizer_peekToken = function _Tokenizer_peekToken() {
52
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_mark).call(this);
53
- const token = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
54
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_reset).call(this);
55
- return token;
56
- }, _Tokenizer_consumeToken = function _Tokenizer_consumeToken() {
57
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhitespace).call(this);
58
- const c = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this);
59
- if (!c) {
60
- return undefined;
61
- }
62
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_mark).call(this);
63
- const next = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this);
64
- if (c === '/' && next === '*') {
65
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeMultiLineComment).call(this);
66
- }
67
- if (c === '/' && next === '/') {
68
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSingleLineComment).call(this);
69
- }
70
- if (c === "'" || c === '"') {
71
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeString).call(this, c);
72
- }
73
- if (c === '`') {
74
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeBacktickSymbol).call(this);
75
- }
76
- if (c === '@') {
77
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeDateTime).call(this);
78
- }
79
- if (c.match(/\d/)) {
80
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeNumber).call(this);
81
- }
82
- if (c.match(/\w/)) {
83
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSymbol).call(this);
84
- }
85
- if (c === '$' && next.match(/\w/)) {
86
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeSymbol).call(this);
87
- }
88
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeOperator).call(this);
89
- }, _Tokenizer_consumeWhitespace = function _Tokenizer_consumeWhitespace() {
90
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\s/));
91
- }, _Tokenizer_consumeMultiLineComment = function _Tokenizer_consumeMultiLineComment() {
92
- const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f").index;
93
- __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) !== '/');
94
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
95
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
96
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, 'Comment', __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f").index));
97
- }, _Tokenizer_consumeSingleLineComment = function _Tokenizer_consumeSingleLineComment() {
98
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, 'Comment', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== '\n'));
99
- }, _Tokenizer_consumeString = function _Tokenizer_consumeString(endChar) {
100
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
101
- const result = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, '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) !== endChar));
102
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
103
- return result;
104
- }, _Tokenizer_consumeBacktickSymbol = function _Tokenizer_consumeBacktickSymbol() {
105
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
106
- const result = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, 'Symbol', __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) !== '`'));
107
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
108
- return result;
109
- }, _Tokenizer_consumeDateTime = function _Tokenizer_consumeDateTime() {
110
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this); // Consume "@"
111
- const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f").index;
112
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d-]/));
113
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === 'T') {
114
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
115
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d:]/));
116
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '.' && __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this).match(/\d/)) {
117
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
118
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\d/));
119
- }
120
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === 'Z') {
121
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
122
- }
123
- else if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '+' || __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '-') {
124
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
125
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/[\d:]/));
126
- }
127
- }
128
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, 'DateTime', __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f").index));
129
- }, _Tokenizer_consumeNumber = function _Tokenizer_consumeNumber() {
130
- const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f").index;
131
- let id = 'Number';
132
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\d/));
133
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '.' && __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this).match(/\d/)) {
134
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
135
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(/\d/));
136
- }
137
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '-' && __classPrivateFieldGet(this, _Tokenizer_dateTimeLiterals, "f")) {
138
- // Rewind to one character before the start, and then treat as dateTime literal.
139
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").index = start - 1;
140
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeDateTime).call(this);
141
- }
142
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === ' ') {
143
- if (isUnitToken(__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peekToken).call(this))) {
144
- id = 'Quantity';
145
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeToken).call(this);
146
- }
147
- }
148
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, id, __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f").index));
149
- }, _Tokenizer_consumeSymbol = function _Tokenizer_consumeSymbol() {
150
- const value = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_consumeWhile).call(this, () => __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this).match(__classPrivateFieldGet(this, _Tokenizer_symbolRegex, "f")));
151
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_prevToken).call(this)?.value !== '.' && __classPrivateFieldGet(this, _Tokenizer_keywords, "f").includes(value)) {
152
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, value, value);
153
- }
154
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, 'Symbol', value);
155
- }, _Tokenizer_consumeOperator = function _Tokenizer_consumeOperator() {
156
- const c = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this);
157
- const next = __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_peek).call(this);
158
- const twoCharOp = c + next;
159
- if (__classPrivateFieldGet(this, _Tokenizer_operators, "f").includes(twoCharOp)) {
160
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
161
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
162
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, twoCharOp, twoCharOp);
163
- }
164
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
165
- return __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_buildToken).call(this, c, c);
166
- }, _Tokenizer_consumeWhile = function _Tokenizer_consumeWhile(condition) {
167
- const start = __classPrivateFieldGet(this, _Tokenizer_pos, "f").index;
168
- while (__classPrivateFieldGet(this, _Tokenizer_pos, "f").index < __classPrivateFieldGet(this, _Tokenizer_str, "f").length && condition()) {
169
- __classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_advance).call(this);
170
- }
171
- return __classPrivateFieldGet(this, _Tokenizer_str, "f").substring(start, __classPrivateFieldGet(this, _Tokenizer_pos, "f").index);
172
- }, _Tokenizer_curr = function _Tokenizer_curr() {
173
- return __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f").index];
174
- }, _Tokenizer_prev = function _Tokenizer_prev() {
175
- return __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f").index - 1] ?? '';
176
- }, _Tokenizer_peek = function _Tokenizer_peek() {
177
- return __classPrivateFieldGet(this, _Tokenizer_str, "f")[__classPrivateFieldGet(this, _Tokenizer_pos, "f").index + 1] ?? '';
178
- }, _Tokenizer_mark = function _Tokenizer_mark() {
179
- __classPrivateFieldGet(this, _Tokenizer_markStack, "f").push({ ...__classPrivateFieldGet(this, _Tokenizer_pos, "f") });
180
- }, _Tokenizer_reset = function _Tokenizer_reset() {
181
- const mark = __classPrivateFieldGet(this, _Tokenizer_markStack, "f").pop();
182
- if (!mark) {
183
- throw new Error('No mark to reset to');
184
- }
185
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").index = mark.index;
186
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").line = mark.line;
187
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").column = mark.column;
188
- }, _Tokenizer_advance = function _Tokenizer_advance() {
189
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").index++;
190
- if (__classPrivateFieldGet(this, _Tokenizer_instances, "m", _Tokenizer_curr).call(this) === '\n') {
191
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").line++;
192
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").column = 0;
193
- }
194
- else {
195
- __classPrivateFieldGet(this, _Tokenizer_pos, "f").column++;
196
- }
197
- }, _Tokenizer_buildToken = function _Tokenizer_buildToken(id, value) {
198
- const mark = __classPrivateFieldGet(this, _Tokenizer_markStack, "f").pop();
199
- if (!mark) {
200
- throw new Error('No mark for token');
201
- }
202
- return {
203
- id,
204
- value,
205
- ...mark,
206
- };
207
- };
208
218
  function isUnitToken(token) {
209
219
  if (token) {
210
220
  if (token.id === 'String') {