@jalvin/compiler 2.0.50 → 2.0.52

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/codegen.d.ts CHANGED
@@ -119,6 +119,10 @@ export declare class CodeGenerator {
119
119
  private resolveLocalComponentImports;
120
120
  private isConstructorCall;
121
121
  private emitComponentCall;
122
+ private isComplexBuilderStmt;
123
+ private emitBuilderStmt;
124
+ private emitBuilderIf;
125
+ private emitBuilderWhen;
122
126
  private emitLambdaBodyAsDomChildren;
123
127
  private emitLambdaExpr;
124
128
  private emitIfExpr;
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
package/dist/codegen.js CHANGED
@@ -1730,8 +1730,15 @@ class CodeGenerator {
1730
1730
  }
1731
1731
  props.push(propName === val ? propName : `${propName}: ${val}`);
1732
1732
  }
1733
+ const lastParamName = paramNames && paramNames.length > 0 ? paramNames[paramNames.length - 1] : undefined;
1734
+ const isUserComponent = tagName !== null && this.userComponentNames.has(tagName);
1735
+ const isTrailingLambdaMappedToProps = expr.trailingLambda && isUserComponent && lastParamName && lastParamName !== "children";
1736
+ if (isTrailingLambdaMappedToProps) {
1737
+ const lambdaStr = this.emitLambdaExpr(expr.trailingLambda);
1738
+ props.push(`${lastParamName}: ${lambdaStr}`);
1739
+ }
1733
1740
  const propsStr = props.length > 0 ? `{ ${props.join(", ")} }` : "{}";
