@bablr/agast-vm-helpers 0.1.2 → 0.1.4
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/README.md +10 -1
- package/lib/builders.js +32 -26
- package/lib/index.js +6 -11
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
# @bablr/agast-vm-helpers
|
|
2
2
|
|
|
3
|
-
Helper functions for working with the agAST VM
|
|
3
|
+
Helper functions for working with the agAST VM.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
|
|
8
|
+
```js
|
|
9
|
+
import { buildExpression, reifyExression } from 'agast-vm-helpers';
|
|
10
|
+
|
|
11
|
+
reifyExpression(buildExpression());
|
|
12
|
+
```
|
package/lib/builders.js
CHANGED
|
@@ -20,17 +20,31 @@ function* repeat(times, ...values) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export const buildReference = (name, isArray) => {
|
|
23
|
-
return t.node(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
return t.node(
|
|
24
|
+
l.CSTML,
|
|
25
|
+
'Reference',
|
|
26
|
+
[t.ref`name`, ...when(isArray, [t.ref`arrayOperatorToken`]), t.ref`sigilToken`],
|
|
27
|
+
{
|
|
28
|
+
name: buildIdentifier(name),
|
|
29
|
+
arrayOperatorToken: isArray ? t.s_node(l.CSTML, 'Punctuator', '[]') : null,
|
|
30
|
+
sigilToken: t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
31
|
+
},
|
|
32
|
+
);
|
|
27
33
|
};
|
|
28
34
|
|
|
29
35
|
export const buildGap = () => {
|
|
30
|
-
return t.node(l.CSTML, 'Gap', [t.ref`
|
|
36
|
+
return t.node(l.CSTML, 'Gap', [t.ref`sigilToken`], {
|
|
37
|
+
sigilToken: t.s_node(l.CSTML, 'Punctuator', '<//>'),
|
|
38
|
+
});
|
|
31
39
|
};
|
|
32
40
|
|
|
33
|
-
export const
|
|
41
|
+
export const buildShift = () => {
|
|
42
|
+
return t.node(l.CSTML, 'Shift', [t.ref`sigilToken`], {
|
|
43
|
+
sigilToken: t.s_node(l.CSTML, 'Punctuator', '^^^'),
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const buildFlags = (flags = {}) => {
|
|
34
48
|
const { intrinsic = null, token = null, escape = null, trivia = null, expression = null } = flags;
|
|
35
49
|
|
|
36
50
|
if ((trivia && escape) || (expression && (trivia || escape))) {
|
|
@@ -55,7 +69,7 @@ export const buildFlags = (flags) => {
|
|
|
55
69
|
};
|
|
56
70
|
};
|
|
57
71
|
|
|
58
|
-
export const buildSpamMatcher = (type, value, attributes = {}) => {
|
|
72
|
+
export const buildSpamMatcher = (type = null, value = null, attributes = {}) => {
|
|
59
73
|
return buildFullyQualifiedSpamMatcher({}, null, type, value, attributes);
|
|
60
74
|
};
|
|
61
75
|
|
|
@@ -79,7 +93,7 @@ export const buildFullyQualifiedSpamMatcher = (
|
|
|
79
93
|
t.ref`openToken`,
|
|
80
94
|
t.ref`flags`,
|
|
81
95
|
...when(language_, [t.ref`language`, t.ref`languageSeparator`]),
|
|
82
|
-
t.ref`type
|
|
96
|
+
...when(type, [t.ref`type`]),
|
|
83
97
|
...when(intrinsicValue, [t.embedded(buildSpace()), t.ref`intrinsicValue`]),
|
|
84
98
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
85
99
|
...interpolateArrayChildren(attributes, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
@@ -90,7 +104,7 @@ export const buildFullyQualifiedSpamMatcher = (
|
|
|
90
104
|
flags: buildFlags(flags),
|
|
91
105
|
language: buildLanguage(language_),
|
|
92
106
|
languageSeparator: language_ && type && t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
93
|
-
type: buildIdentifier(type),
|
|
107
|
+
type: type && buildIdentifier(type),
|
|
94
108
|
intrinsicValue: intrinsicValue && buildString(intrinsicValue),
|
|
95
109
|
attributes: attributes_,
|
|
96
110
|
closeToken: t.s_node(l.CSTML, 'Punctuator', '>'),
|
|
@@ -98,7 +112,13 @@ export const buildFullyQualifiedSpamMatcher = (
|
|
|
98
112
|
);
|
|
99
113
|
};
|
|
100
114
|
|
|
101
|
-
export const buildNodeOpenTag = (
|
|
115
|
+
export const buildNodeOpenTag = (
|
|
116
|
+
flags,
|
|
117
|
+
language,
|
|
118
|
+
type = null,
|
|
119
|
+
intrinsicValue = null,
|
|
120
|
+
attributes = {},
|
|
121
|
+
) => {
|
|
102
122
|
const attributes_ = buildAttributes(attributes);
|
|
103
123
|
|
|
104
124
|
let language_ = !language || language.length === 0 ? null : language;
|
|
@@ -110,7 +130,7 @@ export const buildNodeOpenTag = (flags, language, type, intrinsicValue = null, a
|
|
|
110
130
|
t.ref`openToken`,
|
|
111
131
|
t.ref`flags`,
|
|
112
132
|
...when(language_, [t.ref`language`, t.ref`languageSeparator`]),
|
|
113
|
-
t.ref`type
|
|
133
|
+
...when(type, [t.ref`type`]),
|
|
114
134
|
...when(intrinsicValue, [t.embedded(buildSpace()), t.ref`intrinsicValue`]),
|
|
115
135
|
...when(attributes_.length, [t.embedded(buildSpace())]),
|
|
116
136
|
...interpolateArrayChildren(attributes_, t.ref`attributes[]`, t.embedded(buildSpace())),
|
|
@@ -122,7 +142,7 @@ export const buildNodeOpenTag = (flags, language, type, intrinsicValue = null, a
|
|
|
122
142
|
flags: buildFlags(flags),
|
|
123
143
|
language: buildLanguage(language_),
|
|
124
144
|
languageSeparator: language_ && type && t.s_node(l.CSTML, 'Punctuator', ':'),
|
|
125
|
-
type: buildIdentifier(type),
|
|
145
|
+
type: type && buildIdentifier(type),
|
|
126
146
|
intrinsicValue: intrinsicValue && buildString(intrinsicValue),
|
|
127
147
|
attributes: attributes_,
|
|
128
148
|
selfClosingToken: intrinsicValue && t.s_node(l.CSTML, 'Punctuator', '/'),
|
|
@@ -157,13 +177,6 @@ export const buildDoctypeTag = (attributes) => {
|
|
|
157
177
|
);
|
|
158
178
|
};
|
|
159
179
|
|
|
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
|
-
});
|
|
165
|
-
};
|
|
166
|
-
|
|
167
180
|
export const buildIdentifierPath = (path) => {
|
|
168
181
|
const path_ = [...path];
|
|
169
182
|
const segments = path_.map((name) => buildIdentifier(name));
|
|
@@ -209,13 +222,6 @@ export const buildNodeCloseTag = (type, language) => {
|
|
|
209
222
|
);
|
|
210
223
|
};
|
|
211
224
|
|
|
212
|
-
export const buildFragmentCloseTag = () => {
|
|
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', '>'),
|
|
216
|
-
});
|
|
217
|
-
};
|
|
218
|
-
|
|
219
225
|
export const buildLiteral = (value) => {
|
|
220
226
|
return t.node(l.CSTML, 'Literal', [t.ref`value`], { value });
|
|
221
227
|
};
|
package/lib/index.js
CHANGED
|
@@ -16,7 +16,7 @@ export const effectsFor = (verb) => {
|
|
|
16
16
|
return { success: 'none', failure: 'none' };
|
|
17
17
|
|
|
18
18
|
case 'guard':
|
|
19
|
-
return { success: '
|
|
19
|
+
return { success: 'fail', failure: 'none' };
|
|
20
20
|
|
|
21
21
|
default:
|
|
22
22
|
throw new Error('invalid match verb');
|
|
@@ -69,11 +69,11 @@ export const reifyExpression = (node) => {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
case 'Reference': {
|
|
72
|
-
let { name,
|
|
72
|
+
let { name, arrayOperatorToken } = node.properties;
|
|
73
73
|
|
|
74
74
|
name = reifyExpression(name);
|
|
75
75
|
|
|
76
|
-
return { type: 'Reference', value: { name, isArray: !!
|
|
76
|
+
return { type: 'Reference', value: { name, isArray: !!arrayOperatorToken } };
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
case 'Literal': {
|
|
@@ -82,14 +82,6 @@ export const reifyExpression = (node) => {
|
|
|
82
82
|
return { type: 'Literal', value: getCooked(value.properties.content) };
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
case 'OpenFragmentTag': {
|
|
86
|
-
return { type: 'OpenFragmentTag', value: undefined };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
case 'CloseFragmentTag': {
|
|
90
|
-
return { type: 'CloseFragmentTag', value: {} };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
85
|
case 'IdentifierPath': {
|
|
94
86
|
return node.properties.segments.map((segment) => reifyExpression(segment));
|
|
95
87
|
}
|
|
@@ -133,6 +125,9 @@ export const reifyExpression = (node) => {
|
|
|
133
125
|
case 'Gap':
|
|
134
126
|
return { type: 'Gap', value: undefined };
|
|
135
127
|
|
|
128
|
+
case 'Shift':
|
|
129
|
+
return { type: 'Shift', value: undefined };
|
|
130
|
+
|
|
136
131
|
default:
|
|
137
132
|
throw new Error();
|
|
138
133
|
}
|
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.4",
|
|
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.6"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@bablr/eslint-config-base": "github:bablr-lang/eslint-config-base#49f5952efed27f94ee9b94340eb1563c440bf64e",
|