@bablr/agast-helpers 0.11.0 → 0.11.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/lib/builders.js CHANGED
@@ -402,6 +402,8 @@ export const parseObject = (input) => {
402
402
 
403
403
  obj[key] = value;
404
404
 
405
+ while (chr === ' ') chr = str[++p.idx];
406
+
405
407
  sep = chr === ',' ? chr : null;
406
408
  if (sep) {
407
409
  chr = str[++p.idx];
@@ -429,13 +431,23 @@ export const parseArray = (input) => {
429
431
  chr = str[++p.idx];
430
432
  }
431
433
 
432
- let value = parseExpression(p);
433
- chr = str[p.idx];
434
+ let first = true;
435
+ while (first || chr === ',') {
436
+ if (!first && chr === ',') {
437
+ chr = str[++p.idx];
438
+ while (chr === ' ') {
439
+ chr = str[++p.idx];
440
+ }
441
+ }
442
+ let value = parseExpression(p);
443
+ chr = str[p.idx];
434
444
 
435
- arr.push(value);
445
+ arr.push(value);
436
446
 
437
- while (chr === ' ') {
438
- chr = str[++p.idx];
447
+ while (chr === ' ') {
448
+ chr = str[++p.idx];
449
+ }
450
+ first = false;
439
451
  }
440
452
 
441
453
  if (chr !== ']') throw new Error();
@@ -473,12 +485,31 @@ export const parseString = (input) => {
473
485
  return result.join('');
474
486
  };
475
487
 
488
+ export const parseDigits = (input) => {
489
+ let p = buildParser(input);
490
+ let { str } = p;
491
+ let chr = str[p.idx];
492
+ let digits = [];
493
+
494
+ while (chr >= '0' && chr <= '9') {
495
+ digits.push(chr);
496
+ chr = str[++p.idx];
497
+ }
498
+
499
+ return parseInt(digits.join(''), 10);
500
+ };
501
+
476
502
  export const parseUnsignedInteger = (input) => {
477
503
  let p = buildParser(input);
478
504
  let { str } = p;
479
505
  let chr = str[p.idx];
480
506
  let digits = [];
481
507
 
508
+ if (chr === '0') {
509
+ chr = str[++p.idx];
510
+ return 0;
511
+ }
512
+
482
513
  while (chr >= '0' && chr <= '9') {
483
514
  digits.push(chr);
484
515
  chr = str[++p.idx];
@@ -487,6 +518,58 @@ export const parseUnsignedInteger = (input) => {
487
518
  return parseInt(digits.join(''), 10);
488
519
  };
489
520
 
521
+ export const parseInteger = (input) => {
522
+ let p = buildParser(input);
523
+ let { str } = p;
524
+ let chr = str[p.idx];
525
+ let negative = false;
526
+
527
+ if (chr === '-') {
528
+ negative = true;
529
+ chr = str[++p.idx];
530
+ }
531
+
532
+ return parseUnsignedInteger(p) * (negative ? -1 : 1);
533
+ };
534
+
535
+ export const parseNumber = (input) => {
536
+ let p = buildParser(input);
537
+ let { str } = p;
538
+ let chr = str[p.idx];
539
+ let startIdx = p.idx;
540
+
541
+ if (chr === '-') {
542
+ chr = str[++p.idx];
543
+ }
544
+
545
+ if (chr == '0') {
546
+ chr = str[++p.idx];
547
+ } else {
548
+ parseDigits(p);
549
+ chr = str[p.idx];
550
+ }
551
+
552
+ if (chr === '.') {
553
+ chr = str[++p.idx];
554
+ parseDigits(p);
555
+ chr = str[p.idx];
556
+ }
557
+
558
+ if (chr === 'e' || chr === 'E') {
559
+ chr = str[++p.idx];
560
+
561
+ if (chr === '+' || chr === '-') {
562
+ chr = str[++p.idx];
563
+ }
564
+
565
+ parseDigits(p);
566
+ }
567
+
568
+ let endIdx = p.idx;
569
+
570
+ return parseFloat(str.slice(startIdx, endIdx));
571
+ };
572
+
490
573
  export const parseEscape = (input) => {
491
574
  let p = buildParser(input);
492
575
  let { str } = p;
@@ -601,7 +684,7 @@ export const parseExpression = (input) => {
601
684
  p.idx += 9;
602
685
  return -Infinity;
603
686
  } else {
604
- throw new Error();
687
+ return parseNumber(p);
605
688
  }
606
689
  case '+':
607
690
  if (str[p.idx + 1] === 'I' && match(p, '+Infinity')) {
@@ -612,7 +695,7 @@ export const parseExpression = (input) => {
612
695
  }
613
696
  default:
614
697
  if (chr >= '0' && chr <= '9') {
615
- return parseUnsignedInteger(p);
698
+ return parseNumber(p);
616
699
  } else {
617
700
  throw new Error();
618
701
  }
package/lib/print.js CHANGED
@@ -13,20 +13,22 @@ import {
13
13
  StreamTag,
14
14
  } from './symbols.js';
15
15
  import { parseObject } from './builders.js';
16
+ import { arrayValues } from './iterable.js';
16
17
 
17
18
  let { isInteger, isFinite } = Number;
18
19
  let { isArray } = Array;
19
- let { freeze } = Object;
20
+ let { freeze, entries } = Object;
20
21
  let isString = (val) => typeof val === 'string';
21
22
  let isNumber = (val) => typeof val === 'number';
22
23
  let isObject = (val) => val && typeof val === 'object' && !isArray(val);
23
24
 
24
- export const printArray = (arr) => `[${arr.map((v) => printExpression(v)).join(', ')}]`;
25
+ export const printArray = (arr) =>
26
+ `[${[...arrayValues(arr)].map((v) => printExpression(v)).join(', ')}]`;
25
27
 
26
28
  export const printObject = (obj) => {
27
- let entries = Object.entries(obj);
28
- return entries.length
29
- ? `{ ${entries.map(([k, v]) => `${k}: ${printExpression(v)}`).join(', ')} }`
29
+ let entries_ = entries(obj);
30
+ return entries_.length
31
+ ? `{ ${entries_.map(([k, v]) => `${k}: ${printExpression(v)}`).join(', ')} }`
30
32
  : '{}';
31
33
  };
32
34
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bablr/agast-helpers",
3
3
  "description": "Helper functions for working with agAST trees",
4
- "version": "0.11.0",
4
+ "version": "0.11.1",
5
5
  "author": "Conrad Buck<conartist6@gmail.com>",
6
6
  "type": "module",
7
7
  "files": [