@reckona/mreact-compiler 0.0.153 → 0.0.154
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/emit-server.d.ts.map +1 -1
- package/dist/emit-server.js +81 -8
- package/dist/emit-server.js.map +1 -1
- package/dist/ir.d.ts +2 -1
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js.map +1 -1
- package/dist/oxc-compat-create-element.d.ts +11 -0
- package/dist/oxc-compat-create-element.d.ts.map +1 -0
- package/dist/oxc-compat-create-element.js +489 -0
- package/dist/oxc-compat-create-element.js.map +1 -0
- package/dist/oxc.d.ts.map +1 -1
- package/dist/oxc.js +79 -11
- package/dist/oxc.js.map +1 -1
- package/package.json +2 -2
- package/src/emit-server.ts +103 -4
- package/src/ir.ts +4 -1
- package/src/oxc-compat-create-element.ts +705 -0
- package/src/oxc.ts +130 -4
package/dist/ir.d.ts
CHANGED
|
@@ -85,7 +85,7 @@ export interface TextIr {
|
|
|
85
85
|
export interface ExprIr {
|
|
86
86
|
kind: "expr";
|
|
87
87
|
code: string;
|
|
88
|
-
renderMode?: "dynamic" | "html" | "react-node" | "stream-node";
|
|
88
|
+
renderMode?: "dynamic" | "html" | "react-node" | "stream-node" | "compat-child";
|
|
89
89
|
}
|
|
90
90
|
export interface AsyncBoundaryIr {
|
|
91
91
|
kind: "async-boundary";
|
|
@@ -109,6 +109,7 @@ export interface DynamicAttributeIr {
|
|
|
109
109
|
kind: "dynamic-attr";
|
|
110
110
|
name: string;
|
|
111
111
|
code: string;
|
|
112
|
+
serialization?: "compat";
|
|
112
113
|
}
|
|
113
114
|
export interface EventAttributeIr {
|
|
114
115
|
kind: "event";
|
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,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,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,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,aAAa,GACb,MAAM,GACN,MAAM,GACN,MAAM,GACN,eAAe,CAAC;AAEpB,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,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,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,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,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,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,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,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,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,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,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,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,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,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\";\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}\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\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"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JsxNodeIr } from "./ir.js";
|
|
2
|
+
export declare function collectCompatCreateElementNames(program: unknown): Set<string>;
|
|
3
|
+
interface CompatCreateElementScope {
|
|
4
|
+
names: ReadonlySet<string>;
|
|
5
|
+
shadowed: ReadonlySet<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function analyzeCompatCreateElementRoot(code: string, expression: Record<string, unknown>, scope: CompatCreateElementScope): JsxNodeIr | undefined;
|
|
8
|
+
export declare function hasLowerableCompatCreateElementReturn(code: string, functionLike: Record<string, unknown>, names: ReadonlySet<string>): boolean;
|
|
9
|
+
export declare function collectFunctionShadowedNames(functionLike: Record<string, unknown>, names: ReadonlySet<string>): Set<string>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=oxc-compat-create-element.d.ts.map
|
|
@@ -0,0 +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;AAWtD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAiC7E;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;AAiQD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,OAAO,CA0BT;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"}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { readArray, readObject, readSource, unwrapOxcParentheses } from "./oxc-node-utils.js";
|
|
2
|
+
// Lowers statically analyzable react-compat createElement() call trees into
|
|
3
|
+
// the element IR so they compile through the server string pipeline instead
|
|
4
|
+
// of being interpreted per request. Any unsupported shape anywhere in a tree
|
|
5
|
+
// bails the WHOLE tree out (callers keep the source verbatim) so the
|
|
6
|
+
// interpreter semantics never get half-applied.
|
|
7
|
+
const COMPAT_CREATE_ELEMENT_SOURCES = new Set(["react", "@reckona/mreact-compat"]);
|
|
8
|
+
export function collectCompatCreateElementNames(program) {
|
|
9
|
+
const names = new Set();
|
|
10
|
+
for (const statement of readArray(readObject(program).body)) {
|
|
11
|
+
const declaration = readObject(statement);
|
|
12
|
+
if (declaration.type !== "ImportDeclaration") {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const source = readObject(declaration.source);
|
|
16
|
+
if (typeof source.value !== "string" || !COMPAT_CREATE_ELEMENT_SOURCES.has(source.value)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
for (const specifier of readArray(declaration.specifiers)) {
|
|
20
|
+
const specifierObject = readObject(specifier);
|
|
21
|
+
if (specifierObject.type !== "ImportSpecifier") {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const imported = readObject(specifierObject.imported);
|
|
25
|
+
const local = readObject(specifierObject.local);
|
|
26
|
+
if (imported.name === "createElement" && typeof local.name === "string") {
|
|
27
|
+
names.add(local.name);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return names;
|
|
32
|
+
}
|
|
33
|
+
// Mirrors packages/react-compat/src/server-render.ts attribute serialization
|
|
34
|
+
// for compile-time-known prop values. Keep these tables in sync with the
|
|
35
|
+
// interpreter; parity tests compare emitted bytes against renderToString.
|
|
36
|
+
const COMPAT_HTML_ATTRIBUTE_ALIASES = {
|
|
37
|
+
acceptCharset: "accept-charset",
|
|
38
|
+
autoFocus: "autofocus",
|
|
39
|
+
autoPlay: "autoplay",
|
|
40
|
+
charSet: "charset",
|
|
41
|
+
className: "class",
|
|
42
|
+
colSpan: "colspan",
|
|
43
|
+
contentEditable: "contenteditable",
|
|
44
|
+
crossOrigin: "crossorigin",
|
|
45
|
+
encType: "enctype",
|
|
46
|
+
formAction: "formaction",
|
|
47
|
+
frameBorder: "frameborder",
|
|
48
|
+
htmlFor: "for",
|
|
49
|
+
httpEquiv: "http-equiv",
|
|
50
|
+
maxLength: "maxlength",
|
|
51
|
+
minLength: "minlength",
|
|
52
|
+
noValidate: "novalidate",
|
|
53
|
+
playsInline: "playsinline",
|
|
54
|
+
rowSpan: "rowspan",
|
|
55
|
+
spellCheck: "spellcheck",
|
|
56
|
+
srcDoc: "srcdoc",
|
|
57
|
+
srcSet: "srcset",
|
|
58
|
+
tabIndex: "tabindex",
|
|
59
|
+
useMap: "usemap",
|
|
60
|
+
};
|
|
61
|
+
const COMPAT_BOOLEANISH_STRING_ATTRIBUTES = new Set([
|
|
62
|
+
"contenteditable",
|
|
63
|
+
"draggable",
|
|
64
|
+
"spellcheck",
|
|
65
|
+
]);
|
|
66
|
+
// URL-bearing attributes always emit through the dynamic path so the runtime
|
|
67
|
+
// scheme guard applies; static literal lowering must not bypass it.
|
|
68
|
+
const URL_ATTRIBUTE_NAMES = new Set([
|
|
69
|
+
"action",
|
|
70
|
+
"formaction",
|
|
71
|
+
"href",
|
|
72
|
+
"src",
|
|
73
|
+
"srcset",
|
|
74
|
+
"xlink:href",
|
|
75
|
+
]);
|
|
76
|
+
const VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\w.\-:]*$/;
|
|
77
|
+
function isActiveCreateElementName(scope, name) {
|
|
78
|
+
return scope.names.has(name) && !scope.shadowed.has(name);
|
|
79
|
+
}
|
|
80
|
+
function isEventHandlerPropName(name) {
|
|
81
|
+
return (name.length > 1 &&
|
|
82
|
+
(name.charCodeAt(0) | 32) === 111 &&
|
|
83
|
+
(name.charCodeAt(1) | 32) === 110);
|
|
84
|
+
}
|
|
85
|
+
function isBooleanishStringAttributeName(attributeName) {
|
|
86
|
+
const lowerCased = attributeName.toLowerCase();
|
|
87
|
+
return lowerCased.startsWith("aria-") || COMPAT_BOOLEANISH_STRING_ATTRIBUTES.has(lowerCased);
|
|
88
|
+
}
|
|
89
|
+
function isDataAttributeName(attributeName) {
|
|
90
|
+
return attributeName.toLowerCase().startsWith("data-");
|
|
91
|
+
}
|
|
92
|
+
function readStaticPropertyKey(property) {
|
|
93
|
+
if (property.computed === true) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const key = readObject(property.key);
|
|
97
|
+
if (key.type === "Identifier" && typeof key.name === "string") {
|
|
98
|
+
return key.name;
|
|
99
|
+
}
|
|
100
|
+
if (key.type === "Literal" && typeof key.value === "string") {
|
|
101
|
+
return key.value;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
function readStaticLiteral(expression) {
|
|
106
|
+
if (expression.type === "Literal") {
|
|
107
|
+
const value = expression.value;
|
|
108
|
+
if (value === null ||
|
|
109
|
+
typeof value === "string" ||
|
|
110
|
+
typeof value === "number" ||
|
|
111
|
+
typeof value === "boolean") {
|
|
112
|
+
return { kind: "value", value };
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (expression.type === "Identifier" && expression.name === "undefined") {
|
|
117
|
+
return { kind: "undefined" };
|
|
118
|
+
}
|
|
119
|
+
if (expression.type === "TemplateLiteral") {
|
|
120
|
+
const expressions = readArray(expression.expressions);
|
|
121
|
+
const quasis = readArray(expression.quasis);
|
|
122
|
+
if (expressions.length === 0 && quasis.length === 1) {
|
|
123
|
+
const cooked = readObject(readObject(quasis[0]).value).cooked;
|
|
124
|
+
if (typeof cooked === "string") {
|
|
125
|
+
return { kind: "value", value: cooked };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
function lowerCreateElementProps(code, propsArgument) {
|
|
132
|
+
if (propsArgument === undefined ||
|
|
133
|
+
(propsArgument.type === "Literal" && propsArgument.value === null) ||
|
|
134
|
+
(propsArgument.type === "Identifier" && propsArgument.name === "undefined")) {
|
|
135
|
+
return { attributes: [] };
|
|
136
|
+
}
|
|
137
|
+
if (propsArgument.type !== "ObjectExpression") {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
const attributes = [];
|
|
141
|
+
let keyCode;
|
|
142
|
+
let childrenProp;
|
|
143
|
+
for (const property of readArray(propsArgument.properties)) {
|
|
144
|
+
const propertyObject = readObject(property);
|
|
145
|
+
if (propertyObject.type !== "Property" ||
|
|
146
|
+
propertyObject.kind !== "init" ||
|
|
147
|
+
propertyObject.method === true ||
|
|
148
|
+
propertyObject.shorthand === true) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const name = readStaticPropertyKey(propertyObject);
|
|
152
|
+
if (name === undefined) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
const value = unwrapOxcParentheses(readObject(propertyObject.value));
|
|
156
|
+
if (name === "key") {
|
|
157
|
+
keyCode = readSource(code, value);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (name === "ref" || isEventHandlerPropName(name)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (name === "children") {
|
|
164
|
+
childrenProp = value;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (name === "dangerouslySetInnerHTML" || name === "suppressHydrationWarning") {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
if (name === "style") {
|
|
171
|
+
const styleProp = lowerStyleProp(code, value);
|
|
172
|
+
if (styleProp === undefined) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
if (styleProp.attribute !== undefined) {
|
|
176
|
+
attributes.push(styleProp.attribute);
|
|
177
|
+
}
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const attributeName = COMPAT_HTML_ATTRIBUTE_ALIASES[name] ?? name;
|
|
181
|
+
if (!VALID_ATTRIBUTE_NAME.test(attributeName) || isEventHandlerPropName(attributeName)) {
|
|
182
|
+
// The interpreter drops these at runtime; keeping them out of the
|
|
183
|
+
// compiled output matches its bytes.
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const literal = readStaticLiteral(value);
|
|
187
|
+
if (literal === undefined || URL_ATTRIBUTE_NAMES.has(attributeName.toLowerCase())) {
|
|
188
|
+
attributes.push({
|
|
189
|
+
kind: "dynamic-attr",
|
|
190
|
+
name: attributeName,
|
|
191
|
+
code: readSource(code, value),
|
|
192
|
+
serialization: "compat",
|
|
193
|
+
});
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const staticAttribute = serializeStaticCompatAttribute(attributeName, literal);
|
|
197
|
+
if (staticAttribute !== undefined) {
|
|
198
|
+
attributes.push(staticAttribute);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
attributes,
|
|
203
|
+
...(keyCode === undefined ? {} : { keyCode }),
|
|
204
|
+
...(childrenProp === undefined ? {} : { childrenProp }),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function serializeStaticCompatAttribute(attributeName, literal) {
|
|
208
|
+
if (literal.kind === "undefined" || literal.value === null) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
const value = literal.value;
|
|
212
|
+
if (typeof value === "boolean") {
|
|
213
|
+
if (isBooleanishStringAttributeName(attributeName) || isDataAttributeName(attributeName)) {
|
|
214
|
+
return { kind: "static-attr", name: attributeName, value: value ? "true" : "false" };
|
|
215
|
+
}
|
|
216
|
+
return value ? { kind: "static-attr", name: attributeName, value: "" } : undefined;
|
|
217
|
+
}
|
|
218
|
+
return { kind: "static-attr", name: attributeName, value: String(value) };
|
|
219
|
+
}
|
|
220
|
+
// undefined bails the whole tree; { attribute: undefined } drops the prop.
|
|
221
|
+
function lowerStyleProp(code, value) {
|
|
222
|
+
if (value.type === "ObjectExpression") {
|
|
223
|
+
for (const property of readArray(value.properties)) {
|
|
224
|
+
const propertyObject = readObject(property);
|
|
225
|
+
if (propertyObject.type !== "Property" ||
|
|
226
|
+
propertyObject.kind !== "init" ||
|
|
227
|
+
propertyObject.computed === true ||
|
|
228
|
+
propertyObject.method === true ||
|
|
229
|
+
readStaticPropertyKey(propertyObject) === undefined) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
attribute: {
|
|
235
|
+
kind: "dynamic-attr",
|
|
236
|
+
name: "style",
|
|
237
|
+
code: readSource(code, value),
|
|
238
|
+
serialization: "compat",
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// The interpreter's renderStyleAttribute only serializes objects; string
|
|
243
|
+
// and other primitive style values are dropped, so match those bytes by
|
|
244
|
+
// dropping them at compile time too.
|
|
245
|
+
if (readStaticLiteral(value) !== undefined) {
|
|
246
|
+
return {};
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
attribute: {
|
|
250
|
+
kind: "dynamic-attr",
|
|
251
|
+
name: "style",
|
|
252
|
+
code: readSource(code, value),
|
|
253
|
+
serialization: "compat",
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export function analyzeCompatCreateElementRoot(code, expression, scope) {
|
|
258
|
+
return lowerCreateElementCall(code, unwrapOxcParentheses(expression), scope);
|
|
259
|
+
}
|
|
260
|
+
function lowerCreateElementCall(code, expression, scope) {
|
|
261
|
+
if (expression.type !== "CallExpression" || expression.optional === true) {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
const callee = readObject(expression.callee);
|
|
265
|
+
if (callee.type !== "Identifier" ||
|
|
266
|
+
typeof callee.name !== "string" ||
|
|
267
|
+
!isActiveCreateElementName(scope, callee.name)) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const args = readArray(expression.arguments);
|
|
271
|
+
if (args.length === 0) {
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
for (const argument of args) {
|
|
275
|
+
if (readObject(argument).type === "SpreadElement") {
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const tagArgument = unwrapOxcParentheses(readObject(args[0]));
|
|
280
|
+
if (tagArgument.type !== "Literal" || typeof tagArgument.value !== "string") {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
const props = lowerCreateElementProps(code, args.length > 1 ? unwrapOxcParentheses(readObject(args[1])) : undefined);
|
|
284
|
+
if (props === undefined) {
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
287
|
+
const childArguments = args.slice(2).map((argument) => unwrapOxcParentheses(readObject(argument)));
|
|
288
|
+
const childSources = childArguments.length > 0
|
|
289
|
+
? childArguments
|
|
290
|
+
: props.childrenProp === undefined
|
|
291
|
+
? []
|
|
292
|
+
: [props.childrenProp];
|
|
293
|
+
const children = [];
|
|
294
|
+
for (const child of childSources) {
|
|
295
|
+
const lowered = lowerCreateElementChild(code, child, scope);
|
|
296
|
+
if (lowered === undefined) {
|
|
297
|
+
return undefined;
|
|
298
|
+
}
|
|
299
|
+
children.push(...lowered);
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
kind: "element",
|
|
303
|
+
tagName: tagArgument.value,
|
|
304
|
+
...(props.keyCode === undefined ? {} : { keyCode: props.keyCode }),
|
|
305
|
+
attributes: props.attributes,
|
|
306
|
+
children,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function lowerCreateElementChild(code, child, scope) {
|
|
310
|
+
const literal = readStaticLiteral(child);
|
|
311
|
+
if (literal !== undefined) {
|
|
312
|
+
if (literal.kind === "undefined" || literal.value === null || typeof literal.value === "boolean") {
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
return [{ kind: "text", value: String(literal.value) }];
|
|
316
|
+
}
|
|
317
|
+
if (child.type === "ArrayExpression") {
|
|
318
|
+
const children = [];
|
|
319
|
+
for (const element of readArray(child.elements)) {
|
|
320
|
+
const elementObject = readObject(element);
|
|
321
|
+
if (elementObject.type === "SpreadElement") {
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
const lowered = lowerCreateElementChild(code, unwrapOxcParentheses(elementObject), scope);
|
|
325
|
+
if (lowered === undefined) {
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
children.push(...lowered);
|
|
329
|
+
}
|
|
330
|
+
return children;
|
|
331
|
+
}
|
|
332
|
+
if (child.type === "CallExpression") {
|
|
333
|
+
const callee = readObject(child.callee);
|
|
334
|
+
if (callee.type === "Identifier" &&
|
|
335
|
+
typeof callee.name === "string" &&
|
|
336
|
+
isActiveCreateElementName(scope, callee.name)) {
|
|
337
|
+
const lowered = lowerCreateElementCall(code, child, scope);
|
|
338
|
+
return lowered === undefined ? undefined : [lowered];
|
|
339
|
+
}
|
|
340
|
+
const list = lowerCreateElementListCall(code, child, scope);
|
|
341
|
+
if (list !== undefined) {
|
|
342
|
+
return [list];
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Provably-string expressions escape directly (and stay batchable); the
|
|
346
|
+
// interpreter would emit the same escaped bytes for them.
|
|
347
|
+
if (isProvablyStringExpression(child, scope)) {
|
|
348
|
+
return [{ kind: "expr", code: readSource(code, child) }];
|
|
349
|
+
}
|
|
350
|
+
// Unknown expressions stay dynamic: the runtime helper escapes primitives
|
|
351
|
+
// and falls back to the interpreter for element values, so children that
|
|
352
|
+
// evaluate to react nodes keep rendering instead of stringifying.
|
|
353
|
+
return [{ kind: "expr", code: readSource(code, child), renderMode: "compat-child" }];
|
|
354
|
+
}
|
|
355
|
+
function isProvablyStringExpression(expression, scope) {
|
|
356
|
+
if (expression.type === "TemplateLiteral") {
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
if (expression.type === "CallExpression" && expression.optional !== true) {
|
|
360
|
+
const callee = readObject(expression.callee);
|
|
361
|
+
return (callee.type === "Identifier" &&
|
|
362
|
+
callee.name === "String" &&
|
|
363
|
+
!scope.shadowed.has("String") &&
|
|
364
|
+
readArray(expression.arguments).length === 1 &&
|
|
365
|
+
readObject(readArray(expression.arguments)[0]).type !== "SpreadElement");
|
|
366
|
+
}
|
|
367
|
+
if (expression.type === "BinaryExpression" && expression.operator === "+") {
|
|
368
|
+
return (isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.left)), scope) ||
|
|
369
|
+
isProvablyStringExpression(unwrapOxcParentheses(readObject(expression.right)), scope));
|
|
370
|
+
}
|
|
371
|
+
if (expression.type === "Literal") {
|
|
372
|
+
return typeof expression.value === "string";
|
|
373
|
+
}
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
function lowerCreateElementListCall(code, expression, scope) {
|
|
377
|
+
if (expression.optional === true) {
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
const callee = readObject(expression.callee);
|
|
381
|
+
if (callee.type !== "MemberExpression" ||
|
|
382
|
+
callee.computed === true ||
|
|
383
|
+
callee.optional === true ||
|
|
384
|
+
readObject(callee.property).name !== "map") {
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
const args = readArray(expression.arguments);
|
|
388
|
+
if (args.length !== 1) {
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
const renderer = readObject(args[0]);
|
|
392
|
+
if (renderer.type !== "ArrowFunctionExpression" || renderer.async === true) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
const parameters = readArray(renderer.params).map((parameter) => readObject(parameter));
|
|
396
|
+
if (parameters.some((parameter) => parameter.type !== "Identifier")) {
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
399
|
+
const [itemName, indexName, arrayName] = parameters.map((parameter) => typeof parameter.name === "string" ? parameter.name : undefined);
|
|
400
|
+
if (itemName === undefined) {
|
|
401
|
+
return undefined;
|
|
402
|
+
}
|
|
403
|
+
const rendererScope = {
|
|
404
|
+
names: scope.names,
|
|
405
|
+
shadowed: new Set([
|
|
406
|
+
...scope.shadowed,
|
|
407
|
+
...[itemName, indexName, arrayName].filter((name) => name !== undefined),
|
|
408
|
+
]),
|
|
409
|
+
};
|
|
410
|
+
const body = unwrapOxcParentheses(readObject(renderer.body));
|
|
411
|
+
if (body.type === "BlockStatement") {
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
const rendered = lowerCreateElementCall(code, body, rendererScope);
|
|
415
|
+
if (rendered === undefined || rendered.kind !== "element") {
|
|
416
|
+
return undefined;
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
kind: "list",
|
|
420
|
+
itemsCode: readSource(code, readObject(callee.object)),
|
|
421
|
+
itemName,
|
|
422
|
+
...(indexName === undefined ? {} : { indexName }),
|
|
423
|
+
...(arrayName === undefined ? {} : { arrayName }),
|
|
424
|
+
...(rendered.keyCode === undefined ? {} : { keyCode: rendered.keyCode }),
|
|
425
|
+
children: [rendered],
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
// Detection-side predicate: a direct `return createElement(...)` (or arrow
|
|
429
|
+
// implicit body) that the converter can fully lower. Detection and lowering
|
|
430
|
+
// share lowerCreateElementCall so they can never disagree.
|
|
431
|
+
export function hasLowerableCompatCreateElementReturn(code, functionLike, names) {
|
|
432
|
+
if (names.size === 0) {
|
|
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;
|
|
450
|
+
}
|
|
451
|
+
export function collectFunctionShadowedNames(functionLike, names) {
|
|
452
|
+
const shadowed = new Set();
|
|
453
|
+
for (const parameter of readArray(functionLike.params)) {
|
|
454
|
+
const parameterObject = readObject(parameter);
|
|
455
|
+
if (parameterObject.type === "Identifier" && typeof parameterObject.name === "string") {
|
|
456
|
+
if (names.has(parameterObject.name)) {
|
|
457
|
+
shadowed.add(parameterObject.name);
|
|
458
|
+
}
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
// Destructured parameters could shadow anything; treat every tracked
|
|
462
|
+
// name as shadowed rather than analyzing the pattern.
|
|
463
|
+
for (const name of names) {
|
|
464
|
+
shadowed.add(name);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const body = readObject(functionLike.body);
|
|
468
|
+
if (body.type !== "BlockStatement") {
|
|
469
|
+
return shadowed;
|
|
470
|
+
}
|
|
471
|
+
for (const statement of readArray(body.body)) {
|
|
472
|
+
const statementObject = readObject(statement);
|
|
473
|
+
if (statementObject.type === "VariableDeclaration") {
|
|
474
|
+
for (const declarator of readArray(statementObject.declarations)) {
|
|
475
|
+
const id = readObject(readObject(declarator).id);
|
|
476
|
+
if (id.type === "Identifier" && typeof id.name === "string" && names.has(id.name)) {
|
|
477
|
+
shadowed.add(id.name);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if (statementObject.type === "FunctionDeclaration" &&
|
|
482
|
+
typeof readObject(statementObject.id).name === "string" &&
|
|
483
|
+
names.has(readObject(statementObject.id).name)) {
|
|
484
|
+
shadowed.add(readObject(statementObject.id).name);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return shadowed;
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=oxc-compat-create-element.js.map
|
|
@@ -0,0 +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"]}
|
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;AA0FxE,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,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CA6BzE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAKzE;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,UAAU,CAAC,GACjD,iBAAiB,CAWnB"}
|