@fluixi/compiler 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/analyze/expr-shape.cjs +62 -0
- package/dist/analyze/expr-shape.d.cts +14 -0
- package/dist/analyze/expr-shape.d.ts +15 -0
- package/dist/analyze/expr-shape.d.ts.map +1 -0
- package/dist/analyze/expr-shape.js +37 -0
- package/dist/analyze/expr-shape.mjs +41 -0
- package/dist/analyze/intrinsics.cjs +112 -0
- package/dist/analyze/intrinsics.d.cts +80 -0
- package/dist/analyze/intrinsics.d.ts +81 -0
- package/dist/analyze/intrinsics.d.ts.map +1 -0
- package/dist/analyze/intrinsics.js +126 -0
- package/dist/analyze/intrinsics.mjs +91 -0
- package/dist/analyze/paren.cjs +134 -0
- package/dist/analyze/paren.d.cts +23 -0
- package/dist/analyze/paren.d.ts +24 -0
- package/dist/analyze/paren.d.ts.map +1 -0
- package/dist/analyze/paren.js +168 -0
- package/dist/analyze/paren.mjs +113 -0
- package/dist/analyze/props-destructure.cjs +226 -0
- package/dist/analyze/props-destructure.d.cts +83 -0
- package/dist/analyze/props-destructure.d.ts +84 -0
- package/dist/analyze/props-destructure.d.ts.map +1 -0
- package/dist/analyze/props-destructure.js +272 -0
- package/dist/analyze/props-destructure.mjs +205 -0
- package/dist/analyze/reactive-bindings.cjs +210 -0
- package/dist/analyze/reactive-bindings.d.cts +42 -0
- package/dist/analyze/reactive-bindings.d.ts +43 -0
- package/dist/analyze/reactive-bindings.d.ts.map +1 -0
- package/dist/analyze/reactive-bindings.js +191 -0
- package/dist/analyze/reactive-bindings.mjs +187 -0
- package/dist/analyze/reactive-expr.cjs +38 -0
- package/dist/analyze/reactive-expr.d.cts +38 -0
- package/dist/analyze/reactive-expr.d.ts +39 -0
- package/dist/analyze/reactive-expr.d.ts.map +1 -0
- package/dist/analyze/reactive-expr.js +31 -0
- package/dist/analyze/reactive-expr.mjs +17 -0
- package/dist/analyze/static-graph.cjs +831 -0
- package/dist/analyze/static-graph.d.cts +102 -0
- package/dist/analyze/static-graph.d.ts +103 -0
- package/dist/analyze/static-graph.d.ts.map +1 -0
- package/dist/analyze/static-graph.js +871 -0
- package/dist/analyze/static-graph.mjs +813 -0
- package/dist/babel-I6BUWUCU.mjs +636 -0
- package/dist/chunk-3AICWNF7.mjs +92 -0
- package/dist/chunk-6CWJWGE2.mjs +2170 -0
- package/dist/chunk-C3XPDB4Y.mjs +16 -0
- package/dist/chunk-GX5XV6Z7.mjs +190 -0
- package/dist/chunk-HXEXPWJ2.mjs +999 -0
- package/dist/chunk-NU3W67UZ.mjs +584 -0
- package/dist/chunk-SKAVY75W.mjs +11 -0
- package/dist/codegen/backend.cjs +18 -0
- package/dist/codegen/backend.d.cts +35 -0
- package/dist/codegen/backend.d.ts +36 -0
- package/dist/codegen/backend.d.ts.map +1 -0
- package/dist/codegen/backend.js +1 -0
- package/dist/codegen/backend.mjs +0 -0
- package/dist/codegen/backends/imperative.cjs +577 -0
- package/dist/codegen/backends/imperative.d.cts +11 -0
- package/dist/codegen/backends/imperative.d.ts +12 -0
- package/dist/codegen/backends/imperative.d.ts.map +1 -0
- package/dist/codegen/backends/imperative.js +362 -0
- package/dist/codegen/backends/imperative.mjs +554 -0
- package/dist/codegen/contract.cjs +52 -0
- package/dist/codegen/contract.d.cts +24 -0
- package/dist/codegen/contract.d.ts +25 -0
- package/dist/codegen/contract.d.ts.map +1 -0
- package/dist/codegen/contract.js +30 -0
- package/dist/codegen/contract.mjs +31 -0
- package/dist/codegen/partial-template.cjs +176 -0
- package/dist/codegen/partial-template.d.cts +61 -0
- package/dist/codegen/partial-template.d.ts +62 -0
- package/dist/codegen/partial-template.d.ts.map +1 -0
- package/dist/codegen/partial-template.js +0 -0
- package/dist/codegen/partial-template.mjs +153 -0
- package/dist/codegen/serialize-static.cjs +125 -0
- package/dist/codegen/serialize-static.d.cts +38 -0
- package/dist/codegen/serialize-static.d.ts +39 -0
- package/dist/codegen/serialize-static.d.ts.map +1 -0
- package/dist/codegen/serialize-static.js +165 -0
- package/dist/codegen/serialize-static.mjs +104 -0
- package/dist/frontend/babel/build-ir-lit.cjs +1933 -0
- package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
- package/dist/frontend/babel/build-ir-lit.d.ts +27 -0
- package/dist/frontend/babel/build-ir-lit.d.ts.map +1 -0
- package/dist/frontend/babel/build-ir-lit.js +13 -0
- package/dist/frontend/babel/build-ir-lit.mjs +1902 -0
- package/dist/frontend/babel/build-ir.cjs +1948 -0
- package/dist/frontend/babel/build-ir.d.cts +35 -0
- package/dist/frontend/babel/build-ir.d.ts +36 -0
- package/dist/frontend/babel/build-ir.d.ts.map +1 -0
- package/dist/frontend/babel/build-ir.js +124 -0
- package/dist/frontend/babel/build-ir.mjs +1919 -0
- package/dist/frontend/babel/index.cjs +2610 -0
- package/dist/frontend/babel/index.d.cts +33 -0
- package/dist/frontend/babel/index.d.ts +34 -0
- package/dist/frontend/babel/index.d.ts.map +1 -0
- package/dist/frontend/babel/index.js +65 -0
- package/dist/frontend/babel/index.mjs +2580 -0
- package/dist/frontend/babel/lower-template.cjs +1931 -0
- package/dist/frontend/babel/lower-template.d.cts +23 -0
- package/dist/frontend/babel/lower-template.d.ts +24 -0
- package/dist/frontend/babel/lower-template.d.ts.map +1 -0
- package/dist/frontend/babel/lower-template.js +64 -0
- package/dist/frontend/babel/lower-template.mjs +1902 -0
- package/dist/frontend/babel/plugin.cjs +2556 -0
- package/dist/frontend/babel/plugin.d.cts +95 -0
- package/dist/frontend/babel/plugin.d.ts +96 -0
- package/dist/frontend/babel/plugin.d.ts.map +1 -0
- package/dist/frontend/babel/plugin.js +523 -0
- package/dist/frontend/babel/plugin.mjs +2527 -0
- package/dist/frontend/babel/server-functions.cjs +110 -0
- package/dist/frontend/babel/server-functions.d.cts +10 -0
- package/dist/frontend/babel/server-functions.d.ts +11 -0
- package/dist/frontend/babel/server-functions.d.ts.map +1 -0
- package/dist/frontend/babel/server-functions.js +81 -0
- package/dist/frontend/babel/server-functions.mjs +89 -0
- package/dist/frontend/babel/types.cjs +18 -0
- package/dist/frontend/babel/types.d.cts +33 -0
- package/dist/frontend/babel/types.d.ts +34 -0
- package/dist/frontend/babel/types.d.ts.map +1 -0
- package/dist/frontend/babel/types.js +1 -0
- package/dist/frontend/babel/types.mjs +0 -0
- package/dist/frontend/types.cjs +18 -0
- package/dist/frontend/types.d.cts +25 -0
- package/dist/frontend/types.d.ts +26 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/frontend/types.js +1 -0
- package/dist/frontend/types.mjs +0 -0
- package/dist/frontend/vocabulary.cjs +98 -0
- package/dist/frontend/vocabulary.d.cts +79 -0
- package/dist/frontend/vocabulary.d.ts +80 -0
- package/dist/frontend/vocabulary.d.ts.map +1 -0
- package/dist/frontend/vocabulary.js +124 -0
- package/dist/frontend/vocabulary.mjs +77 -0
- package/dist/index.cjs +1957 -0
- package/dist/index.d.cts +27 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.mjs +1949 -0
- package/dist/integrations.cjs +5705 -0
- package/dist/integrations.d.cts +215 -0
- package/dist/integrations.d.ts +216 -0
- package/dist/integrations.d.ts.map +1 -0
- package/dist/integrations.js +566 -0
- package/dist/integrations.mjs +810 -0
- package/dist/ir/nodes.cjs +18 -0
- package/dist/ir/nodes.d.cts +168 -0
- package/dist/ir/nodes.d.ts +169 -0
- package/dist/ir/nodes.d.ts.map +1 -0
- package/dist/ir/nodes.js +1 -0
- package/dist/ir/nodes.mjs +0 -0
- package/dist/lower/compile-template.cjs +1670 -0
- package/dist/lower/compile-template.d.cts +82 -0
- package/dist/lower/compile-template.d.ts +83 -0
- package/dist/lower/compile-template.d.ts.map +1 -0
- package/dist/lower/compile-template.js +79 -0
- package/dist/lower/compile-template.mjs +1662 -0
- package/dist/lower/entities.cjs +288 -0
- package/dist/lower/entities.d.cts +1 -0
- package/dist/lower/entities.d.ts +2 -0
- package/dist/lower/entities.d.ts.map +1 -0
- package/dist/lower/entities.js +54 -0
- package/dist/lower/entities.mjs +267 -0
- package/dist/lower/jsx.cjs +1101 -0
- package/dist/lower/jsx.d.cts +33 -0
- package/dist/lower/jsx.d.ts +34 -0
- package/dist/lower/jsx.d.ts.map +1 -0
- package/dist/lower/jsx.js +414 -0
- package/dist/lower/jsx.mjs +1078 -0
- package/dist/lower/template.cjs +1354 -0
- package/dist/lower/template.d.cts +53 -0
- package/dist/lower/template.d.ts +54 -0
- package/dist/lower/template.d.ts.map +1 -0
- package/dist/lower/template.js +542 -0
- package/dist/lower/template.mjs +1335 -0
- package/dist/lower/text.cjs +42 -0
- package/dist/lower/text.d.cts +10 -0
- package/dist/lower/text.d.ts +11 -0
- package/dist/lower/text.d.ts.map +1 -0
- package/dist/lower/text.js +31 -0
- package/dist/lower/text.mjs +21 -0
- package/dist/optimize/analyze-static.cjs +112 -0
- package/dist/optimize/analyze-static.d.cts +39 -0
- package/dist/optimize/analyze-static.d.ts +40 -0
- package/dist/optimize/analyze-static.d.ts.map +1 -0
- package/dist/optimize/analyze-static.js +131 -0
- package/dist/optimize/analyze-static.mjs +91 -0
- package/dist/optimize/collapse-strategies.cjs +90 -0
- package/dist/optimize/collapse-strategies.d.cts +30 -0
- package/dist/optimize/collapse-strategies.d.ts +31 -0
- package/dist/optimize/collapse-strategies.d.ts.map +1 -0
- package/dist/optimize/collapse-strategies.js +33 -0
- package/dist/optimize/collapse-strategies.mjs +67 -0
- package/dist/options.cjs +33 -0
- package/dist/options.d.cts +39 -0
- package/dist/options.d.ts +40 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +8 -0
- package/dist/options.mjs +12 -0
- package/dist/resolve/builtins.cjs +73 -0
- package/dist/resolve/builtins.d.cts +68 -0
- package/dist/resolve/builtins.d.ts +69 -0
- package/dist/resolve/builtins.d.ts.map +1 -0
- package/dist/resolve/builtins.js +64 -0
- package/dist/resolve/builtins.mjs +53 -0
- package/dist/resolve/component-globals.cjs +272 -0
- package/dist/resolve/component-globals.d.cts +88 -0
- package/dist/resolve/component-globals.d.ts +89 -0
- package/dist/resolve/component-globals.d.ts.map +1 -0
- package/dist/resolve/component-globals.js +160 -0
- package/dist/resolve/component-globals.mjs +249 -0
- package/dist/resolve/component-resolver.cjs +80 -0
- package/dist/resolve/component-resolver.d.cts +68 -0
- package/dist/resolve/component-resolver.d.ts +69 -0
- package/dist/resolve/component-resolver.d.ts.map +1 -0
- package/dist/resolve/component-resolver.js +95 -0
- package/dist/resolve/component-resolver.mjs +59 -0
- package/dist/resolve/load-directive.cjs +93 -0
- package/dist/resolve/load-directive.d.cts +53 -0
- package/dist/resolve/load-directive.d.ts +54 -0
- package/dist/resolve/load-directive.d.ts.map +1 -0
- package/dist/resolve/load-directive.js +93 -0
- package/dist/resolve/load-directive.mjs +72 -0
- package/dist/resolve/resolve-ir.cjs +108 -0
- package/dist/resolve/resolve-ir.d.cts +53 -0
- package/dist/resolve/resolve-ir.d.ts +54 -0
- package/dist/resolve/resolve-ir.d.ts.map +1 -0
- package/dist/resolve/resolve-ir.js +58 -0
- package/dist/resolve/resolve-ir.mjs +85 -0
- package/dist/resolve/write-globals.cjs +383 -0
- package/dist/resolve/write-globals.d.cts +36 -0
- package/dist/resolve/write-globals.d.ts +37 -0
- package/dist/resolve/write-globals.d.ts.map +1 -0
- package/dist/resolve/write-globals.js +169 -0
- package/dist/resolve/write-globals.mjs +362 -0
- package/dist/server-fns-VZLHMQTC.mjs +79 -0
- package/dist/server-functions-UAZKOLZW.mjs +82 -0
- package/dist/transform/bindings.cjs +71 -0
- package/dist/transform/bindings.d.cts +16 -0
- package/dist/transform/bindings.d.ts +17 -0
- package/dist/transform/bindings.d.ts.map +1 -0
- package/dist/transform/bindings.js +69 -0
- package/dist/transform/bindings.mjs +50 -0
- package/dist/transform/index.cjs +3837 -0
- package/dist/transform/index.d.cts +15 -0
- package/dist/transform/index.d.ts +16 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +12 -0
- package/dist/transform/index.mjs +4882 -0
- package/dist/transform/intrinsics.cjs +261 -0
- package/dist/transform/intrinsics.d.cts +33 -0
- package/dist/transform/intrinsics.d.ts +34 -0
- package/dist/transform/intrinsics.d.ts.map +1 -0
- package/dist/transform/intrinsics.js +120 -0
- package/dist/transform/intrinsics.mjs +238 -0
- package/dist/transform/props.cjs +441 -0
- package/dist/transform/props.d.cts +45 -0
- package/dist/transform/props.d.ts +46 -0
- package/dist/transform/props.d.ts.map +1 -0
- package/dist/transform/props.js +221 -0
- package/dist/transform/props.mjs +1487 -0
- package/dist/transform/server-fn-id.cjs +35 -0
- package/dist/transform/server-fn-id.d.cts +9 -0
- package/dist/transform/server-fn-id.d.ts +10 -0
- package/dist/transform/server-fn-id.d.ts.map +1 -0
- package/dist/transform/server-fn-id.js +18 -0
- package/dist/transform/server-fn-id.mjs +14 -0
- package/dist/transform/server-fns.cjs +114 -0
- package/dist/transform/server-fns.d.cts +12 -0
- package/dist/transform/server-fns.d.ts +13 -0
- package/dist/transform/server-fns.d.ts.map +1 -0
- package/dist/transform/server-fns.js +94 -0
- package/dist/transform/server-fns.mjs +1160 -0
- package/dist/transform/source-locations.cjs +393 -0
- package/dist/transform/source-locations.d.cts +48 -0
- package/dist/transform/source-locations.d.ts +49 -0
- package/dist/transform/source-locations.d.ts.map +1 -0
- package/dist/transform/source-locations.js +303 -0
- package/dist/transform/source-locations.mjs +370 -0
- package/dist/transform/styles.cjs +606 -0
- package/dist/transform/styles.d.cts +237 -0
- package/dist/transform/styles.d.ts +238 -0
- package/dist/transform/styles.d.ts.map +1 -0
- package/dist/transform/styles.js +743 -0
- package/dist/transform/styles.mjs +671 -0
- package/dist/transform/templates.cjs +3806 -0
- package/dist/transform/templates.d.cts +82 -0
- package/dist/transform/templates.d.ts +83 -0
- package/dist/transform/templates.d.ts.map +1 -0
- package/dist/transform/templates.js +613 -0
- package/dist/transform/templates.mjs +4852 -0
- package/dist/transform-3W45L3EA.mjs +951 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/vite-styles.cjs +223 -0
- package/dist/vite-styles.d.cts +68 -0
- package/dist/vite-styles.d.ts +69 -0
- package/dist/vite-styles.d.ts.map +1 -0
- package/dist/vite-styles.js +241 -0
- package/dist/vite-styles.mjs +214 -0
- package/package.json +141 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Babel front-end: build the host-agnostic IR from a JSX AST node.
|
|
3
|
+
*
|
|
4
|
+
* This is the parsing-end half of the pipeline (AST -> IR); the imperative
|
|
5
|
+
* backend's emit() is the codegen half (IR -> code). Keeping the JSX analysis
|
|
6
|
+
* here and the code generation in the backend is what lets a future swc
|
|
7
|
+
* front-end reuse the exact same backend.
|
|
8
|
+
*
|
|
9
|
+
* JSX can appear nested inside arbitrary expressions (render-props, ternaries,
|
|
10
|
+
* `fallback={<p/>}`, `arr.map(x => <li/>)`, `() => cond && <div/>`, …). The IR
|
|
11
|
+
* models prop/child *expressions* as code strings, so any JSX inside such an
|
|
12
|
+
* expression is recursively compiled (build-ir -> emit) and spliced back in,
|
|
13
|
+
* with the runtime symbols it uses collected into `used` for import injection.
|
|
14
|
+
*/
|
|
15
|
+
import { types as t } from '@babel/core';
|
|
16
|
+
import type { IRNode } from '../../ir/nodes.cjs';
|
|
17
|
+
/** Stringify an expression, compiling any JSX nested inside it first. */
|
|
18
|
+
export declare function genExpr(node: t.Expression, used: Set<string>, onNested?: NestedHook): string;
|
|
19
|
+
/**
|
|
20
|
+
* Called with the IR of JSX (or a template) found inside an expression.
|
|
21
|
+
*
|
|
22
|
+
* That IR is compiled and thrown away during the walk, so anything the module
|
|
23
|
+
* needs because of it: a component import, a delegated event, has to be taken
|
|
24
|
+
* off it here or it is lost. Without this, `{(b) => <Input/>}` emitted a
|
|
25
|
+
* reference to `Input` that nothing imported.
|
|
26
|
+
*/
|
|
27
|
+
export type NestedHook = (ir: IRNode) => void;
|
|
28
|
+
export declare const SVG_TAGS: Set<string>;
|
|
29
|
+
export declare function isReactiveExpr(node: t.Expression): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Build IR from a JSX node. The builder is shared (lower/jsx.ts); what this
|
|
32
|
+
* front-end supplies is how an expression becomes source, `genExpr`, which also
|
|
33
|
+
* compiles any JSX or `` html`` `` nested inside it.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildIR(node: t.JSXElement | t.JSXFragment, used?: Set<string>, onNested?: NestedHook): IRNode;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Babel front-end: build the host-agnostic IR from a JSX AST node.
|
|
3
|
+
*
|
|
4
|
+
* This is the parsing-end half of the pipeline (AST -> IR); the imperative
|
|
5
|
+
* backend's emit() is the codegen half (IR -> code). Keeping the JSX analysis
|
|
6
|
+
* here and the code generation in the backend is what lets a future swc
|
|
7
|
+
* front-end reuse the exact same backend.
|
|
8
|
+
*
|
|
9
|
+
* JSX can appear nested inside arbitrary expressions (render-props, ternaries,
|
|
10
|
+
* `fallback={<p/>}`, `arr.map(x => <li/>)`, `() => cond && <div/>`, …). The IR
|
|
11
|
+
* models prop/child *expressions* as code strings, so any JSX inside such an
|
|
12
|
+
* expression is recursively compiled (build-ir -> emit) and spliced back in,
|
|
13
|
+
* with the runtime symbols it uses collected into `used` for import injection.
|
|
14
|
+
*/
|
|
15
|
+
import { types as t } from '@babel/core';
|
|
16
|
+
import type { IRNode } from '../../ir/nodes.js';
|
|
17
|
+
/** Stringify an expression, compiling any JSX nested inside it first. */
|
|
18
|
+
export declare function genExpr(node: t.Expression, used: Set<string>, onNested?: NestedHook): string;
|
|
19
|
+
/**
|
|
20
|
+
* Called with the IR of JSX (or a template) found inside an expression.
|
|
21
|
+
*
|
|
22
|
+
* That IR is compiled and thrown away during the walk, so anything the module
|
|
23
|
+
* needs because of it: a component import, a delegated event, has to be taken
|
|
24
|
+
* off it here or it is lost. Without this, `{(b) => <Input/>}` emitted a
|
|
25
|
+
* reference to `Input` that nothing imported.
|
|
26
|
+
*/
|
|
27
|
+
export type NestedHook = (ir: IRNode) => void;
|
|
28
|
+
export declare const SVG_TAGS: Set<string>;
|
|
29
|
+
export declare function isReactiveExpr(node: t.Expression): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Build IR from a JSX node. The builder is shared (lower/jsx.ts); what this
|
|
32
|
+
* front-end supplies is how an expression becomes source, `genExpr`, which also
|
|
33
|
+
* compiles any JSX or `` html`` `` nested inside it.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildIR(node: t.JSXElement | t.JSXFragment, used?: Set<string>, onNested?: NestedHook): IRNode;
|
|
36
|
+
//# sourceMappingURL=build-ir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ir.d.ts","sourceRoot":"","sources":["../../../src/frontend/babel/build-ir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,IAAI,CAAC,EAAsB,MAAM,aAAa,CAAC;AAI7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAwDhD,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAE5F;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9C,eAAO,MAAM,QAAQ,aAGnB,CAAC;AA2BH,wBAAgB,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,OAAO,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,EAClC,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,EAC7B,QAAQ,CAAC,EAAE,UAAU,GACpB,MAAM,CAWR"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Babel front-end: build the host-agnostic IR from a JSX AST node.
|
|
3
|
+
*
|
|
4
|
+
* This is the parsing-end half of the pipeline (AST -> IR); the imperative
|
|
5
|
+
* backend's emit() is the codegen half (IR -> code). Keeping the JSX analysis
|
|
6
|
+
* here and the code generation in the backend is what lets a future swc
|
|
7
|
+
* front-end reuse the exact same backend.
|
|
8
|
+
*
|
|
9
|
+
* JSX can appear nested inside arbitrary expressions (render-props, ternaries,
|
|
10
|
+
* `fallback={<p/>}`, `arr.map(x => <li/>)`, `() => cond && <div/>`, …). The IR
|
|
11
|
+
* models prop/child *expressions* as code strings, so any JSX inside such an
|
|
12
|
+
* expression is recursively compiled (build-ir -> emit) and spliced back in,
|
|
13
|
+
* with the runtime symbols it uses collected into `used` for import injection.
|
|
14
|
+
*/
|
|
15
|
+
import { types as t, traverse, template } from '@babel/core';
|
|
16
|
+
import _generate from '@babel/generator';
|
|
17
|
+
import { imperativeBackend, inlineTemplates } from '../../codegen/backends/imperative.js';
|
|
18
|
+
import { buildIRFromLit } from './build-ir-lit.js';
|
|
19
|
+
import { buildJsxIR } from '../../lower/jsx.js';
|
|
20
|
+
import { isReactiveShape } from '../../analyze/reactive-expr.js';
|
|
21
|
+
import { shapeOf } from '../../analyze/expr-shape.js';
|
|
22
|
+
// @babel/generator's ESM/CJS interop default (its types aren't callable under nodenext).
|
|
23
|
+
const generate = _generate.default ?? _generate;
|
|
24
|
+
/** Stringify an AST node back to source. */
|
|
25
|
+
function gen(node) {
|
|
26
|
+
return generate(node, { concise: true }).code;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Replace every JSX node nested inside `node` with the imperative code emitted
|
|
30
|
+
* for it (build-ir -> emit), so the resulting expression is plain JS. Runtime
|
|
31
|
+
* symbols used by the nested code are added to `used`.
|
|
32
|
+
*/
|
|
33
|
+
function transformNestedJSX(node, used, onNested) {
|
|
34
|
+
const clone = t.cloneNode(node, true);
|
|
35
|
+
const file = t.file(t.program([t.expressionStatement(clone)]));
|
|
36
|
+
let changed = false;
|
|
37
|
+
const emitInto = (path, code, imports) => {
|
|
38
|
+
for (const s of imports)
|
|
39
|
+
used.add(s);
|
|
40
|
+
// parse as TS: a hole/arrow param may carry a type annotation ((x: T) => …);
|
|
41
|
+
// preset-typescript strips it downstream, but the reparse must accept it.
|
|
42
|
+
path.replaceWith(template.expression(code, { placeholderPattern: false, plugins: ['typescript'] })());
|
|
43
|
+
path.skip(); // build-ir already handled this subtree (incl. anything nested)
|
|
44
|
+
changed = true;
|
|
45
|
+
};
|
|
46
|
+
traverse(file, {
|
|
47
|
+
'JSXElement|JSXFragment'(path) {
|
|
48
|
+
const jsx = path.node;
|
|
49
|
+
// Resolve before emitting: the emitted call refers to the component by name,
|
|
50
|
+
// and whoever injects the import has to have seen it.
|
|
51
|
+
const nestedIR = buildIR(jsx, used, onNested);
|
|
52
|
+
onNested?.(nestedIR);
|
|
53
|
+
const { code, imports, templates } = imperativeBackend.emit(nestedIR, {});
|
|
54
|
+
emitInto(path, inlineTemplates(code, templates), imports);
|
|
55
|
+
},
|
|
56
|
+
// Nested lit templates compose: ${cond ? html`…` : html`…`},
|
|
57
|
+
// ${list.map(x => html`<li>${x}</li>`)}. Compile them the same way.
|
|
58
|
+
TaggedTemplateExpression(path) {
|
|
59
|
+
const tag = path.node.tag;
|
|
60
|
+
if (!t.isIdentifier(tag) || (tag.name !== 'html' && tag.name !== 'svg'))
|
|
61
|
+
return;
|
|
62
|
+
const ir = buildIRFromLit(path.node, used, { svg: tag.name === 'svg', onNested });
|
|
63
|
+
onNested?.(ir);
|
|
64
|
+
const { code, imports, templates } = imperativeBackend.emit(ir, {});
|
|
65
|
+
emitInto(path, inlineTemplates(code, templates), imports);
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
return changed
|
|
69
|
+
? file.program.body[0].expression
|
|
70
|
+
: node;
|
|
71
|
+
}
|
|
72
|
+
/** Stringify an expression, compiling any JSX nested inside it first. */
|
|
73
|
+
export function genExpr(node, used, onNested) {
|
|
74
|
+
return gen(transformNestedJSX(node, used, onNested));
|
|
75
|
+
}
|
|
76
|
+
export const SVG_TAGS = new Set([
|
|
77
|
+
'svg', 'path', 'circle', 'rect', 'line', 'polygon', 'polyline',
|
|
78
|
+
'ellipse', 'g', 'defs', 'clipPath', 'text',
|
|
79
|
+
]);
|
|
80
|
+
const EVENT_RE = /^on[A-Z]/;
|
|
81
|
+
const DELEGATED = new Set([
|
|
82
|
+
'click', 'dblclick', 'input', 'change', 'submit', 'focus', 'blur',
|
|
83
|
+
'keydown', 'keyup', 'keypress', 'mousedown', 'mouseup',
|
|
84
|
+
]);
|
|
85
|
+
/** A JSX tag is a component when its name is capitalized / a member / namespaced. */
|
|
86
|
+
function tagInfo(name) {
|
|
87
|
+
if (t.isJSXIdentifier(name)) {
|
|
88
|
+
const isComponent = name.name[0] !== name.name[0].toLowerCase();
|
|
89
|
+
return { tag: name.name, component: isComponent };
|
|
90
|
+
}
|
|
91
|
+
if (t.isJSXMemberExpression(name))
|
|
92
|
+
return { tag: gen(name), component: true };
|
|
93
|
+
if (t.isJSXNamespacedName(name)) {
|
|
94
|
+
return { tag: `${name.namespace.name}:${name.name.name}`, component: false };
|
|
95
|
+
}
|
|
96
|
+
return { tag: 'div', component: false };
|
|
97
|
+
}
|
|
98
|
+
function attrName(name) {
|
|
99
|
+
if (t.isJSXIdentifier(name))
|
|
100
|
+
return name.name === 'class' ? 'className' : name.name;
|
|
101
|
+
if (t.isJSXNamespacedName(name))
|
|
102
|
+
return `${name.namespace.name}:${name.name.name}`;
|
|
103
|
+
return 'unknown';
|
|
104
|
+
}
|
|
105
|
+
export function isReactiveExpr(node) {
|
|
106
|
+
return isReactiveShape(shapeOf(node));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build IR from a JSX node. The builder is shared (lower/jsx.ts); what this
|
|
110
|
+
* front-end supplies is how an expression becomes source, `genExpr`, which also
|
|
111
|
+
* compiles any JSX or `` html`` `` nested inside it.
|
|
112
|
+
*/
|
|
113
|
+
export function buildIR(node, used = new Set(), onNested) {
|
|
114
|
+
const ir = buildJsxIR(node, {
|
|
115
|
+
code: (n) =>
|
|
116
|
+
// A member-expression tag (`<ns.Foo/>`) is not an Expression, so it cannot go
|
|
117
|
+
// through the nested-JSX compile: it only ever needs printing.
|
|
118
|
+
n.type === 'JSXMemberExpression'
|
|
119
|
+
? gen(n)
|
|
120
|
+
: genExpr(n, used, onNested),
|
|
121
|
+
used,
|
|
122
|
+
});
|
|
123
|
+
return ir;
|
|
124
|
+
}
|