@weave-framework/cli 0.2.0 → 0.2.53

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.
Files changed (2) hide show
  1. package/dist/cli.js +187 -58
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -411,13 +411,7 @@ var Parser = class {
411
411
  return this.src[this.pos];
412
412
  }
413
413
  readInterp() {
414
- this.pos += 2;
415
- const start = this.pos;
416
- const end = this.src.indexOf("}}", this.pos);
417
- if (end === -1) throw new ParseError("Unclosed {{ interpolation");
418
- this.pos = end + 2;
419
- const raw = this.src.slice(start, end);
420
- return { expr: raw.trim(), offset: start + (raw.length - raw.trimStart().length) };
414
+ return this.readDoubleBracedExpr();
421
415
  }
422
416
  skipComment() {
423
417
  const end = this.src.indexOf("-->", this.pos);
@@ -684,12 +678,63 @@ function rewrite(expr, scope, ctxRef = "ctx") {
684
678
  };
685
679
  while (i < n) {
686
680
  const c = expr[i];
687
- if (c === '"' || c === "'" || c === "`") {
681
+ if (c === '"' || c === "'") {
688
682
  const end = scanString(expr, i);
689
683
  copy(i, expr.slice(i, end));
690
684
  i = end;
691
685
  continue;
692
686
  }
687
+ if (c === "`") {
688
+ copy(i, "`");
689
+ let k = i + 1;
690
+ while (k < n) {
691
+ const ch = expr[k];
692
+ if (ch === "\\") {
693
+ copy(k, expr.slice(k, k + 2));
694
+ k += 2;
695
+ continue;
696
+ }
697
+ if (ch === "`") {
698
+ copy(k, "`");
699
+ k++;
700
+ break;
701
+ }
702
+ if (ch === "$" && expr[k + 1] === "{") {
703
+ copy(k, "${");
704
+ k += 2;
705
+ const exprStart = k;
706
+ let depth = 1;
707
+ while (k < n && depth > 0) {
708
+ const mc = expr[k];
709
+ if (mc === '"' || mc === "'" || mc === "`") {
710
+ k = scanString(expr, k);
711
+ continue;
712
+ }
713
+ if (mc === "{") depth++;
714
+ else if (mc === "}") {
715
+ depth--;
716
+ if (depth === 0) break;
717
+ }
718
+ k++;
719
+ }
720
+ const sub = rewrite(expr.slice(exprStart, k), scope, ctxRef);
721
+ if (sub.reactive) reactive = true;
722
+ flush();
723
+ const genStart = out.length;
724
+ for (const s of sub.segments) segments.push({ src: exprStart + s.src, gen: genStart + s.gen, len: s.len });
725
+ out += sub.code;
726
+ if (expr[k] === "}") {
727
+ copy(k, "}");
728
+ k++;
729
+ }
730
+ continue;
731
+ }
732
+ copy(k, ch);
733
+ k++;
734
+ }
735
+ i = k;
736
+ continue;
737
+ }
693
738
  if (ID_START.test(c)) {
694
739
  let j = i + 1;
695
740
  while (j < n && ID_CHAR.test(expr[j])) j++;
@@ -697,6 +742,11 @@ function rewrite(expr, scope, ctxRef = "ctx") {
697
742
  const isProperty = lastNonSpace(out) === ".";
698
743
  const binding = scope.get(name);
699
744
  if (binding && !isProperty) {
745
+ if (binding.kind !== "local") {
746
+ const prev = lastNonSpace(out);
747
+ const next = firstNonSpaceFrom(expr, j);
748
+ if ((prev === "{" || prev === ",") && (next === "," || next === "}")) insert(`${name}: `);
749
+ }
700
750
  if (binding.kind === "ctx") {
701
751
  insert(`${ctxRef}.`);
702
752
  copy(i, name);
@@ -736,6 +786,12 @@ function lastNonSpace(s) {
736
786
  }
737
787
  return "";
738
788
  }
789
+ function firstNonSpaceFrom(s, from) {
790
+ for (let i = from; i < s.length; i++) {
791
+ if (!/\s/.test(s[i])) return s[i];
792
+ }
793
+ return "";
794
+ }
739
795
  var NON_CTX = /* @__PURE__ */ new Set([
740
796
  // literals / keywords
741
797
  "true",
@@ -842,10 +898,47 @@ function freeIdentifiers(expr) {
842
898
  const n = expr.length;
843
899
  while (i < n) {
844
900
  const c = expr[i];
845
- if (c === '"' || c === "'" || c === "`") {
901
+ if (c === '"' || c === "'") {
846
902
  i = scanString(expr, i);
847
903
  continue;
848
904
  }
905
+ if (c === "`") {
906
+ let k = i + 1;
907
+ while (k < n) {
908
+ const ch = expr[k];
909
+ if (ch === "\\") {
910
+ k += 2;
911
+ continue;
912
+ }
913
+ if (ch === "`") {
914
+ k++;
915
+ break;
916
+ }
917
+ if (ch === "$" && expr[k + 1] === "{") {
918
+ k += 2;
919
+ const start = k;
920
+ let depth = 1;
921
+ while (k < n && depth > 0) {
922
+ const mc = expr[k];
923
+ if (mc === '"' || mc === "'" || mc === "`") {
924
+ k = scanString(expr, k);
925
+ continue;
926
+ }
927
+ if (mc === "{") depth++;
928
+ else if (mc === "}") {
929
+ depth--;
930
+ if (depth === 0) break;
931
+ }
932
+ k++;
933
+ }
934
+ for (const id of freeIdentifiers(expr.slice(start, k))) out.add(id);
935
+ continue;
936
+ }
937
+ k++;
938
+ }
939
+ i = k;
940
+ continue;
941
+ }
849
942
  if (ID_START.test(c)) {
850
943
  let j = i + 1;
851
944
  while (j < n && ID_CHAR.test(expr[j])) j++;
@@ -1123,6 +1216,7 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1123
1216
  html += "<!---->";
1124
1217
  const anchorVar = nodeExpr(path);
1125
1218
  const props = [];
1219
+ const eventKeys = [];
1126
1220
  for (const attr of node.attrs) {
1127
1221
  switch (attr.type) {
1128
1222
  case "static":
@@ -1131,13 +1225,17 @@ function compileFragment(gen, nodes, scope, name, param = "", isHost = false) {
1131
1225
  case "attr":
1132
1226
  props.push(`get ${propKey(attr.name)}() { return ${rewrite(attr.expr, sc).code}; }`);
1133
1227
  break;
1134
- case "event":
1135
- props.push(`${propKey(onProp(attr.name))}: ${rewrite(attr.expr, sc).code}`);
1228
+ case "event": {
1229
+ const k = onProp(attr.name);
1230
+ props.push(`${propKey(k)}: ${rewrite(attr.expr, sc).code}`);
1231
+ eventKeys.push(k);
1136
1232
  break;
1233
+ }
1137
1234
  default:
1138
1235
  throw new Error(`'${attr.type}' binding on <${node.tag}> is not supported yet (M5: props + on:event only)`);
1139
1236
  }
1140
1237
  }
1238
+ if (eventKeys.length) props.push(`'$events': [${eventKeys.map((k) => JSON.stringify(k)).join(", ")}]`);
1141
1239
  const groups = /* @__PURE__ */ new Map();
1142
1240
  for (const child of node.children) {
1143
1241
  let target = child;
@@ -1620,89 +1718,120 @@ function skipString(s, start) {
1620
1718
 
1621
1719
  // packages/compiler/src/infer.ts
1622
1720
  var FOR_VARS = ["$index", "$count", "$first", "$last", "$even", "$odd"];
1721
+ function childLists(node) {
1722
+ switch (node.type) {
1723
+ case "element":
1724
+ case "snippet":
1725
+ case "key":
1726
+ return [node.children];
1727
+ case "if":
1728
+ return node.branches.map((b) => b.children);
1729
+ case "for":
1730
+ return node.empty ? [node.children, node.empty] : [node.children];
1731
+ case "switch":
1732
+ return node.cases.map((c) => c.children);
1733
+ case "defer":
1734
+ return node.placeholder ? [node.children, node.placeholder] : [node.children];
1735
+ case "await": {
1736
+ const lists = [];
1737
+ if (node.pending) lists.push(node.pending);
1738
+ if (node.then) lists.push(node.then.children);
1739
+ if (node.catch) lists.push(node.catch.children);
1740
+ return lists;
1741
+ }
1742
+ default:
1743
+ return [];
1744
+ }
1745
+ }
1623
1746
  function inferCtxNames(nodes) {
1624
1747
  const used = /* @__PURE__ */ new Set();
1625
- const declared = /* @__PURE__ */ new Set();
1626
- const add = (expr) => {
1627
- if (expr) for (const id of freeIdentifiers(expr)) used.add(id);
1748
+ const snippetNames = /* @__PURE__ */ new Set();
1749
+ const collectSnippets = (list) => {
1750
+ for (const node of list) {
1751
+ if (node.type === "snippet") snippetNames.add(node.name);
1752
+ for (const cl of childLists(node)) collectSnippets(cl);
1753
+ }
1754
+ };
1755
+ collectSnippets(nodes);
1756
+ const add = (expr, declared) => {
1757
+ if (!expr) return;
1758
+ for (const id of freeIdentifiers(expr)) {
1759
+ if (!declared.has(id) && !snippetNames.has(id)) used.add(id);
1760
+ }
1628
1761
  };
1629
- const walk2 = (list) => {
1762
+ const walk2 = (list, parentDeclared) => {
1763
+ let declared = parentDeclared;
1630
1764
  for (const node of list) {
1631
1765
  switch (node.type) {
1632
1766
  case "text":
1633
1767
  break;
1634
1768
  case "interp":
1635
- add(node.expr);
1769
+ add(node.expr, declared);
1636
1770
  break;
1637
1771
  case "let":
1638
- add(node.expr);
1639
- declared.add(node.name);
1772
+ add(node.expr, declared);
1773
+ declared = new Set(declared).add(node.name);
1640
1774
  break;
1641
1775
  case "element":
1642
1776
  for (const attr of node.attrs) {
1643
- if (attr.type === "use") add(attr.name);
1644
- if (attr.type === "transition") add(attr.name);
1645
- if (attr.type !== "static") add(attr.expr);
1777
+ if (attr.type === "use") add(attr.name, declared);
1778
+ if (attr.type === "transition") add(attr.name, declared);
1779
+ if (attr.type !== "static") add(attr.expr, declared);
1646
1780
  }
1647
- walk2(node.children);
1781
+ walk2(node.children, declared);
1648
1782
  break;
1649
1783
  case "if":
1650
1784
  for (const br of node.branches) {
1651
- add(br.cond);
1652
- if (br.alias) declared.add(br.alias);
1653
- walk2(br.children);
1785
+ add(br.cond, declared);
1786
+ walk2(br.children, br.alias ? new Set(declared).add(br.alias) : declared);
1654
1787
  }
1655
1788
  break;
1656
- case "for":
1657
- add(node.list);
1658
- add(node.track);
1659
- declared.add(node.item);
1660
- for (const v of FOR_VARS) declared.add(v);
1661
- walk2(node.children);
1662
- if (node.empty) walk2(node.empty);
1789
+ case "for": {
1790
+ add(node.list, declared);
1791
+ const inner = new Set(declared).add(node.item);
1792
+ for (const v of FOR_VARS) inner.add(v);
1793
+ add(node.track, inner);
1794
+ walk2(node.children, inner);
1795
+ if (node.empty) walk2(node.empty, declared);
1663
1796
  break;
1797
+ }
1664
1798
  case "switch":
1665
- add(node.expr);
1799
+ add(node.expr, declared);
1666
1800
  for (const c of node.cases) {
1667
- add(c.test);
1668
- walk2(c.children);
1801
+ add(c.test, declared);
1802
+ walk2(c.children, declared);
1669
1803
  }
1670
1804
  break;
1671
1805
  case "defer":
1672
- if (node.trigger.kind === "when") add(node.trigger.expr);
1673
- if (node.trigger.kind === "timer") add(node.trigger.ms);
1674
- walk2(node.children);
1675
- if (node.placeholder) walk2(node.placeholder);
1806
+ if (node.trigger.kind === "when") add(node.trigger.expr, declared);
1807
+ if (node.trigger.kind === "timer") add(node.trigger.ms, declared);
1808
+ walk2(node.children, declared);
1809
+ if (node.placeholder) walk2(node.placeholder, declared);
1676
1810
  break;
1677
1811
  case "await":
1678
- add(node.expr);
1679
- if (node.pending) walk2(node.pending);
1680
- if (node.then) {
1681
- if (node.then.alias) declared.add(node.then.alias);
1682
- walk2(node.then.children);
1683
- }
1684
- if (node.catch) {
1685
- if (node.catch.alias) declared.add(node.catch.alias);
1686
- walk2(node.catch.children);
1687
- }
1812
+ add(node.expr, declared);
1813
+ if (node.pending) walk2(node.pending, declared);
1814
+ if (node.then) walk2(node.then.children, node.then.alias ? new Set(declared).add(node.then.alias) : declared);
1815
+ if (node.catch) walk2(node.catch.children, node.catch.alias ? new Set(declared).add(node.catch.alias) : declared);
1688
1816
  break;
1689
- case "snippet":
1690
- declared.add(node.name);
1691
- for (const p of node.params) declared.add(p);
1692
- walk2(node.children);
1817
+ case "snippet": {
1818
+ const inner = new Set(declared);
1819
+ for (const p of node.params) inner.add(p);
1820
+ walk2(node.children, inner);
1693
1821
  break;
1822
+ }
1694
1823
  case "render":
1695
- add(node.expr);
1824
+ add(node.expr, declared);
1696
1825
  break;
1697
1826
  case "key":
1698
- add(node.expr);
1699
- walk2(node.children);
1827
+ add(node.expr, declared);
1828
+ walk2(node.children, declared);
1700
1829
  break;
1701
1830
  }
1702
1831
  }
1703
1832
  };
1704
- walk2(nodes);
1705
- return [...used].filter((n) => !declared.has(n)).sort();
1833
+ walk2(nodes, /* @__PURE__ */ new Set());
1834
+ return [...used].sort();
1706
1835
  }
1707
1836
 
1708
1837
  // packages/compiler/src/component.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weave-framework/cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.53",
4
4
  "description": "Weave CLI — `weave build`, `weave dev` (watch + live-reload), `weave check`, `weave routes`.",
5
5
  "type": "module",
6
6
  "bin": {