@adminide-stack/extension-api 11.0.1-alpha.0 → 11.0.1-alpha.12

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 (93) hide show
  1. package/lib/connections/jsonrpc2/connection.js +507 -525
  2. package/lib/connections/jsonrpc2/connection.js.map +1 -0
  3. package/lib/connections/jsonrpc2/events.js +100 -100
  4. package/lib/connections/jsonrpc2/events.js.map +1 -0
  5. package/lib/connections/jsonrpc2/linkedMap.js +248 -246
  6. package/lib/connections/jsonrpc2/linkedMap.js.map +1 -0
  7. package/lib/connections/jsonrpc2/messages.js +36 -40
  8. package/lib/connections/jsonrpc2/messages.js.map +1 -0
  9. package/lib/connections/jsonrpc2/test-helper.js +35 -21
  10. package/lib/connections/jsonrpc2/test-helper.js.map +1 -0
  11. package/lib/connections/jsonrpc2/trace.js +70 -82
  12. package/lib/connections/jsonrpc2/trace.js.map +1 -0
  13. package/lib/connections/jsonrpc2/transport.js +56 -56
  14. package/lib/connections/jsonrpc2/transport.js.map +1 -0
  15. package/lib/connections/jsonrpc2/transports/webWorker.js +80 -88
  16. package/lib/connections/jsonrpc2/transports/webWorker.js.map +1 -0
  17. package/lib/connections/proxy/proxy.js +46 -47
  18. package/lib/connections/proxy/proxy.js.map +1 -0
  19. package/lib/connections/remote-rpc/browser-remote-rpc.js +55 -54
  20. package/lib/connections/remote-rpc/browser-remote-rpc.js.map +1 -0
  21. package/lib/connections/remote-rpc/rxjs-websockets.js +68 -68
  22. package/lib/connections/remote-rpc/rxjs-websockets.js.map +1 -0
  23. package/lib/constants/action-types.js +27 -27
  24. package/lib/constants/action-types.js.map +1 -0
  25. package/lib/constants/types.js +7 -7
  26. package/lib/constants/types.js.map +1 -0
  27. package/lib/core/expr/evaluator.js +103 -104
  28. package/lib/core/expr/evaluator.js.map +1 -0
  29. package/lib/core/expr/lexer.js +366 -361
  30. package/lib/core/expr/lexer.js.map +1 -0
  31. package/lib/core/expr/parser.js +228 -217
  32. package/lib/core/expr/parser.js.map +1 -0
  33. package/lib/core/types/ext-host-types.js +53 -54
  34. package/lib/core/types/ext-host-types.js.map +1 -0
  35. package/lib/index.js +1 -1
  36. package/lib/index.js.map +1 -0
  37. package/lib/interfaces/contributions/contribution.js +40 -40
  38. package/lib/interfaces/contributions/contribution.js.map +1 -0
  39. package/lib/interfaces/ext-services/ext-services.d.ts +2 -2
  40. package/lib/interfaces/extension-manifest.d.ts +1 -1
  41. package/lib/interfaces/graphql.js +1 -1
  42. package/lib/interfaces/graphql.js.map +1 -0
  43. package/lib/interfaces/model.js +3 -3
  44. package/lib/interfaces/model.js.map +1 -0
  45. package/lib/interfaces/text-document.js +76 -77
  46. package/lib/interfaces/text-document.js.map +1 -0
  47. package/lib/interfaces/webview/webview.d.ts +1 -1
  48. package/lib/interfaces/webview/webview.js +3 -3
  49. package/lib/interfaces/webview/webview.js.map +1 -0
  50. package/lib/middlewares/extensionController.js +9 -5
  51. package/lib/middlewares/extensionController.js.map +1 -0
  52. package/lib/protocol/client.protocol.js +2 -2
  53. package/lib/protocol/client.protocol.js.map +1 -0
  54. package/lib/protocol/common.protocol.d.ts +1 -2
  55. package/lib/protocol/common.protocol.js +50 -48
  56. package/lib/protocol/common.protocol.js.map +1 -0
  57. package/lib/protocol/editor-missing-types.js +4 -4
  58. package/lib/protocol/editor-missing-types.js.map +1 -0
  59. package/lib/protocol/proxy-identifier.js +39 -39
  60. package/lib/protocol/proxy-identifier.js.map +1 -0
  61. package/lib/protocol/rpc-logger.js +39 -43
  62. package/lib/protocol/rpc-logger.js.map +1 -0
  63. package/lib/protocol/rpc-protocol.js +736 -724
  64. package/lib/protocol/rpc-protocol.js.map +1 -0
  65. package/lib/protocol/server.protocol.js +22 -22
  66. package/lib/protocol/server.protocol.js.map +1 -0
  67. package/lib/protocol/shared/editor.js +17 -17
  68. package/lib/protocol/shared/editor.js.map +1 -0
  69. package/lib/protocol/temporary-types.js +16 -16
  70. package/lib/protocol/temporary-types.js.map +1 -0
  71. package/lib/protocol/utils/lazy-promise.js +60 -61
  72. package/lib/protocol/utils/lazy-promise.js.map +1 -0
  73. package/lib/react/components/view-component/ViewComponent.js +31 -26
  74. package/lib/react/components/view-component/ViewComponent.js.map +1 -0
  75. package/lib/react/index.js +1 -1
  76. package/lib/react/index.js.map +1 -0
  77. package/lib/react/useExtensionController.js +13 -11
  78. package/lib/react/useExtensionController.js.map +1 -0
  79. package/lib/utils/abortable-rx.js +73 -70
  80. package/lib/utils/abortable-rx.js.map +1 -0
  81. package/lib/utils/errors.js +10 -10
  82. package/lib/utils/errors.js.map +1 -0
  83. package/lib/utils/extensions.js +11 -11
  84. package/lib/utils/extensions.js.map +1 -0
  85. package/lib/utils/helper.test.js +7 -4
  86. package/lib/utils/helper.test.js.map +1 -0
  87. package/lib/utils/paths-util.js +79 -82
  88. package/lib/utils/paths-util.js.map +1 -0
  89. package/lib/utils/rxjs/combineLatestOrDefault.js +72 -70
  90. package/lib/utils/rxjs/combineLatestOrDefault.js.map +1 -0
  91. package/lib/utils/util.js +24 -25
  92. package/lib/utils/util.js.map +1 -0
  93. package/package.json +5 -5
