@weborigami/language 0.0.62 → 0.0.64-beta.1

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.62",
3
+ "version": "0.0.64-beta.1",
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.5.3"
12
12
  },
13
13
  "dependencies": {
14
- "@weborigami/async-tree": "0.0.62",
15
- "@weborigami/types": "0.0.62",
14
+ "@weborigami/async-tree": "0.0.64-beta.1",
15
+ "@weborigami/types": "0.0.64-beta.1",
16
16
  "watcher": "2.3.1"
17
17
  },
18
18
  "scripts": {
@@ -63,9 +63,8 @@ callTarget "function call"
63
63
  / group
64
64
  / scopeReference
65
65
 
66
- // Required closing curly brace. We use this for the `tree` term: it's the last
67
- // term in the `step` parser that starts with a curly brace, so if that parser
68
- // sees a left curly brace, here we must see a right curly brace.
66
+ // Required closing curly brace. We use this for the `object` term: if the
67
+ // parser sees a left curly brace, here we must see a right curly brace.
69
68
  closingBrace
70
69
  = "}"
71
70
  / .? {
@@ -207,7 +206,7 @@ number "number"
207
206
 
208
207
  // An object literal: `{foo: 1, bar: 2}`
209
208
  object "object literal"
210
- = "{" __ entries:objectEntries? __ "}" {
209
+ = "{" __ entries:objectEntries? __ closingBrace {
211
210
  return annotate(makeObject(entries ?? [], ops.object), location());
212
211
  }
213
212
 
@@ -223,7 +222,7 @@ objectEntry
223
222
 
224
223
  // A getter definition inside an object literal: `foo = 1`
225
224
  objectGetter "object getter"
226
- = key:identifierOrString __ "=" __ value:expr {
225
+ = key:objectKey __ "=" __ value:expr {
227
226
  return annotate([key, [ops.getter, value]], location());
228
227
  }
229
228
 
@@ -233,9 +232,13 @@ objectIdentifier "object identifier"
233
232
  return annotate([key, [ops.inherited, key]], location());
234
233
  }
235
234
 
235
+ objectKey "object key"
236
+ = hiddenKey:("(" identifierOrString ")") { return hiddenKey.join(""); }
237
+ / identifierOrString
238
+
236
239
  // A property definition in an object literal: `x: 1`
237
240
  objectProperty "object property"
238
- = @identifierOrString __ ":" __ @expr
241
+ = @objectKey __ ":" __ @expr
239
242
 
240
243
  parameterizedLambda
241
244
  = "(" __ parameters:identifierList? __ ")" __ doubleArrow __ expr:expr {
@@ -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, guillemetString: peg$parseguillemetString, guillemetStringChar: peg$parseguillemetStringChar, 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, objectGetter: peg$parseobjectGetter, objectIdentifier: peg$parseobjectIdentifier, objectProperty: peg$parseobjectProperty, parameterizedLambda: peg$parseparameterizedLambda, parensArgs: peg$parseparensArgs, pipeline: peg$parsepipeline, path: peg$parsepath, pathKey: peg$parsepathKey, pathKeyChar: peg$parsepathKeyChar, 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, 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, guillemetString: peg$parseguillemetString, guillemetStringChar: peg$parseguillemetStringChar, 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, objectGetter: peg$parseobjectGetter, objectIdentifier: peg$parseobjectIdentifier, objectKey: peg$parseobjectKey, objectProperty: peg$parseobjectProperty, parameterizedLambda: peg$parseparameterizedLambda, parensArgs: peg$parseparensArgs, pipeline: peg$parsepipeline, path: peg$parsepath, pathKey: peg$parsepathKey, pathKeyChar: peg$parsepathKeyChar, 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, whitespaceWithNewLine: peg$parsewhitespaceWithNewLine };
197
197
  var peg$startRuleFunction = peg$parse__;
198
198
 
199
199
  var peg$c0 = "//";
@@ -297,37 +297,38 @@ function peg$parse(input, options) {
297
297
  var peg$e50 = peg$literalExpectation("{", false);
298
298
  var peg$e51 = peg$otherExpectation("object getter");
299
299
  var peg$e52 = peg$otherExpectation("object identifier");
300
- var peg$e53 = peg$otherExpectation("object property");
301
- var peg$e54 = peg$otherExpectation("function arguments in parentheses");
302
- var peg$e55 = peg$otherExpectation("slash-separated path");
303
- var peg$e56 = peg$otherExpectation("path element");
304
- var peg$e57 = peg$classExpectation(["(", ")", "{", "}", "[", "]", ",", ":", "/", "\\", " ", "\t", "\n", "\r"], true, false);
305
- var peg$e58 = peg$otherExpectation("function call using protocol: syntax");
306
- var peg$e59 = peg$otherExpectation("protocol");
307
- var peg$e60 = peg$otherExpectation("reserved protocol");
308
- var peg$e61 = peg$literalExpectation("https", false);
309
- var peg$e62 = peg$literalExpectation("http", false);
310
- var peg$e63 = peg$literalExpectation("new", false);
311
- var peg$e64 = peg$literalExpectation("package", false);
312
- var peg$e65 = peg$literalExpectation("treehttps", false);
313
- var peg$e66 = peg$literalExpectation("treehttp", false);
314
- var peg$e67 = peg$literalExpectation("tree", false);
315
- var peg$e68 = peg$otherExpectation("scope reference");
316
- var peg$e69 = peg$literalExpectation(",", false);
317
- var peg$e70 = peg$literalExpectation("#!", false);
318
- var peg$e71 = peg$classExpectation(["\n", "\r"], true, false);
319
- var peg$e72 = peg$classExpectation(["+", "-"], false, false);
320
- var peg$e73 = peg$literalExpectation("\u2192", false);
321
- var peg$e74 = peg$literalExpectation("->", false);
322
- var peg$e75 = peg$otherExpectation("single quote string");
323
- var peg$e76 = peg$literalExpectation("'", false);
324
- var peg$e77 = peg$otherExpectation("string");
325
- var peg$e78 = peg$otherExpectation("template");
326
- var peg$e79 = peg$literalExpectation("${", false);
327
- var peg$e80 = peg$otherExpectation("template text");
328
- var peg$e81 = peg$otherExpectation("template literal");
329
- var peg$e82 = peg$literalExpectation("`", false);
330
- var peg$e83 = peg$otherExpectation("template substitution");
300
+ var peg$e53 = peg$otherExpectation("object key");
301
+ var peg$e54 = peg$otherExpectation("object property");
302
+ var peg$e55 = peg$otherExpectation("function arguments in parentheses");
303
+ var peg$e56 = peg$otherExpectation("slash-separated path");
304
+ var peg$e57 = peg$otherExpectation("path element");
305
+ var peg$e58 = peg$classExpectation(["(", ")", "{", "}", "[", "]", ",", ":", "/", "\\", " ", "\t", "\n", "\r"], true, false);
306
+ var peg$e59 = peg$otherExpectation("function call using protocol: syntax");
307
+ var peg$e60 = peg$otherExpectation("protocol");
308
+ var peg$e61 = peg$otherExpectation("reserved protocol");
309
+ var peg$e62 = peg$literalExpectation("https", false);
310
+ var peg$e63 = peg$literalExpectation("http", false);
311
+ var peg$e64 = peg$literalExpectation("new", false);
312
+ var peg$e65 = peg$literalExpectation("package", false);
313
+ var peg$e66 = peg$literalExpectation("treehttps", false);
314
+ var peg$e67 = peg$literalExpectation("treehttp", false);
315
+ var peg$e68 = peg$literalExpectation("tree", false);
316
+ var peg$e69 = peg$otherExpectation("scope reference");
317
+ var peg$e70 = peg$literalExpectation(",", false);
318
+ var peg$e71 = peg$literalExpectation("#!", false);
319
+ var peg$e72 = peg$classExpectation(["\n", "\r"], true, false);
320
+ var peg$e73 = peg$classExpectation(["+", "-"], false, false);
321
+ var peg$e74 = peg$literalExpectation("\u2192", false);
322
+ var peg$e75 = peg$literalExpectation("->", false);
323
+ var peg$e76 = peg$otherExpectation("single quote string");
324
+ var peg$e77 = peg$literalExpectation("'", false);
325
+ var peg$e78 = peg$otherExpectation("string");
326
+ var peg$e79 = peg$otherExpectation("template");
327
+ var peg$e80 = peg$literalExpectation("${", false);
328
+ var peg$e81 = peg$otherExpectation("template text");
329
+ var peg$e82 = peg$otherExpectation("template literal");
330
+ var peg$e83 = peg$literalExpectation("`", false);
331
+ var peg$e84 = peg$otherExpectation("template substitution");
331
332
 
332
333
  var peg$f0 = function() { return ""; };
333
334
  var peg$f1 = function(path) {
@@ -378,44 +379,45 @@ function peg$parse(input, options) {
378
379
  var peg$f19 = function(key) {
379
380
  return annotate([key, [ops.inherited, key]], location());
380
381
  };
381
- var peg$f20 = function(parameters, expr) {
382
+ var peg$f20 = function(hiddenKey) { return hiddenKey.join(""); };
383
+ var peg$f21 = function(parameters, expr) {
382
384
  return annotate([ops.lambda, parameters ?? [], expr], location());
383
385
  };
384
- var peg$f21 = function(list) {
386
+ var peg$f22 = function(list) {
385
387
  return list ?? annotate([undefined], location());
386
388
  };
387
- var peg$f22 = function(steps) {
389
+ var peg$f23 = function(steps) {
388
390
  return annotate(makePipeline(steps), location());
389
391
  };
390
- var peg$f23 = function(chars) { return chars.join(""); };
391
- var peg$f24 = function(protocol, host, path) {
392
+ var peg$f24 = function(chars) { return chars.join(""); };
393
+ var peg$f25 = function(protocol, host, path) {
392
394
  return annotate([protocol, host, ...(path ?? [])], location());
393
395
  };
394
- var peg$f25 = function() { return ops.https; };
395
- var peg$f26 = function() { return ops.http; };
396
- var peg$f27 = function() { return ops.constructor; };
397
- var peg$f28 = function() { return [ops.scope, "@package"] };
398
- var peg$f29 = function() { return ops.treeHttps; };
399
- var peg$f30 = function() { return ops.treeHttp; };
400
- var peg$f31 = function() { return ops.treeHttps; };
401
- var peg$f32 = function(key) {
396
+ var peg$f26 = function() { return ops.https; };
397
+ var peg$f27 = function() { return ops.http; };
398
+ var peg$f28 = function() { return ops.constructor; };
399
+ var peg$f29 = function() { return [ops.scope, "@package"] };
400
+ var peg$f30 = function() { return ops.treeHttps; };
401
+ var peg$f31 = function() { return ops.treeHttp; };
402
+ var peg$f32 = function() { return ops.treeHttps; };
403
+ var peg$f33 = function(key) {
402
404
  return annotate([ops.scope, key], location());
403
405
  };
404
- var peg$f33 = function() { return null; };
405
406
  var peg$f34 = function() { return null; };
406
- var peg$f35 = function(chars) { return chars.join(""); };
407
- var peg$f36 = function(expr) { return [ops.spread, expr]; };
408
- var peg$f37 = function(contents) {
407
+ var peg$f35 = function() { return null; };
408
+ var peg$f36 = function(chars) { return chars.join(""); };
409
+ var peg$f37 = function(expr) { return [ops.spread, expr]; };
410
+ var peg$f38 = function(contents) {
409
411
  return annotate([ops.lambda, null, contents], location());
410
412
  };
411
- var peg$f38 = function(parts) {
413
+ var peg$f39 = function(parts) {
412
414
  return annotate(makeTemplate(parts), location());
413
415
  };
414
- var peg$f39 = function(chars) { return chars.join(""); };
415
- var peg$f40 = function(parts) {
416
+ var peg$f40 = function(chars) { return chars.join(""); };
417
+ var peg$f41 = function(parts) {
416
418
  return annotate(makeTemplate(parts), location());
417
419
  };
418
- var peg$f41 = function(chars) { return chars.join(""); };
420
+ var peg$f42 = function(chars) { return chars.join(""); };
419
421
  var peg$currPos = options.peg$currPos | 0;
420
422
  var peg$savedPos = peg$currPos;
421
423
  var peg$posDetailsCache = [{ line: 1, column: 1 }];
@@ -1942,13 +1944,7 @@ function peg$parse(input, options) {
1942
1944
  s3 = null;
1943
1945
  }
1944
1946
  s4 = peg$parse__();
1945
- if (input.charCodeAt(peg$currPos) === 125) {
1946
- s5 = peg$c2;
1947
- peg$currPos++;
1948
- } else {
1949
- s5 = peg$FAILED;
1950
- if (peg$silentFails === 0) { peg$fail(peg$e6); }
1951
- }
1947
+ s5 = peg$parseclosingBrace();
1952
1948
  if (s5 !== peg$FAILED) {
1953
1949
  peg$savedPos = s0;
1954
1950
  s0 = peg$f17(s3);
@@ -2034,7 +2030,7 @@ function peg$parse(input, options) {
2034
2030
 
2035
2031
  peg$silentFails++;
2036
2032
  s0 = peg$currPos;
2037
- s1 = peg$parseidentifierOrString();
2033
+ s1 = peg$parseobjectKey();
2038
2034
  if (s1 !== peg$FAILED) {
2039
2035
  s2 = peg$parse__();
2040
2036
  if (input.charCodeAt(peg$currPos) === 61) {
@@ -2091,12 +2087,67 @@ function peg$parse(input, options) {
2091
2087
  return s0;
2092
2088
  }
2093
2089
 
2090
+ function peg$parseobjectKey() {
2091
+ var s0, s1, s2, s3, s4;
2092
+
2093
+ peg$silentFails++;
2094
+ s0 = peg$currPos;
2095
+ s1 = peg$currPos;
2096
+ if (input.charCodeAt(peg$currPos) === 40) {
2097
+ s2 = peg$c12;
2098
+ peg$currPos++;
2099
+ } else {
2100
+ s2 = peg$FAILED;
2101
+ if (peg$silentFails === 0) { peg$fail(peg$e25); }
2102
+ }
2103
+ if (s2 !== peg$FAILED) {
2104
+ s3 = peg$parseidentifierOrString();
2105
+ if (s3 !== peg$FAILED) {
2106
+ if (input.charCodeAt(peg$currPos) === 41) {
2107
+ s4 = peg$c4;
2108
+ peg$currPos++;
2109
+ } else {
2110
+ s4 = peg$FAILED;
2111
+ if (peg$silentFails === 0) { peg$fail(peg$e9); }
2112
+ }
2113
+ if (s4 !== peg$FAILED) {
2114
+ s2 = [s2, s3, s4];
2115
+ s1 = s2;
2116
+ } else {
2117
+ peg$currPos = s1;
2118
+ s1 = peg$FAILED;
2119
+ }
2120
+ } else {
2121
+ peg$currPos = s1;
2122
+ s1 = peg$FAILED;
2123
+ }
2124
+ } else {
2125
+ peg$currPos = s1;
2126
+ s1 = peg$FAILED;
2127
+ }
2128
+ if (s1 !== peg$FAILED) {
2129
+ peg$savedPos = s0;
2130
+ s1 = peg$f20(s1);
2131
+ }
2132
+ s0 = s1;
2133
+ if (s0 === peg$FAILED) {
2134
+ s0 = peg$parseidentifierOrString();
2135
+ }
2136
+ peg$silentFails--;
2137
+ if (s0 === peg$FAILED) {
2138
+ s1 = peg$FAILED;
2139
+ if (peg$silentFails === 0) { peg$fail(peg$e53); }
2140
+ }
2141
+
2142
+ return s0;
2143
+ }
2144
+
2094
2145
  function peg$parseobjectProperty() {
2095
2146
  var s0, s1, s2, s3, s4, s5;
2096
2147
 
2097
2148
  peg$silentFails++;
2098
2149
  s0 = peg$currPos;
2099
- s1 = peg$parseidentifierOrString();
2150
+ s1 = peg$parseobjectKey();
2100
2151
  if (s1 !== peg$FAILED) {
2101
2152
  s2 = peg$parse__();
2102
2153
  if (input.charCodeAt(peg$currPos) === 58) {
@@ -2126,7 +2177,7 @@ function peg$parse(input, options) {
2126
2177
  peg$silentFails--;
2127
2178
  if (s0 === peg$FAILED) {
2128
2179
  s1 = peg$FAILED;
2129
- if (peg$silentFails === 0) { peg$fail(peg$e53); }
2180
+ if (peg$silentFails === 0) { peg$fail(peg$e54); }
2130
2181
  }
2131
2182
 
2132
2183
  return s0;
@@ -2165,7 +2216,7 @@ function peg$parse(input, options) {
2165
2216
  s9 = peg$parsepipeline();
2166
2217
  if (s9 !== peg$FAILED) {
2167
2218
  peg$savedPos = s0;
2168
- s0 = peg$f20(s3, s9);
2219
+ s0 = peg$f21(s3, s9);
2169
2220
  } else {
2170
2221
  peg$currPos = s0;
2171
2222
  s0 = peg$FAILED;
@@ -2214,7 +2265,7 @@ function peg$parse(input, options) {
2214
2265
  }
2215
2266
  if (s5 !== peg$FAILED) {
2216
2267
  peg$savedPos = s0;
2217
- s0 = peg$f21(s3);
2268
+ s0 = peg$f22(s3);
2218
2269
  } else {
2219
2270
  peg$currPos = s0;
2220
2271
  s0 = peg$FAILED;
@@ -2226,7 +2277,7 @@ function peg$parse(input, options) {
2226
2277
  peg$silentFails--;
2227
2278
  if (s0 === peg$FAILED) {
2228
2279
  s1 = peg$FAILED;
2229
- if (peg$silentFails === 0) { peg$fail(peg$e54); }
2280
+ if (peg$silentFails === 0) { peg$fail(peg$e55); }
2230
2281
  }
2231
2282
 
2232
2283
  return s0;
@@ -2280,7 +2331,7 @@ function peg$parse(input, options) {
2280
2331
  }
2281
2332
  if (s1 !== peg$FAILED) {
2282
2333
  peg$savedPos = s0;
2283
- s1 = peg$f22(s1);
2334
+ s1 = peg$f23(s1);
2284
2335
  }
2285
2336
  s0 = s1;
2286
2337
 
@@ -2319,7 +2370,7 @@ function peg$parse(input, options) {
2319
2370
  }
2320
2371
  peg$silentFails--;
2321
2372
  s1 = peg$FAILED;
2322
- if (peg$silentFails === 0) { peg$fail(peg$e55); }
2373
+ if (peg$silentFails === 0) { peg$fail(peg$e56); }
2323
2374
 
2324
2375
  return s0;
2325
2376
  }
@@ -2336,11 +2387,11 @@ function peg$parse(input, options) {
2336
2387
  s2 = peg$parsepathKeyChar();
2337
2388
  }
2338
2389
  peg$savedPos = s0;
2339
- s1 = peg$f23(s1);
2390
+ s1 = peg$f24(s1);
2340
2391
  s0 = s1;
2341
2392
  peg$silentFails--;
2342
2393
  s1 = peg$FAILED;
2343
- if (peg$silentFails === 0) { peg$fail(peg$e56); }
2394
+ if (peg$silentFails === 0) { peg$fail(peg$e57); }
2344
2395
 
2345
2396
  return s0;
2346
2397
  }
@@ -2353,7 +2404,7 @@ function peg$parse(input, options) {
2353
2404
  peg$currPos++;
2354
2405
  } else {
2355
2406
  s0 = peg$FAILED;
2356
- if (peg$silentFails === 0) { peg$fail(peg$e57); }
2407
+ if (peg$silentFails === 0) { peg$fail(peg$e58); }
2357
2408
  }
2358
2409
  if (s0 === peg$FAILED) {
2359
2410
  s0 = peg$parseescapedChar();
@@ -2406,7 +2457,7 @@ function peg$parse(input, options) {
2406
2457
  s5 = null;
2407
2458
  }
2408
2459
  peg$savedPos = s0;
2409
- s0 = peg$f24(s1, s4, s5);
2460
+ s0 = peg$f25(s1, s4, s5);
2410
2461
  } else {
2411
2462
  peg$currPos = s0;
2412
2463
  s0 = peg$FAILED;
@@ -2422,7 +2473,7 @@ function peg$parse(input, options) {
2422
2473
  peg$silentFails--;
2423
2474
  if (s0 === peg$FAILED) {
2424
2475
  s1 = peg$FAILED;
2425
- if (peg$silentFails === 0) { peg$fail(peg$e58); }
2476
+ if (peg$silentFails === 0) { peg$fail(peg$e59); }
2426
2477
  }
2427
2478
 
2428
2479
  return s0;
@@ -2439,7 +2490,7 @@ function peg$parse(input, options) {
2439
2490
  peg$silentFails--;
2440
2491
  if (s0 === peg$FAILED) {
2441
2492
  s1 = peg$FAILED;
2442
- if (peg$silentFails === 0) { peg$fail(peg$e59); }
2493
+ if (peg$silentFails === 0) { peg$fail(peg$e60); }
2443
2494
  }
2444
2495
 
2445
2496
  return s0;
@@ -2455,11 +2506,11 @@ function peg$parse(input, options) {
2455
2506
  peg$currPos += 5;
2456
2507
  } else {
2457
2508
  s1 = peg$FAILED;
2458
- if (peg$silentFails === 0) { peg$fail(peg$e61); }
2509
+ if (peg$silentFails === 0) { peg$fail(peg$e62); }
2459
2510
  }
2460
2511
  if (s1 !== peg$FAILED) {
2461
2512
  peg$savedPos = s0;
2462
- s1 = peg$f25();
2513
+ s1 = peg$f26();
2463
2514
  }
2464
2515
  s0 = s1;
2465
2516
  if (s0 === peg$FAILED) {
@@ -2469,11 +2520,11 @@ function peg$parse(input, options) {
2469
2520
  peg$currPos += 4;
2470
2521
  } else {
2471
2522
  s1 = peg$FAILED;
2472
- if (peg$silentFails === 0) { peg$fail(peg$e62); }
2523
+ if (peg$silentFails === 0) { peg$fail(peg$e63); }
2473
2524
  }
2474
2525
  if (s1 !== peg$FAILED) {
2475
2526
  peg$savedPos = s0;
2476
- s1 = peg$f26();
2527
+ s1 = peg$f27();
2477
2528
  }
2478
2529
  s0 = s1;
2479
2530
  if (s0 === peg$FAILED) {
@@ -2483,11 +2534,11 @@ function peg$parse(input, options) {
2483
2534
  peg$currPos += 3;
2484
2535
  } else {
2485
2536
  s1 = peg$FAILED;
2486
- if (peg$silentFails === 0) { peg$fail(peg$e63); }
2537
+ if (peg$silentFails === 0) { peg$fail(peg$e64); }
2487
2538
  }
2488
2539
  if (s1 !== peg$FAILED) {
2489
2540
  peg$savedPos = s0;
2490
- s1 = peg$f27();
2541
+ s1 = peg$f28();
2491
2542
  }
2492
2543
  s0 = s1;
2493
2544
  if (s0 === peg$FAILED) {
@@ -2497,11 +2548,11 @@ function peg$parse(input, options) {
2497
2548
  peg$currPos += 7;
2498
2549
  } else {
2499
2550
  s1 = peg$FAILED;
2500
- if (peg$silentFails === 0) { peg$fail(peg$e64); }
2551
+ if (peg$silentFails === 0) { peg$fail(peg$e65); }
2501
2552
  }
2502
2553
  if (s1 !== peg$FAILED) {
2503
2554
  peg$savedPos = s0;
2504
- s1 = peg$f28();
2555
+ s1 = peg$f29();
2505
2556
  }
2506
2557
  s0 = s1;
2507
2558
  if (s0 === peg$FAILED) {
@@ -2511,11 +2562,11 @@ function peg$parse(input, options) {
2511
2562
  peg$currPos += 9;
2512
2563
  } else {
2513
2564
  s1 = peg$FAILED;
2514
- if (peg$silentFails === 0) { peg$fail(peg$e65); }
2565
+ if (peg$silentFails === 0) { peg$fail(peg$e66); }
2515
2566
  }
2516
2567
  if (s1 !== peg$FAILED) {
2517
2568
  peg$savedPos = s0;
2518
- s1 = peg$f29();
2569
+ s1 = peg$f30();
2519
2570
  }
2520
2571
  s0 = s1;
2521
2572
  if (s0 === peg$FAILED) {
@@ -2525,11 +2576,11 @@ function peg$parse(input, options) {
2525
2576
  peg$currPos += 8;
2526
2577
  } else {
2527
2578
  s1 = peg$FAILED;
2528
- if (peg$silentFails === 0) { peg$fail(peg$e66); }
2579
+ if (peg$silentFails === 0) { peg$fail(peg$e67); }
2529
2580
  }
2530
2581
  if (s1 !== peg$FAILED) {
2531
2582
  peg$savedPos = s0;
2532
- s1 = peg$f30();
2583
+ s1 = peg$f31();
2533
2584
  }
2534
2585
  s0 = s1;
2535
2586
  if (s0 === peg$FAILED) {
@@ -2539,11 +2590,11 @@ function peg$parse(input, options) {
2539
2590
  peg$currPos += 4;
2540
2591
  } else {
2541
2592
  s1 = peg$FAILED;
2542
- if (peg$silentFails === 0) { peg$fail(peg$e67); }
2593
+ if (peg$silentFails === 0) { peg$fail(peg$e68); }
2543
2594
  }
2544
2595
  if (s1 !== peg$FAILED) {
2545
2596
  peg$savedPos = s0;
2546
- s1 = peg$f31();
2597
+ s1 = peg$f32();
2547
2598
  }
2548
2599
  s0 = s1;
2549
2600
  }
@@ -2555,7 +2606,7 @@ function peg$parse(input, options) {
2555
2606
  peg$silentFails--;
2556
2607
  if (s0 === peg$FAILED) {
2557
2608
  s1 = peg$FAILED;
2558
- if (peg$silentFails === 0) { peg$fail(peg$e60); }
2609
+ if (peg$silentFails === 0) { peg$fail(peg$e61); }
2559
2610
  }
2560
2611
 
2561
2612
  return s0;
@@ -2569,13 +2620,13 @@ function peg$parse(input, options) {
2569
2620
  s1 = peg$parseidentifier();
2570
2621
  if (s1 !== peg$FAILED) {
2571
2622
  peg$savedPos = s0;
2572
- s1 = peg$f32(s1);
2623
+ s1 = peg$f33(s1);
2573
2624
  }
2574
2625
  s0 = s1;
2575
2626
  peg$silentFails--;
2576
2627
  if (s0 === peg$FAILED) {
2577
2628
  s1 = peg$FAILED;
2578
- if (peg$silentFails === 0) { peg$fail(peg$e68); }
2629
+ if (peg$silentFails === 0) { peg$fail(peg$e69); }
2579
2630
  }
2580
2631
 
2581
2632
  return s0;
@@ -2591,7 +2642,7 @@ function peg$parse(input, options) {
2591
2642
  peg$currPos++;
2592
2643
  } else {
2593
2644
  s2 = peg$FAILED;
2594
- if (peg$silentFails === 0) { peg$fail(peg$e69); }
2645
+ if (peg$silentFails === 0) { peg$fail(peg$e70); }
2595
2646
  }
2596
2647
  if (s2 !== peg$FAILED) {
2597
2648
  s3 = peg$parse__();
@@ -2617,7 +2668,7 @@ function peg$parse(input, options) {
2617
2668
  peg$currPos += 2;
2618
2669
  } else {
2619
2670
  s1 = peg$FAILED;
2620
- if (peg$silentFails === 0) { peg$fail(peg$e70); }
2671
+ if (peg$silentFails === 0) { peg$fail(peg$e71); }
2621
2672
  }
2622
2673
  if (s1 !== peg$FAILED) {
2623
2674
  s2 = [];
@@ -2626,7 +2677,7 @@ function peg$parse(input, options) {
2626
2677
  peg$currPos++;
2627
2678
  } else {
2628
2679
  s3 = peg$FAILED;
2629
- if (peg$silentFails === 0) { peg$fail(peg$e71); }
2680
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
2630
2681
  }
2631
2682
  while (s3 !== peg$FAILED) {
2632
2683
  s2.push(s3);
@@ -2635,11 +2686,11 @@ function peg$parse(input, options) {
2635
2686
  peg$currPos++;
2636
2687
  } else {
2637
2688
  s3 = peg$FAILED;
2638
- if (peg$silentFails === 0) { peg$fail(peg$e71); }
2689
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
2639
2690
  }
2640
2691
  }
2641
2692
  peg$savedPos = s0;
2642
- s0 = peg$f33();
2693
+ s0 = peg$f34();
2643
2694
  } else {
2644
2695
  peg$currPos = s0;
2645
2696
  s0 = peg$FAILED;
@@ -2656,7 +2707,7 @@ function peg$parse(input, options) {
2656
2707
  peg$currPos++;
2657
2708
  } else {
2658
2709
  s0 = peg$FAILED;
2659
- if (peg$silentFails === 0) { peg$fail(peg$e72); }
2710
+ if (peg$silentFails === 0) { peg$fail(peg$e73); }
2660
2711
  }
2661
2712
 
2662
2713
  return s0;
@@ -2670,7 +2721,7 @@ function peg$parse(input, options) {
2670
2721
  peg$currPos++;
2671
2722
  } else {
2672
2723
  s0 = peg$FAILED;
2673
- if (peg$silentFails === 0) { peg$fail(peg$e73); }
2724
+ if (peg$silentFails === 0) { peg$fail(peg$e74); }
2674
2725
  }
2675
2726
  if (s0 === peg$FAILED) {
2676
2727
  if (input.substr(peg$currPos, 2) === peg$c36) {
@@ -2678,7 +2729,7 @@ function peg$parse(input, options) {
2678
2729
  peg$currPos += 2;
2679
2730
  } else {
2680
2731
  s0 = peg$FAILED;
2681
- if (peg$silentFails === 0) { peg$fail(peg$e74); }
2732
+ if (peg$silentFails === 0) { peg$fail(peg$e75); }
2682
2733
  }
2683
2734
  }
2684
2735
 
@@ -2703,7 +2754,7 @@ function peg$parse(input, options) {
2703
2754
  peg$currPos++;
2704
2755
  } else {
2705
2756
  s3 = peg$FAILED;
2706
- if (peg$silentFails === 0) { peg$fail(peg$e71); }
2757
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
2707
2758
  }
2708
2759
  while (s3 !== peg$FAILED) {
2709
2760
  s2.push(s3);
@@ -2712,11 +2763,11 @@ function peg$parse(input, options) {
2712
2763
  peg$currPos++;
2713
2764
  } else {
2714
2765
  s3 = peg$FAILED;
2715
- if (peg$silentFails === 0) { peg$fail(peg$e71); }
2766
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
2716
2767
  }
2717
2768
  }
2718
2769
  peg$savedPos = s0;
2719
- s0 = peg$f34();
2770
+ s0 = peg$f35();
2720
2771
  } else {
2721
2772
  peg$currPos = s0;
2722
2773
  s0 = peg$FAILED;
@@ -2735,7 +2786,7 @@ function peg$parse(input, options) {
2735
2786
  peg$currPos++;
2736
2787
  } else {
2737
2788
  s1 = peg$FAILED;
2738
- if (peg$silentFails === 0) { peg$fail(peg$e76); }
2789
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
2739
2790
  }
2740
2791
  if (s1 !== peg$FAILED) {
2741
2792
  s2 = [];
@@ -2749,11 +2800,11 @@ function peg$parse(input, options) {
2749
2800
  peg$currPos++;
2750
2801
  } else {
2751
2802
  s3 = peg$FAILED;
2752
- if (peg$silentFails === 0) { peg$fail(peg$e76); }
2803
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
2753
2804
  }
2754
2805
  if (s3 !== peg$FAILED) {
2755
2806
  peg$savedPos = s0;
2756
- s0 = peg$f35(s2);
2807
+ s0 = peg$f36(s2);
2757
2808
  } else {
2758
2809
  peg$currPos = s0;
2759
2810
  s0 = peg$FAILED;
@@ -2765,7 +2816,7 @@ function peg$parse(input, options) {
2765
2816
  peg$silentFails--;
2766
2817
  if (s0 === peg$FAILED) {
2767
2818
  s1 = peg$FAILED;
2768
- if (peg$silentFails === 0) { peg$fail(peg$e75); }
2819
+ if (peg$silentFails === 0) { peg$fail(peg$e76); }
2769
2820
  }
2770
2821
 
2771
2822
  return s0;
@@ -2782,7 +2833,7 @@ function peg$parse(input, options) {
2782
2833
  peg$currPos++;
2783
2834
  } else {
2784
2835
  s2 = peg$FAILED;
2785
- if (peg$silentFails === 0) { peg$fail(peg$e76); }
2836
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
2786
2837
  }
2787
2838
  if (s2 === peg$FAILED) {
2788
2839
  s2 = peg$parsenewLine();
@@ -2819,7 +2870,7 @@ function peg$parse(input, options) {
2819
2870
  s2 = peg$parsepipeline();
2820
2871
  if (s2 !== peg$FAILED) {
2821
2872
  peg$savedPos = s0;
2822
- s0 = peg$f36(s2);
2873
+ s0 = peg$f37(s2);
2823
2874
  } else {
2824
2875
  peg$currPos = s0;
2825
2876
  s0 = peg$FAILED;
@@ -2895,7 +2946,7 @@ function peg$parse(input, options) {
2895
2946
  peg$silentFails--;
2896
2947
  if (s0 === peg$FAILED) {
2897
2948
  s1 = peg$FAILED;
2898
- if (peg$silentFails === 0) { peg$fail(peg$e77); }
2949
+ if (peg$silentFails === 0) { peg$fail(peg$e78); }
2899
2950
  }
2900
2951
 
2901
2952
  return s0;
@@ -2908,11 +2959,11 @@ function peg$parse(input, options) {
2908
2959
  s0 = peg$currPos;
2909
2960
  s1 = peg$parsetemplateDocumentContents();
2910
2961
  peg$savedPos = s0;
2911
- s1 = peg$f37(s1);
2962
+ s1 = peg$f38(s1);
2912
2963
  s0 = s1;
2913
2964
  peg$silentFails--;
2914
2965
  s1 = peg$FAILED;
2915
- if (peg$silentFails === 0) { peg$fail(peg$e78); }
2966
+ if (peg$silentFails === 0) { peg$fail(peg$e79); }
2916
2967
 
2917
2968
  return s0;
2918
2969
  }
@@ -2928,7 +2979,7 @@ function peg$parse(input, options) {
2928
2979
  peg$currPos += 2;
2929
2980
  } else {
2930
2981
  s2 = peg$FAILED;
2931
- if (peg$silentFails === 0) { peg$fail(peg$e79); }
2982
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
2932
2983
  }
2933
2984
  peg$silentFails--;
2934
2985
  if (s2 === peg$FAILED) {
@@ -2970,7 +3021,7 @@ function peg$parse(input, options) {
2970
3021
  }
2971
3022
  }
2972
3023
  peg$savedPos = s0;
2973
- s1 = peg$f38(s1);
3024
+ s1 = peg$f39(s1);
2974
3025
  s0 = s1;
2975
3026
 
2976
3027
  return s0;
@@ -2993,13 +3044,13 @@ function peg$parse(input, options) {
2993
3044
  }
2994
3045
  if (s1 !== peg$FAILED) {
2995
3046
  peg$savedPos = s0;
2996
- s1 = peg$f39(s1);
3047
+ s1 = peg$f40(s1);
2997
3048
  }
2998
3049
  s0 = s1;
2999
3050
  peg$silentFails--;
3000
3051
  if (s0 === peg$FAILED) {
3001
3052
  s1 = peg$FAILED;
3002
- if (peg$silentFails === 0) { peg$fail(peg$e80); }
3053
+ if (peg$silentFails === 0) { peg$fail(peg$e81); }
3003
3054
  }
3004
3055
 
3005
3056
  return s0;
@@ -3015,7 +3066,7 @@ function peg$parse(input, options) {
3015
3066
  peg$currPos++;
3016
3067
  } else {
3017
3068
  s1 = peg$FAILED;
3018
- if (peg$silentFails === 0) { peg$fail(peg$e82); }
3069
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
3019
3070
  }
3020
3071
  if (s1 !== peg$FAILED) {
3021
3072
  s2 = peg$parsetemplateLiteralContents();
@@ -3024,7 +3075,7 @@ function peg$parse(input, options) {
3024
3075
  peg$currPos++;
3025
3076
  } else {
3026
3077
  s3 = peg$FAILED;
3027
- if (peg$silentFails === 0) { peg$fail(peg$e82); }
3078
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
3028
3079
  }
3029
3080
  if (s3 !== peg$FAILED) {
3030
3081
  s0 = s2;
@@ -3039,7 +3090,7 @@ function peg$parse(input, options) {
3039
3090
  peg$silentFails--;
3040
3091
  if (s0 === peg$FAILED) {
3041
3092
  s1 = peg$FAILED;
3042
- if (peg$silentFails === 0) { peg$fail(peg$e81); }
3093
+ if (peg$silentFails === 0) { peg$fail(peg$e82); }
3043
3094
  }
3044
3095
 
3045
3096
  return s0;
@@ -3056,7 +3107,7 @@ function peg$parse(input, options) {
3056
3107
  peg$currPos++;
3057
3108
  } else {
3058
3109
  s2 = peg$FAILED;
3059
- if (peg$silentFails === 0) { peg$fail(peg$e82); }
3110
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
3060
3111
  }
3061
3112
  if (s2 === peg$FAILED) {
3062
3113
  if (input.substr(peg$currPos, 2) === peg$c38) {
@@ -3064,7 +3115,7 @@ function peg$parse(input, options) {
3064
3115
  peg$currPos += 2;
3065
3116
  } else {
3066
3117
  s2 = peg$FAILED;
3067
- if (peg$silentFails === 0) { peg$fail(peg$e79); }
3118
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
3068
3119
  }
3069
3120
  }
3070
3121
  peg$silentFails--;
@@ -3107,7 +3158,7 @@ function peg$parse(input, options) {
3107
3158
  }
3108
3159
  }
3109
3160
  peg$savedPos = s0;
3110
- s1 = peg$f40(s1);
3161
+ s1 = peg$f41(s1);
3111
3162
  s0 = s1;
3112
3163
 
3113
3164
  return s0;
@@ -3129,7 +3180,7 @@ function peg$parse(input, options) {
3129
3180
  }
3130
3181
  if (s1 !== peg$FAILED) {
3131
3182
  peg$savedPos = s0;
3132
- s1 = peg$f41(s1);
3183
+ s1 = peg$f42(s1);
3133
3184
  }
3134
3185
  s0 = s1;
3135
3186
 
@@ -3146,7 +3197,7 @@ function peg$parse(input, options) {
3146
3197
  peg$currPos += 2;
3147
3198
  } else {
3148
3199
  s1 = peg$FAILED;
3149
- if (peg$silentFails === 0) { peg$fail(peg$e79); }
3200
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
3150
3201
  }
3151
3202
  if (s1 !== peg$FAILED) {
3152
3203
  s2 = peg$parse__();
@@ -3177,7 +3228,7 @@ function peg$parse(input, options) {
3177
3228
  peg$silentFails--;
3178
3229
  if (s0 === peg$FAILED) {
3179
3230
  s1 = peg$FAILED;
3180
- if (peg$silentFails === 0) { peg$fail(peg$e83); }
3231
+ if (peg$silentFails === 0) { peg$fail(peg$e84); }
3181
3232
  }
3182
3233
 
3183
3234
  return s0;
@@ -3299,6 +3350,7 @@ const peg$allowedStartRules = [
3299
3350
  "objectEntry",
3300
3351
  "objectGetter",
3301
3352
  "objectIdentifier",
3353
+ "objectKey",
3302
3354
  "objectProperty",
3303
3355
  "parameterizedLambda",
3304
3356
  "parensArgs",
@@ -23,10 +23,10 @@ export default async function expressionObject(entries, parent) {
23
23
  // Create the object and set its parent
24
24
  const object = {};
25
25
  Object.defineProperty(object, symbols.parent, {
26
- value: parent,
27
- writable: true,
28
26
  configurable: true,
29
27
  enumerable: false,
28
+ value: parent,
29
+ writable: true,
30
30
  });
31
31
 
32
32
  let tree;
@@ -50,9 +50,21 @@ export default async function expressionObject(entries, parent) {
50
50
  defineProperty = false;
51
51
  }
52
52
 
53
+ let enumerable = true;
54
+ if (key[0] === "(" && key[key.length - 1] === ")") {
55
+ key = key.slice(1, -1);
56
+ enumerable = false;
57
+ }
58
+
53
59
  if (defineProperty) {
54
60
  // Define simple property
55
- object[key] = value;
61
+ // object[key] = value;
62
+ Object.defineProperty(object, key, {
63
+ configurable: true,
64
+ enumerable,
65
+ value,
66
+ writable: true,
67
+ });
56
68
  } else {
57
69
  // Property getter
58
70
  let code;
@@ -81,7 +93,7 @@ export default async function expressionObject(entries, parent) {
81
93
 
82
94
  Object.defineProperty(object, key, {
83
95
  configurable: true,
84
- enumerable: true,
96
+ enumerable,
85
97
  get,
86
98
  });
87
99
  }
@@ -91,9 +103,11 @@ export default async function expressionObject(entries, parent) {
91
103
  // and overwrite the property getter with the actual value.
92
104
  for (const key of immediateProperties) {
93
105
  const value = await object[key];
106
+ // @ts-ignore Unclear why TS thinks `object` might be undefined here
107
+ const enumerable = Object.getOwnPropertyDescriptor(object, key).enumerable;
94
108
  Object.defineProperty(object, key, {
95
109
  configurable: true,
96
- enumerable: true,
110
+ enumerable,
97
111
  value,
98
112
  writable: true,
99
113
  });
@@ -308,6 +308,7 @@ describe("Origami parser", () => {
308
308
  [ops.object, ["a", 1]],
309
309
  [ops.scope, "b"],
310
310
  ]);
311
+ assertParse("object", "{ (a): 1 }", [ops.object, ["(a)", 1]]);
311
312
  });
312
313
 
313
314
  test("objectEntry", () => {
@@ -63,4 +63,14 @@ describe("expressionObject", () => {
63
63
  const json = await dataJson.unpack();
64
64
  assert.deepEqual(json, { a: 1 });
65
65
  });
66
+
67
+ test("a key declared with parentheses is not enumerable", async () => {
68
+ const entries = [
69
+ ["(hidden)", "shh"],
70
+ ["visible", "hey"],
71
+ ];
72
+ const object = await expressionObject(entries, null);
73
+ assert.deepEqual(Object.keys(object), ["visible"]);
74
+ assert.equal(object["hidden"], "shh");
75
+ });
66
76
  });