@reckona/mreact-compiler 0.0.160 → 0.0.162
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/boundary-graph.d.ts +13 -0
- package/dist/boundary-graph.d.ts.map +1 -1
- package/dist/boundary-graph.js +1 -0
- package/dist/boundary-graph.js.map +1 -1
- package/dist/compiler-module-context.d.ts +2 -0
- package/dist/compiler-module-context.d.ts.map +1 -1
- package/dist/compiler-module-context.js +1 -0
- package/dist/compiler-module-context.js.map +1 -1
- package/dist/diagnostics.d.ts +1 -0
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +1 -0
- package/dist/diagnostics.js.map +1 -1
- package/dist/emit-server-stream.d.ts.map +1 -1
- package/dist/emit-server-stream.js +70 -4
- package/dist/emit-server-stream.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +35 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +24 -15
- package/dist/internal.js.map +1 -1
- package/dist/ir.d.ts +21 -0
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js.map +1 -1
- package/dist/oxc-compat-create-element.d.ts +2 -0
- package/dist/oxc-compat-create-element.d.ts.map +1 -1
- package/dist/oxc-compat-create-element.js +93 -18
- package/dist/oxc-compat-create-element.js.map +1 -1
- package/dist/oxc-transform.d.ts +1 -0
- package/dist/oxc-transform.d.ts.map +1 -1
- package/dist/oxc-transform.js +1 -0
- package/dist/oxc-transform.js.map +1 -1
- package/dist/oxc.d.ts +4 -0
- package/dist/oxc.d.ts.map +1 -1
- package/dist/oxc.js +180 -21
- package/dist/oxc.js.map +1 -1
- package/dist/transform.d.ts +2 -0
- package/dist/transform.d.ts.map +1 -1
- package/dist/transform.js +2 -0
- package/dist/transform.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/boundary-graph.ts +13 -0
- package/src/compiler-module-context.ts +2 -0
- package/src/diagnostics.ts +1 -0
- package/src/emit-server-stream.ts +103 -8
- package/src/index.ts +2 -0
- package/src/internal.ts +35 -15
- package/src/ir.ts +21 -0
- package/src/oxc-compat-create-element.ts +132 -25
- package/src/oxc-transform.ts +1 -0
- package/src/oxc.ts +330 -12
- package/src/transform.ts +2 -0
- package/src/types.ts +34 -0
package/dist/ir.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { SourceLocation } from "./types.js";
|
|
2
|
+
/** Represents the compiler intermediate representation for one module. */
|
|
2
3
|
export interface ModuleIr {
|
|
3
4
|
userImports: string[];
|
|
4
5
|
moduleStatements: string[];
|
|
5
6
|
moduleBindingNames: string[];
|
|
6
7
|
components: ComponentIr[];
|
|
7
8
|
}
|
|
9
|
+
/** Represents one component discovered and lowered by compiler analysis. */
|
|
8
10
|
export interface ComponentIr {
|
|
9
11
|
name: string;
|
|
10
12
|
exportName: string;
|
|
@@ -16,7 +18,9 @@ export interface ComponentIr {
|
|
|
16
18
|
bindingNames: string[];
|
|
17
19
|
root: JsxNodeIr;
|
|
18
20
|
}
|
|
21
|
+
/** Represents any JSX node shape supported by the compiler intermediate representation. */
|
|
19
22
|
export type JsxNodeIr = JsxElementIr | ComponentRefIr | JsxFragmentIr | ConditionalIr | ListIr | TextIr | ExprIr | AsyncBoundaryIr;
|
|
23
|
+
/** Represents a lowered intrinsic JSX element. */
|
|
20
24
|
export interface JsxElementIr {
|
|
21
25
|
kind: "element";
|
|
22
26
|
tagName: string;
|
|
@@ -24,6 +28,7 @@ export interface JsxElementIr {
|
|
|
24
28
|
attributes: AttributeIr[];
|
|
25
29
|
children: JsxNodeIr[];
|
|
26
30
|
}
|
|
31
|
+
/** Represents a lowered component reference and its props, children, and boundary metadata. */
|
|
27
32
|
export interface ComponentRefIr {
|
|
28
33
|
kind: "component";
|
|
29
34
|
name: string;
|
|
@@ -35,32 +40,39 @@ export interface ComponentRefIr {
|
|
|
35
40
|
props: ComponentPropIr[];
|
|
36
41
|
children: JsxNodeIr[];
|
|
37
42
|
}
|
|
43
|
+
/** Represents a client module reference attached to a component in server output. */
|
|
38
44
|
export interface ClientReferenceIr {
|
|
39
45
|
moduleId: string;
|
|
40
46
|
exportName: string;
|
|
41
47
|
ssrFallback?: boolean;
|
|
42
48
|
}
|
|
49
|
+
/** Represents any prop shape supported by a component reference. */
|
|
43
50
|
export type ComponentPropIr = ComponentNamedPropIr | ComponentRenderPropIr | ComponentSpreadPropIr;
|
|
51
|
+
/** Represents a named component prop with expression code. */
|
|
44
52
|
export interface ComponentNamedPropIr {
|
|
45
53
|
kind: "prop";
|
|
46
54
|
name: string;
|
|
47
55
|
code: string;
|
|
48
56
|
}
|
|
57
|
+
/** Represents a render-prop child lowered into the component prop list. */
|
|
49
58
|
export interface ComponentRenderPropIr {
|
|
50
59
|
kind: "render-prop";
|
|
51
60
|
name: string;
|
|
52
61
|
valueName?: string;
|
|
53
62
|
children: JsxNodeIr[];
|
|
54
63
|
}
|
|
64
|
+
/** Represents a spread prop expression passed to a component reference. */
|
|
55
65
|
export interface ComponentSpreadPropIr {
|
|
56
66
|
kind: "spread-prop";
|
|
57
67
|
code: string;
|
|
58
68
|
}
|
|
69
|
+
/** Represents a JSX fragment and its lowered children. */
|
|
59
70
|
export interface JsxFragmentIr {
|
|
60
71
|
kind: "fragment";
|
|
61
72
|
bodyStatements?: string[];
|
|
62
73
|
children: JsxNodeIr[];
|
|
63
74
|
}
|
|
75
|
+
/** Represents a conditional JSX expression with true and false branches. */
|
|
64
76
|
export interface ConditionalIr {
|
|
65
77
|
kind: "conditional";
|
|
66
78
|
conditionCode: string;
|
|
@@ -68,6 +80,7 @@ export interface ConditionalIr {
|
|
|
68
80
|
whenTrue: JsxNodeIr[];
|
|
69
81
|
whenFalse: JsxNodeIr[];
|
|
70
82
|
}
|
|
83
|
+
/** Represents a JSX list rendering expression and its lowered item body. */
|
|
71
84
|
export interface ListIr {
|
|
72
85
|
kind: "list";
|
|
73
86
|
itemsCode: string;
|
|
@@ -78,15 +91,18 @@ export interface ListIr {
|
|
|
78
91
|
bodyStatements?: string[];
|
|
79
92
|
children: JsxNodeIr[];
|
|
80
93
|
}
|
|
94
|
+
/** Represents static text emitted from JSX. */
|
|
81
95
|
export interface TextIr {
|
|
82
96
|
kind: "text";
|
|
83
97
|
value: string;
|
|
84
98
|
}
|
|
99
|
+
/** Represents a dynamic expression emitted from JSX. */
|
|
85
100
|
export interface ExprIr {
|
|
86
101
|
kind: "expr";
|
|
87
102
|
code: string;
|
|
88
103
|
renderMode?: "dynamic" | "html" | "react-node" | "stream-node" | "compat-child";
|
|
89
104
|
}
|
|
105
|
+
/** Represents an async boundary lowered from an Await-style JSX construct. */
|
|
90
106
|
export interface AsyncBoundaryIr {
|
|
91
107
|
kind: "async-boundary";
|
|
92
108
|
loc?: SourceLocation;
|
|
@@ -99,24 +115,29 @@ export interface AsyncBoundaryIr {
|
|
|
99
115
|
catchChildren?: JsxNodeIr[];
|
|
100
116
|
awaitId?: string;
|
|
101
117
|
}
|
|
118
|
+
/** Represents any intrinsic attribute shape supported by the compiler IR. */
|
|
102
119
|
export type AttributeIr = StaticAttributeIr | DynamicAttributeIr | EventAttributeIr | SpreadAttributeIr;
|
|
120
|
+
/** Represents a static intrinsic attribute. */
|
|
103
121
|
export interface StaticAttributeIr {
|
|
104
122
|
kind: "static-attr";
|
|
105
123
|
name: string;
|
|
106
124
|
value: string;
|
|
107
125
|
}
|
|
126
|
+
/** Represents a dynamic intrinsic attribute expression. */
|
|
108
127
|
export interface DynamicAttributeIr {
|
|
109
128
|
kind: "dynamic-attr";
|
|
110
129
|
name: string;
|
|
111
130
|
code: string;
|
|
112
131
|
serialization?: "compat";
|
|
113
132
|
}
|
|
133
|
+
/** Represents an event handler attribute emitted for client hydration. */
|
|
114
134
|
export interface EventAttributeIr {
|
|
115
135
|
kind: "event";
|
|
116
136
|
name: string;
|
|
117
137
|
eventName: string;
|
|
118
138
|
code: string;
|
|
119
139
|
}
|
|
140
|
+
/** Represents a spread attribute expression on an intrinsic element. */
|
|
120
141
|
export interface SpreadAttributeIr {
|
|
121
142
|
kind: "spread-attr";
|
|
122
143
|
code: string;
|
package/dist/ir.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../src/ir.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../src/ir.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,aAAa,GACb,MAAM,GACN,MAAM,GACN,MAAM,GACN,eAAe,CAAC;AAEpB,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,+FAA+F;AAC/F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAEnG,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,4EAA4E;AAC5E,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,+CAA+C;AAC/C,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wDAAwD;AACxD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAAC;CACjF;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,aAAa,CAAC,EAAE,QAAQ,CAAC;CAC1B;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd"}
|
package/dist/ir.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.js","sourceRoot":"","sources":["../src/ir.ts"],"names":[],"mappings":"","sourcesContent":["import type { SourceLocation } from \"./types.js\";\n\nexport interface ModuleIr {\n userImports: string[];\n moduleStatements: string[];\n moduleBindingNames: string[];\n components: ComponentIr[];\n}\n\nexport interface ComponentIr {\n name: string;\n exportName: string;\n exported?: boolean;\n exportDefault?: boolean;\n async?: boolean;\n parameters: string[];\n bodyStatements: string[];\n bindingNames: string[];\n root: JsxNodeIr;\n}\n\nexport type JsxNodeIr =\n | JsxElementIr\n | ComponentRefIr\n | JsxFragmentIr\n | ConditionalIr\n | ListIr\n | TextIr\n | ExprIr\n | AsyncBoundaryIr;\n\nexport interface JsxElementIr {\n kind: \"element\";\n tagName: string;\n keyCode?: string;\n attributes: AttributeIr[];\n children: JsxNodeIr[];\n}\n\nexport interface ComponentRefIr {\n kind: \"component\";\n name: string;\n loc?: SourceLocation;\n runtime?: \"compat\";\n async?: boolean;\n clientReference?: ClientReferenceIr;\n keyCode?: string;\n props: ComponentPropIr[];\n children: JsxNodeIr[];\n}\n\nexport interface ClientReferenceIr {\n moduleId: string;\n exportName: string;\n ssrFallback?: boolean;\n}\n\nexport type ComponentPropIr = ComponentNamedPropIr | ComponentRenderPropIr | ComponentSpreadPropIr;\n\nexport interface ComponentNamedPropIr {\n kind: \"prop\";\n name: string;\n code: string;\n}\n\nexport interface ComponentRenderPropIr {\n kind: \"render-prop\";\n name: string;\n valueName?: string;\n children: JsxNodeIr[];\n}\n\nexport interface ComponentSpreadPropIr {\n kind: \"spread-prop\";\n code: string;\n}\n\nexport interface JsxFragmentIr {\n kind: \"fragment\";\n bodyStatements?: string[];\n children: JsxNodeIr[];\n}\n\nexport interface ConditionalIr {\n kind: \"conditional\";\n conditionCode: string;\n conditionValueName?: string;\n whenTrue: JsxNodeIr[];\n whenFalse: JsxNodeIr[];\n}\n\nexport interface ListIr {\n kind: \"list\";\n itemsCode: string;\n itemName: string;\n indexName?: string;\n arrayName?: string;\n keyCode?: string;\n bodyStatements?: string[];\n children: JsxNodeIr[];\n}\n\nexport interface TextIr {\n kind: \"text\";\n value: string;\n}\n\nexport interface ExprIr {\n kind: \"expr\";\n code: string;\n renderMode?: \"dynamic\" | \"html\" | \"react-node\" | \"stream-node\" | \"compat-child\";\n}\n\nexport interface AsyncBoundaryIr {\n kind: \"async-boundary\";\n loc?: SourceLocation;\n valueCode: string;\n valueName: string;\n children: JsxNodeIr[];\n placeholderChildren?: JsxNodeIr[];\n placeholderTagCode?: string;\n catchName?: string;\n catchChildren?: JsxNodeIr[];\n awaitId?: string;\n}\n\nexport type AttributeIr =\n | StaticAttributeIr\n | DynamicAttributeIr\n | EventAttributeIr\n | SpreadAttributeIr;\n\nexport interface StaticAttributeIr {\n kind: \"static-attr\";\n name: string;\n value: string;\n}\n\nexport interface DynamicAttributeIr {\n kind: \"dynamic-attr\";\n name: string;\n code: string;\n // \"compat\" applies react-compat serialization semantics (px suffix for\n // numeric style values, interpreter-equivalent filtering).\n serialization?: \"compat\";\n}\n\nexport interface EventAttributeIr {\n kind: \"event\";\n name: string;\n eventName: string;\n code: string;\n}\n\nexport interface SpreadAttributeIr {\n kind: \"spread-attr\";\n code: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ir.js","sourceRoot":"","sources":["../src/ir.ts"],"names":[],"mappings":"","sourcesContent":["import type { SourceLocation } from \"./types.js\";\n\n/** Represents the compiler intermediate representation for one module. */\nexport interface ModuleIr {\n userImports: string[];\n moduleStatements: string[];\n moduleBindingNames: string[];\n components: ComponentIr[];\n}\n\n/** Represents one component discovered and lowered by compiler analysis. */\nexport interface ComponentIr {\n name: string;\n exportName: string;\n exported?: boolean;\n exportDefault?: boolean;\n async?: boolean;\n parameters: string[];\n bodyStatements: string[];\n bindingNames: string[];\n root: JsxNodeIr;\n}\n\n/** Represents any JSX node shape supported by the compiler intermediate representation. */\nexport type JsxNodeIr =\n | JsxElementIr\n | ComponentRefIr\n | JsxFragmentIr\n | ConditionalIr\n | ListIr\n | TextIr\n | ExprIr\n | AsyncBoundaryIr;\n\n/** Represents a lowered intrinsic JSX element. */\nexport interface JsxElementIr {\n kind: \"element\";\n tagName: string;\n keyCode?: string;\n attributes: AttributeIr[];\n children: JsxNodeIr[];\n}\n\n/** Represents a lowered component reference and its props, children, and boundary metadata. */\nexport interface ComponentRefIr {\n kind: \"component\";\n name: string;\n loc?: SourceLocation;\n runtime?: \"compat\";\n async?: boolean;\n clientReference?: ClientReferenceIr;\n keyCode?: string;\n props: ComponentPropIr[];\n children: JsxNodeIr[];\n}\n\n/** Represents a client module reference attached to a component in server output. */\nexport interface ClientReferenceIr {\n moduleId: string;\n exportName: string;\n ssrFallback?: boolean;\n}\n\n/** Represents any prop shape supported by a component reference. */\nexport type ComponentPropIr = ComponentNamedPropIr | ComponentRenderPropIr | ComponentSpreadPropIr;\n\n/** Represents a named component prop with expression code. */\nexport interface ComponentNamedPropIr {\n kind: \"prop\";\n name: string;\n code: string;\n}\n\n/** Represents a render-prop child lowered into the component prop list. */\nexport interface ComponentRenderPropIr {\n kind: \"render-prop\";\n name: string;\n valueName?: string;\n children: JsxNodeIr[];\n}\n\n/** Represents a spread prop expression passed to a component reference. */\nexport interface ComponentSpreadPropIr {\n kind: \"spread-prop\";\n code: string;\n}\n\n/** Represents a JSX fragment and its lowered children. */\nexport interface JsxFragmentIr {\n kind: \"fragment\";\n bodyStatements?: string[];\n children: JsxNodeIr[];\n}\n\n/** Represents a conditional JSX expression with true and false branches. */\nexport interface ConditionalIr {\n kind: \"conditional\";\n conditionCode: string;\n conditionValueName?: string;\n whenTrue: JsxNodeIr[];\n whenFalse: JsxNodeIr[];\n}\n\n/** Represents a JSX list rendering expression and its lowered item body. */\nexport interface ListIr {\n kind: \"list\";\n itemsCode: string;\n itemName: string;\n indexName?: string;\n arrayName?: string;\n keyCode?: string;\n bodyStatements?: string[];\n children: JsxNodeIr[];\n}\n\n/** Represents static text emitted from JSX. */\nexport interface TextIr {\n kind: \"text\";\n value: string;\n}\n\n/** Represents a dynamic expression emitted from JSX. */\nexport interface ExprIr {\n kind: \"expr\";\n code: string;\n renderMode?: \"dynamic\" | \"html\" | \"react-node\" | \"stream-node\" | \"compat-child\";\n}\n\n/** Represents an async boundary lowered from an Await-style JSX construct. */\nexport interface AsyncBoundaryIr {\n kind: \"async-boundary\";\n loc?: SourceLocation;\n valueCode: string;\n valueName: string;\n children: JsxNodeIr[];\n placeholderChildren?: JsxNodeIr[];\n placeholderTagCode?: string;\n catchName?: string;\n catchChildren?: JsxNodeIr[];\n awaitId?: string;\n}\n\n/** Represents any intrinsic attribute shape supported by the compiler IR. */\nexport type AttributeIr =\n | StaticAttributeIr\n | DynamicAttributeIr\n | EventAttributeIr\n | SpreadAttributeIr;\n\n/** Represents a static intrinsic attribute. */\nexport interface StaticAttributeIr {\n kind: \"static-attr\";\n name: string;\n value: string;\n}\n\n/** Represents a dynamic intrinsic attribute expression. */\nexport interface DynamicAttributeIr {\n kind: \"dynamic-attr\";\n name: string;\n code: string;\n // \"compat\" applies react-compat serialization semantics (px suffix for\n // numeric style values, interpreter-equivalent filtering).\n serialization?: \"compat\";\n}\n\n/** Represents an event handler attribute emitted for client hydration. */\nexport interface EventAttributeIr {\n kind: \"event\";\n name: string;\n eventName: string;\n code: string;\n}\n\n/** Represents a spread attribute expression on an intrinsic element. */\nexport interface SpreadAttributeIr {\n kind: \"spread-attr\";\n code: string;\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { JsxNodeIr } from "./ir.js";
|
|
2
2
|
export declare function collectCompatCreateElementNames(program: unknown): Set<string>;
|
|
3
|
+
export declare function collectCompatRenderToStringNames(program: unknown): Set<string>;
|
|
3
4
|
interface CompatCreateElementScope {
|
|
4
5
|
names: ReadonlySet<string>;
|
|
5
6
|
shadowed: ReadonlySet<string>;
|
|
6
7
|
}
|
|
7
8
|
export declare function analyzeCompatCreateElementRoot(code: string, expression: Record<string, unknown>, scope: CompatCreateElementScope): JsxNodeIr | undefined;
|
|
9
|
+
export declare function analyzeCompatCreateElementFunctionRoot(code: string, functionLike: Record<string, unknown>, names: ReadonlySet<string>): JsxNodeIr | undefined;
|
|
8
10
|
export declare function hasLowerableCompatCreateElementReturn(code: string, functionLike: Record<string, unknown>, names: ReadonlySet<string>): boolean;
|
|
9
11
|
export declare function collectFunctionShadowedNames(functionLike: Record<string, unknown>, names: ReadonlySet<string>): Set<string>;
|
|
10
12
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxc-compat-create-element.d.ts","sourceRoot":"","sources":["../src/oxc-compat-create-element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"oxc-compat-create-element.d.ts","sourceRoot":"","sources":["../src/oxc-compat-create-element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,SAAS,CAAC;AAYtD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAiC7E;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAiC9E;AAkDD,UAAU,wBAAwB;IAChC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAoQD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,KAAK,EAAE,wBAAwB,GAC9B,SAAS,GAAG,SAAS,CAEvB;AAED,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,SAAS,GAAG,SAAS,CA4BvB;AA8TD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,OAAO,CAET;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,GAAG,CAAC,MAAM,CAAC,CAiDb"}
|
|
@@ -5,6 +5,7 @@ import { readArray, readObject, readSource, unwrapOxcParentheses } from "./oxc-n
|
|
|
5
5
|
// bails the WHOLE tree out (callers keep the source verbatim) so the
|
|
6
6
|
// interpreter semantics never get half-applied.
|
|
7
7
|
const COMPAT_CREATE_ELEMENT_SOURCES = new Set(["react", "@reckona/mreact-compat"]);
|
|
8
|
+
const COMPAT_RENDER_TO_STRING_SOURCES = new Set(["@reckona/mreact-compat"]);
|
|
8
9
|
export function collectCompatCreateElementNames(program) {
|
|
9
10
|
const names = new Set();
|
|
10
11
|
for (const statement of readArray(readObject(program).body)) {
|
|
@@ -30,6 +31,31 @@ export function collectCompatCreateElementNames(program) {
|
|
|
30
31
|
}
|
|
31
32
|
return names;
|
|
32
33
|
}
|
|
34
|
+
export function collectCompatRenderToStringNames(program) {
|
|
35
|
+
const names = new Set();
|
|
36
|
+
for (const statement of readArray(readObject(program).body)) {
|
|
37
|
+
const declaration = readObject(statement);
|
|
38
|
+
if (declaration.type !== "ImportDeclaration") {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const source = readObject(declaration.source);
|
|
42
|
+
if (typeof source.value !== "string" || !COMPAT_RENDER_TO_STRING_SOURCES.has(source.value)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
for (const specifier of readArray(declaration.specifiers)) {
|
|
46
|
+
const specifierObject = readObject(specifier);
|
|
47
|
+
if (specifierObject.type !== "ImportSpecifier") {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const imported = readObject(specifierObject.imported);
|
|
51
|
+
const local = readObject(specifierObject.local);
|
|
52
|
+
if (imported.name === "renderToString" && typeof local.name === "string") {
|
|
53
|
+
names.add(local.name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return names;
|
|
58
|
+
}
|
|
33
59
|
// Mirrors packages/react-compat/src/server-render.ts attribute serialization
|
|
34
60
|
// for compile-time-known prop values. Keep these tables in sync with the
|
|
35
61
|
// interpreter; parity tests compare emitted bytes against renderToString.
|
|
@@ -257,6 +283,25 @@ function lowerStyleProp(code, value) {
|
|
|
257
283
|
export function analyzeCompatCreateElementRoot(code, expression, scope) {
|
|
258
284
|
return lowerCreateElementCall(code, unwrapOxcParentheses(expression), scope);
|
|
259
285
|
}
|
|
286
|
+
export function analyzeCompatCreateElementFunctionRoot(code, functionLike, names) {
|
|
287
|
+
if (names.size === 0) {
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
const shadowed = collectFunctionShadowedNames(functionLike, names);
|
|
291
|
+
const scope = { names, shadowed };
|
|
292
|
+
const body = unwrapOxcParentheses(readObject(functionLike.body));
|
|
293
|
+
if (body.type !== "BlockStatement") {
|
|
294
|
+
return lowerCreateElementCall(code, body, scope);
|
|
295
|
+
}
|
|
296
|
+
for (const statement of readArray(body.body)) {
|
|
297
|
+
const statementObject = readObject(statement);
|
|
298
|
+
if (statementObject.type !== "ReturnStatement") {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
return lowerCreateElementCall(code, unwrapOxcParentheses(readObject(statementObject.argument)), scope);
|
|
302
|
+
}
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
260
305
|
function lowerCreateElementCall(code, expression, scope) {
|
|
261
306
|
if (expression.type !== "CallExpression" || expression.optional === true) {
|
|
262
307
|
return undefined;
|
|
@@ -342,6 +387,40 @@ function lowerCreateElementChild(code, child, scope) {
|
|
|
342
387
|
return [list];
|
|
343
388
|
}
|
|
344
389
|
}
|
|
390
|
+
if (child.type === "ConditionalExpression") {
|
|
391
|
+
const whenTrue = lowerCreateElementDynamicBranch(code, readObject(child.consequent), scope);
|
|
392
|
+
const whenFalse = lowerCreateElementDynamicBranch(code, readObject(child.alternate), scope);
|
|
393
|
+
if (whenTrue !== undefined && whenFalse !== undefined) {
|
|
394
|
+
return [
|
|
395
|
+
{
|
|
396
|
+
kind: "conditional",
|
|
397
|
+
conditionCode: readSource(code, readObject(child.test)),
|
|
398
|
+
whenTrue,
|
|
399
|
+
whenFalse,
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (child.type === "LogicalExpression" && child.operator === "&&") {
|
|
405
|
+
const whenTrue = lowerCreateElementDynamicBranch(code, readObject(child.right), scope);
|
|
406
|
+
if (whenTrue !== undefined) {
|
|
407
|
+
const conditionValueName = logicalConditionValueName(readObject(child.left));
|
|
408
|
+
return [
|
|
409
|
+
{
|
|
410
|
+
kind: "conditional",
|
|
411
|
+
conditionCode: readSource(code, readObject(child.left)),
|
|
412
|
+
conditionValueName,
|
|
413
|
+
whenTrue,
|
|
414
|
+
whenFalse: [
|
|
415
|
+
{
|
|
416
|
+
kind: "expr",
|
|
417
|
+
code: renderableFalsyConditionValueCode(conditionValueName),
|
|
418
|
+
},
|
|
419
|
+
],
|
|
420
|
+
},
|
|
421
|
+
];
|
|
422
|
+
}
|
|
423
|
+
}
|
|
345
424
|
// Provably-string expressions escape directly (and stay batchable); the
|
|
346
425
|
// interpreter would emit the same escaped bytes for them.
|
|
347
426
|
if (isProvablyStringExpression(child, scope)) {
|
|
@@ -352,6 +431,19 @@ function lowerCreateElementChild(code, child, scope) {
|
|
|
352
431
|
// evaluate to react nodes keep rendering instead of stringifying.
|
|
353
432
|
return [{ kind: "expr", code: readSource(code, child), renderMode: "compat-child" }];
|
|
354
433
|
}
|
|
434
|
+
function lowerCreateElementDynamicBranch(code, expression, scope) {
|
|
435
|
+
const unwrapped = unwrapOxcParentheses(expression);
|
|
436
|
+
if (unwrapped.type === "Literal" && (unwrapped.value === null || unwrapped.value === false)) {
|
|
437
|
+
return [];
|
|
438
|
+
}
|
|
439
|
+
return lowerCreateElementChild(code, unwrapped, scope);
|
|
440
|
+
}
|
|
441
|
+
function logicalConditionValueName(expression) {
|
|
442
|
+
return `__mreactLogical_${typeof expression.start === "number" ? expression.start : "value"}`;
|
|
443
|
+
}
|
|
444
|
+
function renderableFalsyConditionValueCode(name) {
|
|
445
|
+
return `((typeof ${name} === "number" || typeof ${name} === "bigint") ? ${name} : null)`;
|
|
446
|
+
}
|
|
355
447
|
function isProvablyStringExpression(expression, scope) {
|
|
356
448
|
if (expression.type === "TemplateLiteral") {
|
|
357
449
|
return true;
|
|
@@ -429,24 +521,7 @@ function lowerCreateElementListCall(code, expression, scope) {
|
|
|
429
521
|
// implicit body) that the converter can fully lower. Detection and lowering
|
|
430
522
|
// share lowerCreateElementCall so they can never disagree.
|
|
431
523
|
export function hasLowerableCompatCreateElementReturn(code, functionLike, names) {
|
|
432
|
-
|
|
433
|
-
return false;
|
|
434
|
-
}
|
|
435
|
-
const shadowed = collectFunctionShadowedNames(functionLike, names);
|
|
436
|
-
const scope = { names, shadowed };
|
|
437
|
-
const body = unwrapOxcParentheses(readObject(functionLike.body));
|
|
438
|
-
if (body.type !== "BlockStatement") {
|
|
439
|
-
return lowerCreateElementCall(code, body, scope) !== undefined;
|
|
440
|
-
}
|
|
441
|
-
for (const statement of readArray(body.body)) {
|
|
442
|
-
const statementObject = readObject(statement);
|
|
443
|
-
if (statementObject.type !== "ReturnStatement") {
|
|
444
|
-
continue;
|
|
445
|
-
}
|
|
446
|
-
const argument = unwrapOxcParentheses(readObject(statementObject.argument));
|
|
447
|
-
return lowerCreateElementCall(code, argument, scope) !== undefined;
|
|
448
|
-
}
|
|
449
|
-
return false;
|
|
524
|
+
return analyzeCompatCreateElementFunctionRoot(code, functionLike, names) !== undefined;
|
|
450
525
|
}
|
|
451
526
|
export function collectFunctionShadowedNames(functionLike, names) {
|
|
452
527
|
const shadowed = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxc-compat-create-element.js","sourceRoot":"","sources":["../src/oxc-compat-create-element.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AttributeIr, JsxNodeIr } from \"./ir.js\";\nimport { readArray, readObject, readSource, unwrapOxcParentheses } from \"./oxc-node-utils.js\";\n\n// Lowers statically analyzable react-compat createElement() call trees into\n// the element IR so they compile through the server string pipeline instead\n// of being interpreted per request. Any unsupported shape anywhere in a tree\n// bails the WHOLE tree out (callers keep the source verbatim) so the\n// interpreter semantics never get half-applied.\n\nconst COMPAT_CREATE_ELEMENT_SOURCES = new Set([\"react\", \"@reckona/mreact-compat\"]);\n\nexport function collectCompatCreateElementNames(program: unknown): Set<string> {\n const names = new Set<string>();\n\n for (const statement of readArray(readObject(program).body)) {\n const declaration = readObject(statement);\n\n if (declaration.type !== \"ImportDeclaration\") {\n continue;\n }\n\n const source = readObject(declaration.source);\n\n if (typeof source.value !== \"string\" || !COMPAT_CREATE_ELEMENT_SOURCES.has(source.value)) {\n continue;\n }\n\n for (const specifier of readArray(declaration.specifiers)) {\n const specifierObject = readObject(specifier);\n\n if (specifierObject.type !== \"ImportSpecifier\") {\n continue;\n }\n\n const imported = readObject(specifierObject.imported);\n const local = readObject(specifierObject.local);\n\n if (imported.name === \"createElement\" && typeof local.name === \"string\") {\n names.add(local.name);\n }\n }\n }\n\n return names;\n}\n\n// Mirrors packages/react-compat/src/server-render.ts attribute serialization\n// for compile-time-known prop values. Keep these tables in sync with the\n// interpreter; parity tests compare emitted bytes against renderToString.\nconst COMPAT_HTML_ATTRIBUTE_ALIASES: Record<string, string> = {\n acceptCharset: \"accept-charset\",\n autoFocus: \"autofocus\",\n autoPlay: \"autoplay\",\n charSet: \"charset\",\n className: \"class\",\n colSpan: \"colspan\",\n contentEditable: \"contenteditable\",\n crossOrigin: \"crossorigin\",\n encType: \"enctype\",\n formAction: \"formaction\",\n frameBorder: \"frameborder\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n maxLength: \"maxlength\",\n minLength: \"minlength\",\n noValidate: \"novalidate\",\n playsInline: \"playsinline\",\n rowSpan: \"rowspan\",\n spellCheck: \"spellcheck\",\n srcDoc: \"srcdoc\",\n srcSet: \"srcset\",\n tabIndex: \"tabindex\",\n useMap: \"usemap\",\n};\n\nconst COMPAT_BOOLEANISH_STRING_ATTRIBUTES = new Set([\n \"contenteditable\",\n \"draggable\",\n \"spellcheck\",\n]);\n\n// URL-bearing attributes always emit through the dynamic path so the runtime\n// scheme guard applies; static literal lowering must not bypass it.\nconst URL_ATTRIBUTE_NAMES = new Set([\n \"action\",\n \"formaction\",\n \"href\",\n \"src\",\n \"srcset\",\n \"xlink:href\",\n]);\n\nconst VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\\w.\\-:]*$/;\n\ninterface CompatCreateElementScope {\n names: ReadonlySet<string>;\n shadowed: ReadonlySet<string>;\n}\n\nfunction isActiveCreateElementName(scope: CompatCreateElementScope, name: string): boolean {\n return scope.names.has(name) && !scope.shadowed.has(name);\n}\n\nfunction isEventHandlerPropName(name: string): boolean {\n return (\n name.length > 1 &&\n (name.charCodeAt(0) | 32) === 111 &&\n (name.charCodeAt(1) | 32) === 110\n );\n}\n\nfunction isBooleanishStringAttributeName(attributeName: string): boolean {\n const lowerCased = attributeName.toLowerCase();\n return lowerCased.startsWith(\"aria-\") || COMPAT_BOOLEANISH_STRING_ATTRIBUTES.has(lowerCased);\n}\n\nfunction isDataAttributeName(attributeName: string): boolean {\n return attributeName.toLowerCase().startsWith(\"data-\");\n}\n\nfunction readStaticPropertyKey(property: Record<string, unknown>): string | undefined {\n if (property.computed === true) {\n return undefined;\n }\n\n const key = readObject(property.key);\n\n if (key.type === \"Identifier\" && typeof key.name === \"string\") {\n return key.name;\n }\n\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n\n return undefined;\n}\n\ntype StaticLiteral =\n | { kind: \"value\"; value: string | number | boolean | null }\n | { kind: \"undefined\" };\n\nfunction readStaticLiteral(expression: Record<string, unknown>): StaticLiteral | undefined {\n if (expression.type === \"Literal\") {\n const value = expression.value;\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return { kind: \"value\", value };\n }\n\n return undefined;\n }\n\n if (expression.type === \"Identifier\" && expression.name === \"undefined\") {\n return { kind: \"undefined\" };\n }\n\n if (expression.type === \"TemplateLiteral\") {\n const expressions = readArray(expression.expressions);\n const quasis = readArray(expression.quasis);\n\n if (expressions.length === 0 && quasis.length === 1) {\n const cooked = readObject(readObject(quasis[0]).value).cooked;\n\n if (typeof cooked === \"string\") {\n return { kind: \"value\", value: cooked };\n }\n }\n }\n\n return undefined;\n}\n\ninterface LoweredProps {\n attributes: AttributeIr[];\n keyCode?: string;\n childrenProp?: Record<string, unknown>;\n}\n\nfunction lowerCreateElementProps(\n code: string,\n propsArgument: Record<string, unknown> | undefined,\n): LoweredProps | undefined {\n if (\n propsArgument === undefined ||\n (propsArgument.type === \"Literal\" && propsArgument.value === null) ||\n (propsArgument.type === \"Identifier\" && propsArgument.name === \"undefined\")\n ) {\n return { attributes: [] };\n }\n\n if (propsArgument.type !== \"ObjectExpression\") {\n return undefined;\n }\n\n const attributes: AttributeIr[] = [];\n let keyCode: string | undefined;\n let childrenProp: Record<string, unknown> | undefined;\n\n for (const property of readArray(propsArgument.properties)) {\n const propertyObject = readObject(property);\n\n if (\n propertyObject.type !== \"Property\" ||\n propertyObject.kind !== \"init\" ||\n propertyObject.method === true ||\n propertyObject.shorthand === true\n ) {\n return undefined;\n }\n\n const name = readStaticPropertyKey(propertyObject);\n\n if (name === undefined) {\n return undefined;\n }\n\n const value = unwrapOxcParentheses(readObject(propertyObject.value));\n\n if (name === \"key\") {\n keyCode = readSource(code, value);\n continue;\n }\n\n if (name === \"ref\" || isEventHandlerPropName(name)) {\n continue;\n }\n\n if (name === \"children\") {\n childrenProp = value;\n continue;\n }\n\n if (name === \"dangerouslySetInnerHTML\" || name === \"suppressHydrationWarning\") {\n return undefined;\n }\n\n if (name === \"style\") {\n const styleProp = lowerStyleProp(code, value);\n\n if (styleProp === undefined) {\n return undefined;\n }\n\n if (styleProp.attribute !== undefined) {\n attributes.push(styleProp.attribute);\n }\n continue;\n }\n\n const attributeName = COMPAT_HTML_ATTRIBUTE_ALIASES[name] ?? name;\n\n if (!VALID_ATTRIBUTE_NAME.test(attributeName) || isEventHandlerPropName(attributeName)) {\n // The interpreter drops these at runtime; keeping them out of the\n // compiled output matches its bytes.\n continue;\n }\n\n const literal = readStaticLiteral(value);\n\n if (literal === undefined || URL_ATTRIBUTE_NAMES.has(attributeName.toLowerCase())) {\n attributes.push({\n kind: \"dynamic-attr\",\n name: attributeName,\n code: readSource(code, value),\n serialization: \"compat\",\n });\n continue;\n }\n\n const staticAttribute = serializeStaticCompatAttribute(attributeName, literal);\n\n if (staticAttribute !== undefined) {\n attributes.push(staticAttribute);\n }\n }\n\n return {\n attributes,\n ...(keyCode === undefined ? {} : { keyCode }),\n ...(childrenProp === undefined ? {} : { childrenProp }),\n };\n}\n\nfunction serializeStaticCompatAttribute(\n attributeName: string,\n literal: StaticLiteral,\n): AttributeIr | undefined {\n if (literal.kind === \"undefined\" || literal.value === null) {\n return undefined;\n }\n\n const value = literal.value;\n\n if (typeof value === \"boolean\") {\n if (isBooleanishStringAttributeName(attributeName) || isDataAttributeName(attributeName)) {\n return { kind: \"static-attr\", name: attributeName, value: value ? \"true\" : \"false\" };\n }\n\n return value ? { kind: \"static-attr\", name: attributeName, value: \"\" } : undefined;\n }\n\n return { kind: \"static-attr\", name: attributeName, value: String(value) };\n}\n\n// undefined bails the whole tree; { attribute: undefined } drops the prop.\nfunction lowerStyleProp(\n code: string,\n value: Record<string, unknown>,\n): { attribute?: AttributeIr } | undefined {\n if (value.type === \"ObjectExpression\") {\n for (const property of readArray(value.properties)) {\n const propertyObject = readObject(property);\n\n if (\n propertyObject.type !== \"Property\" ||\n propertyObject.kind !== \"init\" ||\n propertyObject.computed === true ||\n propertyObject.method === true ||\n readStaticPropertyKey(propertyObject) === undefined\n ) {\n return undefined;\n }\n }\n\n return {\n attribute: {\n kind: \"dynamic-attr\",\n name: \"style\",\n code: readSource(code, value),\n serialization: \"compat\",\n },\n };\n }\n\n // The interpreter's renderStyleAttribute only serializes objects; string\n // and other primitive style values are dropped, so match those bytes by\n // dropping them at compile time too.\n if (readStaticLiteral(value) !== undefined) {\n return {};\n }\n\n return {\n attribute: {\n kind: \"dynamic-attr\",\n name: \"style\",\n code: readSource(code, value),\n serialization: \"compat\",\n },\n };\n}\n\nexport function analyzeCompatCreateElementRoot(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n return lowerCreateElementCall(code, unwrapOxcParentheses(expression), scope);\n}\n\nfunction lowerCreateElementCall(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n if (expression.type !== \"CallExpression\" || expression.optional === true) {\n return undefined;\n }\n\n const callee = readObject(expression.callee);\n\n if (\n callee.type !== \"Identifier\" ||\n typeof callee.name !== \"string\" ||\n !isActiveCreateElementName(scope, callee.name)\n ) {\n return undefined;\n }\n\n const args = readArray(expression.arguments);\n\n if (args.length === 0) {\n return undefined;\n }\n\n for (const argument of args) {\n if (readObject(argument).type === \"SpreadElement\") {\n return undefined;\n }\n }\n\n const tagArgument = unwrapOxcParentheses(readObject(args[0]));\n\n if (tagArgument.type !== \"Literal\" || typeof tagArgument.value !== \"string\") {\n return undefined;\n }\n\n const props = lowerCreateElementProps(\n code,\n args.length > 1 ? unwrapOxcParentheses(readObject(args[1])) : undefined,\n );\n\n if (props === undefined) {\n return undefined;\n }\n\n const childArguments = args.slice(2).map((argument) => unwrapOxcParentheses(readObject(argument)));\n const childSources =\n childArguments.length > 0\n ? childArguments\n : props.childrenProp === undefined\n ? []\n : [props.childrenProp];\n const children: JsxNodeIr[] = [];\n\n for (const child of childSources) {\n const lowered = lowerCreateElementChild(code, child, scope);\n\n if (lowered === undefined) {\n return undefined;\n }\n\n children.push(...lowered);\n }\n\n return {\n kind: \"element\",\n tagName: tagArgument.value,\n ...(props.keyCode === undefined ? {} : { keyCode: props.keyCode }),\n attributes: props.attributes,\n children,\n };\n}\n\nfunction lowerCreateElementChild(\n code: string,\n child: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr[] | undefined {\n const literal = readStaticLiteral(child);\n\n if (literal !== undefined) {\n if (literal.kind === \"undefined\" || literal.value === null || typeof literal.value === \"boolean\") {\n return [];\n }\n\n return [{ kind: \"text\", value: String(literal.value) }];\n }\n\n if (child.type === \"ArrayExpression\") {\n const children: JsxNodeIr[] = [];\n\n for (const element of readArray(child.elements)) {\n const elementObject = readObject(element);\n\n if (elementObject.type === \"SpreadElement\") {\n return undefined;\n }\n\n const lowered = lowerCreateElementChild(code, unwrapOxcParentheses(elementObject), scope);\n\n if (lowered === undefined) {\n return undefined;\n }\n\n children.push(...lowered);\n }\n\n return children;\n }\n\n if (child.type === \"CallExpression\") {\n const callee = readObject(child.callee);\n\n if (\n callee.type === \"Identifier\" &&\n typeof callee.name === \"string\" &&\n isActiveCreateElementName(scope, callee.name)\n ) {\n const lowered = lowerCreateElementCall(code, child, scope);\n return lowered === undefined ? undefined : [lowered];\n }\n\n const list = lowerCreateElementListCall(code, child, scope);\n\n if (list !== undefined) {\n return [list];\n }\n }\n\n // Provably-string expressions escape directly (and stay batchable); the\n // interpreter would emit the same escaped bytes for them.\n if (isProvablyStringExpression(child, scope)) {\n return [{ kind: \"expr\", code: readSource(code, child) }];\n }\n\n // Unknown expressions stay dynamic: the runtime helper escapes primitives\n // and falls back to the interpreter for element values, so children that\n // evaluate to react nodes keep rendering instead of stringifying.\n return [{ kind: \"expr\", code: readSource(code, child), renderMode: \"compat-child\" }];\n}\n\nfunction isProvablyStringExpression(\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): boolean {\n if (expression.type === \"TemplateLiteral\") {\n return true;\n }\n\n if (expression.type === \"CallExpression\" && expression.optional !== true) {\n const callee = readObject(expression.callee);\n\n return (\n callee.type === \"Identifier\" &&\n callee.name === \"String\" &&\n !scope.shadowed.has(\"String\") &&\n readArray(expression.arguments).length === 1 &&\n readObject(readArray(expression.arguments)[0]).type !== \"SpreadElement\"\n );\n }\n\n if (expression.type === \"BinaryExpression\" && expression.operator === \"+\") {\n return (\n isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.left)), scope) ||\n isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.right)), scope)\n );\n }\n\n if (expression.type === \"Literal\") {\n return typeof expression.value === \"string\";\n }\n\n return false;\n}\n\nfunction lowerCreateElementListCall(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n if (expression.optional === true) {\n return undefined;\n }\n\n const callee = readObject(expression.callee);\n\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed === true ||\n callee.optional === true ||\n readObject(callee.property).name !== \"map\"\n ) {\n return undefined;\n }\n\n const args = readArray(expression.arguments);\n\n if (args.length !== 1) {\n return undefined;\n }\n\n const renderer = readObject(args[0]);\n\n if (renderer.type !== \"ArrowFunctionExpression\" || renderer.async === true) {\n return undefined;\n }\n\n const parameters = readArray(renderer.params).map((parameter) => readObject(parameter));\n\n if (parameters.some((parameter) => parameter.type !== \"Identifier\")) {\n return undefined;\n }\n\n const [itemName, indexName, arrayName] = parameters.map((parameter) =>\n typeof parameter.name === \"string\" ? parameter.name : undefined,\n );\n\n if (itemName === undefined) {\n return undefined;\n }\n\n const rendererScope: CompatCreateElementScope = {\n names: scope.names,\n shadowed: new Set([\n ...scope.shadowed,\n ...[itemName, indexName, arrayName].filter((name): name is string => name !== undefined),\n ]),\n };\n const body = unwrapOxcParentheses(readObject(renderer.body));\n\n if (body.type === \"BlockStatement\") {\n return undefined;\n }\n\n const rendered = lowerCreateElementCall(code, body, rendererScope);\n\n if (rendered === undefined || rendered.kind !== \"element\") {\n return undefined;\n }\n\n return {\n kind: \"list\",\n itemsCode: readSource(code, readObject(callee.object)),\n itemName,\n ...(indexName === undefined ? {} : { indexName }),\n ...(arrayName === undefined ? {} : { arrayName }),\n ...(rendered.keyCode === undefined ? {} : { keyCode: rendered.keyCode }),\n children: [rendered],\n };\n}\n\n// Detection-side predicate: a direct `return createElement(...)` (or arrow\n// implicit body) that the converter can fully lower. Detection and lowering\n// share lowerCreateElementCall so they can never disagree.\nexport function hasLowerableCompatCreateElementReturn(\n code: string,\n functionLike: Record<string, unknown>,\n names: ReadonlySet<string>,\n): boolean {\n if (names.size === 0) {\n return false;\n }\n\n const shadowed = collectFunctionShadowedNames(functionLike, names);\n const scope: CompatCreateElementScope = { names, shadowed };\n const body = unwrapOxcParentheses(readObject(functionLike.body));\n\n if (body.type !== \"BlockStatement\") {\n return lowerCreateElementCall(code, body, scope) !== undefined;\n }\n\n for (const statement of readArray(body.body)) {\n const statementObject = readObject(statement);\n\n if (statementObject.type !== \"ReturnStatement\") {\n continue;\n }\n\n const argument = unwrapOxcParentheses(readObject(statementObject.argument));\n\n return lowerCreateElementCall(code, argument, scope) !== undefined;\n }\n\n return false;\n}\n\nexport function collectFunctionShadowedNames(\n functionLike: Record<string, unknown>,\n names: ReadonlySet<string>,\n): Set<string> {\n const shadowed = new Set<string>();\n\n for (const parameter of readArray(functionLike.params)) {\n const parameterObject = readObject(parameter);\n\n if (parameterObject.type === \"Identifier\" && typeof parameterObject.name === \"string\") {\n if (names.has(parameterObject.name)) {\n shadowed.add(parameterObject.name);\n }\n continue;\n }\n\n // Destructured parameters could shadow anything; treat every tracked\n // name as shadowed rather than analyzing the pattern.\n for (const name of names) {\n shadowed.add(name);\n }\n }\n\n const body = readObject(functionLike.body);\n\n if (body.type !== \"BlockStatement\") {\n return shadowed;\n }\n\n for (const statement of readArray(body.body)) {\n const statementObject = readObject(statement);\n\n if (statementObject.type === \"VariableDeclaration\") {\n for (const declarator of readArray(statementObject.declarations)) {\n const id = readObject(readObject(declarator).id);\n\n if (id.type === \"Identifier\" && typeof id.name === \"string\" && names.has(id.name)) {\n shadowed.add(id.name);\n }\n }\n }\n\n if (\n statementObject.type === \"FunctionDeclaration\" &&\n typeof readObject(statementObject.id).name === \"string\" &&\n names.has(readObject(statementObject.id).name as string)\n ) {\n shadowed.add(readObject(statementObject.id).name as string);\n }\n }\n\n return shadowed;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oxc-compat-create-element.js","sourceRoot":"","sources":["../src/oxc-compat-create-element.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE9F,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,gDAAgD;AAEhD,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC;AACnF,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAE5E,MAAM,UAAU,+BAA+B,CAAC,OAAgB;IAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,WAAW,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzF,SAAS;QACX,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAE9C,IAAI,eAAe,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAgB;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,WAAW,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,SAAS;QACX,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAE9C,IAAI,eAAe,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,yEAAyE;AACzE,0EAA0E;AAC1E,MAAM,6BAA6B,GAA2B;IAC5D,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,iBAAiB;IAClC,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,mCAAmC,GAAG,IAAI,GAAG,CAAC;IAClD,iBAAiB;IACjB,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,QAAQ;IACR,YAAY;IACZ,MAAM;IACN,KAAK;IACL,QAAQ;IACR,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAOpD,SAAS,yBAAyB,CAAC,KAA+B,EAAE,IAAY;IAC9E,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,CACL,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG;QACjC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CAAC,aAAqB;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,mCAAmC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAqB;IAChD,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAiC;IAC9D,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAMD,SAAS,iBAAiB,CAAC,UAAmC;IAC5D,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAE/B,IACE,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YAE9D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD,SAAS,uBAAuB,CAC9B,IAAY,EACZ,aAAkD;IAElD,IACE,aAAa,KAAK,SAAS;QAC3B,CAAC,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,KAAK,IAAI,CAAC;QAClE,CAAC,aAAa,CAAC,IAAI,KAAK,YAAY,IAAI,aAAa,CAAC,IAAI,KAAK,WAAW,CAAC,EAC3E,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,IAAI,OAA2B,CAAC;IAChC,IAAI,YAAiD,CAAC;IAEtD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE5C,IACE,cAAc,CAAC,IAAI,KAAK,UAAU;YAClC,cAAc,CAAC,IAAI,KAAK,MAAM;YAC9B,cAAc,CAAC,MAAM,KAAK,IAAI;YAC9B,cAAc,CAAC,SAAS,KAAK,IAAI,EACjC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAErE,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,YAAY,GAAG,KAAK,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,yBAAyB,IAAI,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC9E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE9C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QAElE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC;YACvF,kEAAkE;YAClE,qCAAqC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,OAAO,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAClF,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;gBAC7B,aAAa,EAAE,QAAQ;aACxB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,8BAA8B,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE/E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,aAAqB,EACrB,OAAsB;IAEtB,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,+BAA+B,CAAC,aAAa,CAAC,IAAI,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC;YACzF,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACvF,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,2EAA2E;AAC3E,SAAS,cAAc,CACrB,IAAY,EACZ,KAA8B;IAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE5C,IACE,cAAc,CAAC,IAAI,KAAK,UAAU;gBAClC,cAAc,CAAC,IAAI,KAAK,MAAM;gBAC9B,cAAc,CAAC,QAAQ,KAAK,IAAI;gBAChC,cAAc,CAAC,MAAM,KAAK,IAAI;gBAC9B,qBAAqB,CAAC,cAAc,CAAC,KAAK,SAAS,EACnD,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE;gBACT,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;gBAC7B,aAAa,EAAE,QAAQ;aACxB;SACF,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,wEAAwE;IACxE,qCAAqC;IACrC,IAAI,iBAAiB,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,SAAS,EAAE;YACT,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;YAC7B,aAAa,EAAE,QAAQ;SACxB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,IAAY,EACZ,UAAmC,EACnC,KAA+B;IAE/B,OAAO,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,IAAY,EACZ,YAAqC,EACrC,KAA0B;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,4BAA4B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnE,MAAM,KAAK,GAA6B,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjE,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,eAAe,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,OAAO,sBAAsB,CAC3B,IAAI,EACJ,oBAAoB,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,EAC1D,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,UAAmC,EACnC,KAA+B;IAE/B,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE7C,IACE,MAAM,CAAC,IAAI,KAAK,YAAY;QAC5B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,CAAC,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAC9C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,uBAAuB,CACnC,IAAI,EACJ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,YAAY,GAChB,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,WAAW,CAAC,KAAK;QAC1B,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClE,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAY,EACZ,KAA8B,EAC9B,KAA+B;IAE/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACjG,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAgB,EAAE,CAAC;QAEjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,aAAa,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC3C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;YAE1F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExC,IACE,MAAM,CAAC,IAAI,KAAK,YAAY;YAC5B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAC7C,CAAC;YACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,GAAG,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5F,MAAM,SAAS,GAAG,+BAA+B,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAE5F,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO;gBACL;oBACE,IAAI,EAAE,aAAa;oBACnB,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvD,QAAQ;oBACR,SAAS;iBACV;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAEvF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7E,OAAO;gBACL;oBACE,IAAI,EAAE,aAAa;oBACnB,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvD,kBAAkB;oBAClB,QAAQ;oBACR,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iCAAiC,CAAC,kBAAkB,CAAC;yBAC5D;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,0DAA0D;IAC1D,IAAI,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,0EAA0E;IAC1E,yEAAyE;IACzE,kEAAkE;IAClE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,+BAA+B,CACtC,IAAY,EACZ,UAAmC,EACnC,KAA+B;IAE/B,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,yBAAyB,CAAC,UAAmC;IACpE,OAAO,mBAAmB,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,iCAAiC,CAAC,IAAY;IACrD,OAAO,YAAY,IAAI,2BAA2B,IAAI,oBAAoB,IAAI,UAAU,CAAC;AAC3F,CAAC;AAED,SAAS,0BAA0B,CACjC,UAAmC,EACnC,KAA+B;IAE/B,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,YAAY;YAC5B,MAAM,CAAC,IAAI,KAAK,QAAQ;YACxB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC7B,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;YAC5C,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CACxE,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,IAAI,UAAU,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC1E,OAAO,CACL,0BAA0B,CAAC,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;YACpF,0BAA0B,CAAC,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CACtF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,0BAA0B,CACjC,IAAY,EACZ,UAAmC,EACnC,KAA+B;IAE/B,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE7C,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;QAClC,MAAM,CAAC,QAAQ,KAAK,IAAI;QACxB,MAAM,CAAC,QAAQ,KAAK,IAAI;QACxB,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,KAAK,EAC1C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAErC,IAAI,QAAQ,CAAC,IAAI,KAAK,yBAAyB,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAExF,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACpE,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;IAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAA6B;QAC9C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,IAAI,GAAG,CAAC;YAChB,GAAG,KAAK,CAAC,QAAQ;YACjB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;SACzF,CAAC;KACH,CAAC;IACF,MAAM,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,QAAQ;QACR,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxE,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,2DAA2D;AAC3D,MAAM,UAAU,qCAAqC,CACnD,IAAY,EACZ,YAAqC,EACrC,KAA0B;IAE1B,OAAO,sCAAsC,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,YAAqC,EACrC,KAA0B;IAE1B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,eAAe,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,eAAe,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtF,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,SAAS;QACX,CAAC;QAED,qEAAqE;QACrE,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,eAAe,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnD,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjE,MAAM,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAEjD,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IACE,eAAe,CAAC,IAAI,KAAK,qBAAqB;YAC9C,OAAO,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ;YACvD,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,IAAc,CAAC,EACxD,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,IAAc,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type { AttributeIr, JsxNodeIr } from \"./ir.js\";\nimport { readArray, readObject, readSource, unwrapOxcParentheses } from \"./oxc-node-utils.js\";\n\n// Lowers statically analyzable react-compat createElement() call trees into\n// the element IR so they compile through the server string pipeline instead\n// of being interpreted per request. Any unsupported shape anywhere in a tree\n// bails the WHOLE tree out (callers keep the source verbatim) so the\n// interpreter semantics never get half-applied.\n\nconst COMPAT_CREATE_ELEMENT_SOURCES = new Set([\"react\", \"@reckona/mreact-compat\"]);\nconst COMPAT_RENDER_TO_STRING_SOURCES = new Set([\"@reckona/mreact-compat\"]);\n\nexport function collectCompatCreateElementNames(program: unknown): Set<string> {\n const names = new Set<string>();\n\n for (const statement of readArray(readObject(program).body)) {\n const declaration = readObject(statement);\n\n if (declaration.type !== \"ImportDeclaration\") {\n continue;\n }\n\n const source = readObject(declaration.source);\n\n if (typeof source.value !== \"string\" || !COMPAT_CREATE_ELEMENT_SOURCES.has(source.value)) {\n continue;\n }\n\n for (const specifier of readArray(declaration.specifiers)) {\n const specifierObject = readObject(specifier);\n\n if (specifierObject.type !== \"ImportSpecifier\") {\n continue;\n }\n\n const imported = readObject(specifierObject.imported);\n const local = readObject(specifierObject.local);\n\n if (imported.name === \"createElement\" && typeof local.name === \"string\") {\n names.add(local.name);\n }\n }\n }\n\n return names;\n}\n\nexport function collectCompatRenderToStringNames(program: unknown): Set<string> {\n const names = new Set<string>();\n\n for (const statement of readArray(readObject(program).body)) {\n const declaration = readObject(statement);\n\n if (declaration.type !== \"ImportDeclaration\") {\n continue;\n }\n\n const source = readObject(declaration.source);\n\n if (typeof source.value !== \"string\" || !COMPAT_RENDER_TO_STRING_SOURCES.has(source.value)) {\n continue;\n }\n\n for (const specifier of readArray(declaration.specifiers)) {\n const specifierObject = readObject(specifier);\n\n if (specifierObject.type !== \"ImportSpecifier\") {\n continue;\n }\n\n const imported = readObject(specifierObject.imported);\n const local = readObject(specifierObject.local);\n\n if (imported.name === \"renderToString\" && typeof local.name === \"string\") {\n names.add(local.name);\n }\n }\n }\n\n return names;\n}\n\n// Mirrors packages/react-compat/src/server-render.ts attribute serialization\n// for compile-time-known prop values. Keep these tables in sync with the\n// interpreter; parity tests compare emitted bytes against renderToString.\nconst COMPAT_HTML_ATTRIBUTE_ALIASES: Record<string, string> = {\n acceptCharset: \"accept-charset\",\n autoFocus: \"autofocus\",\n autoPlay: \"autoplay\",\n charSet: \"charset\",\n className: \"class\",\n colSpan: \"colspan\",\n contentEditable: \"contenteditable\",\n crossOrigin: \"crossorigin\",\n encType: \"enctype\",\n formAction: \"formaction\",\n frameBorder: \"frameborder\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n maxLength: \"maxlength\",\n minLength: \"minlength\",\n noValidate: \"novalidate\",\n playsInline: \"playsinline\",\n rowSpan: \"rowspan\",\n spellCheck: \"spellcheck\",\n srcDoc: \"srcdoc\",\n srcSet: \"srcset\",\n tabIndex: \"tabindex\",\n useMap: \"usemap\",\n};\n\nconst COMPAT_BOOLEANISH_STRING_ATTRIBUTES = new Set([\n \"contenteditable\",\n \"draggable\",\n \"spellcheck\",\n]);\n\n// URL-bearing attributes always emit through the dynamic path so the runtime\n// scheme guard applies; static literal lowering must not bypass it.\nconst URL_ATTRIBUTE_NAMES = new Set([\n \"action\",\n \"formaction\",\n \"href\",\n \"src\",\n \"srcset\",\n \"xlink:href\",\n]);\n\nconst VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\\w.\\-:]*$/;\n\ninterface CompatCreateElementScope {\n names: ReadonlySet<string>;\n shadowed: ReadonlySet<string>;\n}\n\nfunction isActiveCreateElementName(scope: CompatCreateElementScope, name: string): boolean {\n return scope.names.has(name) && !scope.shadowed.has(name);\n}\n\nfunction isEventHandlerPropName(name: string): boolean {\n return (\n name.length > 1 &&\n (name.charCodeAt(0) | 32) === 111 &&\n (name.charCodeAt(1) | 32) === 110\n );\n}\n\nfunction isBooleanishStringAttributeName(attributeName: string): boolean {\n const lowerCased = attributeName.toLowerCase();\n return lowerCased.startsWith(\"aria-\") || COMPAT_BOOLEANISH_STRING_ATTRIBUTES.has(lowerCased);\n}\n\nfunction isDataAttributeName(attributeName: string): boolean {\n return attributeName.toLowerCase().startsWith(\"data-\");\n}\n\nfunction readStaticPropertyKey(property: Record<string, unknown>): string | undefined {\n if (property.computed === true) {\n return undefined;\n }\n\n const key = readObject(property.key);\n\n if (key.type === \"Identifier\" && typeof key.name === \"string\") {\n return key.name;\n }\n\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n\n return undefined;\n}\n\ntype StaticLiteral =\n | { kind: \"value\"; value: string | number | boolean | null }\n | { kind: \"undefined\" };\n\nfunction readStaticLiteral(expression: Record<string, unknown>): StaticLiteral | undefined {\n if (expression.type === \"Literal\") {\n const value = expression.value;\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return { kind: \"value\", value };\n }\n\n return undefined;\n }\n\n if (expression.type === \"Identifier\" && expression.name === \"undefined\") {\n return { kind: \"undefined\" };\n }\n\n if (expression.type === \"TemplateLiteral\") {\n const expressions = readArray(expression.expressions);\n const quasis = readArray(expression.quasis);\n\n if (expressions.length === 0 && quasis.length === 1) {\n const cooked = readObject(readObject(quasis[0]).value).cooked;\n\n if (typeof cooked === \"string\") {\n return { kind: \"value\", value: cooked };\n }\n }\n }\n\n return undefined;\n}\n\ninterface LoweredProps {\n attributes: AttributeIr[];\n keyCode?: string;\n childrenProp?: Record<string, unknown>;\n}\n\nfunction lowerCreateElementProps(\n code: string,\n propsArgument: Record<string, unknown> | undefined,\n): LoweredProps | undefined {\n if (\n propsArgument === undefined ||\n (propsArgument.type === \"Literal\" && propsArgument.value === null) ||\n (propsArgument.type === \"Identifier\" && propsArgument.name === \"undefined\")\n ) {\n return { attributes: [] };\n }\n\n if (propsArgument.type !== \"ObjectExpression\") {\n return undefined;\n }\n\n const attributes: AttributeIr[] = [];\n let keyCode: string | undefined;\n let childrenProp: Record<string, unknown> | undefined;\n\n for (const property of readArray(propsArgument.properties)) {\n const propertyObject = readObject(property);\n\n if (\n propertyObject.type !== \"Property\" ||\n propertyObject.kind !== \"init\" ||\n propertyObject.method === true ||\n propertyObject.shorthand === true\n ) {\n return undefined;\n }\n\n const name = readStaticPropertyKey(propertyObject);\n\n if (name === undefined) {\n return undefined;\n }\n\n const value = unwrapOxcParentheses(readObject(propertyObject.value));\n\n if (name === \"key\") {\n keyCode = readSource(code, value);\n continue;\n }\n\n if (name === \"ref\" || isEventHandlerPropName(name)) {\n continue;\n }\n\n if (name === \"children\") {\n childrenProp = value;\n continue;\n }\n\n if (name === \"dangerouslySetInnerHTML\" || name === \"suppressHydrationWarning\") {\n return undefined;\n }\n\n if (name === \"style\") {\n const styleProp = lowerStyleProp(code, value);\n\n if (styleProp === undefined) {\n return undefined;\n }\n\n if (styleProp.attribute !== undefined) {\n attributes.push(styleProp.attribute);\n }\n continue;\n }\n\n const attributeName = COMPAT_HTML_ATTRIBUTE_ALIASES[name] ?? name;\n\n if (!VALID_ATTRIBUTE_NAME.test(attributeName) || isEventHandlerPropName(attributeName)) {\n // The interpreter drops these at runtime; keeping them out of the\n // compiled output matches its bytes.\n continue;\n }\n\n const literal = readStaticLiteral(value);\n\n if (literal === undefined || URL_ATTRIBUTE_NAMES.has(attributeName.toLowerCase())) {\n attributes.push({\n kind: \"dynamic-attr\",\n name: attributeName,\n code: readSource(code, value),\n serialization: \"compat\",\n });\n continue;\n }\n\n const staticAttribute = serializeStaticCompatAttribute(attributeName, literal);\n\n if (staticAttribute !== undefined) {\n attributes.push(staticAttribute);\n }\n }\n\n return {\n attributes,\n ...(keyCode === undefined ? {} : { keyCode }),\n ...(childrenProp === undefined ? {} : { childrenProp }),\n };\n}\n\nfunction serializeStaticCompatAttribute(\n attributeName: string,\n literal: StaticLiteral,\n): AttributeIr | undefined {\n if (literal.kind === \"undefined\" || literal.value === null) {\n return undefined;\n }\n\n const value = literal.value;\n\n if (typeof value === \"boolean\") {\n if (isBooleanishStringAttributeName(attributeName) || isDataAttributeName(attributeName)) {\n return { kind: \"static-attr\", name: attributeName, value: value ? \"true\" : \"false\" };\n }\n\n return value ? { kind: \"static-attr\", name: attributeName, value: \"\" } : undefined;\n }\n\n return { kind: \"static-attr\", name: attributeName, value: String(value) };\n}\n\n// undefined bails the whole tree; { attribute: undefined } drops the prop.\nfunction lowerStyleProp(\n code: string,\n value: Record<string, unknown>,\n): { attribute?: AttributeIr } | undefined {\n if (value.type === \"ObjectExpression\") {\n for (const property of readArray(value.properties)) {\n const propertyObject = readObject(property);\n\n if (\n propertyObject.type !== \"Property\" ||\n propertyObject.kind !== \"init\" ||\n propertyObject.computed === true ||\n propertyObject.method === true ||\n readStaticPropertyKey(propertyObject) === undefined\n ) {\n return undefined;\n }\n }\n\n return {\n attribute: {\n kind: \"dynamic-attr\",\n name: \"style\",\n code: readSource(code, value),\n serialization: \"compat\",\n },\n };\n }\n\n // The interpreter's renderStyleAttribute only serializes objects; string\n // and other primitive style values are dropped, so match those bytes by\n // dropping them at compile time too.\n if (readStaticLiteral(value) !== undefined) {\n return {};\n }\n\n return {\n attribute: {\n kind: \"dynamic-attr\",\n name: \"style\",\n code: readSource(code, value),\n serialization: \"compat\",\n },\n };\n}\n\nexport function analyzeCompatCreateElementRoot(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n return lowerCreateElementCall(code, unwrapOxcParentheses(expression), scope);\n}\n\nexport function analyzeCompatCreateElementFunctionRoot(\n code: string,\n functionLike: Record<string, unknown>,\n names: ReadonlySet<string>,\n): JsxNodeIr | undefined {\n if (names.size === 0) {\n return undefined;\n }\n\n const shadowed = collectFunctionShadowedNames(functionLike, names);\n const scope: CompatCreateElementScope = { names, shadowed };\n const body = unwrapOxcParentheses(readObject(functionLike.body));\n\n if (body.type !== \"BlockStatement\") {\n return lowerCreateElementCall(code, body, scope);\n }\n\n for (const statement of readArray(body.body)) {\n const statementObject = readObject(statement);\n\n if (statementObject.type !== \"ReturnStatement\") {\n continue;\n }\n\n return lowerCreateElementCall(\n code,\n unwrapOxcParentheses(readObject(statementObject.argument)),\n scope,\n );\n }\n\n return undefined;\n}\n\nfunction lowerCreateElementCall(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n if (expression.type !== \"CallExpression\" || expression.optional === true) {\n return undefined;\n }\n\n const callee = readObject(expression.callee);\n\n if (\n callee.type !== \"Identifier\" ||\n typeof callee.name !== \"string\" ||\n !isActiveCreateElementName(scope, callee.name)\n ) {\n return undefined;\n }\n\n const args = readArray(expression.arguments);\n\n if (args.length === 0) {\n return undefined;\n }\n\n for (const argument of args) {\n if (readObject(argument).type === \"SpreadElement\") {\n return undefined;\n }\n }\n\n const tagArgument = unwrapOxcParentheses(readObject(args[0]));\n\n if (tagArgument.type !== \"Literal\" || typeof tagArgument.value !== \"string\") {\n return undefined;\n }\n\n const props = lowerCreateElementProps(\n code,\n args.length > 1 ? unwrapOxcParentheses(readObject(args[1])) : undefined,\n );\n\n if (props === undefined) {\n return undefined;\n }\n\n const childArguments = args.slice(2).map((argument) => unwrapOxcParentheses(readObject(argument)));\n const childSources =\n childArguments.length > 0\n ? childArguments\n : props.childrenProp === undefined\n ? []\n : [props.childrenProp];\n const children: JsxNodeIr[] = [];\n\n for (const child of childSources) {\n const lowered = lowerCreateElementChild(code, child, scope);\n\n if (lowered === undefined) {\n return undefined;\n }\n\n children.push(...lowered);\n }\n\n return {\n kind: \"element\",\n tagName: tagArgument.value,\n ...(props.keyCode === undefined ? {} : { keyCode: props.keyCode }),\n attributes: props.attributes,\n children,\n };\n}\n\nfunction lowerCreateElementChild(\n code: string,\n child: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr[] | undefined {\n const literal = readStaticLiteral(child);\n\n if (literal !== undefined) {\n if (literal.kind === \"undefined\" || literal.value === null || typeof literal.value === \"boolean\") {\n return [];\n }\n\n return [{ kind: \"text\", value: String(literal.value) }];\n }\n\n if (child.type === \"ArrayExpression\") {\n const children: JsxNodeIr[] = [];\n\n for (const element of readArray(child.elements)) {\n const elementObject = readObject(element);\n\n if (elementObject.type === \"SpreadElement\") {\n return undefined;\n }\n\n const lowered = lowerCreateElementChild(code, unwrapOxcParentheses(elementObject), scope);\n\n if (lowered === undefined) {\n return undefined;\n }\n\n children.push(...lowered);\n }\n\n return children;\n }\n\n if (child.type === \"CallExpression\") {\n const callee = readObject(child.callee);\n\n if (\n callee.type === \"Identifier\" &&\n typeof callee.name === \"string\" &&\n isActiveCreateElementName(scope, callee.name)\n ) {\n const lowered = lowerCreateElementCall(code, child, scope);\n return lowered === undefined ? undefined : [lowered];\n }\n\n const list = lowerCreateElementListCall(code, child, scope);\n\n if (list !== undefined) {\n return [list];\n }\n }\n\n if (child.type === \"ConditionalExpression\") {\n const whenTrue = lowerCreateElementDynamicBranch(code, readObject(child.consequent), scope);\n const whenFalse = lowerCreateElementDynamicBranch(code, readObject(child.alternate), scope);\n\n if (whenTrue !== undefined && whenFalse !== undefined) {\n return [\n {\n kind: \"conditional\",\n conditionCode: readSource(code, readObject(child.test)),\n whenTrue,\n whenFalse,\n },\n ];\n }\n }\n\n if (child.type === \"LogicalExpression\" && child.operator === \"&&\") {\n const whenTrue = lowerCreateElementDynamicBranch(code, readObject(child.right), scope);\n\n if (whenTrue !== undefined) {\n const conditionValueName = logicalConditionValueName(readObject(child.left));\n\n return [\n {\n kind: \"conditional\",\n conditionCode: readSource(code, readObject(child.left)),\n conditionValueName,\n whenTrue,\n whenFalse: [\n {\n kind: \"expr\",\n code: renderableFalsyConditionValueCode(conditionValueName),\n },\n ],\n },\n ];\n }\n }\n\n // Provably-string expressions escape directly (and stay batchable); the\n // interpreter would emit the same escaped bytes for them.\n if (isProvablyStringExpression(child, scope)) {\n return [{ kind: \"expr\", code: readSource(code, child) }];\n }\n\n // Unknown expressions stay dynamic: the runtime helper escapes primitives\n // and falls back to the interpreter for element values, so children that\n // evaluate to react nodes keep rendering instead of stringifying.\n return [{ kind: \"expr\", code: readSource(code, child), renderMode: \"compat-child\" }];\n}\n\nfunction lowerCreateElementDynamicBranch(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr[] | undefined {\n const unwrapped = unwrapOxcParentheses(expression);\n\n if (unwrapped.type === \"Literal\" && (unwrapped.value === null || unwrapped.value === false)) {\n return [];\n }\n\n return lowerCreateElementChild(code, unwrapped, scope);\n}\n\nfunction logicalConditionValueName(expression: Record<string, unknown>): string {\n return `__mreactLogical_${typeof expression.start === \"number\" ? expression.start : \"value\"}`;\n}\n\nfunction renderableFalsyConditionValueCode(name: string): string {\n return `((typeof ${name} === \"number\" || typeof ${name} === \"bigint\") ? ${name} : null)`;\n}\n\nfunction isProvablyStringExpression(\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): boolean {\n if (expression.type === \"TemplateLiteral\") {\n return true;\n }\n\n if (expression.type === \"CallExpression\" && expression.optional !== true) {\n const callee = readObject(expression.callee);\n\n return (\n callee.type === \"Identifier\" &&\n callee.name === \"String\" &&\n !scope.shadowed.has(\"String\") &&\n readArray(expression.arguments).length === 1 &&\n readObject(readArray(expression.arguments)[0]).type !== \"SpreadElement\"\n );\n }\n\n if (expression.type === \"BinaryExpression\" && expression.operator === \"+\") {\n return (\n isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.left)), scope) ||\n isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.right)), scope)\n );\n }\n\n if (expression.type === \"Literal\") {\n return typeof expression.value === \"string\";\n }\n\n return false;\n}\n\nfunction lowerCreateElementListCall(\n code: string,\n expression: Record<string, unknown>,\n scope: CompatCreateElementScope,\n): JsxNodeIr | undefined {\n if (expression.optional === true) {\n return undefined;\n }\n\n const callee = readObject(expression.callee);\n\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed === true ||\n callee.optional === true ||\n readObject(callee.property).name !== \"map\"\n ) {\n return undefined;\n }\n\n const args = readArray(expression.arguments);\n\n if (args.length !== 1) {\n return undefined;\n }\n\n const renderer = readObject(args[0]);\n\n if (renderer.type !== \"ArrowFunctionExpression\" || renderer.async === true) {\n return undefined;\n }\n\n const parameters = readArray(renderer.params).map((parameter) => readObject(parameter));\n\n if (parameters.some((parameter) => parameter.type !== \"Identifier\")) {\n return undefined;\n }\n\n const [itemName, indexName, arrayName] = parameters.map((parameter) =>\n typeof parameter.name === \"string\" ? parameter.name : undefined,\n );\n\n if (itemName === undefined) {\n return undefined;\n }\n\n const rendererScope: CompatCreateElementScope = {\n names: scope.names,\n shadowed: new Set([\n ...scope.shadowed,\n ...[itemName, indexName, arrayName].filter((name): name is string => name !== undefined),\n ]),\n };\n const body = unwrapOxcParentheses(readObject(renderer.body));\n\n if (body.type === \"BlockStatement\") {\n return undefined;\n }\n\n const rendered = lowerCreateElementCall(code, body, rendererScope);\n\n if (rendered === undefined || rendered.kind !== \"element\") {\n return undefined;\n }\n\n return {\n kind: \"list\",\n itemsCode: readSource(code, readObject(callee.object)),\n itemName,\n ...(indexName === undefined ? {} : { indexName }),\n ...(arrayName === undefined ? {} : { arrayName }),\n ...(rendered.keyCode === undefined ? {} : { keyCode: rendered.keyCode }),\n children: [rendered],\n };\n}\n\n// Detection-side predicate: a direct `return createElement(...)` (or arrow\n// implicit body) that the converter can fully lower. Detection and lowering\n// share lowerCreateElementCall so they can never disagree.\nexport function hasLowerableCompatCreateElementReturn(\n code: string,\n functionLike: Record<string, unknown>,\n names: ReadonlySet<string>,\n): boolean {\n return analyzeCompatCreateElementFunctionRoot(code, functionLike, names) !== undefined;\n}\n\nexport function collectFunctionShadowedNames(\n functionLike: Record<string, unknown>,\n names: ReadonlySet<string>,\n): Set<string> {\n const shadowed = new Set<string>();\n\n for (const parameter of readArray(functionLike.params)) {\n const parameterObject = readObject(parameter);\n\n if (parameterObject.type === \"Identifier\" && typeof parameterObject.name === \"string\") {\n if (names.has(parameterObject.name)) {\n shadowed.add(parameterObject.name);\n }\n continue;\n }\n\n // Destructured parameters could shadow anything; treat every tracked\n // name as shadowed rather than analyzing the pattern.\n for (const name of names) {\n shadowed.add(name);\n }\n }\n\n const body = readObject(functionLike.body);\n\n if (body.type !== \"BlockStatement\") {\n return shadowed;\n }\n\n for (const statement of readArray(body.body)) {\n const statementObject = readObject(statement);\n\n if (statementObject.type === \"VariableDeclaration\") {\n for (const declarator of readArray(statementObject.declarations)) {\n const id = readObject(readObject(declarator).id);\n\n if (id.type === \"Identifier\" && typeof id.name === \"string\" && names.has(id.name)) {\n shadowed.add(id.name);\n }\n }\n }\n\n if (\n statementObject.type === \"FunctionDeclaration\" &&\n typeof readObject(statementObject.id).name === \"string\" &&\n names.has(readObject(statementObject.id).name as string)\n ) {\n shadowed.add(readObject(statementObject.id).name as string);\n }\n }\n\n return shadowed;\n}\n"]}
|
package/dist/oxc-transform.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Removes TypeScript syntax from a snippet with OXC while preserving JSX. */
|
|
1
2
|
export declare function stripTypeScriptWithOxc(source: string): string;
|
|
2
3
|
export declare function transformJsxWithOxc(source: string): string;
|
|
3
4
|
export declare function transformJsxToCreateElementWithOxc(source: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxc-transform.d.ts","sourceRoot":"","sources":["../src/oxc-transform.ts"],"names":[],"mappings":"AAKA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B7D;AA+BD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmB1D;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBzE"}
|
|
1
|
+
{"version":3,"file":"oxc-transform.d.ts","sourceRoot":"","sources":["../src/oxc-transform.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B7D;AA+BD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmB1D;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBzE"}
|
package/dist/oxc-transform.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { transformSync } from "oxc-transform";
|
|
2
2
|
const stripTypeScriptCache = new Map();
|
|
3
3
|
const stripTypeScriptCacheLimit = 512;
|
|
4
|
+
/** Removes TypeScript syntax from a snippet with OXC while preserving JSX. */
|
|
4
5
|
export function stripTypeScriptWithOxc(source) {
|
|
5
6
|
if (!needsTypeScriptStripping(source)) {
|
|
6
7
|
return source.trimEnd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxc-transform.js","sourceRoot":"","sources":["../src/oxc-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;AACvD,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE;QAClD,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,UAAU;QACf,UAAU,EAAE;YACV,qBAAqB,EAAE,IAAI;SAC5B;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAErF,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAc,EAAE,QAAgB;IAClE,IAAI,oBAAoB,CAAC,IAAI,IAAI,yBAAyB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAEvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,2EAA2E;IAC3E,4EAA4E;IAC5E,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,sCAAsC,CAAC,IAAI,CAAC,MAAM,CAAC;QACnD,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC;QAClD,4CAA4C,CAAC,IAAI,CAAC,MAAM,CAAC;QACzD,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC;QACjD,6CAA6C,CAAC,IAAI,CAAC,MAAM,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE;QAClD,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE;YACH,OAAO,EAAE,WAAW;YACpB,YAAY,EAAE,wBAAwB;SACvC;QACD,UAAU,EAAE;YACV,qBAAqB,EAAE,IAAI;SAC5B;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACnD,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,MAAc;IAC/D,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE;QAClD,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE;YACH,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,UAAU;SACvB;QACD,UAAU,EAAE;YACV,qBAAqB,EAAE,IAAI;SAC5B;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACnD,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["import { transformSync } from \"oxc-transform\";\n\nconst stripTypeScriptCache = new Map<string, string>();\nconst stripTypeScriptCacheLimit = 512;\n\nexport function stripTypeScriptWithOxc(source: string): string {\n if (!needsTypeScriptStripping(source)) {\n return source.trimEnd();\n }\n\n const cached = stripTypeScriptCache.get(source);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: \"preserve\",\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n const stripped = result.errors.length > 0 ? source.trimEnd() : result.code.trimEnd();\n\n rememberStrippedTypeScript(source, stripped);\n\n return stripped;\n}\n\nfunction rememberStrippedTypeScript(source: string, stripped: string): void {\n if (stripTypeScriptCache.size >= stripTypeScriptCacheLimit) {\n const first = stripTypeScriptCache.keys().next().value;\n\n if (first !== undefined) {\n stripTypeScriptCache.delete(first);\n }\n }\n\n stripTypeScriptCache.set(source, stripped);\n}\n\nfunction needsTypeScriptStripping(source: string): boolean {\n // This is intentionally an over-approximation: false positives cost an oxc\n // pass, but false negatives leak TypeScript syntax into emitted JavaScript.\n return (\n /\\bimport\\s+type\\b/.test(source) ||\n /\\bexport\\s+type\\b/.test(source) ||\n /\\btype\\s+[A-Za-z_$][\\w$]*\\b/.test(source) ||\n /\\binterface\\s+[A-Za-z_$][\\w$]*\\b/.test(source) ||\n /<[^>\\n]+\\bextends\\b[^>\\n]*>\\s*\\(/.test(source) ||\n /\\b[A-Za-z_$][\\w$.]*\\s*<[^>\\n]+>\\s*\\(/.test(source) ||\n /\\bas\\s+(?:const|[A-Za-z_$][\\w$]*)\\b/.test(source) ||\n /\\bsatisfies\\s+[A-Za-z_$][\\w$<>,\\s|&.[\\]?]*/.test(source) ||\n /[A-Za-z_$)\\]}]\\s*!\\s*(?=[,.;)\\]}])/.test(source) ||\n /:\\s*[A-Za-z_$][\\w$<>,\\s|&.[\\]?]*(?=[,)=;{])/.test(source)\n );\n}\n\nexport function transformJsxWithOxc(source: string): string {\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: {\n runtime: \"automatic\",\n importSource: \"@reckona/mreact-compat\",\n },\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n if (result.errors.length > 0 && result.code === \"\") {\n return stripTypeScriptWithOxc(source);\n }\n\n return result.code.trimEnd();\n}\n\nexport function transformJsxToCreateElementWithOxc(source: string): string {\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: {\n runtime: \"classic\",\n pragma: \"createElement\",\n pragmaFrag: \"Fragment\",\n },\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n if (result.errors.length > 0 && result.code === \"\") {\n return stripTypeScriptWithOxc(source);\n }\n\n return result.code.trimEnd();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oxc-transform.js","sourceRoot":"","sources":["../src/oxc-transform.ts"],"names":[],"mappings":"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","sourcesContent":["import { transformSync } from \"oxc-transform\";\n\nconst stripTypeScriptCache = new Map<string, string>();\nconst stripTypeScriptCacheLimit = 512;\n\n/** Removes TypeScript syntax from a snippet with OXC while preserving JSX. */\nexport function stripTypeScriptWithOxc(source: string): string {\n if (!needsTypeScriptStripping(source)) {\n return source.trimEnd();\n }\n\n const cached = stripTypeScriptCache.get(source);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: \"preserve\",\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n const stripped = result.errors.length > 0 ? source.trimEnd() : result.code.trimEnd();\n\n rememberStrippedTypeScript(source, stripped);\n\n return stripped;\n}\n\nfunction rememberStrippedTypeScript(source: string, stripped: string): void {\n if (stripTypeScriptCache.size >= stripTypeScriptCacheLimit) {\n const first = stripTypeScriptCache.keys().next().value;\n\n if (first !== undefined) {\n stripTypeScriptCache.delete(first);\n }\n }\n\n stripTypeScriptCache.set(source, stripped);\n}\n\nfunction needsTypeScriptStripping(source: string): boolean {\n // This is intentionally an over-approximation: false positives cost an oxc\n // pass, but false negatives leak TypeScript syntax into emitted JavaScript.\n return (\n /\\bimport\\s+type\\b/.test(source) ||\n /\\bexport\\s+type\\b/.test(source) ||\n /\\btype\\s+[A-Za-z_$][\\w$]*\\b/.test(source) ||\n /\\binterface\\s+[A-Za-z_$][\\w$]*\\b/.test(source) ||\n /<[^>\\n]+\\bextends\\b[^>\\n]*>\\s*\\(/.test(source) ||\n /\\b[A-Za-z_$][\\w$.]*\\s*<[^>\\n]+>\\s*\\(/.test(source) ||\n /\\bas\\s+(?:const|[A-Za-z_$][\\w$]*)\\b/.test(source) ||\n /\\bsatisfies\\s+[A-Za-z_$][\\w$<>,\\s|&.[\\]?]*/.test(source) ||\n /[A-Za-z_$)\\]}]\\s*!\\s*(?=[,.;)\\]}])/.test(source) ||\n /:\\s*[A-Za-z_$][\\w$<>,\\s|&.[\\]?]*(?=[,)=;{])/.test(source)\n );\n}\n\nexport function transformJsxWithOxc(source: string): string {\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: {\n runtime: \"automatic\",\n importSource: \"@reckona/mreact-compat\",\n },\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n if (result.errors.length > 0 && result.code === \"\") {\n return stripTypeScriptWithOxc(source);\n }\n\n return result.code.trimEnd();\n}\n\nexport function transformJsxToCreateElementWithOxc(source: string): string {\n const result = transformSync(\"snippet.tsx\", source, {\n lang: \"tsx\",\n sourceType: \"module\",\n target: \"es2022\",\n jsx: {\n runtime: \"classic\",\n pragma: \"createElement\",\n pragmaFrag: \"Fragment\",\n },\n typescript: {\n onlyRemoveTypeImports: true,\n },\n });\n\n if (result.errors.length > 0 && result.code === \"\") {\n return stripTypeScriptWithOxc(source);\n }\n\n return result.code.trimEnd();\n}\n"]}
|
package/dist/oxc.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type AnalyzeToIrInput, type AnalyzeToIrOutput } from "./internal.js";
|
|
2
2
|
import { type CompilerModuleContext } from "./compiler-module-context.js";
|
|
3
3
|
import type { ModuleIr } from "./ir.js";
|
|
4
|
+
/** Reports OXC analysis parity data used by compiler migration and diagnostics tests. */
|
|
4
5
|
export interface OxcParityResult {
|
|
5
6
|
matches: boolean;
|
|
6
7
|
oxc: {
|
|
@@ -11,7 +12,10 @@ export interface OxcParityResult {
|
|
|
11
12
|
rawJsxDetected: boolean;
|
|
12
13
|
};
|
|
13
14
|
}
|
|
15
|
+
/** Compares OXC component discovery and IR output against parity expectations for one module. */
|
|
14
16
|
export declare function analyzeOxcParity(input: AnalyzeToIrInput): OxcParityResult;
|
|
17
|
+
/** Analyzes source code into compiler IR using OXC parsing and lowering. */
|
|
15
18
|
export declare function analyzeWithOxc(input: AnalyzeToIrInput): AnalyzeToIrOutput;
|
|
19
|
+
/** Analyzes a cached OXC compiler module context into compiler IR. */
|
|
16
20
|
export declare function analyzeCompilerModuleContextWithOxc(context: CompilerModuleContext, input: Omit<AnalyzeToIrInput, "code" | "filename">): AnalyzeToIrOutput;
|
|
17
21
|
//# sourceMappingURL=oxc.d.ts.map
|
package/dist/oxc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxc.d.ts","sourceRoot":"","sources":["../src/oxc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAkC,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"oxc.d.ts","sourceRoot":"","sources":["../src/oxc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAkC,QAAQ,EAAE,MAAM,SAAS,CAAC;AA4FxE,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE;QACH,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,EAAE,CAAC,EAAE,QAAQ,CAAC;QACd,sBAAsB,EAAE,OAAO,CAAC;QAChC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AA+CD,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CA6BzE;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAKzE;AAED,sEAAsE;AACtE,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,UAAU,CAAC,GACjD,iBAAiB,CAWnB"}
|