@@ -1,27 +1,27 @@
1
1
  /** Valid token types in expressions. */
2
2
  var TokenType;
3
3
  (function (TokenType) {
4
- /** An operator. */
5
- TokenType[TokenType["Operator"] = 0] = "Operator";
6
- /** An identifier. */
7
- TokenType[TokenType["Identifier"] = 1] = "Identifier";
8
- /** A string literal. */
9
- TokenType[TokenType["String"] = 2] = "String";
10
- /**
11
- * The start of a template until its first expression.
12
- *
13
- * See https://tc39.github.io/ecma262/#sec-template-literal-lexical-components for documentation on the
14
- * ECMAScript lexical components for templates, upon which this is based.
15
- */
16
- TokenType[TokenType["TemplateHead"] = 3] = "TemplateHead";
17
- /** The end of a previous template expression until the next template expression. */
18
- TokenType[TokenType["TemplateMiddle"] = 4] = "TemplateMiddle";
19
- /** The end of a previous template expression until the end of the template. */
20
- TokenType[TokenType["TemplateTail"] = 5] = "TemplateTail";
21
- /** A template with no substitutions. */
22
- TokenType[TokenType["NoSubstitutionTemplate"] = 6] = "NoSubstitutionTemplate";
23
- /** A number literal. */
24
- TokenType[TokenType["Number"] = 7] = "Number";
4
+ /** An operator. */
5
+ TokenType[TokenType["Operator"] = 0] = "Operator";
6
+ /** An identifier. */
7
+ TokenType[TokenType["Identifier"] = 1] = "Identifier";
8
+ /** A string literal. */
9
+ TokenType[TokenType["String"] = 2] = "String";
10
+ /**
11
+ * The start of a template until its first expression.
12
+ *
13
+ * See https://tc39.github.io/ecma262/#sec-template-literal-lexical-components for documentation on the
14
+ * ECMAScript lexical components for templates, upon which this is based.
15
+ */
16
+ TokenType[TokenType["TemplateHead"] = 3] = "TemplateHead";
17
+ /** The end of a previous template expression until the next template expression. */
18
+ TokenType[TokenType["TemplateMiddle"] = 4] = "TemplateMiddle";
19
+ /** The end of a previous template expression until the end of the template. */
20
+ TokenType[TokenType["TemplateTail"] = 5] = "TemplateTail";
21
+ /** A template with no substitutions. */
22
+ TokenType[TokenType["NoSubstitutionTemplate"] = 6] = "NoSubstitutionTemplate";
23
+ /** A number literal. */
24
+ TokenType[TokenType["Number"] = 7] = "Number";
25
25
  })(TokenType || (TokenType = {}));
