@weborigami/language 0.0.53 → 0.0.55
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weborigami/language",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"description": "Web Origami expression language compiler and runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./main.js",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"typescript": "5.4.5"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@weborigami/async-tree": "0.0.
|
|
15
|
-
"@weborigami/types": "0.0.
|
|
14
|
+
"@weborigami/async-tree": "0.0.55",
|
|
15
|
+
"@weborigami/types": "0.0.55",
|
|
16
16
|
"watcher": "2.3.1"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
@@ -155,6 +155,10 @@ identifierChar
|
|
|
155
155
|
identifierList
|
|
156
156
|
= @identifier|1.., separator| separator?
|
|
157
157
|
|
|
158
|
+
identifierOrString
|
|
159
|
+
= identifier
|
|
160
|
+
/ string
|
|
161
|
+
|
|
158
162
|
implicitParensArgs "arguments with implicit parentheses"
|
|
159
163
|
= inlineSpace+ @list
|
|
160
164
|
|
|
@@ -210,13 +214,13 @@ objectEntries
|
|
|
210
214
|
objectEntry
|
|
211
215
|
= spread
|
|
212
216
|
/ objectProperty
|
|
213
|
-
/ key:
|
|
217
|
+
/ key:identifierOrString {
|
|
214
218
|
return annotate([key, [ops.scope, key]], location());
|
|
215
219
|
}
|
|
216
220
|
|
|
217
221
|
// A single object property with key and value: `x: 1`
|
|
218
222
|
objectProperty "object property"
|
|
219
|
-
= @
|
|
223
|
+
= @identifierOrString __ ":" __ @expr
|
|
220
224
|
|
|
221
225
|
parameterizedLambda
|
|
222
226
|
= "(" __ parameters:identifierList? __ ")" __ doubleArrow __ expr:expr {
|
|
@@ -373,7 +377,7 @@ tree "tree literal"
|
|
|
373
377
|
|
|
374
378
|
// A tree assignment statement: `foo = 1`
|
|
375
379
|
treeAssignment "tree assignment"
|
|
376
|
-
= @
|
|
380
|
+
= @identifierOrString __ "=" __ @expr
|
|
377
381
|
|
|
378
382
|
// A separated list of assignments or shorthands
|
|
379
383
|
treeEntries
|
|
@@ -382,7 +386,7 @@ treeEntries
|
|
|
382
386
|
treeEntry
|
|
383
387
|
= spread
|
|
384
388
|
/ treeAssignment
|
|
385
|
-
/ key:
|
|
389
|
+
/ key:identifierOrString {
|
|
386
390
|
return annotate([key, [ops.inherited, key]], location());
|
|
387
391
|
}
|
|
388
392
|
|
package/src/compiler/parse.js
CHANGED
|
@@ -193,7 +193,7 @@ function peg$parse(input, options) {
|
|
|
193
193
|
var peg$FAILED = {};
|
|
194
194
|
var peg$source = options.grammarSource;
|
|
195
195
|
|
|
196
|
-
var peg$startRuleFunctions = { __: peg$parse__, absoluteFilePath: peg$parseabsoluteFilePath, args: peg$parseargs, array: peg$parsearray, arrayEntries: peg$parsearrayEntries, arrayEntry: peg$parsearrayEntry, callTarget: peg$parsecallTarget, closingBrace: peg$parseclosingBrace, closingBracket: peg$parseclosingBracket, closingParen: peg$parseclosingParen, comment: peg$parsecomment, digits: peg$parsedigits, doubleArrow: peg$parsedoubleArrow, doubleQuoteString: peg$parsedoubleQuoteString, doubleQuoteStringChar: peg$parsedoubleQuoteStringChar, ellipsis: peg$parseellipsis, escapedChar: peg$parseescapedChar, expr: peg$parseexpr, expression: peg$parseexpression, float: peg$parsefloat, functionComposition: peg$parsefunctionComposition, group: peg$parsegroup, host: peg$parsehost, identifier: peg$parseidentifier, identifierChar: peg$parseidentifierChar, identifierList: peg$parseidentifierList, implicitParensArgs: peg$parseimplicitParensArgs, inlineSpace: peg$parseinlineSpace, integer: peg$parseinteger, lambda: peg$parselambda, leadingSlashPath: peg$parseleadingSlashPath, list: peg$parselist, multiLineComment: peg$parsemultiLineComment, newLine: peg$parsenewLine, number: peg$parsenumber, object: peg$parseobject, objectEntries: peg$parseobjectEntries, objectEntry: peg$parseobjectEntry, objectProperty: peg$parseobjectProperty, parameterizedLambda: peg$parseparameterizedLambda, parensArgs: peg$parseparensArgs, pipeline: peg$parsepipeline, path: peg$parsepath, pathKey: peg$parsepathKey, protocolCall: peg$parseprotocolCall, protocol: peg$parseprotocol, reservedProtocol: peg$parsereservedProtocol, scopeReference: peg$parsescopeReference, separator: peg$parseseparator, shebang: peg$parseshebang, sign: peg$parsesign, singleArrow: peg$parsesingleArrow, singleLineComment: peg$parsesingleLineComment, singleQuoteString: peg$parsesingleQuoteString, singleQuoteStringChar: peg$parsesingleQuoteStringChar, spread: peg$parsespread, step: peg$parsestep, start: peg$parsestart, string: peg$parsestring, templateDocument: peg$parsetemplateDocument, templateDocumentChar: peg$parsetemplateDocumentChar, templateDocumentContents: peg$parsetemplateDocumentContents, templateDocumentText: peg$parsetemplateDocumentText, templateLiteral: peg$parsetemplateLiteral, templateLiteralChar: peg$parsetemplateLiteralChar, templateLiteralContents: peg$parsetemplateLiteralContents, templateLiteralText: peg$parsetemplateLiteralText, templateSubstitution: peg$parsetemplateSubstitution, textChar: peg$parsetextChar, tree: peg$parsetree, treeAssignment: peg$parsetreeAssignment, treeEntries: peg$parsetreeEntries, treeEntry: peg$parsetreeEntry, whitespaceWithNewLine: peg$parsewhitespaceWithNewLine };
|
|
196
|
+
var peg$startRuleFunctions = { __: peg$parse__, absoluteFilePath: peg$parseabsoluteFilePath, args: peg$parseargs, array: peg$parsearray, arrayEntries: peg$parsearrayEntries, arrayEntry: peg$parsearrayEntry, callTarget: peg$parsecallTarget, closingBrace: peg$parseclosingBrace, closingBracket: peg$parseclosingBracket, closingParen: peg$parseclosingParen, comment: peg$parsecomment, digits: peg$parsedigits, doubleArrow: peg$parsedoubleArrow, doubleQuoteString: peg$parsedoubleQuoteString, doubleQuoteStringChar: peg$parsedoubleQuoteStringChar, ellipsis: peg$parseellipsis, escapedChar: peg$parseescapedChar, expr: peg$parseexpr, expression: peg$parseexpression, float: peg$parsefloat, functionComposition: peg$parsefunctionComposition, group: peg$parsegroup, host: peg$parsehost, identifier: peg$parseidentifier, identifierChar: peg$parseidentifierChar, identifierList: peg$parseidentifierList, identifierOrString: peg$parseidentifierOrString, implicitParensArgs: peg$parseimplicitParensArgs, inlineSpace: peg$parseinlineSpace, integer: peg$parseinteger, lambda: peg$parselambda, leadingSlashPath: peg$parseleadingSlashPath, list: peg$parselist, multiLineComment: peg$parsemultiLineComment, newLine: peg$parsenewLine, number: peg$parsenumber, object: peg$parseobject, objectEntries: peg$parseobjectEntries, objectEntry: peg$parseobjectEntry, objectProperty: peg$parseobjectProperty, parameterizedLambda: peg$parseparameterizedLambda, parensArgs: peg$parseparensArgs, pipeline: peg$parsepipeline, path: peg$parsepath, pathKey: peg$parsepathKey, protocolCall: peg$parseprotocolCall, protocol: peg$parseprotocol, reservedProtocol: peg$parsereservedProtocol, scopeReference: peg$parsescopeReference, separator: peg$parseseparator, shebang: peg$parseshebang, sign: peg$parsesign, singleArrow: peg$parsesingleArrow, singleLineComment: peg$parsesingleLineComment, singleQuoteString: peg$parsesingleQuoteString, singleQuoteStringChar: peg$parsesingleQuoteStringChar, spread: peg$parsespread, step: peg$parsestep, start: peg$parsestart, string: peg$parsestring, templateDocument: peg$parsetemplateDocument, templateDocumentChar: peg$parsetemplateDocumentChar, templateDocumentContents: peg$parsetemplateDocumentContents, templateDocumentText: peg$parsetemplateDocumentText, templateLiteral: peg$parsetemplateLiteral, templateLiteralChar: peg$parsetemplateLiteralChar, templateLiteralContents: peg$parsetemplateLiteralContents, templateLiteralText: peg$parsetemplateLiteralText, templateSubstitution: peg$parsetemplateSubstitution, textChar: peg$parsetextChar, tree: peg$parsetree, treeAssignment: peg$parsetreeAssignment, treeEntries: peg$parsetreeEntries, treeEntry: peg$parsetreeEntry, whitespaceWithNewLine: peg$parsewhitespaceWithNewLine };
|
|
197
197
|
var peg$startRuleFunction = peg$parse__;
|
|
198
198
|
|
|
199
199
|
var peg$c0 = "//";
|
|
@@ -1435,6 +1435,17 @@ function peg$parse(input, options) {
|
|
|
1435
1435
|
return s0;
|
|
1436
1436
|
}
|
|
1437
1437
|
|
|
1438
|
+
function peg$parseidentifierOrString() {
|
|
1439
|
+
var s0;
|
|
1440
|
+
|
|
1441
|
+
s0 = peg$parseidentifier();
|
|
1442
|
+
if (s0 === peg$FAILED) {
|
|
1443
|
+
s0 = peg$parsestring();
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
return s0;
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1438
1449
|
function peg$parseimplicitParensArgs() {
|
|
1439
1450
|
var s0, s1, s2;
|
|
1440
1451
|
|
|
@@ -1894,7 +1905,7 @@ function peg$parse(input, options) {
|
|
|
1894
1905
|
s0 = peg$parseobjectProperty();
|
|
1895
1906
|
if (s0 === peg$FAILED) {
|
|
1896
1907
|
s0 = peg$currPos;
|
|
1897
|
-
s1 = peg$
|
|
1908
|
+
s1 = peg$parseidentifierOrString();
|
|
1898
1909
|
if (s1 !== peg$FAILED) {
|
|
1899
1910
|
peg$savedPos = s0;
|
|
1900
1911
|
s1 = peg$f17(s1);
|
|
@@ -1911,7 +1922,7 @@ function peg$parse(input, options) {
|
|
|
1911
1922
|
|
|
1912
1923
|
peg$silentFails++;
|
|
1913
1924
|
s0 = peg$currPos;
|
|
1914
|
-
s1 = peg$
|
|
1925
|
+
s1 = peg$parseidentifierOrString();
|
|
1915
1926
|
if (s1 !== peg$FAILED) {
|
|
1916
1927
|
s2 = peg$parse__();
|
|
1917
1928
|
if (input.charCodeAt(peg$currPos) === 58) {
|
|
@@ -3041,7 +3052,7 @@ function peg$parse(input, options) {
|
|
|
3041
3052
|
|
|
3042
3053
|
peg$silentFails++;
|
|
3043
3054
|
s0 = peg$currPos;
|
|
3044
|
-
s1 = peg$
|
|
3055
|
+
s1 = peg$parseidentifierOrString();
|
|
3045
3056
|
if (s1 !== peg$FAILED) {
|
|
3046
3057
|
s2 = peg$parse__();
|
|
3047
3058
|
if (input.charCodeAt(peg$currPos) === 61) {
|
|
@@ -3128,7 +3139,7 @@ function peg$parse(input, options) {
|
|
|
3128
3139
|
s0 = peg$parsetreeAssignment();
|
|
3129
3140
|
if (s0 === peg$FAILED) {
|
|
3130
3141
|
s0 = peg$currPos;
|
|
3131
|
-
s1 = peg$
|
|
3142
|
+
s1 = peg$parseidentifierOrString();
|
|
3132
3143
|
if (s1 !== peg$FAILED) {
|
|
3133
3144
|
peg$savedPos = s0;
|
|
3134
3145
|
s1 = peg$f41(s1);
|
|
@@ -3222,6 +3233,7 @@ const peg$allowedStartRules = [
|
|
|
3222
3233
|
"identifier",
|
|
3223
3234
|
"identifierChar",
|
|
3224
3235
|
"identifierList",
|
|
3236
|
+
"identifierOrString",
|
|
3225
3237
|
"implicitParensArgs",
|
|
3226
3238
|
"inlineSpace",
|
|
3227
3239
|
"integer",
|
|
@@ -30,7 +30,7 @@ export default async function mergeTrees(...trees) {
|
|
|
30
30
|
|
|
31
31
|
// If all trees are plain objects, return a plain object.
|
|
32
32
|
if (unpacked.every((tree) => isPlainObject(tree))) {
|
|
33
|
-
return
|
|
33
|
+
return Object.assign({}, ...unpacked);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// If all trees are arrays, return an array.
|
|
@@ -56,23 +56,3 @@ export default async function mergeTrees(...trees) {
|
|
|
56
56
|
|
|
57
57
|
return result;
|
|
58
58
|
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Merge the indicated plain objects. If a key is present in multiple objects,
|
|
62
|
-
* the value from the first object is used.
|
|
63
|
-
*
|
|
64
|
-
* This is similar to calling Object.assign() with the objects in reverse order,
|
|
65
|
-
* but we want to ensure the keys end up in the same order they're encountered
|
|
66
|
-
* in the objects.
|
|
67
|
-
*
|
|
68
|
-
* @param {...any} objects
|
|
69
|
-
*/
|
|
70
|
-
function mergeObjects(...objects) {
|
|
71
|
-
const result = {};
|
|
72
|
-
for (const obj of objects) {
|
|
73
|
-
for (const key of Object.keys(obj)) {
|
|
74
|
-
result[key] ??= obj[key];
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
}
|
|
@@ -299,6 +299,11 @@ describe("Origami parser", () => {
|
|
|
299
299
|
["a", 1],
|
|
300
300
|
["b", [ops.scope, "b"]],
|
|
301
301
|
]);
|
|
302
|
+
assertParse("object", `{ "a": 1, "b": 2 }`, [
|
|
303
|
+
ops.object,
|
|
304
|
+
["a", 1],
|
|
305
|
+
["b", 2],
|
|
306
|
+
]);
|
|
302
307
|
assertParse("object", "{ a: 1, ...b }", [
|
|
303
308
|
ops.merge,
|
|
304
309
|
[ops.object, ["a", 1]],
|
|
@@ -13,16 +13,15 @@ describe("mergeTrees", () => {
|
|
|
13
13
|
b: 2,
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
b: 3,
|
|
17
|
+
c: 4,
|
|
18
18
|
}
|
|
19
19
|
);
|
|
20
20
|
// @ts-ignore
|
|
21
21
|
assert.deepEqual(await Tree.plain(tree), {
|
|
22
22
|
a: 1,
|
|
23
|
-
b:
|
|
24
|
-
c:
|
|
25
|
-
d: 4,
|
|
23
|
+
b: 3,
|
|
24
|
+
c: 4,
|
|
26
25
|
});
|
|
27
26
|
});
|
|
28
27
|
|
|
@@ -55,15 +54,14 @@ describe("mergeTrees", () => {
|
|
|
55
54
|
b: 2,
|
|
56
55
|
},
|
|
57
56
|
{
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
b: 3,
|
|
58
|
+
c: 4,
|
|
60
59
|
}
|
|
61
60
|
);
|
|
62
61
|
assert.deepEqual(result, {
|
|
63
62
|
a: 1,
|
|
64
|
-
b:
|
|
65
|
-
c:
|
|
66
|
-
d: 4,
|
|
63
|
+
b: 3,
|
|
64
|
+
c: 4,
|
|
67
65
|
});
|
|
68
66
|
});
|
|
69
67
|
|