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 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
- case 'PLUS': return l + r;
1611
- case 'MINUS': return l - r;
1612
- case 'STAR': return l * r;
1613
- case 'SLASH': return l / r;
1614
- case 'MOD': return l % r;
1615
- case 'EQEQ': return l === r;
1616
- case 'NOTEQ': return l !== r;
1617
- case 'LT': return l < r;
1618
- case 'LTE': return l <= r;
1619
- case 'GT': return l > r;
1620
- case 'GTE': return l >= r;
1621
- default: throw new Error(`Unknown binary operator ${node.operator}`);
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
- if (obj == null) throw new Error('Indexing null/undefined');
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/undefined');
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.22';
2495
+ const VERSION = '1.0.23';
2479
2496
 
2480
2497
  const COLOR = {
2481
2498
  reset: '\x1b[0m',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starlight-cli",
3
- "version": "1.0.22",
3
+ "version": "1.0.23",
4
4
  "description": "Starlight Programming Language CLI",
5
5
  "bin": {
6
6
  "starlight": "index.js"
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
- case 'PLUS': return l + r;
268
- case 'MINUS': return l - r;
269
- case 'STAR': return l * r;
270
- case 'SLASH': return l / r;
271
- case 'MOD': return l % r;
272
- case 'EQEQ': return l === r;
273
- case 'NOTEQ': return l !== r;
274
- case 'LT': return l < r;
275
- case 'LTE': return l <= r;
276
- case 'GT': return l > r;
277
- case 'GTE': return l >= r;
278
- default: throw new Error(`Unknown binary operator ${node.operator}`);
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
- if (obj == null) throw new Error('Indexing null/undefined');
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/undefined');
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;
package/src/starlight.js CHANGED
@@ -9,7 +9,7 @@ const Lexer = require('./lexer');
9
9
  const Parser = require('./parser');
10
10
  const Evaluator = require('./evaluator');
11
11
 
12
- const VERSION = '1.0.22';
12
+ const VERSION = '1.0.23';
13
13
 
14
14
  const COLOR = {
15
15
  reset: '\x1b[0m',