26
26
  /**
27
27
  * All valid operators in expressions. The values are the operator precedence (or, for operators that are not operators, 0). This
@@ -30,28 +30,28 @@ var TokenType;
30
30
  * Exported for testing only.
31
31
  */
32
32
  const OPERATORS = {
33
- '(': 0,
34
- ')': 0,
35
- '}': 0,
36
- ',': 0,
37
- '=': 0,
38
- '||': 1,
39
- '&&': 2,
40
- '^': 4,
41
- '==': 6,
42
- '!=': 6,
43
- '===': 6,
44
- '!==': 6,
45
- '<': 7,
46
- '>': 7,
47
- '<=': 7,
48
- '>=': 7,
49
- '+': 9,
50
- '-': 9,
51
- '*': 10,
52
- '/': 10,
53
- '%': 10,
54
- '!': 11,
33
+ '(': 0,
34
+ ')': 0,
35
+ '}': 0,
36
+ ',': 0,
37
+ '=': 0,
38
+ '||': 1,
39
+ '&&': 2,
40
+ '^': 4,
41
+ '==': 6,
42
+ '!=': 6,
43
+ '===': 6,
44
+ '!==': 6,
45
+ '<': 7,
46
+ '>': 7,
47
+ '<=': 7,
48
+ '>=': 7,
49
+ '+': 9,
50
+ '-': 9,
51
+ '*': 10,
52
+ '/': 10,
53
+ '%': 10,
54
+ '!': 11
55
55
  };
56
56
  /**
57
57
  * A tree with the next valid operator characters for multi-character operators. This must be kept in sync with
@@ -60,351 +60,356 @@ const OPERATORS = {
60
60
  * Exported for testing only.
61
61
  */
62
62
  const OPERATOR_CHARS = {
63
- '&': { '&': true },
64
- '|': { '|': true },
63
+ '&': {
64
+ '&': true
65
+ },
66
+ '|': {
67
+ '|': true
68
+ },
69
+ '=': {
70
+ '\u0000': true,
65
71
  '=': {
66
- '\u0000': true,
67
- '=': {
68
- '\u0000': true,
69
- '=': true,
70
- },
71
- },
72
- '!': {
73
- '\u0000': true,
74
- '=': {
75
- '\u0000': true,
76
- '=': true,
77
- },
78
- },
79
- '<': { '\u0000': true, '=': true },
80
- '>': { '\u0000': true, '=': true },
81
- '^': true,
82
- '}': true,
83
- '(': true,
84
- ')': true,
85
- ',': true,
86
- '+': true,
87
- '-': true,
88
- '*': true,
89
- '/': true,
90
- '%': true,
72
+ '\u0000': true,
73
+ '=': true
74
+ }
75
+ },
76
+ '!': {
77
+ '\u0000': true,
78
+ '=': {
79
+ '\u0000': true,
80
+ '=': true
81
+ }
82
+ },
83
+ '<': {
84
+ '\u0000': true,
85
+ '=': true
86
+ },
87
+ '>': {
88
+ '\u0000': true,
89
+ '=': true
90
+ },
91
+ '^': true,
92
+ '}': true,
93
+ '(': true,
94
+ ')': true,
95
+ ',': true,
96
+ '+': true,
97
+ '-': true,
98
+ '*': true,
99
+ '/': true,
100
+ '%': true
91
101
  };
