@barefootjs/jsx 0.1.1 → 0.1.3
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/adapters/parsed-expr-emitter.d.ts +1 -1
- package/dist/adapters/parsed-expr-emitter.d.ts.map +1 -1
- package/dist/analyzer-context.d.ts +22 -0
- package/dist/analyzer-context.d.ts.map +1 -1
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/errors.d.ts +0 -9
- package/dist/errors.d.ts.map +1 -1
- package/dist/expression-parser.d.ts +1 -1
- package/dist/expression-parser.d.ts.map +1 -1
- package/dist/index.js +306 -38
- package/dist/ir-to-client-js/compute-inlinability.d.ts +2 -2
- package/dist/ir-to-client-js/control-flow/plan/build-inner-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts +6 -18
- package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/inner-loop.d.ts.map +1 -1
- package/dist/jsx-to-ir.d.ts.map +1 -1
- package/dist/types.d.ts +10 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/__snapshots__/doc-examples.test.ts.snap +13 -17
- package/src/__tests__/circular-dependency.audit.test.ts +19 -0
- package/src/__tests__/compiler-stress-1244.test.ts +6 -10
- package/src/__tests__/component-not-found.audit.test.ts +36 -0
- package/src/__tests__/doc-examples.test.ts +5 -6
- package/src/__tests__/invalid-component-name.audit.test.ts +38 -0
- package/src/__tests__/invalid-jsx-attribute.audit.test.ts +47 -0
- package/src/__tests__/invalid-jsx-expression.audit.test.ts +44 -0
- package/src/__tests__/invalid-signal-usage.audit.test.ts +72 -0
- package/src/__tests__/jsx-function-inlining.test.ts +281 -1
- package/src/__tests__/loop-fallback-wrap.test.ts +5 -5
- package/src/__tests__/nested-loop-reactive-attrs.test.ts +4 -4
- package/src/__tests__/props-type-mismatch.audit.test.ts +100 -0
- package/src/__tests__/staged-ir/10-stage-diagnostics.test.ts +83 -2
- package/src/__tests__/static-loop-csr-materialize.test.ts +6 -4
- package/src/__tests__/type-inference-failed.audit.test.ts +48 -0
- package/src/__tests__/unknown-signal.audit.test.ts +111 -0
- package/src/adapters/parsed-expr-emitter.ts +1 -1
- package/src/analyzer-context.ts +25 -0
- package/src/analyzer.ts +207 -1
- package/src/errors.ts +4 -26
- package/src/expression-parser.ts +8 -9
- package/src/ir-to-client-js/compute-inlinability.ts +2 -2
- package/src/ir-to-client-js/control-flow/plan/build-inner-loop.ts +3 -8
- package/src/ir-to-client-js/control-flow/plan/inner-loop.ts +6 -17
- package/src/ir-to-client-js/control-flow/stringify/inner-loop.ts +5 -19
- package/src/jsx-to-ir.ts +215 -4
- package/src/types.ts +11 -3
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* be added in one place.
|
|
34
34
|
*/
|
|
35
35
|
import type { ParsedExpr, SortComparator, TemplatePart } from '../expression-parser';
|
|
36
|
-
export type HigherOrderMethod = 'filter' | 'every' | 'some' | 'find' | 'findIndex';
|
|
36
|
+
export type HigherOrderMethod = 'filter' | 'every' | 'some' | 'find' | 'findIndex' | 'findLast' | 'findLastIndex';
|
|
37
37
|
/**
|
|
38
38
|
* Non-higher-order array methods (#1443). One discriminator for the
|
|
39
39
|
* full set of "value-builtin" method calls on arrays — extending it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsed-expr-emitter.d.ts","sourceRoot":"","sources":["../../src/adapters/parsed-expr-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEpF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"parsed-expr-emitter.d.ts","sourceRoot":"","sources":["../../src/adapters/parsed-expr-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,26 @@ export interface PendingSignalTuple {
|
|
|
32
32
|
setter: string | null;
|
|
33
33
|
initialFreeIdentifiers: ReadonlySet<string>;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* One branch of a multi-return JSX helper function's if/else chain.
|
|
37
|
+
* `jsxReturn` is null for guard clauses that `return null`.
|
|
38
|
+
*/
|
|
39
|
+
export interface MultiReturnJsxBranch {
|
|
40
|
+
condition: ts.Expression;
|
|
41
|
+
jsxReturn: ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extracted control flow from a multi-return JSX helper function.
|
|
45
|
+
* Represents `if (c1) return <A/>; if (c2) return <B/>; return <C/>`
|
|
46
|
+
* as a chain of condition→JSX pairs plus an optional fallback.
|
|
47
|
+
*/
|
|
48
|
+
export interface MultiReturnJsxInfo {
|
|
49
|
+
branches: MultiReturnJsxBranch[];
|
|
50
|
+
fallback: ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment | null;
|
|
51
|
+
params: string[];
|
|
52
|
+
/** For switch-sourced branches, the discriminant expression (e.g. `name` in `switch(name)`) */
|
|
53
|
+
switchDiscriminant?: ts.Expression;
|
|
54
|
+
}
|
|
35
55
|
/**
|
|
36
56
|
* Represents an if statement with a JSX return in a component function.
|
|
37
57
|
*/
|
|
@@ -95,6 +115,8 @@ export interface AnalyzerContext {
|
|
|
95
115
|
jsxReturn: ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment;
|
|
96
116
|
params: string[];
|
|
97
117
|
}>;
|
|
118
|
+
/** Maps multi-return JSX helper functions for conditional inlining at call sites. */
|
|
119
|
+
jsxMultiReturnFunctions: Map<string, MultiReturnJsxInfo>;
|
|
98
120
|
/**
|
|
99
121
|
* Maps function names to reactive-factory info (#931). A reactive factory
|
|
100
122
|
* is a same-file helper whose body declares reactive primitives and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer-context.d.ts","sourceRoot":"","sources":["../src/analyzer-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EACb,cAAc,EACd,SAAS,EACT,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,KAAK,YAAY,EAAiD,MAAM,eAAe,CAAA;AAEhG;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAA;IACxB,qDAAqD;IACrD,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,qBAAqB,CAAA;IACpE,+CAA+C;IAC/C,cAAc,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAA;IACxC,qCAAqC;IACrC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAGhB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,EAAE,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,aAAa,GAAG,IAAI,CAAA;IAC/D,gBAAgB,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IAGnB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,0EAA0E;IAC1E,cAAc,EAAE,iBAAiB,EAAE,CAAA;IACnC,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,YAAY,EAAE,eAAe,EAAE,CAAA;IAC/B,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B;;;;;;;OAOG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,oEAAoE;IACpE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;IACpF;;;;;;;;;;;;;OAaG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA;IAC/C,6EAA6E;IAC7E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,CAAA;QACpE,MAAM,EAAE,MAAM,EAAE,CAAA;KACjB,CAAC,CAAA;IACF;;;;;;;;OAQG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACnD;;;OAGG;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAGhD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,yEAAyE;IACzE,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,qFAAqF;IACrF,kBAAkB,EAAE,sBAAsB,GAAG,IAAI,CAAA;IAWjD,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,CAAA;IAG/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IAGvC,MAAM,EAAE,aAAa,EAAE,CAAA;IAGvB,qBAAqB,EAAE,OAAO,CAAA;IAE9B;;;;;OAKG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAGtC,iBAAiB,EAAE,YAAY,EAAE,CAAA;IAEjC,0FAA0F;IAC1F,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;IAE9B;;;;;;OAMG;IACH,kBAAkB,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAA;IAEnC,4DAA4D;IAC5D,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAAA;CAC7B;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,MAAM,GACf,eAAe,
|
|
1
|
+
{"version":3,"file":"analyzer-context.d.ts","sourceRoot":"","sources":["../src/analyzer-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,aAAa,EACb,cAAc,EACd,SAAS,EACT,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,KAAK,YAAY,EAAiD,MAAM,eAAe,CAAA;AAEhG;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAA;IACxB,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;CAC5E;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,QAAQ,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;IAC1E,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,+FAA+F;IAC/F,kBAAkB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAA;IACxB,qDAAqD;IACrD,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,qBAAqB,CAAA;IACpE,+CAA+C;IAC/C,cAAc,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAA;IACxC,qCAAqC;IACrC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAGhB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,EAAE,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,aAAa,GAAG,IAAI,CAAA;IAC/D,gBAAgB,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IAGnB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,0EAA0E;IAC1E,cAAc,EAAE,iBAAiB,EAAE,CAAA;IACnC,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,YAAY,EAAE,eAAe,EAAE,CAAA;IAC/B,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B;;;;;;;OAOG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,oEAAoE;IACpE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;IACpF;;;;;;;;;;;;;OAaG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA;IAC/C,6EAA6E;IAC7E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,CAAA;QACpE,MAAM,EAAE,MAAM,EAAE,CAAA;KACjB,CAAC,CAAA;IACF,qFAAqF;IACrF,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACxD;;;;;;;;OAQG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACnD;;;OAGG;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAGhD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,yEAAyE;IACzE,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,qFAAqF;IACrF,kBAAkB,EAAE,sBAAsB,GAAG,IAAI,CAAA;IAWjD,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,CAAA;IAG/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IAGvC,MAAM,EAAE,aAAa,EAAE,CAAA;IAGvB,qBAAqB,EAAE,OAAO,CAAA;IAE9B;;;;;OAKG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAGtC,iBAAiB,EAAE,YAAY,EAAE,CAAA;IAEjC,0FAA0F;IAC1F,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;IAE9B;;;;;;OAMG;IACH,kBAAkB,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAA;IAEnC,4DAA4D;IAC5D,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAAA;CAC7B;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,MAAM,GACf,eAAe,CAkDjB;AAMD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,MAAM,GACf,cAAc,CAehB;AAMD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,SAAS,EACjC,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,QAAQ,GAAG,IAAI,CA2FjB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,IAAI,IAAI,EAAE,CAAC,mBAAmB,GAAG;IAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAA;CAAE,CAO1D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,IAAI,IAAI,EAAE,CAAC,mBAAmB,GAAG;IAClC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAA;IACnB,WAAW,EAAE,EAAE,CAAC,aAAa,CAAA;CAC9B,CAMA"}
|
package/dist/analyzer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAI3B,OAAO,EACL,KAAK,eAAe,EAOrB,MAAM,oBAAoB,CAAA;AAmB3B;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK/D;AA8BD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAA;CAAE,GAAG,IAAI,CA8CpF;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,GACnB,eAAe,CAgHjB;AAugBD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAavE;
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAI3B,OAAO,EACL,KAAK,eAAe,EAOrB,MAAM,oBAAoB,CAAA;AAmB3B;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK/D;AA8BD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAA;CAAE,GAAG,IAAI,CA8CpF;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,GACnB,eAAe,CAgHjB;AAugBD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAavE;AAmsCD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CA6BpE;AA2LD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAuCzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAelE;AAwjCD,eAAO,MAAM,wBAAwB,aAOnC,CAAA;AAkBF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CA0DV;AAcD,eAAO,MAAM,mBAAmB,aAG9B,CAAA;AAoRF;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAwCvE;AAMD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -5,20 +5,11 @@ import type { CompilerError, ErrorSeverity, ErrorSuggestion, SourceLocation } fr
|
|
|
5
5
|
export declare const ErrorCodes: {
|
|
6
6
|
readonly MISSING_USE_CLIENT: 'BF001';
|
|
7
7
|
readonly CLIENT_IMPORTING_SERVER: 'BF003';
|
|
8
|
-
readonly UNKNOWN_SIGNAL: 'BF010';
|
|
9
8
|
readonly SIGNAL_OUTSIDE_COMPONENT: 'BF011';
|
|
10
|
-
readonly INVALID_SIGNAL_USAGE: 'BF012';
|
|
11
|
-
readonly INVALID_JSX_EXPRESSION: 'BF020';
|
|
12
9
|
readonly UNSUPPORTED_JSX_PATTERN: 'BF021';
|
|
13
|
-
readonly INVALID_JSX_ATTRIBUTE: 'BF022';
|
|
14
10
|
readonly MISSING_KEY_IN_LIST: 'BF023';
|
|
15
11
|
readonly MISSING_KEY_IN_NESTED_LIST: 'BF024';
|
|
16
12
|
readonly UNSUPPORTED_DESTRUCTURE_REST: 'BF025';
|
|
17
|
-
readonly TYPE_INFERENCE_FAILED: 'BF030';
|
|
18
|
-
readonly PROPS_TYPE_MISMATCH: 'BF031';
|
|
19
|
-
readonly COMPONENT_NOT_FOUND: 'BF040';
|
|
20
|
-
readonly CIRCULAR_DEPENDENCY: 'BF041';
|
|
21
|
-
readonly INVALID_COMPONENT_NAME: 'BF042';
|
|
22
13
|
readonly PROPS_DESTRUCTURING: 'BF043';
|
|
23
14
|
readonly SIGNAL_GETTER_NOT_CALLED: 'BF044';
|
|
24
15
|
readonly JSX_IN_LOCAL_FUNCTION: 'BF045';
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAA;AAMhB,eAAO,MAAM,UAAU;aAErB,kBAAkB,EAAE,OAAO;aAC3B,uBAAuB,EAAE,OAAO;aAGhC,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAA;AAMhB,eAAO,MAAM,UAAU;aAErB,kBAAkB,EAAE,OAAO;aAC3B,uBAAuB,EAAE,OAAO;aAGhC,wBAAwB,EAAE,OAAO;aAGjC,uBAAuB,EAAE,OAAO;aAChC,mBAAmB,EAAE,OAAO;aAC5B,0BAA0B,EAAE,OAAO;aACnC,4BAA4B,EAAE,OAAO;aAGrC,mBAAmB,EAAE,OAAO;aAC5B,wBAAwB,EAAE,OAAO;aACjC,qBAAqB,EAAE,OAAO;aAC9B,+BAA+B,EAAE,OAAO;aAUxC,4BAA4B,EAAE,OAAO;aAGrC,uBAAuB,EAAE,OAAO;aAChC,oBAAoB,EAAE,OAAO;aAG7B,mCAAmC,EAAE,OAAO;aAQ5C,iCAAiC,EAAE,OAAO;aAa1C,0BAA0B,EAAE,OAAO;aACnC,4BAA4B,EAAE,OAAO;aACrC,uBAAuB,EAAE,OAAO;aAMhC,2BAA2B,EAAE,OAAO;aAGpC,6BAA6B,EAAE,OAAO;CAC9B,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AA6EpE,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B,GACA,aAAa,CAuBf;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B,GACA,aAAa,CAEf;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B,GACA,aAAa,CAEf;AAMD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,cAAc,EACnB,YAAY,SAAI,GACf,MAAM,CA6BR;AAmBD,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,MAAM,CA6CR;AAMD;;;;;;;GAOG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAId;AAMD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,cAAc,CAMhB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,GAClB,cAAc,CAMhB"}
|
|
@@ -50,7 +50,7 @@ export type ParsedExpr = {
|
|
|
50
50
|
body: ParsedExpr;
|
|
51
51
|
} | {
|
|
52
52
|
kind: 'higher-order';
|
|
53
|
-
method: 'filter' | 'every' | 'some' | 'find' | 'findIndex';
|
|
53
|
+
method: 'filter' | 'every' | 'some' | 'find' | 'findIndex' | 'findLast' | 'findLastIndex';
|
|
54
54
|
object: ParsedExpr;
|
|
55
55
|
param: string;
|
|
56
56
|
predicate: ParsedExpr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-parser.d.ts","sourceRoot":"","sources":["../src/expression-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAM3B,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,GACnH;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"expression-parser.d.ts","sourceRoot":"","sources":["../src/expression-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -938,6 +938,7 @@ function createAnalyzerContext(sourceFile, filePath) {
|
|
|
938
938
|
jsxConstants: new Map,
|
|
939
939
|
inlineableJsxConsts: new Map,
|
|
940
940
|
jsxFunctions: new Map,
|
|
941
|
+
jsxMultiReturnFunctions: new Map,
|
|
941
942
|
reactiveFactories: new Map,
|
|
942
943
|
signalTupleRefs: new Map,
|
|
943
944
|
propsType: null,
|
|
@@ -1389,20 +1390,11 @@ var path_default = posix;
|
|
|
1389
1390
|
var ErrorCodes = {
|
|
1390
1391
|
MISSING_USE_CLIENT: "BF001",
|
|
1391
1392
|
CLIENT_IMPORTING_SERVER: "BF003",
|
|
1392
|
-
UNKNOWN_SIGNAL: "BF010",
|
|
1393
1393
|
SIGNAL_OUTSIDE_COMPONENT: "BF011",
|
|
1394
|
-
INVALID_SIGNAL_USAGE: "BF012",
|
|
1395
|
-
INVALID_JSX_EXPRESSION: "BF020",
|
|
1396
1394
|
UNSUPPORTED_JSX_PATTERN: "BF021",
|
|
1397
|
-
INVALID_JSX_ATTRIBUTE: "BF022",
|
|
1398
1395
|
MISSING_KEY_IN_LIST: "BF023",
|
|
1399
1396
|
MISSING_KEY_IN_NESTED_LIST: "BF024",
|
|
1400
1397
|
UNSUPPORTED_DESTRUCTURE_REST: "BF025",
|
|
1401
|
-
TYPE_INFERENCE_FAILED: "BF030",
|
|
1402
|
-
PROPS_TYPE_MISMATCH: "BF031",
|
|
1403
|
-
COMPONENT_NOT_FOUND: "BF040",
|
|
1404
|
-
CIRCULAR_DEPENDENCY: "BF041",
|
|
1405
|
-
INVALID_COMPONENT_NAME: "BF042",
|
|
1406
1398
|
PROPS_DESTRUCTURING: "BF043",
|
|
1407
1399
|
SIGNAL_GETTER_NOT_CALLED: "BF044",
|
|
1408
1400
|
JSX_IN_LOCAL_FUNCTION: "BF045",
|
|
@@ -1421,20 +1413,11 @@ var ErrorCodes = {
|
|
|
1421
1413
|
var errorMessages = {
|
|
1422
1414
|
[ErrorCodes.MISSING_USE_CLIENT]: "'use client' directive required for components with createSignal or event handlers",
|
|
1423
1415
|
[ErrorCodes.CLIENT_IMPORTING_SERVER]: "Client component cannot import server component",
|
|
1424
|
-
[ErrorCodes.UNKNOWN_SIGNAL]: "Unknown signal reference",
|
|
1425
1416
|
[ErrorCodes.SIGNAL_OUTSIDE_COMPONENT]: "Module-level reactive declaration (createSignal / createMemo) is not allowed. " + "The downstream codegen drops the declaration silently and every reference becomes a ReferenceError at SSR and at hydrate. " + "Move the declaration inside a component function so each mount gets its own state.",
|
|
1426
|
-
[ErrorCodes.INVALID_SIGNAL_USAGE]: "Invalid signal usage",
|
|
1427
|
-
[ErrorCodes.INVALID_JSX_EXPRESSION]: "Invalid JSX expression",
|
|
1428
1417
|
[ErrorCodes.UNSUPPORTED_JSX_PATTERN]: "Unsupported JSX pattern",
|
|
1429
|
-
[ErrorCodes.INVALID_JSX_ATTRIBUTE]: "Invalid JSX attribute",
|
|
1430
1418
|
[ErrorCodes.MISSING_KEY_IN_LIST]: "Missing key attribute in list rendering. Add a key prop for efficient updates",
|
|
1431
1419
|
[ErrorCodes.MISSING_KEY_IN_NESTED_LIST]: "Nested .map() loop requires key attribute for event delegation. Add a key prop to elements in the inner loop",
|
|
1432
1420
|
[ErrorCodes.UNSUPPORTED_DESTRUCTURE_REST]: "Computed property key in .map() callback destructure is not supported. Rewrite the callback to destructure explicit bindings (e.g., `({ a, b }) => ...`) so the compiler can rewrite references to per-item signal accessors.",
|
|
1433
|
-
[ErrorCodes.TYPE_INFERENCE_FAILED]: "Failed to infer type",
|
|
1434
|
-
[ErrorCodes.PROPS_TYPE_MISMATCH]: "Props type mismatch",
|
|
1435
|
-
[ErrorCodes.COMPONENT_NOT_FOUND]: "Component not found",
|
|
1436
|
-
[ErrorCodes.CIRCULAR_DEPENDENCY]: "Circular dependency detected",
|
|
1437
|
-
[ErrorCodes.INVALID_COMPONENT_NAME]: "Component name must start with uppercase letter",
|
|
1438
1421
|
[ErrorCodes.PROPS_DESTRUCTURING]: "Props destructuring in function parameters breaks reactivity. Use props object directly.",
|
|
1439
1422
|
[ErrorCodes.SIGNAL_GETTER_NOT_CALLED]: "Signal/memo getter passed without calling it. Use getter() to read the value.",
|
|
1440
1423
|
[ErrorCodes.JSX_IN_LOCAL_FUNCTION]: "Local function returns JSX but cannot be inlined. Extract it as a top-level PascalCase component or use a single return statement.",
|
|
@@ -1446,7 +1429,7 @@ var errorMessages = {
|
|
|
1446
1429
|
[ErrorCodes.STRIPPED_CLIENT_IMPORT_REFERENCED]: "Import was stripped from the client bundle but its binding is still referenced. Client components ('use client' .tsx) are not callable as plain functions from imperative .ts modules — render them as JSX from a 'use client' parent instead. If the flagged name is a local shadow rather than the stripped import, please file an issue.",
|
|
1447
1430
|
[ErrorCodes.STAGE_REACTIVE_IN_TEMPLATE]: "Reactive binding (signal getter or memo) referenced from template scope. The template lambda runs at module scope without the reactive context, so the value cannot be evaluated at SSR. Wrap the JSX expression in /* @client */ to defer it to hydrate, or restructure so the template uses a prop or static value.",
|
|
1448
1431
|
[ErrorCodes.STAGE_INIT_LOCAL_IN_TEMPLATE]: "Init-scope local referenced from template scope. The template lambda runs at module scope (via render() / renderChild()) and cannot reach init-body locals. Wrap the JSX expression in /* @client */, or lift the value to a prop or module-scope const.",
|
|
1449
|
-
[ErrorCodes.STAGE_AWAIT_IN_TEMPLATE]: "AwaitExpression in template scope. The
|
|
1432
|
+
[ErrorCodes.STAGE_AWAIT_IN_TEMPLATE]: "AwaitExpression in template scope. The generated template and init functions are synchronous — a bare `await` produces a SyntaxError at parse time. Move the await into the component body (before the return) or into an onMount/effect callback, and pass the resolved value to JSX.",
|
|
1450
1433
|
[ErrorCodes.INLINE_JSX_CALLBACK_CAPTURE]: "Inline JSX-returning arrow function captures a non-module identifier. Extract the callback into a top-level 'use client' component (e.g. `function MyNode(n) { return <div/> }` then `renderNode={MyNode}`) or pass captured values via component props.",
|
|
1451
1434
|
[ErrorCodes.UNRECOGNIZED_REACTIVE_FACTORY]: "Tuple destructuring of a non-reactive factory call. The compiler only recognizes createSignal / createMemo calls and same-file helpers that wrap them with a single `return [a, b]` exit."
|
|
1452
1435
|
};
|
|
@@ -2592,6 +2575,139 @@ function extractSingleJsxReturn(body) {
|
|
|
2592
2575
|
return null;
|
|
2593
2576
|
return jsxReturn;
|
|
2594
2577
|
}
|
|
2578
|
+
function extractMultiReturnJsxBranches(body) {
|
|
2579
|
+
const branches = [];
|
|
2580
|
+
let fallback = null;
|
|
2581
|
+
const stmts = body.statements;
|
|
2582
|
+
for (let i = 0;i < stmts.length; i++) {
|
|
2583
|
+
const stmt = stmts[i];
|
|
2584
|
+
if (ts6.isIfStatement(stmt)) {
|
|
2585
|
+
let current = stmt;
|
|
2586
|
+
while (ts6.isIfStatement(current)) {
|
|
2587
|
+
const ifStmt = current;
|
|
2588
|
+
if (!isDirectReturnBlock(ifStmt.thenStatement))
|
|
2589
|
+
return null;
|
|
2590
|
+
const jsxReturn = findJsxReturnInBlock(ifStmt.thenStatement);
|
|
2591
|
+
const nullReturn = findNullReturnInBlock(ifStmt.thenStatement);
|
|
2592
|
+
if (!jsxReturn && !nullReturn)
|
|
2593
|
+
return null;
|
|
2594
|
+
branches.push({ condition: ifStmt.expression, jsxReturn: jsxReturn ?? null });
|
|
2595
|
+
if (ifStmt.elseStatement) {
|
|
2596
|
+
if (ts6.isIfStatement(ifStmt.elseStatement)) {
|
|
2597
|
+
current = ifStmt.elseStatement;
|
|
2598
|
+
continue;
|
|
2599
|
+
}
|
|
2600
|
+
if (!isDirectReturnBlock(ifStmt.elseStatement))
|
|
2601
|
+
return null;
|
|
2602
|
+
const elseJsx = findJsxReturnInBlock(ifStmt.elseStatement);
|
|
2603
|
+
if (elseJsx) {
|
|
2604
|
+
fallback = elseJsx;
|
|
2605
|
+
} else if (!findNullReturnInBlock(ifStmt.elseStatement)) {
|
|
2606
|
+
return null;
|
|
2607
|
+
}
|
|
2608
|
+
if (branches.length === 0)
|
|
2609
|
+
return null;
|
|
2610
|
+
return { branches, fallback };
|
|
2611
|
+
}
|
|
2612
|
+
break;
|
|
2613
|
+
}
|
|
2614
|
+
continue;
|
|
2615
|
+
}
|
|
2616
|
+
if (ts6.isSwitchStatement(stmt)) {
|
|
2617
|
+
if (branches.length > 0)
|
|
2618
|
+
return null;
|
|
2619
|
+
if (!ts6.isIdentifier(stmt.expression) && !ts6.isPropertyAccessExpression(stmt.expression)) {
|
|
2620
|
+
return null;
|
|
2621
|
+
}
|
|
2622
|
+
const hasDefault = stmt.caseBlock.clauses.some((c) => ts6.isDefaultClause(c));
|
|
2623
|
+
if (!hasDefault)
|
|
2624
|
+
return null;
|
|
2625
|
+
for (const clause of stmt.caseBlock.clauses) {
|
|
2626
|
+
const jsxReturn = findJsxReturnInCaseClause(clause);
|
|
2627
|
+
const nullReturn = findNullReturnInCaseClause(clause);
|
|
2628
|
+
if (!jsxReturn && !nullReturn)
|
|
2629
|
+
return null;
|
|
2630
|
+
if (ts6.isCaseClause(clause)) {
|
|
2631
|
+
branches.push({
|
|
2632
|
+
condition: clause.expression,
|
|
2633
|
+
jsxReturn: jsxReturn ?? null
|
|
2634
|
+
});
|
|
2635
|
+
} else {
|
|
2636
|
+
fallback = jsxReturn ?? null;
|
|
2637
|
+
}
|
|
2638
|
+
}
|
|
2639
|
+
if (branches.length === 0)
|
|
2640
|
+
return null;
|
|
2641
|
+
return { branches, fallback, switchDiscriminant: stmt.expression };
|
|
2642
|
+
}
|
|
2643
|
+
if (ts6.isReturnStatement(stmt) && stmt.expression) {
|
|
2644
|
+
const expr = unwrapJsxTransparent(stmt.expression);
|
|
2645
|
+
if (ts6.isJsxElement(expr) || ts6.isJsxSelfClosingElement(expr) || ts6.isJsxFragment(expr)) {
|
|
2646
|
+
fallback = expr;
|
|
2647
|
+
} else if (expr.kind === ts6.SyntaxKind.NullKeyword) {} else {
|
|
2648
|
+
return null;
|
|
2649
|
+
}
|
|
2650
|
+
continue;
|
|
2651
|
+
}
|
|
2652
|
+
if (ts6.isVariableStatement(stmt))
|
|
2653
|
+
return null;
|
|
2654
|
+
return null;
|
|
2655
|
+
}
|
|
2656
|
+
if (branches.length === 0)
|
|
2657
|
+
return null;
|
|
2658
|
+
return { branches, fallback };
|
|
2659
|
+
}
|
|
2660
|
+
function isDirectReturnBlock(node) {
|
|
2661
|
+
if (ts6.isReturnStatement(node))
|
|
2662
|
+
return true;
|
|
2663
|
+
if (ts6.isBlock(node)) {
|
|
2664
|
+
let returnCount = 0;
|
|
2665
|
+
for (const stmt of node.statements) {
|
|
2666
|
+
if (ts6.isReturnStatement(stmt)) {
|
|
2667
|
+
returnCount++;
|
|
2668
|
+
} else if (ts6.isIfStatement(stmt) || ts6.isSwitchStatement(stmt) || ts6.isForStatement(stmt) || ts6.isForOfStatement(stmt) || ts6.isForInStatement(stmt) || ts6.isWhileStatement(stmt) || ts6.isDoStatement(stmt) || ts6.isTryStatement(stmt)) {
|
|
2669
|
+
return false;
|
|
2670
|
+
}
|
|
2671
|
+
}
|
|
2672
|
+
return returnCount === 1;
|
|
2673
|
+
}
|
|
2674
|
+
return false;
|
|
2675
|
+
}
|
|
2676
|
+
function findNullReturnInBlock(node) {
|
|
2677
|
+
if (ts6.isBlock(node)) {
|
|
2678
|
+
for (const stmt of node.statements) {
|
|
2679
|
+
if (ts6.isReturnStatement(stmt) && stmt.expression) {
|
|
2680
|
+
const expr = unwrapJsxTransparent(stmt.expression);
|
|
2681
|
+
if (expr.kind === ts6.SyntaxKind.NullKeyword)
|
|
2682
|
+
return true;
|
|
2683
|
+
}
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
if (ts6.isReturnStatement(node) && node.expression) {
|
|
2687
|
+
const expr = unwrapJsxTransparent(node.expression);
|
|
2688
|
+
if (expr.kind === ts6.SyntaxKind.NullKeyword)
|
|
2689
|
+
return true;
|
|
2690
|
+
}
|
|
2691
|
+
return false;
|
|
2692
|
+
}
|
|
2693
|
+
function findJsxReturnInCaseClause(clause) {
|
|
2694
|
+
for (const stmt of clause.statements) {
|
|
2695
|
+
if (ts6.isReturnStatement(stmt) && stmt.expression) {
|
|
2696
|
+
return extractJsxFromExpression(stmt.expression);
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
return null;
|
|
2700
|
+
}
|
|
2701
|
+
function findNullReturnInCaseClause(clause) {
|
|
2702
|
+
for (const stmt of clause.statements) {
|
|
2703
|
+
if (ts6.isReturnStatement(stmt) && stmt.expression) {
|
|
2704
|
+
const expr = unwrapJsxTransparent(stmt.expression);
|
|
2705
|
+
if (expr.kind === ts6.SyntaxKind.NullKeyword)
|
|
2706
|
+
return true;
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
return false;
|
|
2710
|
+
}
|
|
2595
2711
|
function isMultiReturnJsxFunctionBody(body) {
|
|
2596
2712
|
let returnCount = 0;
|
|
2597
2713
|
let hasJsxReturn = false;
|
|
@@ -2675,6 +2791,15 @@ function collectFunction(node, ctx, _isModule, isExported = false) {
|
|
|
2675
2791
|
jsxReturn,
|
|
2676
2792
|
params: node.parameters.map((p) => p.name.getText(ctx.sourceFile))
|
|
2677
2793
|
});
|
|
2794
|
+
} else {
|
|
2795
|
+
const multi = extractMultiReturnJsxBranches(node.body);
|
|
2796
|
+
if (multi) {
|
|
2797
|
+
isJsxFunction = true;
|
|
2798
|
+
ctx.jsxMultiReturnFunctions.set(name, {
|
|
2799
|
+
...multi,
|
|
2800
|
+
params: node.parameters.map((p) => p.name.getText(ctx.sourceFile))
|
|
2801
|
+
});
|
|
2802
|
+
}
|
|
2678
2803
|
}
|
|
2679
2804
|
}
|
|
2680
2805
|
const isAsync = node.modifiers?.some((m) => m.kind === ts6.SyntaxKind.AsyncKeyword) ?? false;
|
|
@@ -2927,6 +3052,15 @@ function collectConstant(node, ctx, _isModule, declarationKind = "const", isExpo
|
|
|
2927
3052
|
jsxReturn,
|
|
2928
3053
|
params: init.parameters.map((p) => p.name.getText(ctx.sourceFile))
|
|
2929
3054
|
});
|
|
3055
|
+
} else {
|
|
3056
|
+
const multi = extractMultiReturnJsxBranches(arrowBody);
|
|
3057
|
+
if (multi) {
|
|
3058
|
+
isJsxFunction = true;
|
|
3059
|
+
ctx.jsxMultiReturnFunctions.set(name, {
|
|
3060
|
+
...multi,
|
|
3061
|
+
params: init.parameters.map((p) => p.name.getText(ctx.sourceFile))
|
|
3062
|
+
});
|
|
3063
|
+
}
|
|
2930
3064
|
}
|
|
2931
3065
|
} else {
|
|
2932
3066
|
let body = arrowBody;
|
|
@@ -3186,7 +3320,7 @@ function inferTypeFromValue(value) {
|
|
|
3186
3320
|
if (/\.(some|every|includes)\s*\([\s\S]*\)\s*$/.test(trimmed)) {
|
|
3187
3321
|
return { kind: "primitive", raw: "boolean", primitive: "boolean" };
|
|
3188
3322
|
}
|
|
3189
|
-
if (/\.(indexOf|findIndex|lastIndexOf)\s*\([\s\S]*\)\s*$/.test(trimmed)) {
|
|
3323
|
+
if (/\.(indexOf|findIndex|findLastIndex|lastIndexOf)\s*\([\s\S]*\)\s*$/.test(trimmed)) {
|
|
3190
3324
|
return { kind: "primitive", raw: "number", primitive: "number" };
|
|
3191
3325
|
}
|
|
3192
3326
|
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
@@ -3827,8 +3961,6 @@ var UNSUPPORTED_METHODS = new Set([
|
|
|
3827
3961
|
"reduceRight",
|
|
3828
3962
|
"every",
|
|
3829
3963
|
"some",
|
|
3830
|
-
"findLast",
|
|
3831
|
-
"findLastIndex",
|
|
3832
3964
|
"forEach",
|
|
3833
3965
|
"flatMap",
|
|
3834
3966
|
"flat"
|
|
@@ -3871,7 +4003,7 @@ function convertNode(node, raw) {
|
|
|
3871
4003
|
if (ts7.isCallExpression(node)) {
|
|
3872
4004
|
const callee = convertNode(node.expression, raw);
|
|
3873
4005
|
const args = node.arguments.map((arg) => convertNode(arg, raw));
|
|
3874
|
-
if (callee.kind === "member" && ["filter", "every", "some", "find", "findIndex"].includes(callee.property)) {
|
|
4006
|
+
if (callee.kind === "member" && ["filter", "every", "some", "find", "findIndex", "findLast", "findLastIndex"].includes(callee.property)) {
|
|
3875
4007
|
if (args.length === 1 && args[0].kind === "arrow-fn") {
|
|
3876
4008
|
const arrowFn = args[0];
|
|
3877
4009
|
return {
|
|
@@ -5812,6 +5944,18 @@ function transformExpressionInner(expr, ctx, node, isClientOnly) {
|
|
|
5812
5944
|
}
|
|
5813
5945
|
return ir;
|
|
5814
5946
|
}
|
|
5947
|
+
if (containsAwaitExpression(expr)) {
|
|
5948
|
+
ctx.analyzer.errors.push(createError(ErrorCodes.STAGE_AWAIT_IN_TEMPLATE, getSourceLocation(expr, ctx.sourceFile, ctx.filePath)));
|
|
5949
|
+
return {
|
|
5950
|
+
type: "expression",
|
|
5951
|
+
expr: "undefined",
|
|
5952
|
+
typeInfo: null,
|
|
5953
|
+
reactive: false,
|
|
5954
|
+
slotId: null,
|
|
5955
|
+
loc: getSourceLocation(node, ctx.sourceFile, ctx.filePath),
|
|
5956
|
+
origin: { phase: "tick", scope: "template", effect: "pure", freeRefs: [] }
|
|
5957
|
+
};
|
|
5958
|
+
}
|
|
5815
5959
|
const exprText = ctx.getJS(expr);
|
|
5816
5960
|
const freeRefs = resolveFreeRefs(expr, makeBindingEnv(ctx));
|
|
5817
5961
|
const origin = {
|
|
@@ -5883,6 +6027,97 @@ function transformJsxFunctionCall(callExpr, jsxFunc, ctx, _isClientOnly) {
|
|
|
5883
6027
|
ctx.analyzer.getJS = originalAnalyzerGetJS;
|
|
5884
6028
|
}
|
|
5885
6029
|
}
|
|
6030
|
+
function transformMultiReturnJsxFunctionCall(callExpr, info, ctx) {
|
|
6031
|
+
const substitutions = new Map;
|
|
6032
|
+
for (let i = 0;i < info.params.length; i++) {
|
|
6033
|
+
const paramName = info.params[i];
|
|
6034
|
+
const arg = callExpr.arguments[i];
|
|
6035
|
+
if (arg) {
|
|
6036
|
+
substitutions.set(paramName, ctx.getJS(arg));
|
|
6037
|
+
}
|
|
6038
|
+
}
|
|
6039
|
+
const baseGetJS = ctx.analyzer.getJS.bind(ctx.analyzer);
|
|
6040
|
+
const originalCtxGetJS = ctx.getJS;
|
|
6041
|
+
const originalAnalyzerGetJS = ctx.analyzer.getJS;
|
|
6042
|
+
const substitutedGetJS = (node) => {
|
|
6043
|
+
let text = baseGetJS(node);
|
|
6044
|
+
for (const [paramName, argExpr] of substitutions) {
|
|
6045
|
+
text = text.replace(new RegExp(`\\b${paramName}\\b`, "g"), argExpr);
|
|
6046
|
+
}
|
|
6047
|
+
return text;
|
|
6048
|
+
};
|
|
6049
|
+
ctx.getJS = substitutedGetJS;
|
|
6050
|
+
ctx.analyzer.getJS = substitutedGetJS;
|
|
6051
|
+
try {
|
|
6052
|
+
const loc = getSourceLocation(callExpr, ctx.sourceFile, ctx.filePath);
|
|
6053
|
+
const nullExpr = {
|
|
6054
|
+
type: "expression",
|
|
6055
|
+
expr: "null",
|
|
6056
|
+
typeInfo: { kind: "primitive", raw: "null", primitive: "null" },
|
|
6057
|
+
reactive: false,
|
|
6058
|
+
slotId: null,
|
|
6059
|
+
loc,
|
|
6060
|
+
origin: { phase: "tick", scope: "template", effect: "pure", freeRefs: [] }
|
|
6061
|
+
};
|
|
6062
|
+
let result = info.fallback ? transformNode(info.fallback, ctx) ?? nullExpr : nullExpr;
|
|
6063
|
+
for (let i = info.branches.length - 1;i >= 0; i--) {
|
|
6064
|
+
const branch = info.branches[i];
|
|
6065
|
+
let conditionText;
|
|
6066
|
+
if (info.switchDiscriminant) {
|
|
6067
|
+
const discText = substitutedGetJS(info.switchDiscriminant);
|
|
6068
|
+
const caseText = substitutedGetJS(branch.condition);
|
|
6069
|
+
conditionText = `${discText} === ${caseText}`;
|
|
6070
|
+
} else {
|
|
6071
|
+
conditionText = substitutedGetJS(branch.condition);
|
|
6072
|
+
}
|
|
6073
|
+
const env = makeBindingEnv(ctx);
|
|
6074
|
+
const caseFreeRefs = resolveFreeRefs(branch.condition, env);
|
|
6075
|
+
const discFreeRefs = info.switchDiscriminant ? resolveFreeRefs(info.switchDiscriminant, env) : [];
|
|
6076
|
+
const conditionOrigin = {
|
|
6077
|
+
phase: "tick",
|
|
6078
|
+
scope: "template",
|
|
6079
|
+
effect: "pure",
|
|
6080
|
+
freeRefs: [...discFreeRefs, ...caseFreeRefs]
|
|
6081
|
+
};
|
|
6082
|
+
const reactive = isReactiveExpression(conditionText, ctx, branch.condition) || isReactiveOrigin(conditionOrigin);
|
|
6083
|
+
const loopParamReactive = !reactive && referencesLoopParam(conditionText, ctx);
|
|
6084
|
+
const callsReactive = exprCallsReactiveGetters(branch.condition, ctx) || (info.switchDiscriminant ? exprCallsReactiveGetters(info.switchDiscriminant, ctx) : false);
|
|
6085
|
+
const hasCalls = exprHasFunctionCalls(branch.condition) || (info.switchDiscriminant ? exprHasFunctionCalls(info.switchDiscriminant) : false);
|
|
6086
|
+
const needsSlot = reactive || loopParamReactive || callsReactive || hasCalls;
|
|
6087
|
+
const slotId = needsSlot ? generateSlotId(ctx) : null;
|
|
6088
|
+
const whenTrue = branch.jsxReturn ? transformNode(branch.jsxReturn, ctx) ?? nullExpr : nullExpr;
|
|
6089
|
+
let templateCondition;
|
|
6090
|
+
if (info.switchDiscriminant) {
|
|
6091
|
+
const discRewritten = rewriteBarePropRefs2(substitutedGetJS(info.switchDiscriminant), info.switchDiscriminant, ctx);
|
|
6092
|
+
const caseRewritten = rewriteBarePropRefs2(substitutedGetJS(branch.condition), branch.condition, ctx);
|
|
6093
|
+
const discPart = discRewritten ?? substitutedGetJS(info.switchDiscriminant);
|
|
6094
|
+
const casePart = caseRewritten ?? substitutedGetJS(branch.condition);
|
|
6095
|
+
templateCondition = `${discPart} === ${casePart}`;
|
|
6096
|
+
} else {
|
|
6097
|
+
templateCondition = rewriteBarePropRefs2(conditionText, branch.condition, ctx);
|
|
6098
|
+
}
|
|
6099
|
+
const conditional = {
|
|
6100
|
+
type: "conditional",
|
|
6101
|
+
condition: conditionText,
|
|
6102
|
+
templateCondition,
|
|
6103
|
+
conditionType: null,
|
|
6104
|
+
reactive,
|
|
6105
|
+
whenTrue,
|
|
6106
|
+
whenFalse: result,
|
|
6107
|
+
slotId,
|
|
6108
|
+
callsReactiveGetters: callsReactive || undefined,
|
|
6109
|
+
hasFunctionCalls: hasCalls || undefined,
|
|
6110
|
+
loc,
|
|
6111
|
+
origin: conditionOrigin
|
|
6112
|
+
};
|
|
6113
|
+
result = conditional;
|
|
6114
|
+
}
|
|
6115
|
+
return result;
|
|
6116
|
+
} finally {
|
|
6117
|
+
ctx.getJS = originalCtxGetJS;
|
|
6118
|
+
ctx.analyzer.getJS = originalAnalyzerGetJS;
|
|
6119
|
+
}
|
|
6120
|
+
}
|
|
5886
6121
|
function transformConditional(node, ctx) {
|
|
5887
6122
|
const condition = ctx.getJS(node.condition);
|
|
5888
6123
|
const conditionOrigin = {
|
|
@@ -5964,6 +6199,13 @@ function containsJsxInExpression(node) {
|
|
|
5964
6199
|
}
|
|
5965
6200
|
return ts10.forEachChild(node, containsJsxInExpression) ?? false;
|
|
5966
6201
|
}
|
|
6202
|
+
function containsAwaitExpression(node) {
|
|
6203
|
+
if (ts10.isAwaitExpression(node))
|
|
6204
|
+
return true;
|
|
6205
|
+
if (ts10.isFunctionDeclaration(node) || ts10.isFunctionExpression(node) || ts10.isArrowFunction(node))
|
|
6206
|
+
return false;
|
|
6207
|
+
return ts10.forEachChild(node, containsAwaitExpression) ?? false;
|
|
6208
|
+
}
|
|
5967
6209
|
function transformNullishCoalescing(node, ctx) {
|
|
5968
6210
|
const leftText = ctx.getJS(node.left);
|
|
5969
6211
|
const isNullish = node.operatorToken.kind === ts10.SyntaxKind.QuestionQuestionToken;
|
|
@@ -6054,6 +6296,10 @@ function transformJsxExpression(expr, ctx, isClientOnly = false) {
|
|
|
6054
6296
|
if (jsxFunc) {
|
|
6055
6297
|
return transformJsxFunctionCall(node, jsxFunc, ctx, isClientOnly);
|
|
6056
6298
|
}
|
|
6299
|
+
const multiJsxFunc = ctx.analyzer.jsxMultiReturnFunctions.get(callee.text);
|
|
6300
|
+
if (multiJsxFunc) {
|
|
6301
|
+
return transformMultiReturnJsxFunctionCall(node, multiJsxFunc, ctx);
|
|
6302
|
+
}
|
|
6057
6303
|
}
|
|
6058
6304
|
return null;
|
|
6059
6305
|
}
|
|
@@ -6090,6 +6336,16 @@ function transformJsxExpression(expr, ctx, isClientOnly = false) {
|
|
|
6090
6336
|
case ts10.SyntaxKind.ArrayLiteralExpression:
|
|
6091
6337
|
return null;
|
|
6092
6338
|
case ts10.SyntaxKind.AwaitExpression:
|
|
6339
|
+
ctx.analyzer.errors.push(createError(ErrorCodes.STAGE_AWAIT_IN_TEMPLATE, getSourceLocation(node, ctx.sourceFile, ctx.filePath)));
|
|
6340
|
+
return {
|
|
6341
|
+
type: "expression",
|
|
6342
|
+
expr: "undefined",
|
|
6343
|
+
typeInfo: null,
|
|
6344
|
+
reactive: false,
|
|
6345
|
+
slotId: null,
|
|
6346
|
+
loc: getSourceLocation(node, ctx.sourceFile, ctx.filePath),
|
|
6347
|
+
origin: { phase: "tick", scope: "template", effect: "pure", freeRefs: [] }
|
|
6348
|
+
};
|
|
6093
6349
|
case ts10.SyntaxKind.YieldExpression:
|
|
6094
6350
|
return null;
|
|
6095
6351
|
case ts10.SyntaxKind.SpreadElement:
|
|
@@ -6741,7 +6997,8 @@ function transformMapCall(node, ctx, isClientOnly = false, method = "map") {
|
|
|
6741
6997
|
const bodyIsMultiRoot = loopBodyIsMultiRoot(children);
|
|
6742
6998
|
const callsReactive = exprCallsReactiveGetters(arrayExpr, ctx);
|
|
6743
6999
|
const hasCalls = exprHasFunctionCalls(arrayExpr);
|
|
6744
|
-
const
|
|
7000
|
+
const isDirectPropArray = method !== "flatMap" && isArrayExprDirectPropRef(arrayExpr, ctx);
|
|
7001
|
+
const isStaticArray = !isSignalOrMemoArray(array, ctx) && !isDirectPropArray && !hasCalls;
|
|
6745
7002
|
const nestedComponents = collectNestedComponents(children).filter((c) => c.name !== childComponent?.name);
|
|
6746
7003
|
return {
|
|
6747
7004
|
type: "loop",
|
|
@@ -6757,6 +7014,7 @@ function transformMapCall(node, ctx, isClientOnly = false, method = "map") {
|
|
|
6757
7014
|
slotId: null,
|
|
6758
7015
|
markerId: `l${ctx.loopMarkerCounter++}`,
|
|
6759
7016
|
isStaticArray,
|
|
7017
|
+
isPropDerivedArray: isDirectPropArray || undefined,
|
|
6760
7018
|
callsReactiveGetters: callsReactive || undefined,
|
|
6761
7019
|
hasFunctionCalls: hasCalls || undefined,
|
|
6762
7020
|
bodyIsMultiRoot: bodyIsMultiRoot || undefined,
|
|
@@ -7016,6 +7274,10 @@ function getAttributeValue(attr, ctx) {
|
|
|
7016
7274
|
expr = branchInit;
|
|
7017
7275
|
}
|
|
7018
7276
|
}
|
|
7277
|
+
if (ts10.isAwaitExpression(expr)) {
|
|
7278
|
+
ctx.analyzer.errors.push(createError(ErrorCodes.STAGE_AWAIT_IN_TEMPLATE, getSourceLocation(expr, ctx.sourceFile, ctx.filePath)));
|
|
7279
|
+
return AttrValueOf.expression("undefined");
|
|
7280
|
+
}
|
|
7019
7281
|
checkBareSignalOrMemoIdentifier(expr, ctx);
|
|
7020
7282
|
if (attr.name.getText(ctx.sourceFile) === "style" && ts10.isObjectLiteralExpression(expr)) {
|
|
7021
7283
|
const cssString = tryStaticStyleObjectToCss(expr);
|
|
@@ -7337,6 +7599,20 @@ function checkBareSignalOrMemoIdentifier(expr, ctx) {
|
|
|
7337
7599
|
}
|
|
7338
7600
|
}
|
|
7339
7601
|
}
|
|
7602
|
+
function isArrayExprDirectPropRef(arrayExpr, ctx) {
|
|
7603
|
+
const propNames = new Set(ctx.patterns.props.map((p) => p.name));
|
|
7604
|
+
const propsObjName = ctx.analyzer.propsObjectName;
|
|
7605
|
+
if (ts10.isIdentifier(arrayExpr)) {
|
|
7606
|
+
return propNames.has(arrayExpr.text);
|
|
7607
|
+
}
|
|
7608
|
+
if (ts10.isPropertyAccessExpression(arrayExpr) && propsObjName) {
|
|
7609
|
+
const obj = arrayExpr.expression;
|
|
7610
|
+
if (ts10.isIdentifier(obj) && obj.text === propsObjName) {
|
|
7611
|
+
return true;
|
|
7612
|
+
}
|
|
7613
|
+
}
|
|
7614
|
+
return false;
|
|
7615
|
+
}
|
|
7340
7616
|
function isSignalOrMemoArray(array, ctx) {
|
|
7341
7617
|
for (const { pattern } of ctx.patterns.signals) {
|
|
7342
7618
|
if (pattern.test(array))
|
|
@@ -12798,14 +13074,11 @@ function buildReactiveEmit(inner, level, wrapOuter) {
|
|
|
12798
13074
|
}));
|
|
12799
13075
|
const reactiveAttrs = inner.bindings.reactiveAttrs.map((attr) => {
|
|
12800
13076
|
const wrapped = wrapLoopParamAsAccessor(wrapOuter(attr.expression), inner.param, inner.paramBindings);
|
|
12801
|
-
const isStyleObject = attr.attrName === "style" && /^\s*\{/.test(attr.expression);
|
|
12802
13077
|
return {
|
|
12803
13078
|
slotId: attr.childSlotId,
|
|
12804
|
-
attrName:
|
|
13079
|
+
attrName: attr.attrName,
|
|
12805
13080
|
wrappedExpression: wrapped,
|
|
12806
|
-
|
|
12807
|
-
isBoolean: isBooleanAttr(attr.attrName),
|
|
12808
|
-
presenceOrUndefined: !!attr.presenceOrUndefined
|
|
13081
|
+
meta: pickAttrMeta(attr)
|
|
12809
13082
|
};
|
|
12810
13083
|
});
|
|
12811
13084
|
const preludeStatements = [];
|
|
@@ -13838,16 +14111,11 @@ function emitReactive(lines, inner, indent) {
|
|
|
13838
14111
|
for (const attr of emit.reactiveAttrs) {
|
|
13839
14112
|
const targetVar = `__ta_${attr.slotId.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
13840
14113
|
lines.push(`${indent} { const ${targetVar} = qsa(__innerEl${uid}, '[bf="${attr.slotId}"]')`);
|
|
13841
|
-
if (
|
|
13842
|
-
|
|
13843
|
-
}
|
|
13844
|
-
lines.push(`${indent} if (${targetVar}) createEffect(() => { if (${attr.wrappedExpression}) ${targetVar}.setAttribute('${attr.attrName}', ''); else ${targetVar}.removeAttribute('${attr.attrName}') }) }`);
|
|
13845
|
-
} else if (attr.presenceOrUndefined) {
|
|
13846
|
-
const ariaVal = attr.attrName.startsWith("aria-") ? "'true'" : "''";
|
|
13847
|
-
lines.push(`${indent} if (${targetVar}) createEffect(() => { if (${attr.wrappedExpression}) ${targetVar}.setAttribute('${attr.attrName}', ${ariaVal}); else ${targetVar}.removeAttribute('${attr.attrName}') }) }`);
|
|
13848
|
-
} else {
|
|
13849
|
-
lines.push(`${indent} if (${targetVar}) createEffect(() => { const __v = ${attr.wrappedExpression}; if (__v != null) ${targetVar}.setAttribute('${attr.attrName}', String(__v)); else ${targetVar}.removeAttribute('${attr.attrName}') }) }`);
|
|
14114
|
+
lines.push(`${indent} if (${targetVar}) createEffect(() => {`);
|
|
14115
|
+
for (const stmt of emitAttrUpdate(targetVar, attr.attrName, attr.wrappedExpression, attr.meta)) {
|
|
14116
|
+
lines.push(`${indent} ${stmt}`);
|
|
13850
14117
|
}
|
|
14118
|
+
lines.push(`${indent} }) }`);
|
|
13851
14119
|
}
|
|
13852
14120
|
emitLoopChildRefs(lines, emit.childRefs, {
|
|
13853
14121
|
indent: `${indent} `,
|