1734
- if (expr.trailingLambda) {
1741
+ if (expr.trailingLambda && !isTrailingLambdaMappedToProps) {
1735
1742
  if (expr.trailingLambda.params.length > 0) {
1736
1743
  // Lambda with explicit params (e.g. builder-style): emit as a function, not DOM children
1737
1744
  return `${callee}(${propsStr}, [${this.emitLambdaExpr(expr.trailingLambda)}])`;
@@ -1741,36 +1748,188 @@ class CodeGenerator {
1741
1748
  }
1742
1749
  return `${callee}(${propsStr})`;
1743
1750
  }
1744
- emitLambdaBodyAsDomChildren(lambda) {
1745
- const parts = [];
1746
- for (const stmt of lambda.body) {
1747
- if (stmt.kind === "ExprStmt") {
1748
- parts.push(this.emitExpr(stmt.expr));
1749
- }
1750
- else if (stmt.kind === "IfStmt") {
1751
- const s = stmt;
1752
- const cond = this.emitExpr(s.condition);
1753
- const thenExprs = s.then.statements.filter((st) => st.kind === "ExprStmt").map((st) => this.emitExpr(st.expr));
1754
- const elseExprs = s.else && s.else.kind === "Block" ? s.else.statements.filter((st) => st.kind === "ExprStmt").map((st) => this.emitExpr(st.expr)) : [];
1755
- const thenStr = thenExprs.length > 0 ? `...(${cond} ? [${thenExprs.join(", ")}] : [])` : "";
1756
- const elseStr = elseExprs.length > 0 ? `...(!(${cond}) ? [${elseExprs.join(", ")}] : [])` : "";
1757
- if (thenStr)
1758
- parts.push(thenStr);
1759
- if (elseStr)
1760
- parts.push(elseStr);
1761
- }
1762
- else if (stmt.kind === "ForStmt") {
1751
+ isComplexBuilderStmt(stmt) {
1752
+ if (stmt.kind !== "ExprStmt") {
1753
+ return true;
1754
+ }
1755
+ const expr = stmt.expr;
1756
+ if (expr.kind === "AssignExpr" || expr.kind === "CompoundAssignExpr") {
1757
+ return true;
1758
+ }
1759
+ return false;
1760
+ }
1761
+ emitBuilderStmt(stmt, arrayName) {
1762
+ switch (stmt.kind) {
1763
+ case "Block":
1764
+ for (const s of stmt.statements) {
1765
+ this.emitBuilderStmt(s, arrayName);
1766
+ }
1767
+ break;
1768
+ case "PropertyDecl":
1769
+ this.emitPropertyDecl(stmt, false, true);
1770
+ break;
1771
+ case "DestructuringDecl":
1772
+ this.emitDestructuringDecl(stmt, false);
1773
+ break;
1774
+ case "ExprStmt":
1775
+ if (stmt.expr.kind === "AssignExpr" || stmt.expr.kind === "CompoundAssignExpr") {
1776
+ this.w.writeIndentedLine(`${this.emitExpr(stmt.expr)};`);
1777
+ }
1778
+ else {
1779
+ this.w.writeIndentedLine(`${arrayName}.push(${this.emitExpr(stmt.expr)});`);
1780
+ }
1781
+ break;
1782
+ case "IfStmt":
1783
+ this.emitBuilderIf(stmt, arrayName);
1784
+ break;
1785
+ case "WhenStmt":
1786
+ this.emitBuilderWhen(stmt, arrayName);
1787
+ break;
1788
+ case "ForStmt": {
1763
1789
  const s = stmt;
1764
1790
  const iter = this.emitExpr(s.iterable);
1765
1791
  let bindingStr = typeof s.binding === "string" ? `const ${s.binding}` : s.binding.kind === "TupleDestructure" ? `const [${s.binding.names.map((n) => n ?? "_").join(", ")}]` : `const [${s.binding.key}, ${s.binding.value}]`;
1766
- const innerExprs = s.body.statements.filter((inner) => inner.kind === "ExprStmt").map((inner) => this.emitExpr(inner.expr));
1767
- if (innerExprs.length > 0) {
1768
- const pushes = innerExprs.map((e) => `__c.push(${e});`).join(" ");
1769
- parts.push(`...(() => { const __c: any[] = []; for (${bindingStr} of ${iter}) { ${pushes} } return __c; })()`);
1792
+ this.w.writeIndentedLine(`for (${bindingStr} of ${iter}) {`);
1793
+ this.w.pushIndent();
1794
+ this.emitBuilderStmt(s.body, arrayName);
1795
+ this.w.popIndent();
1796
+ this.w.writeIndentedLine("}");
1797
+ break;
1798
+ }
1799
+ case "WhileStmt": {
1800
+ const s = stmt;
1801
+ this.w.writeIndentedLine(`while (${this.emitExpr(s.condition)}) {`);
1802
+ this.w.pushIndent();
1803
+ this.emitBuilderStmt(s.body, arrayName);
1804
+ this.w.popIndent();
1805
+ this.w.writeIndentedLine("}");
1806
+ break;
1807
+ }
1808
+ case "DoWhileStmt": {
1809
+ const s = stmt;
1810
+ this.w.writeIndentedLine(`do {`);
1811
+ this.w.pushIndent();
1812
+ this.emitBuilderStmt(s.body, arrayName);
1813
+ this.w.popIndent();
1814
+ this.w.writeIndentedLine(`} while (${this.emitExpr(s.condition)});`);
1815
+ break;
1816
+ }
1817
+ case "TryCatchStmt": {
1818
+ const s = stmt;
1819
+ this.w.writeIndentedLine(`try {`);
1820
+ this.w.pushIndent();
1821
+ this.emitBuilderStmt(s.body, arrayName);
1822
+ this.w.popIndent();
1823
+ for (const c of s.catches) {
1824
+ this.w.writeIndentedLine(`} catch (${c.name}) {`);
1825
+ this.w.pushIndent();
1826
+ this.emitBuilderStmt(c.body, arrayName);
1827
+ this.w.popIndent();
1828
+ }
1829
+ if (s.finally) {
1830
+ this.w.writeIndentedLine(`} finally {`);
1831
+ this.w.pushIndent();
1832
+ this.emitBuilderStmt(s.finally, arrayName);
1833
+ this.w.popIndent();
1834
+ }
1835
+ this.w.writeIndentedLine(`}`);
1836
+ break;
1837
+ }
1838
+ default:
1839
+ this.emitStmt(stmt);
1840
+ break;
1841
+ }
1842
+ }
1843
+ emitBuilderIf(stmt, arrayName, isElseIf = false) {
1844
+ const cond = this.emitExpr(stmt.condition);
1845
+ if (isElseIf) {
1846
+ this.w.write(`if (${cond}) {\n`);
1847
+ }
1848
+ else {
1849
+ this.w.writeIndentedLine(`if (${cond}) {`);
1850
+ }
1851
+ this.w.pushIndent();
1852
+ this.emitBuilderStmt(stmt.then, arrayName);
1853
+ this.w.popIndent();
1854
+ if (stmt.else) {
1855
+ if (stmt.else.kind === "IfStmt") {
1856
+ this.w.writeIndented("} else ");
1857
+ this.emitBuilderIf(stmt.else, arrayName, true);
1858
+ }
1859
+ else {
1860
+ this.w.writeIndentedLine("} else {");
1861
+ this.w.pushIndent();
1862
+ this.emitBuilderStmt(stmt.else, arrayName);
1863
+ this.w.popIndent();
1864
+ this.w.writeIndentedLine("}");
1865
+ }
1866
+ }
1867
+ else {
1868
+ this.w.writeIndentedLine("}");
1869
+ }
1870
+ }
1871
+ emitBuilderWhen(stmt, arrayName) {
1872
+ const subjectVar = stmt.subject ? "__when_subject__" : null;
1873
+ if (stmt.subject) {
1874
+ const binding = stmt.subject.binding ?? subjectVar;
1875
+ this.w.writeIndentedLine(`const ${binding} = ${this.emitExpr(stmt.subject.expr)};`);
1876
+ }
1877
+ let first = true;
1878
+ for (const branch of stmt.branches) {
1879
+ if (branch.isElse) {
1880
+ this.w.writeIndentedLine(first ? `{` : `} else {`);
1881
+ }
1882
+ else {
1883
+ const cond = branch.conditions.map((c) => this.emitWhenCondition(c, subjectVar ?? "")).join(" || ");
1884
+ this.w.writeIndentedLine(first ? `if (${cond}) {` : `} else if (${cond}) {`);
1885
+ }
1886
+ first = false;
1887
+ this.w.pushIndent();
1888
+ if (branch.body.kind === "Block") {
1889
+ this.emitBuilderStmt(branch.body, arrayName);
1890
+ }
1891
+ else {
1892
+ if (branch.body.kind === "AssignExpr" || branch.body.kind === "CompoundAssignExpr") {
1893
+ this.w.writeIndentedLine(`${this.emitExpr(branch.body)};`);
1894
+ }
1895
+ else {
1896
+ this.w.writeIndentedLine(`${arrayName}.push(${this.emitExpr(branch.body)});`);
1897
+ }
1898
+ }
1899
+ this.w.popIndent();
1900
+ }
1901
+ this.w.writeIndentedLine(`}`);
1902
+ }
1903
+ emitLambdaBodyAsDomChildren(lambda) {
1904
+ const hasComplex = lambda.body.some((s) => this.isComplexBuilderStmt(s));
1905
+ if (!hasComplex) {
1906
+ const parts = [];
1907
+ for (const stmt of lambda.body) {
1908
+ if (stmt.kind === "ExprStmt") {
1909
+ parts.push(this.emitExpr(stmt.expr));
1770
1910
  }
1771
1911
  }
1912
+ return parts.join(", ");
1913
+ }
1914
+ const saved = this.w;
1915
+ const tmp = new Writer();
1916
+ tmp.indent = saved.indent;
1917
+ this.w = tmp;
1918
+ try {
1919
+ this.w.writeLine("(() => {");
1920
+ this.w.pushIndent();
1921
+ this.w.writeIndentedLine("const __c: any[] = [];");
1922
+ for (const stmt of lambda.body) {
1923
+ this.emitBuilderStmt(stmt, "__c");
1924
+ }
1925
+ this.w.writeIndentedLine("return __c;");
1926
+ this.w.popIndent();
1927
+ this.w.writeIndented("})()");
1928
+ }
1929
+ finally {
1930
+ this.w = saved;
1772
1931
  }
1773
- return parts.join(", ");
1932
+ return `...${tmp.output.trim()}`;
1774
1933
  }
1775
1934
  emitLambdaExpr(expr) {
1776
1935
  const params = expr.params.length === 0 ? "it" : expr.params.map((p) => p.name ?? "_").join(", ");