starlight-cli 1.0.24 → 1.0.26

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
@@ -1416,63 +1416,100 @@ class Evaluator {
1416
1416
  }
1417
1417
  return n;
1418
1418
  });
1419
+ this.global.define('fetch', async (url, options = {}) => {
1420
+ const res = await fetch(url, options);
1421
+ return {
1422
+ status: res.status,
1423
+ ok: res.ok,
1424
+ text: async () => await res.text(),
1425
+ json: async () => await res.json()
1426
+ };
1427
+ });
1428
+
1429
+ // GET request
1430
+ this.global.define('get', async (url) => {
1431
+ const res = await fetch(url);
1432
+ return await res.json();
1433
+ });
1434
+
1435
+ this.global.define('post', async (url, data) => {
1436
+ const res = await fetch(url, {
1437
+ method: 'POST',
1438
+ headers: { 'Content-Type': 'application/json' },
1439
+ body: JSON.stringify(data)
1440
+ });
1441
+ return await res.json();
1442
+ });
1419
1443
 
1444
+ this.global.define('sleep', async (ms) => {
1445
+ return new Promise(resolve => setTimeout(resolve, ms));
1446
+ });
1420
1447
  this.global.define('str', arg => {
1421
1448
  return String(arg);
1422
1449
  });
1423
1450
 
1424
1451
  }
1425
1452
 
