starlight-cli 1.0.22 → 1.0.23
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/dist/index.js +35 -18
- package/package.json +1 -1
- package/src/evaluator.js +34 -17
- package/src/starlight.js +1 -1
package/dist/index.js
CHANGED
|
@@ -1606,21 +1606,27 @@ evalImport(node, env) {
|
|
|
1606
1606
|
evalBinary(node, env) {
|
|
1607
1607
|
const l = this.evaluate(node.left, env);
|
|
1608
1608
|
const r = this.evaluate(node.right, env);
|
|
1609
|
+
|
|
1610
|
+
if (node.operator === 'SLASH' && r === 0) {
|
|
1611
|
+
throw new Error('Division by zero');
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1609
1614
|
switch (node.operator) {
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1615
|
+
case 'PLUS': return l + r;
|
|
1616
|
+
case 'MINUS': return l - r;
|
|
1617
|
+
case 'STAR': return l * r;
|
|
1618
|
+
case 'SLASH': return l / r;
|
|
1619
|
+
case 'MOD': return l % r;
|
|
1620
|
+
case 'EQEQ': return l === r;
|
|
1621
|
+
case 'NOTEQ': return l !== r;
|
|
1622
|
+
case 'LT': return l < r;
|
|
1623
|
+
case 'LTE': return l <= r;
|
|
1624
|
+
case 'GT': return l > r;
|
|
1625
|
+
case 'GTE': return l >= r;
|
|
1626
|
+
default: throw new Error(`Unknown binary operator ${node.operator}`);
|
|
1622
1627
|
}
|
|
1623
|
-
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1624
1630
|
|
|
1625
1631
|
evalLogical(node, env) {
|
|
1626
1632
|
const l = this.evaluate(node.left, env);
|
|
@@ -1701,9 +1707,18 @@ evalImport(node, env) {
|
|
|
1701
1707
|
evalIndex(node, env) {
|
|
1702
1708
|
const obj = this.evaluate(node.object, env);
|
|
1703
1709
|
const idx = this.evaluate(node.indexer, env);
|
|
1704
|
-
|
|
1710
|
+
|
|
1711
|
+
if (obj == null) throw new Error('Indexing null or undefined');
|
|
1712
|
+
if (Array.isArray(obj) && (idx < 0 || idx >= obj.length)) {
|
|
1713
|
+
throw new Error('Array index out of bounds');
|
|
1714
|
+
}
|
|
1715
|
+
if (typeof obj === 'object' && !(idx in obj)) {
|
|
1716
|
+
throw new Error(`Property '${idx}' does not exist`);
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1705
1719
|
return obj[idx];
|
|
1706
|
-
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1707
1722
|
|
|
1708
1723
|
evalObject(node, env) {
|
|
1709
1724
|
const out = {};
|
|
@@ -1713,9 +1728,11 @@ evalImport(node, env) {
|
|
|
1713
1728
|
|
|
1714
1729
|
evalMember(node, env) {
|
|
1715
1730
|
const obj = this.evaluate(node.object, env);
|
|
1716
|
-
if (obj == null) throw new Error('Member access of null
|
|
1731
|
+
if (obj == null) throw new Error('Member access of null or undefined');
|
|
1732
|
+
if (!(node.property in obj)) throw new Error(`Property '${node.property}' does not exist`);
|
|
1717
1733
|
return obj[node.property];
|
|
1718
|
-
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1719
1736
|
|
|
1720
1737
|
evalUpdate(node, env) {
|
|
1721
1738
|
const arg = node.argument;
|
|
@@ -2475,7 +2492,7 @@ const Lexer = __nccwpck_require__(211);
|
|
|
2475
2492
|
const Parser = __nccwpck_require__(222);
|
|
2476
2493
|
const Evaluator = __nccwpck_require__(112);
|
|
2477
2494
|
|
|
2478
|
-
const VERSION = '1.0.
|
|
2495
|
+
const VERSION = '1.0.23';
|
|
2479
2496
|
|
|
2480
2497
|
const COLOR = {
|
|
2481
2498
|
reset: '\x1b[0m',
|
package/package.json
CHANGED
package/src/evaluator.js
CHANGED
|
@@ -263,21 +263,27 @@ evalImport(node, env) {
|
|
|
263
263
|
evalBinary(node, env) {
|
|
264
264
|
const l = this.evaluate(node.left, env);
|
|
265
265
|
const r = this.evaluate(node.right, env);
|
|
266
|
+
|
|
267
|
+
if (node.operator === 'SLASH' && r === 0) {
|
|
268
|
+
throw new Error('Division by zero');
|
|
269
|
+
}
|
|
270
|
+
|
|
266
271
|
switch (node.operator) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
272
|
+
case 'PLUS': return l + r;
|
|
273
|
+
case 'MINUS': return l - r;
|
|
274
|
+
case 'STAR': return l * r;
|
|
275
|
+
case 'SLASH': return l / r;
|
|
276
|
+
case 'MOD': return l % r;
|
|
277
|
+
case 'EQEQ': return l === r;
|
|
278
|
+
case 'NOTEQ': return l !== r;
|
|
279
|
+
case 'LT': return l < r;
|
|
280
|
+
case 'LTE': return l <= r;
|
|
281
|
+
case 'GT': return l > r;
|
|
282
|
+
case 'GTE': return l >= r;
|
|
283
|
+
default: throw new Error(`Unknown binary operator ${node.operator}`);
|
|
279
284
|
}
|
|
280
|
-
|
|
285
|
+
}
|
|
286
|
+
|
|
281
287
|
|
|
282
288
|
evalLogical(node, env) {
|
|
283
289
|
const l = this.evaluate(node.left, env);
|
|
@@ -358,9 +364,18 @@ evalImport(node, env) {
|
|
|
358
364
|
evalIndex(node, env) {
|
|
359
365
|
const obj = this.evaluate(node.object, env);
|
|
360
366
|
const idx = this.evaluate(node.indexer, env);
|
|
361
|
-
|
|
367
|
+
|
|
368
|
+
if (obj == null) throw new Error('Indexing null or undefined');
|
|
369
|
+
if (Array.isArray(obj) && (idx < 0 || idx >= obj.length)) {
|
|
370
|
+
throw new Error('Array index out of bounds');
|
|
371
|
+
}
|
|
372
|
+
if (typeof obj === 'object' && !(idx in obj)) {
|
|
373
|
+
throw new Error(`Property '${idx}' does not exist`);
|
|
374
|
+
}
|
|
375
|
+
|
|
362
376
|
return obj[idx];
|
|
363
|
-
|
|
377
|
+
}
|
|
378
|
+
|
|
364
379
|
|
|
365
380
|
evalObject(node, env) {
|
|
366
381
|
const out = {};
|
|
@@ -370,9 +385,11 @@ evalImport(node, env) {
|
|
|
370
385
|
|
|
371
386
|
evalMember(node, env) {
|
|
372
387
|
const obj = this.evaluate(node.object, env);
|
|
373
|
-
if (obj == null) throw new Error('Member access of null
|
|
388
|
+
if (obj == null) throw new Error('Member access of null or undefined');
|
|
389
|
+
if (!(node.property in obj)) throw new Error(`Property '${node.property}' does not exist`);
|
|
374
390
|
return obj[node.property];
|
|
375
|
-
|
|
391
|
+
}
|
|
392
|
+
|
|
376
393
|
|
|
377
394
|
evalUpdate(node, env) {
|
|
378
395
|
const arg = node.argument;
|