92
102
  function isWhiteSpace(character) {
93
- return character === '\u0009' || character === ' ' || character === '\u00A0';
103
+ return character === '\u0009' || character === ' ' || character === '\u00A0';
94
104
  }
95
105
  function isLetter(character) {
96
- return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z');
106
+ return character >= 'a' && character <= 'z' || character >= 'A' && character <= 'Z';
97
107
  }
98
108
  function isDecimalDigit(character) {
99
- return character >= '0' && character <= '9';
109
+ return character >= '0' && character <= '9';
100
110
  }
101
111
  function isIdentifierStart(character) {
102
- return character === '_' || isLetter(character);
112
+ return character === '_' || isLetter(character);
103
113
  }
104
114
  function isIdentifierPart(character) {
105
- return isIdentifierStart(character) || isDecimalDigit(character) || character === '.';
115
+ return isIdentifierStart(character) || isDecimalDigit(character) || character === '.';
106
116
  }
107
117
  /** Scans an expression. */
108
118
  class Lexer {
109
- expression = '';
110
- length = 0;
111
- _index = 0;
112
- marker = 0;
113
- curlyStack = 0;
114
- /** The current character position of the lexer's cursor. */
115
- get index() {
116
- return this._index;
117
- }
118
- reset(string) {
119
- this.expression = string;
120
- this.length = string.length;
121
- this._index = 0;
122
- this.curlyStack = 0;
123
- }
124
- next() {
125
- this.skipSpaces();
126
- if (this._index >= this.length) {
127
- return undefined;
128
- }
129
- this.marker = this._index;
130
- const token = this.scanNext();
131
- if (token !== undefined) {
132
- return token;
133
- }
134
- throw new SyntaxError(`Unexpected character ${JSON.stringify(this.peekNextChar())} (at ${this.index})`);
135
- }
136
- peek() {
137
- const savedIndex = this._index;
138
- const savedCurlyStack = this.curlyStack;
139
- let token;
140
- try {
141
- token = this.next();
142
- }
143
- catch {
144
- token = undefined;
145
- }
146
- this._index = savedIndex;
147
- this.curlyStack = savedCurlyStack;
148
- if (!token) {
149
- return undefined;
150
- }
151
- return { type: token.type, value: token.value };
119
+ expression = '';
120
+ length = 0;
121
+ _index = 0;
122
+ marker = 0;
123
+ curlyStack = 0;
124
+ /** The current character position of the lexer's cursor. */
125
+ get index() {
126
+ return this._index;
127
+ }
128
+ reset(string) {
129
+ this.expression = string;
130
+ this.length = string.length;
131
+ this._index = 0;
132
+ this.curlyStack = 0;
133
+ }
134
+ next() {
135
+ this.skipSpaces();
136
+ if (this._index >= this.length) {
137
+ return undefined;
152
138
  }
153
- scanNext() {
154
- let token = this.scanString();
155
- if (token !== undefined) {
156
- return token;
157
- }
158
- token = this.scanTemplate();
159
- if (token !== undefined) {
160
- return token;
161
- }
162
- token = this.scanNumber();
163
- if (token !== undefined) {
164
- return token;
165
- }
166
- token = this.scanOperator();
167
- if (token !== undefined) {
168
- return token;
169
- }
170
- token = this.scanIdentifier();
171
- if (token !== undefined) {
172
- return token;
173
- }
174
- return undefined;
175
- }
176
- peekNextChar(advance = 0) {
177
- const index = this._index + advance;
178
- return index < this.length ? this.expression.charAt(index) : '\u0000';
179
- }
180
- getNextChar() {
181
- let character = '\u0000';
182
- const index = this._index;
183
- if (index < this.length) {
184
- character = this.expression.charAt(index);
185
- this._index += 1;
186
- }
187
- return character;
188
- }
189
- createToken(type, value) {
190
- return {
191
- type,
192
- value,
193
- start: this.marker,
194
- end: this._index,
195
- };
196
- }
197
- skipSpaces() {
198
- while (this._index < this.length) {
199
- const character = this.peekNextChar();
200
- if (!isWhiteSpace(character)) {
201
- break;
202
- }
203
- this.getNextChar();
204
- }
139
+ this.marker = this._index;
140
+ const token = this.scanNext();
141
+ if (token !== undefined) {
142
+ return token;
205
143
  }
206
- scanOperator() {
207
- let searchTree = OPERATOR_CHARS;
208
- let value = '';
209
- while (searchTree && searchTree !== true) {
210
- const character = this.peekNextChar();
211
- searchTree = searchTree[character];
212
- if (searchTree) {
213
- value += character;
214
- this.getNextChar();
215
- }
216
- }
217
- if (value === '}') {
218
- this.curlyStack--;
219
- }
220
- if (value === '') {
221
- return undefined;
222
- }
223
- return this.createToken(TokenType.Operator, value);
144
+ throw new SyntaxError(`Unexpected character ${JSON.stringify(this.peekNextChar())} (at ${this.index})`);
145
+ }
146
+ peek() {
147
+ const savedIndex = this._index;
148
+ const savedCurlyStack = this.curlyStack;
149
+ let token;
150
+ try {
151
+ token = this.next();
152
+ } catch {
153
+ token = undefined;
224
154
  }
225
- scanIdentifier() {
226
- let character = this.peekNextChar();
227
- if (!isIdentifierStart(character)) {
228
- return undefined;
229
- }
230
- let id = this.getNextChar();
231
- while (true) {
232
- character = this.peekNextChar();
233
- if (!isIdentifierPart(character)) {
234
- break;
235
- }
236
- id += this.getNextChar();
237
- }
238
- return this.createToken(TokenType.Identifier, id);
155
+ this._index = savedIndex;
156
+ this.curlyStack = savedCurlyStack;
157
+ if (!token) {
158
+ return undefined;
239
159
  }
240
- scanString() {
241
- const quote = this.peekNextChar();
242
- if (quote !== "'" && quote !== '"') {
243
- return undefined;
244
- }
245
- this.getNextChar();
246
- let terminated = false;
247
- let string = '';
248
- while (this._index < this.length) {
249
- const character = this.getNextChar();
250
- if (character === quote) {
251
- terminated = true;
252
- break;
253
- }
254
- if (character === '\\') {
255
- string += backslashEscapeCodeString(this.getNextChar());
256
- }
257
- else {
258
- string += character;
259
- }
260
- }
261
- if (!terminated) {
262
- throw new Error(`Unterminated string literal (at ${this.index})`);
263
- }
264
- return this.createToken(TokenType.String, string);
160
+ return {
161
+ type: token.type,
162
+ value: token.value
163
+ };
164
+ }
165
+ scanNext() {
166
+ let token = this.scanString();
167
+ if (token !== undefined) {
168
+ return token;
265
169
  }
266
- scanTemplate() {
267
- const character = this.peekNextChar();
268
- if (!(character === '`' || (character === '}' && this.curlyStack > 0))) {
269
- return undefined;
270
- }
170
+ token = this.scanTemplate();
171
+ if (token !== undefined) {
172
+ return token;
173
+ }
174
+ token = this.scanNumber();
175
+ if (token !== undefined) {
176
+ return token;
177
+ }
178
+ token = this.scanOperator();
179
+ if (token !== undefined) {
180
+ return token;
181
+ }
182
+ token = this.scanIdentifier();
183
+ if (token !== undefined) {
184
+ return token;
185
+ }
186
+ return undefined;
187
+ }
188
+ peekNextChar(advance = 0) {
189
+ const index = this._index + advance;
190
+ return index < this.length ? this.expression.charAt(index) : '\u0000';
191
+ }
192
+ getNextChar() {
193
+ let character = '\u0000';
194
+ const index = this._index;
195
+ if (index < this.length) {
196
+ character = this.expression.charAt(index);
197
+ this._index += 1;
198
+ }
199
+ return character;
200
+ }
201
+ createToken(type, value) {
202
+ return {
203
+ type,
204
+ value,
205
+ start: this.marker,
206
+ end: this._index
207
+ };
208
+ }
209
+ skipSpaces() {
210
+ while (this._index < this.length) {
211
+ const character = this.peekNextChar();
212
+ if (!isWhiteSpace(character)) {
213
+ break;
214
+ }
215
+ this.getNextChar();
216
+ }
217
+ }
218
+ scanOperator() {
219
+ let searchTree = OPERATOR_CHARS;
220
+ let value = '';
221
+ while (searchTree && searchTree !== true) {
222
+ const character = this.peekNextChar();
223
+ searchTree = searchTree[character];
224
+ if (searchTree) {
225
+ value += character;
271
226
  this.getNextChar();
272
- const head = character === '`';
273
- return this.doScanTemplate(head);
274
- }
275
- backtick() {
276
- return true;
277
- }
278
- doScanTemplate(head) {
279
- let tail = false;
280
- let terminated = false;
281
- let hasSubstitution = false;
282
- let string = '';
283
- while (this._index < this.length) {
284
- const character = this.getNextChar();
285
- if (character === '`' && this.backtick()) {
286
- tail = true;
287
- terminated = true;
288
- break;
289
- }
290
- if (character === '\\') {
291
- string += backslashEscapeCodeString(this.getNextChar());
292
- }
293
- else {
294
- if (character === '$') {
295
- const character2 = this.peekNextChar();
296
- if (character2 === '{') {
297
- this.curlyStack++;
298
- this.getNextChar();
299
- terminated = true;
300
- hasSubstitution = true;
301
- break;
302
- }
303
- }
304
- string += character;
305
- }
306
- }
307
- if (!head) {
308
- this.curlyStack--;
309
- }
310
- if (this.backtick()) {
311
- if (!terminated) {
312
- throw new Error(`Unterminated template literal (at ${this.index})`);
313
- }
314
- }
315
- else if (this._index === this.length) {
316
- tail = true;
317
- }
318
- let type;
319
- if (head && terminated && !hasSubstitution) {
320
- type = TokenType.NoSubstitutionTemplate;
321
- }
322
- else if (head) {
323
- type = TokenType.TemplateHead;
324
- }
325
- else if (tail) {
326
- type = TokenType.TemplateTail;
327
- }
328
- else {
329
- type = TokenType.TemplateMiddle;
330
- }
331
- return this.createToken(type, string);
227
+ }
332
228
  }
333
- scanNumber() {
334
- let character = this.peekNextChar();
335
- if (!isDecimalDigit(character) && character !== '.') {
336
- return undefined;
337
- }
338
- let number = '';
339
- if (character !== '.') {
340
- number = this.getNextChar();
341
- while (true) {
342
- character = this.peekNextChar();
343
- if (!isDecimalDigit(character)) {
344
- break;
345
- }
346
- number += this.getNextChar();
347
- }
348
- }
349
- if (character === '.') {
350
- number += this.getNextChar();
351
- while (true) {
352
- character = this.peekNextChar();
353
- if (!isDecimalDigit(character)) {
354
- break;
355
- }
356
- number += this.getNextChar();
357
- }
358
- }
359
- if (character === 'e' || character === 'E') {
360
- number += this.getNextChar();
361
- character = this.peekNextChar();
362
- if (character === '+' || character === '-' || isDecimalDigit(character)) {
363
- number += this.getNextChar();
364
- while (true) {
365
- character = this.peekNextChar();
366
- if (!isDecimalDigit(character)) {
367
- break;
368
- }
369
- number += this.getNextChar();
370
- }
371
- }
372
- else {
373
- character = `character ${JSON.stringify(character)}`;
374
- if (this._index >= this.length) {
375
- character = '<end>';
376
- }
377
- throw new SyntaxError(`Unexpected ${character} after the exponent sign (at ${this.index})`);
378
- }
229
+ if (value === '}') {
230
+ this.curlyStack--;
231
+ }
232
+ if (value === '') {
233
+ return undefined;
234
+ }
235
+ return this.createToken(TokenType.Operator, value);
236
+ }
237
+ scanIdentifier() {
238
+ let character = this.peekNextChar();
239
+ if (!isIdentifierStart(character)) {
240
+ return undefined;
241
+ }
242
+ let id = this.getNextChar();
243
+ while (true) {
244
+ character = this.peekNextChar();
245
+ if (!isIdentifierPart(character)) {
246
+ break;
247
+ }
248
+ id += this.getNextChar();
249
+ }
250
+ return this.createToken(TokenType.Identifier, id);
251
+ }
252
+ scanString() {
253
+ const quote = this.peekNextChar();
254
+ if (quote !== "'" && quote !== '"') {
255
+ return undefined;
256
+ }
257
+ this.getNextChar();
258
+ let terminated = false;
259
+ let string = '';
260
+ while (this._index < this.length) {
261
+ const character = this.getNextChar();
262
+ if (character === quote) {
263
+ terminated = true;
264
+ break;
265
+ }
266
+ if (character === '\\') {
267
+ string += backslashEscapeCodeString(this.getNextChar());
268
+ } else {
269
+ string += character;
270
+ }
271
+ }
272
+ if (!terminated) {
273
+ throw new Error(`Unterminated string literal (at ${this.index})`);
274
+ }
275
+ return this.createToken(TokenType.String, string);
276
+ }
277
+ scanTemplate() {
278
+ const character = this.peekNextChar();
279
+ if (!(character === '`' || character === '}' && this.curlyStack > 0)) {
280
+ return undefined;
281
+ }
282
+ this.getNextChar();
283
+ const head = character === '`';
284
+ return this.doScanTemplate(head);
285
+ }
286
+ backtick() {
287
+ return true;
288
+ }
289
+ doScanTemplate(head) {
290
+ let tail = false;
291
+ let terminated = false;
292
+ let hasSubstitution = false;
293
+ let string = '';
294
+ while (this._index < this.length) {
295
+ const character = this.getNextChar();
296
+ if (character === '`' && this.backtick()) {
297
+ tail = true;
298
+ terminated = true;
299
+ break;
300
+ }
301
+ if (character === '\\') {
302
+ string += backslashEscapeCodeString(this.getNextChar());
303
+ } else {
304
+ if (character === '$') {
305
+ const character2 = this.peekNextChar();
306
+ if (character2 === '{') {
307
+ this.curlyStack++;
308
+ this.getNextChar();
309
+ terminated = true;
310
+ hasSubstitution = true;
311
+ break;
312
+ }
379
313
  }
380
- if (number === '.') {
381
- throw new SyntaxError(`Expected decimal digits after the dot sign (at ${this.index})`);
314
+ string += character;
315
+ }
316
+ }
317
+ if (!head) {
318
+ this.curlyStack--;
319
+ }
320
+ if (this.backtick()) {
321
+ if (!terminated) {
322
+ throw new Error(`Unterminated template literal (at ${this.index})`);
323
+ }
324
+ } else if (this._index === this.length) {
325
+ tail = true;
326
+ }
327
+ let type;
328
+ if (head && terminated && !hasSubstitution) {
329
+ type = TokenType.NoSubstitutionTemplate;
330
+ } else if (head) {
331
+ type = TokenType.TemplateHead;
332
+ } else if (tail) {
333
+ type = TokenType.TemplateTail;
334
+ } else {
335
+ type = TokenType.TemplateMiddle;
336
+ }
337
+ return this.createToken(type, string);
338
+ }
339
+ scanNumber() {
340
+ let character = this.peekNextChar();
341
+ if (!isDecimalDigit(character) && character !== '.') {
342
+ return undefined;
343
+ }
344
+ let number = '';
345
+ if (character !== '.') {
346
+ number = this.getNextChar();
347
+ while (true) {
348
+ character = this.peekNextChar();
349
+ if (!isDecimalDigit(character)) {
350
+ break;
351
+ }
352
+ number += this.getNextChar();
353
+ }
354
+ }
355
+ if (character === '.') {
356
+ number += this.getNextChar();
357
+ while (true) {
358
+ character = this.peekNextChar();
359
+ if (!isDecimalDigit(character)) {
360
+ break;
361
+ }
362
+ number += this.getNextChar();
363
+ }
364
+ }
365
+ if (character === 'e' || character === 'E') {
366
+ number += this.getNextChar();
367
+ character = this.peekNextChar();
368
+ if (character === '+' || character === '-' || isDecimalDigit(character)) {
369
+ number += this.getNextChar();
370
+ while (true) {
371
+ character = this.peekNextChar();
372
+ if (!isDecimalDigit(character)) {
373
+ break;
374
+ }
375
+ number += this.getNextChar();
376
+ }
377
+ } else {
378
+ character = `character ${JSON.stringify(character)}`;
379
+ if (this._index >= this.length) {
380
+ character = '<end>';
382
381
  }
383
- return this.createToken(TokenType.Number, number);
382
+ throw new SyntaxError(`Unexpected ${character} after the exponent sign (at ${this.index})`);
383
+ }
384
+ }
385
+ if (number === '.') {
386
+ throw new SyntaxError(`Expected decimal digits after the dot sign (at ${this.index})`);
384
387
  }
388
+ return this.createToken(TokenType.Number, number);
389
+ }
385
390
  }
386
391
  /** Scans a template. */
387
392
  class TemplateLexer extends Lexer {
388
- next() {
389
- if (this._index === 0) {
390
- return this.doScanTemplate(true);
391
- }
392
- return super.next();
393
- }
394
- backtick() {
395
- // The root is not surrounded with backticks.
396
- return this.curlyStack !== 0;
393
+ next() {
394
+ if (this._index === 0) {
395
+ return this.doScanTemplate(true);
397
396
  }
397
+ return super.next();
398
+ }
399
+ backtick() {
400
+ // The root is not surrounded with backticks.
401
+ return this.curlyStack !== 0;
402
+ }
398
403
  }
399
404
  function backslashEscapeCodeString(character) {
400
- switch (character) {
401
- case 'n':
402
- return '\n';
403
- case 'r':
404
- return '\r';
405
- case 't':
406
- return '\t';
407
- default:
408
- return character;
409
- }
410
- }export{Lexer,OPERATORS,OPERATOR_CHARS,TemplateLexer,TokenType};
405
+ switch (character) {
406
+ case 'n':
407
+ return '\n';
408
+ case 'r':
409
+ return '\r';
410
+ case 't':
411
+ return '\t';
412
+ default:
413
+ return character;
414
+ }
415
+ }export{Lexer,OPERATORS,OPERATOR_CHARS,TemplateLexer,TokenType};//# sourceMappingURL=lexer.js.map