@bablr/agast-vm-helpers 0.1.0 → 0.1.2
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/lib/builders.js +118 -115
- package/lib/index.js +13 -13
- package/package.json +2 -2
package/lib/builders.js
CHANGED
|
@@ -30,8 +30,8 @@ export const buildGap = () => {
|
|
|
30
30
|
return t.node(l.CSTML, 'Gap', [t.ref`value`], { value: t.s_node(l.CSTML, 'Punctuator', '<//>') });
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
const buildFlags = (flags) => {
|
|
34
|
-
const { token = null, escape = null, trivia = null, expression = null } = flags;
|
|
33
|
+
export const buildFlags = (flags) => {
|
|
34
|
+
const { intrinsic = null, token = null, escape = null, trivia = null, expression = null } = flags;
|
|
35
35
|
|
|
36
36
|
if ((trivia && escape) || (expression && (trivia || escape))) {
|
|
37
37
|
throw new Error('invalid flags');
|
|
@@ -39,16 +39,18 @@ const buildFlags = (flags) => {
|
|
|
39
39
|
|
|
40
40
|
return {
|
|
41
41
|
children: [
|
|
42
|
-
...when(trivia, [t.ref`
|
|
43
|
-
...when(
|
|
44
|
-
...when(
|
|
45
|
-
...when(
|
|
42
|
+
...when(trivia, [t.ref`triviaToken`]),
|
|
43
|
+
...when(intrinsic, [t.ref`intrinsicToken`]),
|
|
44
|
+
...when(token, [t.ref`tokenToken`]),
|
|
45
|
+
...when(escape, [t.ref`escapeToken`]),
|
|
46
|
+
...when(expression, [t.ref`expressionToken`]),
|
|
46
47
|
],
|
|
47
48
|
properties: {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
triviaToken: trivia && t.s_node(l.CSTML, 'Punctuator', '#'),
|
|
50
|
+
intrinsicToken: intrinsic && t.s_node(l.CSTML, 'Punctuator', '~'),
|
|
51
|
+
tokenToken: token && t.s_node(l.CSTML, 'Punctuator', '*'),
|
|
52
|
+
escapeToken: escape && t.s_node(l.CSTML, 'Punctuator', '@'),
|
|
53
|
+
expressionToken: expression && t.s_node(l.CSTML, 'Punctuator', '+'),
|
|
52
54
|
},
|
|
53
55
|
};
|
|
54
56
|
};
|
|
@@ -64,134 +66,102 @@ export const buildFullyQualifiedSpamMatcher = (
|
|
|
64
66
|
intrinsicValue,
|
|
65
67
|
attributes = {},
|
|
66
68
|
) => {
|
|
67
|
-
const attributes_ =
|
|
68
|
-
buildAttribute(key, value),
|
|
69
|
-
);
|
|
69
|
+
const attributes_ = buildAttributes(attributes);
|
|
70
70
|
|
|
71
71
|
const lArr = language ? [...language] : [];
|
|
72
72
|
|
|
73
73
|
let language_ = lArr.length === 0 ? null : lArr;
|
|
74
74
|
|
|
75
|
-
const flags_ = buildFlags(flags);
|
|
76
75
|
return t.node(
|
|
77
76
|
l.Spamex,
|
|
78
77
|
'NodeMatcher',
|
|
79
78
|
[
|
|
80
|
-
t.ref`
|
|
81
|
-
|
|
79
|
+
t.ref`openToken`,
|
|
80
|
+
t.ref`flags`,
|
|
82
81
|
...when(language_, [t.ref`language`, t.ref`languageSeparator`]),
|
|
83
82
|
t.ref`type`,
|
|
84
83
|
...when(intrinsicValue, [t.embedded(buildSpace()), t.ref`intrinsicValue`]),
|
|
85
84
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
86
85
|
...interpolateArrayChildren(attributes, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
87
|
-
t.ref`
|
|
86
|
+
t.ref`closeToken`,
|
|
88
87
|
],
|
|
89
88
|
{
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '<'),
|
|
90
|
+
flags: buildFlags(flags),
|
|
92
91
|
language: buildLanguage(language_),
|
|
93
92
|
languageSeparator: language_ && type && t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
94
93
|
type: buildIdentifier(type),
|
|
95
94
|
intrinsicValue: intrinsicValue && buildString(intrinsicValue),
|
|
96
95
|
attributes: attributes_,
|
|
97
|
-
|
|
96
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
98
97
|
},
|
|
99
98
|
);
|
|
100
99
|
};
|
|
101
100
|
|
|
102
101
|
export const buildNodeOpenTag = (flags, language, type, intrinsicValue = null, attributes = {}) => {
|
|
103
|
-
const attributes_ =
|
|
104
|
-
buildAttribute(key, value),
|
|
105
|
-
);
|
|
102
|
+
const attributes_ = buildAttributes(attributes);
|
|
106
103
|
|
|
107
104
|
let language_ = !language || language.length === 0 ? null : language;
|
|
108
105
|
|
|
109
|
-
const flags_ = buildFlags(flags);
|
|
110
|
-
|
|
111
106
|
return t.node(
|
|
112
107
|
l.CSTML,
|
|
113
108
|
'OpenNodeTag',
|
|
114
109
|
[
|
|
115
|
-
t.ref`
|
|
116
|
-
|
|
110
|
+
t.ref`openToken`,
|
|
111
|
+
t.ref`flags`,
|
|
117
112
|
...when(language_, [t.ref`language`, t.ref`languageSeparator`]),
|
|
118
113
|
t.ref`type`,
|
|
119
114
|
...when(intrinsicValue, [t.embedded(buildSpace()), t.ref`intrinsicValue`]),
|
|
120
115
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
121
116
|
...interpolateArrayChildren(attributes_, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
122
117
|
when(intrinsicValue, [t.embedded(buildSpace), t.ref`selfClosingToken`]),
|
|
123
|
-
t.ref`
|
|
118
|
+
t.ref`closeToken`,
|
|
124
119
|
],
|
|
125
120
|
{
|
|
126
|
-
|
|
127
|
-
|
|
121
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '<'),
|
|
122
|
+
flags: buildFlags(flags),
|
|
128
123
|
language: buildLanguage(language_),
|
|
129
124
|
languageSeparator: language_ && type && t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
130
125
|
type: buildIdentifier(type),
|
|
131
126
|
intrinsicValue: intrinsicValue && buildString(intrinsicValue),
|
|
132
127
|
attributes: attributes_,
|
|
133
128
|
selfClosingToken: intrinsicValue && t.s_node(l.CSTML, 'Punctuator', '/'),
|
|
134
|
-
|
|
129
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
135
130
|
},
|
|
136
131
|
);
|
|
137
132
|
};
|
|
138
133
|
|
|
139
134
|
export const buildDoctypeTag = (attributes) => {
|
|
140
|
-
const attributes_ =
|
|
141
|
-
buildAttribute(key, value),
|
|
142
|
-
);
|
|
135
|
+
const attributes_ = buildAttributes(attributes);
|
|
143
136
|
|
|
144
137
|
return t.node(
|
|
145
138
|
l.CSTML,
|
|
146
139
|
'DoctypeTag',
|
|
147
140
|
[
|
|
148
|
-
t.ref`
|
|
141
|
+
t.ref`openToken`,
|
|
149
142
|
t.ref`version`,
|
|
150
143
|
t.ref`versionSeparator`,
|
|
151
144
|
t.ref`doctype`,
|
|
152
145
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
153
146
|
...interpolateArrayChildren(attributes_, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
154
|
-
t.ref`
|
|
147
|
+
t.ref`closeToken`,
|
|
155
148
|
],
|
|
156
149
|
{
|
|
157
|
-
|
|
150
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '<!'),
|
|
158
151
|
version: t.s_node(l.CSTML, 'PositiveInteger', '0'),
|
|
159
152
|
versionSeparator: t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
160
153
|
doctype: t.s_node(l.CSTML, 'Keyword', 'cstml'),
|
|
161
154
|
attributes: attributes_,
|
|
162
|
-
|
|
163
|
-
},
|
|
164
|
-
);
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
export const buildFragmentFlags = (flags = {}) => {
|
|
168
|
-
const { escape = null, trivia = null } = flags;
|
|
169
|
-
if (!(escape || trivia)) {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return t.node(
|
|
174
|
-
l.CSTML,
|
|
175
|
-
'NodeFlags',
|
|
176
|
-
[...when(trivia, [t.ref`trivia`]), ...when(escape, [t.ref`escape`])],
|
|
177
|
-
{
|
|
178
|
-
trivia: trivia && t.s_node(l.CSTML, 'Punctuator', '#'),
|
|
179
|
-
escape: escape && t.s_node(l.CSTML, 'Punctuator', '@'),
|
|
155
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
180
156
|
},
|
|
181
157
|
);
|
|
182
158
|
};
|
|
183
159
|
|
|
184
|
-
export const buildFragmentOpenTag = (
|
|
185
|
-
return t.node(
|
|
186
|
-
l.CSTML,
|
|
187
|
-
'
|
|
188
|
-
|
|
189
|
-
{
|
|
190
|
-
open: t.s_node(l.CSTML, 'Punctuator', '<'),
|
|
191
|
-
flags: buildFragmentFlags(flags),
|
|
192
|
-
close: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
193
|
-
},
|
|
194
|
-
);
|
|
160
|
+
export const buildFragmentOpenTag = () => {
|
|
161
|
+
return t.node(l.CSTML, 'OpenFragmentTag', [t.ref`openToken`, t.ref`closeToken`], {
|
|
162
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '<'),
|
|
163
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
164
|
+
});
|
|
195
165
|
};
|
|
196
166
|
|
|
197
167
|
export const buildIdentifierPath = (path) => {
|
|
@@ -223,26 +193,26 @@ export const buildNodeCloseTag = (type, language) => {
|
|
|
223
193
|
l.CSTML,
|
|
224
194
|
'CloseNodeTag',
|
|
225
195
|
[
|
|
226
|
-
t.ref`
|
|
196
|
+
t.ref`openToken`,
|
|
227
197
|
...when(language, [t.ref`language`]),
|
|
228
198
|
...when(type && language, [t.ref`languageSeparator`]),
|
|
229
199
|
...when(type, [t.ref`type`]),
|
|
230
|
-
t.ref`
|
|
200
|
+
t.ref`closeToken`,
|
|
231
201
|
],
|
|
232
202
|
{
|
|
233
|
-
|
|
203
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '</'),
|
|
234
204
|
language: buildLanguage(language),
|
|
235
205
|
languageSeparator: language && type ? t.s_node(l.CSTML, 'Punctuator', ':') : null,
|
|
236
206
|
type: type && buildIdentifier(type),
|
|
237
|
-
|
|
207
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
238
208
|
},
|
|
239
209
|
);
|
|
240
210
|
};
|
|
241
211
|
|
|
242
212
|
export const buildFragmentCloseTag = () => {
|
|
243
|
-
return t.node(l.CSTML, 'CloseFragmentTag', [t.ref`
|
|
244
|
-
|
|
245
|
-
|
|
213
|
+
return t.node(l.CSTML, 'CloseFragmentTag', [t.ref`openToken`, t.ref`closeToken`], {
|
|
214
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '</'),
|
|
215
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
246
216
|
});
|
|
247
217
|
};
|
|
248
218
|
|
|
@@ -261,7 +231,11 @@ export const buildSpace = () => {
|
|
|
261
231
|
};
|
|
262
232
|
|
|
263
233
|
export const buildIdentifier = (name) => {
|
|
264
|
-
return t.
|
|
234
|
+
return t.s_node(l.Instruction, 'Identifier', name);
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
export const buildKeyword = (name) => {
|
|
238
|
+
return t.s_node(l.Instruction, 'Identifier', name);
|
|
265
239
|
};
|
|
266
240
|
|
|
267
241
|
export const buildCall = (verb, ...args) => {
|
|
@@ -295,8 +269,8 @@ export const buildDigit = (value) => {
|
|
|
295
269
|
return t.s_node(l.CSTML, 'Digit', value);
|
|
296
270
|
};
|
|
297
271
|
|
|
298
|
-
export const buildInteger = (value) => {
|
|
299
|
-
const digits = value.toString(
|
|
272
|
+
export const buildInteger = (value, base = 10) => {
|
|
273
|
+
const digits = value.toString(base).split('');
|
|
300
274
|
|
|
301
275
|
return t.node(
|
|
302
276
|
l.CSTML,
|
|
@@ -330,21 +304,23 @@ export const buildNumber = (value) => {
|
|
|
330
304
|
}
|
|
331
305
|
};
|
|
332
306
|
|
|
307
|
+
const buildLiteralTerminal = (lit) => freeze({ type: 'Literal', value: lit });
|
|
308
|
+
|
|
333
309
|
export const buildString = (value) => {
|
|
334
310
|
const pieces = isArray(value) ? value : [value];
|
|
335
311
|
const terminals = [];
|
|
336
312
|
let lit = '';
|
|
337
313
|
|
|
338
314
|
if (pieces.length === 1 && pieces[0] === "'") {
|
|
339
|
-
return t.node(l.CSTML, 'String', [t.ref`
|
|
340
|
-
|
|
315
|
+
return t.node(l.CSTML, 'String', [t.ref`openToken`, t.ref`content`, t.ref`closeToken`], {
|
|
316
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '"'),
|
|
341
317
|
content: interpolateString(
|
|
342
318
|
freeze({
|
|
343
319
|
type: 'Literal',
|
|
344
320
|
value,
|
|
345
321
|
}),
|
|
346
322
|
),
|
|
347
|
-
|
|
323
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '"'),
|
|
348
324
|
});
|
|
349
325
|
}
|
|
350
326
|
|
|
@@ -359,22 +335,45 @@ export const buildString = (value) => {
|
|
|
359
335
|
chr === '\n' ||
|
|
360
336
|
chr === '\r' ||
|
|
361
337
|
chr === '\t' ||
|
|
362
|
-
chr === '\0'
|
|
338
|
+
chr === '\0' ||
|
|
339
|
+
chr.charCodeAt(0) < 32
|
|
363
340
|
) {
|
|
364
341
|
if (lit) {
|
|
365
|
-
terminals.push(
|
|
342
|
+
terminals.push(buildLiteralTerminal(lit));
|
|
366
343
|
lit = '';
|
|
367
344
|
}
|
|
368
345
|
|
|
346
|
+
let value;
|
|
347
|
+
|
|
348
|
+
if (escapables[chr]) {
|
|
349
|
+
value = t.node(l.CSTML, 'EscapeCode', [t.ref`sigilToken`], {
|
|
350
|
+
sigilToken: buildKeyword(escapables[chr]),
|
|
351
|
+
digits: null,
|
|
352
|
+
});
|
|
353
|
+
} else if (chr.charCodeAt(0) < 32) {
|
|
354
|
+
const hexDigits = chr.charCodeAt(0).toString(16).padStart(4, '0');
|
|
355
|
+
value = t.node(
|
|
356
|
+
l.CSTML,
|
|
357
|
+
'EscapeCode',
|
|
358
|
+
[t.ref`sigilToken`, ...[...hexDigits].map((d) => t.ref`digits[]`)],
|
|
359
|
+
{
|
|
360
|
+
sigilToken: buildKeyword('u'),
|
|
361
|
+
digits: [...hexDigits].map((digit) => buildDigit(digit)),
|
|
362
|
+
},
|
|
363
|
+
);
|
|
364
|
+
} else {
|
|
365
|
+
value = buildKeyword(chr);
|
|
366
|
+
}
|
|
367
|
+
|
|
369
368
|
terminals.push(
|
|
370
369
|
t.buildEmbedded(
|
|
371
370
|
t.e_node(
|
|
372
371
|
l.CSTML,
|
|
373
|
-
'
|
|
374
|
-
[t.ref`escape`, t.ref`
|
|
372
|
+
'EscapeSequence',
|
|
373
|
+
[t.ref`escape`, t.ref`value`],
|
|
375
374
|
{
|
|
376
375
|
escape: t.s_node(l.CSTML, 'Punctuator', '\\'),
|
|
377
|
-
|
|
376
|
+
value,
|
|
378
377
|
},
|
|
379
378
|
{ cooked: chr },
|
|
380
379
|
),
|
|
@@ -385,11 +384,11 @@ export const buildString = (value) => {
|
|
|
385
384
|
}
|
|
386
385
|
}
|
|
387
386
|
} else {
|
|
388
|
-
terminals.push(
|
|
387
|
+
terminals.push(buildLiteralTerminal(lit));
|
|
389
388
|
lit = '';
|
|
390
389
|
|
|
391
390
|
if (piece == null) {
|
|
392
|
-
throw new Error('not
|
|
391
|
+
throw new Error('not implemented');
|
|
393
392
|
} else if (isString(piece.type)) {
|
|
394
393
|
terminals.push(piece);
|
|
395
394
|
} else {
|
|
@@ -398,25 +397,25 @@ export const buildString = (value) => {
|
|
|
398
397
|
}
|
|
399
398
|
}
|
|
400
399
|
|
|
401
|
-
if (lit) terminals.push(
|
|
400
|
+
if (lit) terminals.push(buildLiteralTerminal(lit));
|
|
402
401
|
lit = '';
|
|
403
402
|
|
|
404
|
-
return t.node(l.CSTML, 'String', [t.ref`
|
|
405
|
-
|
|
403
|
+
return t.node(l.CSTML, 'String', [t.ref`openToken`, t.ref`content`, t.ref`closeToken`], {
|
|
404
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', "'"),
|
|
406
405
|
content: interpolateString(terminals),
|
|
407
|
-
|
|
406
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', "'"),
|
|
408
407
|
});
|
|
409
408
|
};
|
|
410
409
|
|
|
411
410
|
export const buildBoolean = (value) => {
|
|
412
|
-
return t.node(l.Instruction, 'Boolean', [t.ref`
|
|
413
|
-
|
|
411
|
+
return t.node(l.Instruction, 'Boolean', [t.ref`sigilToken`], {
|
|
412
|
+
sigilToken: t.s_node(l.Instruction, 'Keyword', value ? 'true' : 'false'),
|
|
414
413
|
});
|
|
415
414
|
};
|
|
416
415
|
|
|
417
416
|
export const buildNull = () => {
|
|
418
|
-
return t.node(l.Instruction, 'Null', [t.ref`
|
|
419
|
-
|
|
417
|
+
return t.node(l.Instruction, 'Null', [t.ref`sigilToken`], {
|
|
418
|
+
sigilToken: t.s_node(l.Instruction, 'Keyword', 'null'),
|
|
420
419
|
});
|
|
421
420
|
};
|
|
422
421
|
|
|
@@ -425,7 +424,7 @@ export const buildArray = (elements) => {
|
|
|
425
424
|
l.Instruction,
|
|
426
425
|
'Array',
|
|
427
426
|
[
|
|
428
|
-
t.ref`
|
|
427
|
+
t.ref`openToken`,
|
|
429
428
|
...interpolateArrayChildren(
|
|
430
429
|
elements,
|
|
431
430
|
t.ref`elements[]`,
|
|
@@ -433,12 +432,12 @@ export const buildArray = (elements) => {
|
|
|
433
432
|
t.t_node(l.Comment, null, [t.embedded(t.t_node('Space', 'Space', [t.lit(' ')]))]),
|
|
434
433
|
),
|
|
435
434
|
),
|
|
436
|
-
t.ref`
|
|
435
|
+
t.ref`closeToken`,
|
|
437
436
|
],
|
|
438
437
|
{
|
|
439
|
-
|
|
438
|
+
openToken: t.s_node(l.Instruction, 'Punctuator', '['),
|
|
440
439
|
elements: [...interpolateArray(elements)],
|
|
441
|
-
|
|
440
|
+
closeToken: t.s_node(l.Instruction, 'Punctuator', ']'),
|
|
442
441
|
},
|
|
443
442
|
);
|
|
444
443
|
};
|
|
@@ -448,7 +447,7 @@ export const buildTuple = (values) => {
|
|
|
448
447
|
l.Instruction,
|
|
449
448
|
'Tuple',
|
|
450
449
|
[
|
|
451
|
-
t.ref`
|
|
450
|
+
t.ref`openToken`,
|
|
452
451
|
...interpolateArrayChildren(
|
|
453
452
|
values,
|
|
454
453
|
t.ref`values[]`,
|
|
@@ -456,12 +455,12 @@ export const buildTuple = (values) => {
|
|
|
456
455
|
t.t_node(l.Comment, null, [t.embedded(t.t_node('Space', 'Space', [t.lit(' ')]))]),
|
|
457
456
|
),
|
|
458
457
|
),
|
|
459
|
-
t.ref`
|
|
458
|
+
t.ref`closeToken`,
|
|
460
459
|
],
|
|
461
460
|
{
|
|
462
|
-
|
|
461
|
+
openToken: t.s_node(l.Instruction, 'Punctuator', '('),
|
|
463
462
|
values: [...interpolateArray(values)],
|
|
464
|
-
|
|
463
|
+
closeToken: t.s_node(l.Instruction, 'Punctuator', ')'),
|
|
465
464
|
},
|
|
466
465
|
);
|
|
467
466
|
};
|
|
@@ -471,7 +470,7 @@ export const buildObject = (properties) => {
|
|
|
471
470
|
l.Instruction,
|
|
472
471
|
'Object',
|
|
473
472
|
[
|
|
474
|
-
t.ref`
|
|
473
|
+
t.ref`openToken`,
|
|
475
474
|
...interpolateArrayChildren(
|
|
476
475
|
Object.entries(properties).map(([key, value]) => buildProperty(key, value)),
|
|
477
476
|
t.ref`properties[]`,
|
|
@@ -479,16 +478,16 @@ export const buildObject = (properties) => {
|
|
|
479
478
|
t.t_node(l.Comment, null, [t.embedded(t.t_node('Space', 'Space', [t.lit(' ')]))]),
|
|
480
479
|
),
|
|
481
480
|
),
|
|
482
|
-
t.ref`
|
|
481
|
+
t.ref`closeToken`,
|
|
483
482
|
],
|
|
484
483
|
{
|
|
485
|
-
|
|
484
|
+
openToken: t.s_node(l.Instruction, 'Punctuator', '{'),
|
|
486
485
|
properties: [
|
|
487
486
|
...interpolateArray(
|
|
488
487
|
Object.entries(properties).map(([key, value]) => buildProperty(key, value)),
|
|
489
488
|
),
|
|
490
489
|
],
|
|
491
|
-
|
|
490
|
+
closeToken: t.s_node(l.Instruction, 'Punctuator', '}'),
|
|
492
491
|
},
|
|
493
492
|
{},
|
|
494
493
|
);
|
|
@@ -503,8 +502,8 @@ export const buildMappingAttribute = (key, value) => {
|
|
|
503
502
|
};
|
|
504
503
|
|
|
505
504
|
export const buildBooleanAttribute = (key, value) => {
|
|
506
|
-
return t.node(l.CSTML, 'BooleanAttribute', [...when(!value, [t.ref`
|
|
507
|
-
|
|
505
|
+
return t.node(l.CSTML, 'BooleanAttribute', [...when(!value, [t.ref`negateToken`]), t.ref`key`], {
|
|
506
|
+
negateToken: !value ? t.s_node(l.CSTML, 'Puncutator', '!') : null,
|
|
508
507
|
key: buildIdentifier(key),
|
|
509
508
|
});
|
|
510
509
|
};
|
|
@@ -521,6 +520,8 @@ export const buildExpression = (expr) => {
|
|
|
521
520
|
return buildBoolean(expr);
|
|
522
521
|
case 'string':
|
|
523
522
|
return buildString(expr);
|
|
523
|
+
case 'number':
|
|
524
|
+
return buildInteger(expr);
|
|
524
525
|
case 'object': {
|
|
525
526
|
switch (getPrototypeOf(expr)) {
|
|
526
527
|
case Array.prototype:
|
|
@@ -539,10 +540,12 @@ export const buildExpression = (expr) => {
|
|
|
539
540
|
}
|
|
540
541
|
};
|
|
541
542
|
|
|
543
|
+
export const buildAttributes = (attributes = {}) => {
|
|
544
|
+
return Object.entries(attributes).map(({ 0: key, 1: value }) => buildAttribute(key, value));
|
|
545
|
+
};
|
|
546
|
+
|
|
542
547
|
export const buildNodeMatcher = (flags, language, type, attributes = {}) => {
|
|
543
|
-
const attributes_ =
|
|
544
|
-
buildAttribute(key, value),
|
|
545
|
-
);
|
|
548
|
+
const attributes_ = buildAttributes(attributes);
|
|
546
549
|
|
|
547
550
|
let language_ = !language || language.length === 0 ? null : language;
|
|
548
551
|
|
|
@@ -552,22 +555,22 @@ export const buildNodeMatcher = (flags, language, type, attributes = {}) => {
|
|
|
552
555
|
l.Spamex,
|
|
553
556
|
'NodeMatcher',
|
|
554
557
|
[
|
|
555
|
-
t.ref`
|
|
558
|
+
t.ref`openToken`,
|
|
556
559
|
...when(flags_, [t.ref`flags`]),
|
|
557
560
|
...when(language_, [t.ref`language`, t.ref`languageSeparator`]),
|
|
558
561
|
t.ref`type`,
|
|
559
562
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
560
563
|
...interpolateArrayChildren(attributes_, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
561
|
-
t.ref`
|
|
564
|
+
t.ref`closeToken`,
|
|
562
565
|
],
|
|
563
566
|
{
|
|
564
|
-
|
|
567
|
+
openToken: t.s_node(l.CSTML, 'Punctuator', '<'),
|
|
565
568
|
language: buildLanguage(language_),
|
|
566
569
|
languageSeparator: language_ && type && t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
567
570
|
flags: flags_,
|
|
568
571
|
type: buildIdentifier(type),
|
|
569
572
|
attributes: attributes_,
|
|
570
|
-
|
|
573
|
+
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
571
574
|
},
|
|
572
575
|
);
|
|
573
576
|
};
|
package/lib/index.js
CHANGED
|
@@ -27,15 +27,15 @@ export const shouldBranch = (effects) => {
|
|
|
27
27
|
return effects ? effects.success === 'none' || effects.failure === 'none' : false;
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
const reifyFlags = (
|
|
31
|
-
let {
|
|
30
|
+
const reifyFlags = (flags) => {
|
|
31
|
+
let { triviaToken, escapeToken, tokenToken, expressionToken, intrinsicToken } = flags.properties;
|
|
32
32
|
|
|
33
33
|
return {
|
|
34
|
-
token: !!
|
|
35
|
-
escape: !!
|
|
36
|
-
trivia: !!
|
|
37
|
-
intrinsic: !!
|
|
38
|
-
expression: !!
|
|
34
|
+
token: !!tokenToken,
|
|
35
|
+
escape: !!escapeToken,
|
|
36
|
+
trivia: !!triviaToken,
|
|
37
|
+
intrinsic: !!intrinsicToken,
|
|
38
|
+
expression: !!expressionToken,
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
41
|
|
|
@@ -95,9 +95,9 @@ export const reifyExpression = (node) => {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
case 'OpenNodeTag': {
|
|
98
|
-
let { language, type, attributes, intrinsicValue } = node.properties;
|
|
98
|
+
let { flags, language, type, attributes, intrinsicValue } = node.properties;
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
flags = reifyFlags(flags);
|
|
101
101
|
language = reifyLanguage(language);
|
|
102
102
|
type = reifyExpression(type);
|
|
103
103
|
attributes = reifyAttributes(attributes);
|
|
@@ -150,9 +150,9 @@ export const reifyExpression = (node) => {
|
|
|
150
150
|
|
|
151
151
|
switch (node.type) {
|
|
152
152
|
case 'NodeMatcher':
|
|
153
|
-
let { language, type, attributes, intrinsicValue } = node.properties;
|
|
153
|
+
let { flags, language, type, attributes, intrinsicValue } = node.properties;
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
flags = reifyFlags(flags);
|
|
156
156
|
language = reifyExpression(language);
|
|
157
157
|
type = reifyExpression(type);
|
|
158
158
|
attributes = reifyAttributes(attributes);
|
|
@@ -194,7 +194,7 @@ export const reifyExpression = (node) => {
|
|
|
194
194
|
|
|
195
195
|
case 'Boolean': {
|
|
196
196
|
// prettier-ignore
|
|
197
|
-
switch (getCooked(node.properties.
|
|
197
|
+
switch (getCooked(node.properties.sigilToken)) {
|
|
198
198
|
case 'true': return true;
|
|
199
199
|
case 'false': return false;
|
|
200
200
|
default: throw new Error();
|
|
@@ -249,7 +249,7 @@ export const reifyAttributes = (attributes) => {
|
|
|
249
249
|
if (attr.type === 'MappingAttribute') {
|
|
250
250
|
return [reifyExpression(attr.properties.key), reifyExpression(attr.properties.value)];
|
|
251
251
|
} else if (attr.type === 'BooleanAttribute') {
|
|
252
|
-
return [reifyExpression(attr.properties.key), !attr.properties.
|
|
252
|
+
return [reifyExpression(attr.properties.key), !attr.properties.negateToken];
|
|
253
253
|
} else {
|
|
254
254
|
throw new Error();
|
|
255
255
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bablr/agast-vm-helpers",
|
|
3
3
|
"description": "Helper functions for working with the BABLR VM",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"author": "Conrad Buck<conartist6@gmail.com>",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"files": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"sideEffects": false,
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@bablr/agast-helpers": "0.1.
|
|
18
|
+
"@bablr/agast-helpers": "0.1.5"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@bablr/eslint-config-base": "github:bablr-lang/eslint-config-base#49f5952efed27f94ee9b94340eb1563c440bf64e",
|