1426
-
1427
- evaluate(node, env = this.global) {
1428
- switch (node.type) {
1429
- case 'Program': return this.evalProgram(node, env);
1430
- case 'BlockStatement': return this.evalBlock(node, new Environment(env));
1431
- case 'VarDeclaration': return this.evalVarDeclaration(node, env);
1432
- case 'AssignmentExpression': return this.evalAssignment(node, env);
1433
- case 'CompoundAssignment': return this.evalCompoundAssignment(node, env);
1434
- case 'SldeployStatement': return this.evalSldeploy(node, env);
1435
- case 'AskStatement': return this.evalAsk(node, env);
1436
- case 'DefineStatement': return this.evalDefine(node, env);
1437
- case 'ExpressionStatement': return this.evaluate(node.expression, env);
1438
- case 'BinaryExpression': return this.evalBinary(node, env);
1439
- case 'LogicalExpression': return this.evalLogical(node, env);
1440
- case 'UnaryExpression': return this.evalUnary(node, env);
1441
- case 'Literal': return node.value;
1442
- case 'Identifier': return env.get(node.name);
1443
- case 'IfStatement': return this.evalIf(node, env);
1444
- case 'WhileStatement': return this.evalWhile(node, env);
1445
- case 'ForStatement': return this.evalFor(node, env);
1446
- case 'BreakStatement': throw new BreakSignal();
1447
- case 'ContinueStatement': throw new ContinueSignal();
1448
- case 'ImportStatement': return this.evalImport(node, env);
1449
- case 'FunctionDeclaration': return this.evalFunctionDeclaration(node, env);
1450
- case 'CallExpression': return this.evalCall(node, env);
1451
- case 'ArrowFunctionExpression':
1452
- return this.evalArrowFunction(node, env);
1453
-
1454
- case 'ReturnStatement': {
1455
- const val = node.argument ? this.evaluate(node.argument, env) : null;
1456
- throw new ReturnValue(val);
1453
+ async evaluate(node, env = this.global) {
1454
+ switch (node.type) {
1455
+ case 'Program': return await this.evalProgram(node, env);
1456
+ case 'BlockStatement': return await this.evalBlock(node, new Environment(env));
1457
+ case 'VarDeclaration': return await this.evalVarDeclaration(node, env);
1458
+ case 'AssignmentExpression': return await this.evalAssignment(node, env);
1459
+ case 'CompoundAssignment': return await this.evalCompoundAssignment(node, env);
1460
+ case 'SldeployStatement': return await this.evalSldeploy(node, env);
1461
+ case 'AskStatement': return await this.evalAsk(node, env);
1462
+ case 'DefineStatement': return await this.evalDefine(node, env);
1463
+ case 'ExpressionStatement': return await this.evaluate(node.expression, env);
1464
+ case 'BinaryExpression': return await this.evalBinary(node, env);
1465
+ case 'LogicalExpression': return await this.evalLogical(node, env);
1466
+ case 'UnaryExpression': return await this.evalUnary(node, env);
1467
+ case 'Literal': return node.value;
1468
+ case 'Identifier': return env.get(node.name);
1469
+ case 'IfStatement': return await this.evalIf(node, env);
1470
+ case 'WhileStatement': return await this.evalWhile(node, env);
1471
+ case 'ForStatement': return await this.evalFor(node, env);
1472
+ case 'BreakStatement': throw new BreakSignal();
1473
+ case 'ContinueStatement': throw new ContinueSignal();
1474
+ case 'ImportStatement': return await this.evalImport(node, env);
1475
+ case 'FunctionDeclaration': return this.evalFunctionDeclaration(node, env);
1476
+ case 'CallExpression': return await this.evalCall(node, env);
1477
+ case 'ArrowFunctionExpression': return this.evalArrowFunction(node, env);
1478
+ case 'ReturnStatement': {
1479
+ const val = node.argument ? await this.evaluate(node.argument, env) : null;
1480
+ throw new ReturnValue(val);
1481
+ }
1482
+
1483
+ case 'ArrayExpression':
1484
+ return await Promise.all(node.elements.map(el => this.evaluate(el, env)));
1485
+ case 'IndexExpression': return await this.evalIndex(node, env);
1486
+ case 'ObjectExpression': {
1487
+ const out = {};
1488
+ for (const p of node.props) {
1489
+ out[p.key] = await this.evaluate(p.value, env);
1457
1490
  }
1458
- case 'ArrayExpression': return node.elements.map(el => this.evaluate(el, env));
1459
- case 'IndexExpression': return this.evalIndex(node, env);
1460
- case 'ObjectExpression': return this.evalObject(node, env);
1461
- case 'MemberExpression': return this.evalMember(node, env);
1462
- case 'UpdateExpression': return this.evalUpdate(node, env);
1463
- default:
1464
- throw new Error(`Unknown node type in evaluator: ${node.type}`);
1491
+ return out;
1492
+ }
1493
+ case 'MemberExpression': return await this.evalMember(node, env);
1494
+ case 'UpdateExpression': return await this.evalUpdate(node, env);
1495
+ case 'AwaitExpression': {
1496
+ const val = await this.evaluate(node.argument, env);
1497
+ return val;
1465
1498
  }
1499
+ default:
1500
+ throw new Error(`Unknown node type in evaluator: ${node.type}`);
1466
1501
  }
1502
+ }
1467
1503
 
1468
- evalProgram(node, env) {
1469
- let result = null;
1470
- for (const stmt of node.body) {
1471
- result = this.evaluate(stmt, env);
1472
- }
1473
- return result;
1504
+ async evalProgram(node, env) {
1505
+ let result = null;
1506
+ for (const stmt of node.body) {
1507
+ result = await this.evaluate(stmt, env);
1474
1508
  }
1475
- evalImport(node, env) {
1509
+ return result;
1510
+ }
1511
+
1512
+ async evalImport(node, env) {
1476
1513
  const spec = node.path;
1477
1514
  let lib;
1478
1515
 
@@ -1495,7 +1532,7 @@ evalImport(node, env) {
1495
1532
  const ast = new Parser(tokens).parse();
1496
1533
 
1497
1534
  const moduleEnv = new Environment(env);
1498
- this.evaluate(ast, moduleEnv);
1535
+ await this.evaluate(ast, moduleEnv);
1499
1536
 
1500
1537
  lib = {};
1501
1538
  for (const key of Object.keys(moduleEnv.store)) {
@@ -1523,262 +1560,268 @@ evalImport(node, env) {
1523
1560
  return null;
1524
1561
  }
1525
1562
 
1526
-
1527
- evalBlock(node, env) {
1528
- let result = null;
1529
- for (const stmt of node.body) {
1530
- try {
1531
- result = this.evaluate(stmt, env);
1532
- } catch (e) {
1533
- if (e instanceof ReturnValue || e instanceof BreakSignal || e instanceof ContinueSignal) throw e;
1534
- throw e;
1535
- }
1563
+ async evalBlock(node, env) {
1564
+ let result = null;
1565
+ for (const stmt of node.body) {
1566
+ try {
1567
+ result = await this.evaluate(stmt, env);
1568
+ } catch (e) {
1569
+ if (e instanceof ReturnValue || e instanceof BreakSignal || e instanceof ContinueSignal) throw e;
1570
+ throw e;
1536
1571
  }
1537
- return result;
1538
1572
  }
1573
+ return result;
1574
+ }
1575
+
1576
+ async evalVarDeclaration(node, env) {
1577
+ const val = await this.evaluate(node.expr, env);
1578
+ return env.define(node.id, val);
1579
+ }
1539
1580
 
1540
- evalVarDeclaration(node, env) {
1541
- const val = this.evaluate(node.expr, env);
1542
- return env.define(node.id, val);
1543
- }
1544
1581
  evalArrowFunction(node, env) {
1545
1582
  return {
1546
1583
  params: node.params,
1547
1584
  body: node.body,
1548
1585
  env: env,
1549
- arrow: true
1586
+ arrow: true,
1587
+ async: node.async || false
1550
1588
  };
1551
1589
  }
1552
1590
 
1553
- evalAssignment(node, env) {
1554
- const rightVal = this.evaluate(node.right, env);
1555
- const left = node.left;
1591
+ async evalAssignment(node, env) {
1592
+ const rightVal = await this.evaluate(node.right, env);
1593
+ const left = node.left;
1556
1594
 
1557
- if (left.type === 'Identifier') return env.set(left.name, rightVal);
1558
- if (left.type === 'MemberExpression') {
1559
- const obj = this.evaluate(left.object, env);
1560
- obj[left.property] = rightVal;
1561
- return rightVal;
1562
- }
1563
- if (left.type === 'IndexExpression') {
1564
- const obj = this.evaluate(left.object, env);
1565
- const idx = this.evaluate(left.indexer, env);
1566
- obj[idx] = rightVal;
1567
- return rightVal;
1568
- }
1595
+ if (left.type === 'Identifier') return env.set(left.name, rightVal);
1596
+ if (left.type === 'MemberExpression') {
1597
+ const obj = await this.evaluate(left.object, env);
1598
+ obj[left.property] = rightVal;
1599
+ return rightVal;
1600
+ }
1601
+ if (left.type === 'IndexExpression') {
1602
+ const obj = await this.evaluate(left.object, env);
1603
+ const idx = await this.evaluate(left.indexer, env);
1604
+ obj[idx] = rightVal;
1605
+ return rightVal;
1606
+ }
1607
+
1608
+ throw new Error('Invalid assignment target');
1609
+ }
1569
1610
 
1570
- throw new Error('Invalid assignment target');
1611
+ async evalCompoundAssignment(node, env) {
1612
+ const left = node.left;
1613
+ let current;
1614
+
1615
+ if (left.type === 'Identifier') current = env.get(left.name);
1616
+ else if (left.type === 'MemberExpression') current = await this.evalMember(left, env);
1617
+ else if (left.type === 'IndexExpression') current = await this.evalIndex(left, env);
1618
+ else throw new Error('Invalid compound assignment target');
1619
+
1620
+ const rhs = await this.evaluate(node.right, env);
1621
+ let computed;
1622
+ switch (node.operator) {
1623
+ case 'PLUSEQ': computed = current + rhs; break;
1624
+ case 'MINUSEQ': computed = current - rhs; break;
1625
+ case 'STAREQ': computed = current * rhs; break;
1626
+ case 'SLASHEQ': computed = current / rhs; break;
1627
+ case 'MODEQ': computed = current % rhs; break;
1628
+ default: throw new Error('Unknown compound operator');
1571
1629
  }
1572
1630
 
1573
- evalCompoundAssignment(node, env) {
1574
- const left = node.left;
1575
- let current;
1631
+ if (left.type === 'Identifier') env.set(left.name, computed);
1632
+ else if (left.type === 'MemberExpression') await this.evalAssignment({ left, right: { type: 'Literal', value: computed }, type: 'AssignmentExpression' }, env);
1633
+ else await this.evalAssignment({ left, right: { type: 'Literal', value: computed }, type: 'AssignmentExpression' }, env);
1576
1634
 
1577
- if (left.type === 'Identifier') current = env.get(left.name);
1578
- else if (left.type === 'MemberExpression') current = this.evalMember(left, env);
1579
- else if (left.type === 'IndexExpression') current = this.evalIndex(left, env);
1580
- else throw new Error('Invalid compound assignment target');
1635
+ return computed;
1636
+ }
1581
1637
 
1582
- const rhs = this.evaluate(node.right, env);
1583
- let computed;
1584
- switch (node.operator) {
1585
- case 'PLUSEQ': computed = current + rhs; break;
1586
- case 'MINUSEQ': computed = current - rhs; break;
1587
- case 'STAREQ': computed = current * rhs; break;
1588
- case 'SLASHEQ': computed = current / rhs; break;
1589
- case 'MODEQ': computed = current % rhs; break;
1590
- default: throw new Error('Unknown compound operator');
1591
- }
1638
+ async evalSldeploy(node, env) {
1639
+ const val = await this.evaluate(node.expr, env);
1640
+ console.log(val);
1641
+ return val;
1642
+ }
1643
+
1644
+ async evalAsk(node, env) {
1645
+ const prompt = await this.evaluate(node.prompt, env);
1646
+ const input = readlineSync.question(prompt + ' ');
1647
+ return input;
1648
+ }
1592
1649
 
1593
- if (left.type === 'Identifier') env.set(left.name, computed);
1594
- else if (left.type === 'MemberExpression') this.evalAssignment({ left, right: { type: 'Literal', value: computed }, type: 'AssignmentExpression' }, env);
1595
- else this.evalAssignment({ left, right: { type: 'Literal', value: computed }, type: 'AssignmentExpression' }, env);
1650
+ async evalDefine(node, env) {
1651
+ const val = node.expr ? await this.evaluate(node.expr, env) : null;
1652
+ return this.global.define(node.id, val);
1653
+ }
1596
1654
 
1597
- return computed;
1598
- }
1655
+ async evalBinary(node, env) {
1656
+ const l = await this.evaluate(node.left, env);
1657
+ const r = await this.evaluate(node.right, env);
1599
1658
 
1600
- evalSldeploy(node, env) {
1601
- const val = this.evaluate(node.expr, env);
1602
- console.log(val);
1603
- return val;
1659
+ if (node.operator === 'SLASH' && r === 0) {
1660
+ throw new Error('Division by zero');
1604
1661
  }
1605
1662
 
1606
- evalAsk(node, env) {
1607
- const prompt = this.evaluate(node.prompt, env);
1608
- const input = readlineSync.question(prompt + ' ');
1609
- return input;
1663
+ switch (node.operator) {
1664
+ case 'PLUS': return l + r;
1665
+ case 'MINUS': return l - r;
1666
+ case 'STAR': return l * r;
1667
+ case 'SLASH': return l / r;
1668
+ case 'MOD': return l % r;
1669
+ case 'EQEQ': return l === r;
1670
+ case 'NOTEQ': return l !== r;
1671
+ case 'LT': return l < r;
1672
+ case 'LTE': return l <= r;
1673
+ case 'GT': return l > r;
1674
+ case 'GTE': return l >= r;
1675
+ default: throw new Error(`Unknown binary operator ${node.operator}`);
1610
1676
  }
1677
+ }
1678
+
1679
+ async evalLogical(node, env) {
1680
+ const l = await this.evaluate(node.left, env);
1681
+ if (node.operator === 'AND') return l && await this.evaluate(node.right, env);
1682
+ if (node.operator === 'OR') return l || await this.evaluate(node.right, env);
1683
+ throw new Error(`Unknown logical operator ${node.operator}`);
1684
+ }
1611
1685
 
1612
- evalDefine(node, env) {
1613
- const val = node.expr ? this.evaluate(node.expr, env) : null;
1614
- return this.global.define(node.id, val);
1686
+ async evalUnary(node, env) {
1687
+ const val = await this.evaluate(node.argument, env);
1688
+ switch (node.operator) {
1689
+ case 'NOT': return !val;
1690
+ case 'MINUS': return -val;
1691
+ case 'PLUS': return +val;
1692
+ default: throw new Error(`Unknown unary operator ${node.operator}`);
1615
1693
  }
1694
+ }
1616
1695
 
1617
- evalBinary(node, env) {
1618
- const l = this.evaluate(node.left, env);
1619
- const r = this.evaluate(node.right, env);
1696
+ async evalIf(node, env) {
1697
+ const test = await this.evaluate(node.test, env);
1698
+ if (test) return await this.evaluate(node.consequent, env);
1699
+ if (node.alternate) return await this.evaluate(node.alternate, env);
1700
+ return null;
1701
+ }
1620
1702
 
1621
- if (node.operator === 'SLASH' && r === 0) {
1622
- throw new Error('Division by zero');
1703
+ async evalWhile(node, env) {
1704
+ while (await this.evaluate(node.test, env)) {
1705
+ try { await this.evaluate(node.body, env); }
1706
+ catch (e) {
1707
+ if (e instanceof BreakSignal) break;
1708
+ if (e instanceof ContinueSignal) continue;
1709
+ throw e;
1623
1710
  }
1711
+ }
1712
+ return null;
1713
+ }
1624
1714
 
1625
- switch (node.operator) {
1626
- case 'PLUS': return l + r;
1627
- case 'MINUS': return l - r;
1628
- case 'STAR': return l * r;
1629
- case 'SLASH': return l / r;
1630
- case 'MOD': return l % r;
1631
- case 'EQEQ': return l === r;
1632
- case 'NOTEQ': return l !== r;
1633
- case 'LT': return l < r;
1634
- case 'LTE': return l <= r;
1635
- case 'GT': return l > r;
1636
- case 'GTE': return l >= r;
1637
- default: throw new Error(`Unknown binary operator ${node.operator}`);
1715
+ async evalFor(node, env) {
1716
+ const local = new Environment(env);
1717
+ if (node.init) await this.evaluate(node.init, local);
1718
+ while (!node.test || await this.evaluate(node.test, local)) {
1719
+ try { await this.evaluate(node.body, local); }
1720
+ catch (e) {
1721
+ if (e instanceof BreakSignal) break;
1722
+ if (e instanceof ContinueSignal) {
1723
+ if (node.update) await this.evaluate(node.update, local);
1724
+ continue;
1725
+ }
1726
+ throw e;
1638
1727
  }
1728
+ if (node.update) await this.evaluate(node.update, local);
1729
+ }
1730
+ return null;
1639
1731
  }
1640
1732
 
1733
+ evalFunctionDeclaration(node, env) {
1734
+ const fn = { params: node.params, body: node.body, env, async: node.async || false };
1735
+ env.define(node.name, fn);
1736
+ return null;
1737
+ }
1641
1738
 
1642
- evalLogical(node, env) {
1643
- const l = this.evaluate(node.left, env);
1644
- if (node.operator === 'AND') return l && this.evaluate(node.right, env);
1645
- if (node.operator === 'OR') return l || this.evaluate(node.right, env);
1646
- throw new Error(`Unknown logical operator ${node.operator}`);
1739
+ async evalCall(node, env) {
1740
+ const calleeEvaluated = await this.evaluate(node.callee, env);
1741
+ if (typeof calleeEvaluated === 'function') {
1742
+ const args = [];
1743
+ for (const a of node.arguments) args.push(await this.evaluate(a, env));
1744
+ return calleeEvaluated(...args);
1647
1745
  }
1648
-
1649
- evalUnary(node, env) {
1650
- const val = this.evaluate(node.argument, env);
1651
- switch (node.operator) {
1652
- case 'NOT': return !val;
1653
- case 'MINUS': return -val;
1654
- case 'PLUS': return +val;
1655
- default: throw new Error(`Unknown unary operator ${node.operator}`);
1656
- }
1746
+ if (!calleeEvaluated || typeof calleeEvaluated !== 'object' || !calleeEvaluated.body) {
1747
+ throw new Error('Call to non-function');
1657
1748
  }
1658
1749
 
1659
- evalIf(node, env) {
1660
- const test = this.evaluate(node.test, env);
1661
- if (test) return this.evaluate(node.consequent, env);
1662
- if (node.alternate) return this.evaluate(node.alternate, env);
1663
- return null;
1664
- }
1750
+ const fn = calleeEvaluated;
1751
+ const callEnv = new Environment(fn.env);
1665
1752
 
1666
- evalWhile(node, env) {
1667
- while (this.evaluate(node.test, env)) {
1668
- try { this.evaluate(node.body, env); }
1669
- catch (e) {
1670
- if (e instanceof BreakSignal) break;
1671
- if (e instanceof ContinueSignal) continue;
1672
- throw e;
1673
- }
1674
- }
1675
- return null;
1676
- }
1677
-
1678
- evalFor(node, env) {
1679
- const local = new Environment(env);
1680
- if (node.init) this.evaluate(node.init, local);
1681
- while (!node.test || this.evaluate(node.test, local)) {
1682
- try { this.evaluate(node.body, local); }
1683
- catch (e) {
1684
- if (e instanceof BreakSignal) break;
1685
- if (e instanceof ContinueSignal) { if (node.update) this.evaluate(node.update, local); continue; }
1686
- throw e;
1687
- }
1688
- if (node.update) this.evaluate(node.update, local);
1689
- }
1690
- return null;
1753
+ for (let i = 0; i < fn.params.length; i++) {
1754
+ const argVal = node.arguments[i] ? await this.evaluate(node.arguments[i], env) : null;
1755
+ callEnv.define(fn.params[i], argVal);
1691
1756
  }
1692
1757
 
1693
- evalFunctionDeclaration(node, env) {
1694
- const fn = { params: node.params, body: node.body, env };
1695
- env.define(node.name, fn);
1696
- return null;
1758
+ try {
1759
+ const result = await this.evaluate(fn.body, callEnv);
1760
+ return fn.arrow ? result : result;
1761
+ } catch (e) {
1762
+ if (e instanceof ReturnValue) return e.value;
1763
+ throw e;
1697
1764
  }
1698
-
1699
- evalCall(node, env) {
1700
- const calleeEvaluated = this.evaluate(node.callee, env);
1701
- if (typeof calleeEvaluated === 'function') {
1702
- const args = node.arguments.map(a => this.evaluate(a, env));
1703
- return calleeEvaluated(...args);
1704
- }
1705
- if (!calleeEvaluated || typeof calleeEvaluated !== 'object' || !calleeEvaluated.body) {
1706
- throw new Error('Call to non-function');
1707
- }
1708
- const fn = calleeEvaluated;
1709
- const callEnv = new Environment(fn.env);
1710
- fn.params.forEach((p, i) => {
1711
- const argVal = node.arguments[i] ? this.evaluate(node.arguments[i], env) : null;
1712
- callEnv.define(p, argVal);
1713
- });
1714
- try {
1715
- const result = this.evaluate(fn.body, callEnv);
1716
- return fn.arrow ? result : result;
1717
- } catch (e) {
1718
- if (e instanceof ReturnValue) return e.value;
1719
- throw e;
1720
1765
  }
1721
1766
 
1767
+ async evalIndex(node, env) {
1768
+ const obj = await this.evaluate(node.object, env);
1769
+ const idx = await this.evaluate(node.indexer, env);
1770
+
1771
+ if (obj == null) throw new Error('Indexing null or undefined');
1772
+ if (Array.isArray(obj) && (idx < 0 || idx >= obj.length)) {
1773
+ throw new Error('Array index out of bounds');
1774
+ }
1775
+ if (typeof obj === 'object' && !(idx in obj)) {
1776
+ throw new Error(`Property '${idx}' does not exist`);
1722
1777
  }
1723
1778
 
1724
- evalIndex(node, env) {
1725
- const obj = this.evaluate(node.object, env);
1726
- const idx = this.evaluate(node.indexer, env);
1779
+ return obj[idx];
1780
+ }
1727
1781
 
1728
- if (obj == null) throw new Error('Indexing null or undefined');
1729
- if (Array.isArray(obj) && (idx < 0 || idx >= obj.length)) {
1730
- throw new Error('Array index out of bounds');
1731
- }
1732
- if (typeof obj === 'object' && !(idx in obj)) {
1733
- throw new Error(`Property '${idx}' does not exist`);
1734
- }
1782
+ async evalObject(node, env) {
1783
+ const out = {};
1784
+ for (const p of node.props) out[p.key] = await this.evaluate(p.value, env);
1785
+ return out;
1786
+ }
1735
1787
 
1736
- return obj[idx];
1788
+ async evalMember(node, env) {
1789
+ const obj = await this.evaluate(node.object, env);
1790
+ if (obj == null) throw new Error('Member access of null or undefined');
1791
+ if (!(node.property in obj)) throw new Error(`Property '${node.property}' does not exist`);
1792
+ return obj[node.property];
1737
1793
  }
1738
1794
 
1795
+ async evalUpdate(node, env) {
1796
+ const arg = node.argument;
1797
+ const getCurrent = async () => {
1798
+ if (arg.type === 'Identifier') return env.get(arg.name);
1799
+ if (arg.type === 'MemberExpression') return await this.evalMember(arg, env);
1800
+ if (arg.type === 'IndexExpression') return await this.evalIndex(arg, env);
1801
+ throw new Error('Invalid update target');
1802
+ };
1803
+ const setValue = async (v) => {
1804
+ if (arg.type === 'Identifier') env.set(arg.name, v);
1805
+ else if (arg.type === 'MemberExpression') {
1806
+ const obj = await this.evaluate(arg.object, env);
1807
+ obj[arg.property] = v;
1808
+ } else if (arg.type === 'IndexExpression') {
1809
+ const obj = await this.evaluate(arg.object, env);
1810
+ const idx = await this.evaluate(arg.indexer, env);
1811
+ obj[idx] = v;
1812
+ }
1813
+ };
1739
1814
 
1740
- evalObject(node, env) {
1741
- const out = {};
1742
- for (const p of node.props) out[p.key] = this.evaluate(p.value, env);
1743
- return out;
1744
- }
1815
+ const current = await getCurrent();
1816
+ const newVal = (node.operator === 'PLUSPLUS') ? current + 1 : current - 1;
1745
1817
 
1746
- evalMember(node, env) {
1747
- const obj = this.evaluate(node.object, env);
1748
- if (obj == null) throw new Error('Member access of null or undefined');
1749
- if (!(node.property in obj)) throw new Error(`Property '${node.property}' does not exist`);
1750
- return obj[node.property];
1818
+ if (node.prefix) { await setValue(newVal); return newVal; }
1819
+ else { await setValue(newVal); return current; }
1751
1820
  }
1752
1821
 
1753
-
1754
- evalUpdate(node, env) {
1755
- const arg = node.argument;
1756
- const getCurrent = () => {
1757
- if (arg.type === 'Identifier') return env.get(arg.name);
1758
- if (arg.type === 'MemberExpression') return this.evalMember(arg, env);
1759
- if (arg.type === 'IndexExpression') return this.evalIndex(arg, env);
1760
- throw new Error('Invalid update target');
1761
- };
1762
- const setValue = (v) => {
1763
- if (arg.type === 'Identifier') env.set(arg.name, v);
1764
- else if (arg.type === 'MemberExpression') {
1765
- const obj = this.evaluate(arg.object, env);
1766
- obj[arg.property] = v;
1767
- }
1768
- else if (arg.type === 'IndexExpression') {
1769
- const obj = this.evaluate(arg.object, env);
1770
- const idx = this.evaluate(arg.indexer, env);
1771
- obj[idx] = v;
1772
- }
1773
- };
1774
- const current = getCurrent();
1775
- const newVal = (node.operator === 'PLUSPLUS') ? current + 1 : current - 1;
1776
- if (node.prefix) { setValue(newVal); return newVal; }
1777
- else { setValue(newVal); return current; }
1778
- }
1779
1822
  }
1780
1823
 
1781
- module.exports = Evaluator;
1824
+ module.exports = Evaluator;
1782
1825
 
1783
1826
  /***/ }),
1784
1827
 
@@ -1866,10 +1909,13 @@ class Lexer {
1866
1909
  }
1867
1910
 
1868
1911
  const keywords = [
1869
- 'let', 'sldeploy', 'if', 'else', 'while', 'for',
1870
- 'break', 'continue', 'func', 'return', 'true', 'false', 'null',
1871
- 'ask', 'define', 'import', 'from', 'as'
1872
- ];
1912
+ 'let', 'sldeploy', 'if', 'else', 'while', 'for',
1913
+ 'break', 'continue', 'func', 'return',
1914
+ 'true', 'false', 'null',
1915
+ 'ask', 'define', 'import', 'from', 'as',
1916
+ 'async', 'await'
1917
+ ];
1918
+
1873
1919
 
1874
1920
  if (keywords.includes(result)) {
1875
1921
  return { type: result.toUpperCase(), value: result, line: startLine, column: startCol };
@@ -2009,6 +2055,11 @@ class Parser {
2009
2055
  }
2010
2056
 
2011
2057
  statement() {
2058
+ if (this.current.type === 'ASYNC' && this.peekType() === 'FUNC') {
2059
+ this.eat('ASYNC');
2060
+ this.eat('FUNC');
2061
+ return this.asyncFuncDeclaration();
2062
+ }
2012
2063
  switch (this.current.type) {
2013
2064
  case 'LET': return this.varDeclaration();
2014
2065
  case 'SLDEPLOY': return this.sldeployStatement();
@@ -2056,6 +2107,24 @@ class Parser {
2056
2107
  if (this.current.type === 'SEMICOLON') this.eat('SEMICOLON');
2057
2108
  return { type: 'DefineStatement', id, expr };
2058
2109
  }
2110
+ asyncFuncDeclaration() {
2111
+ const name = this.current.value;
2112
+ this.eat('IDENTIFIER');
2113
+ this.eat('LPAREN');
2114
+ const params = [];
2115
+ if (this.current.type !== 'RPAREN') {
2116
+ params.push(this.current.value);
2117
+ this.eat('IDENTIFIER');
2118
+ while (this.current.type === 'COMMA') {
2119
+ this.eat('COMMA');
2120
+ params.push(this.current.value);
2121
+ this.eat('IDENTIFIER');
2122
+ }
2123
+ }
2124
+ this.eat('RPAREN');
2125
+ const body = this.block();
2126
+ return { type: 'FunctionDeclaration', name, params, body, async: true };
2127
+ }
2059
2128
 
2060
2129
  ifStatement() {
2061
2130
  this.eat('IF');
@@ -2364,7 +2433,11 @@ arrowFunction(params) {
2364
2433
  if (t.type === 'TRUE') { this.eat('TRUE'); return { type: 'Literal', value: true }; }
2365
2434
  if (t.type === 'FALSE') { this.eat('FALSE'); return { type: 'Literal', value: false }; }
2366
2435
  if (t.type === 'NULL') { this.eat('NULL'); return { type: 'Literal', value: null }; }
2367
-
2436
+ if (t.type === 'AWAIT') {
2437
+ this.eat('AWAIT');
2438
+ const argument = this.expression();
2439
+ return { type: 'AwaitExpression', argument };
2440
+ }
2368
2441
  if (t.type === 'ASK') {
2369
2442
  this.eat('ASK');
2370
2443
  this.eat('LPAREN');
@@ -2560,7 +2633,7 @@ const Lexer = __nccwpck_require__(211);
2560
2633
  const Parser = __nccwpck_require__(222);
2561
2634
  const Evaluator = __nccwpck_require__(112);
2562
2635
 
2563
- const VERSION = '1.0.24';
2636
+ const VERSION = '1.0.26';
2564
2637
 
2565
2638
  const COLOR = {
2566
2639
  reset: '\x1b[0m',