diff --git a/src/compiler/factory/utilities.ts b/src/compiler/factory/utilities.ts index 770600d94b71d..0960509ae4de9 100644 --- a/src/compiler/factory/utilities.ts +++ b/src/compiler/factory/utilities.ts @@ -46,7 +46,7 @@ namespace ts { } } - function createJsxFactoryExpression(factory: NodeFactory, jsxFactoryEntity: EntityName | undefined, reactNamespace: string, parent: JsxOpeningLikeElement | JsxOpeningFragment): Expression { + export function createJsxFactoryExpression(factory: NodeFactory, jsxFactoryEntity: EntityName | undefined, reactNamespace: string, parent: JsxOpeningLikeElement | JsxOpeningFragment): Expression { return jsxFactoryEntity ? createJsxFactoryExpressionFromEntityName(factory, jsxFactoryEntity, parent) : factory.createPropertyAccessExpression( @@ -64,7 +64,7 @@ namespace ts { ); } - export function createExpressionForJsxElement(factory: NodeFactory, jsxFactoryEntity: EntityName | undefined, reactNamespace: string, tagName: Expression, props: Expression | undefined, children: readonly Expression[] | undefined, parentElement: JsxOpeningLikeElement, location: TextRange): LeftHandSideExpression { + export function createExpressionForJsxElement(factory: NodeFactory, callee: Expression, tagName: Expression, props: Expression | undefined, children: readonly Expression[] | undefined, location: TextRange): LeftHandSideExpression { const argumentsList = [tagName]; if (props) { argumentsList.push(props); @@ -88,7 +88,7 @@ namespace ts { return setTextRange( factory.createCallExpression( - createJsxFactoryExpression(factory, jsxFactoryEntity, reactNamespace, parentElement), + callee, /*typeArguments*/ undefined, argumentsList ), diff --git a/src/compiler/transformers/jsx.ts b/src/compiler/transformers/jsx.ts index 58e1c8ac5fcf5..bb177d518bb7a 100644 --- a/src/compiler/transformers/jsx.ts +++ b/src/compiler/transformers/jsx.ts @@ -4,7 +4,7 @@ namespace ts { interface PerFileState { importSpecifier?: string; filenameDeclaration?: VariableDeclaration & { name: Identifier; }; - utilizedImplicitRuntimeImports?: Map; + utilizedImplicitRuntimeImports?: Map>; } const { @@ -40,17 +40,25 @@ namespace ts { } function getImplicitImportForName(name: string) { - const existing = currentFileState.utilizedImplicitRuntimeImports?.get(name); + const importSource = name === "createElement" + ? currentFileState.importSpecifier! + : `${currentFileState.importSpecifier}/${compilerOptions.jsx === JsxEmit.ReactJSXDev ? "jsx-dev-runtime" : "jsx-runtime"}`; + const existing = currentFileState.utilizedImplicitRuntimeImports?.get(importSource)?.get(name); if (existing) { return existing.name; } if (!currentFileState.utilizedImplicitRuntimeImports) { currentFileState.utilizedImplicitRuntimeImports = createMap(); } + let specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource); + if (!specifierSourceImports) { + specifierSourceImports = createMap(); + currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports); + } const generatedName = factory.createUniqueName(`_${name}`, GeneratedIdentifierFlags.Optimistic | GeneratedIdentifierFlags.FileLevel | GeneratedIdentifierFlags.AllowNameSubstitution); const specifier = factory.createImportSpecifier(factory.createIdentifier(name), generatedName); generatedName.generatedImportReference = specifier; - currentFileState.utilizedImplicitRuntimeImports.set(name, specifier); + specifierSourceImports.set(name, specifier); return generatedName; } @@ -73,29 +81,30 @@ namespace ts { if (currentFileState.filenameDeclaration) { statements = insertStatementAfterCustomPrologue(statements.slice(), factory.createVariableStatement(/*modifiers*/ undefined, factory.createVariableDeclarationList([currentFileState.filenameDeclaration], NodeFlags.Const))); } - if (currentFileState.utilizedImplicitRuntimeImports && currentFileState.utilizedImplicitRuntimeImports.size && currentFileState.importSpecifier !== undefined) { - const specifier = `${currentFileState.importSpecifier}/${compilerOptions.jsx === JsxEmit.ReactJSXDev ? "jsx-dev-runtime" : "jsx-runtime"}`; - if (isExternalModule(node)) { - // Add `import` statement - const importStatement = factory.createImportDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, factory.createImportClause(/*typeOnly*/ false, /*name*/ undefined, factory.createNamedImports(arrayFrom(currentFileState.utilizedImplicitRuntimeImports.values()))), factory.createStringLiteral(specifier)); - setParentRecursive(importStatement, /*incremental*/ false); - statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement); - } - else if (isExternalOrCommonJsModule(node)) { - // Add `require` statement - const requireStatement = factory.createVariableStatement(/*modifiers*/ undefined, factory.createVariableDeclarationList([ - factory.createVariableDeclaration( - factory.createObjectBindingPattern(map(arrayFrom(currentFileState.utilizedImplicitRuntimeImports.values()), s => factory.createBindingElement(/*dotdotdot*/ undefined, s.propertyName, s.name))), - /*exclaimationToken*/ undefined, - /*type*/ undefined, - factory.createCallExpression(factory.createIdentifier("require"), /*typeArguments*/ undefined, [factory.createStringLiteral(specifier)]) - ) - ], NodeFlags.Const)); - setParentRecursive(requireStatement, /*incremental*/ false); - statements = insertStatementAfterCustomPrologue(statements.slice(), requireStatement); - } - else { - // Do nothing (script file) - consider an error in the checker? + if (currentFileState.utilizedImplicitRuntimeImports) { + for (const [importSource, importSpecifiersMap] of arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries())) { + if (isExternalModule(node)) { + // Add `import` statement + const importStatement = factory.createImportDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, factory.createImportClause(/*typeOnly*/ false, /*name*/ undefined, factory.createNamedImports(arrayFrom(importSpecifiersMap.values()))), factory.createStringLiteral(importSource)); + setParentRecursive(importStatement, /*incremental*/ false); + statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement); + } + else if (isExternalOrCommonJsModule(node)) { + // Add `require` statement + const requireStatement = factory.createVariableStatement(/*modifiers*/ undefined, factory.createVariableDeclarationList([ + factory.createVariableDeclaration( + factory.createObjectBindingPattern(map(arrayFrom(importSpecifiersMap.values()), s => factory.createBindingElement(/*dotdotdot*/ undefined, s.propertyName, s.name))), + /*exclaimationToken*/ undefined, + /*type*/ undefined, + factory.createCallExpression(factory.createIdentifier("require"), /*typeArguments*/ undefined, [factory.createStringLiteral(importSource)]) + ) + ], NodeFlags.Const)); + setParentRecursive(requireStatement, /*incremental*/ false); + statements = insertStatementAfterCustomPrologue(statements.slice(), requireStatement); + } + else { + // Do nothing (script file) - consider an error in the checker? + } } } if (statements !== visited.statements) { @@ -306,14 +315,21 @@ namespace ts { } } + const callee = currentFileState.importSpecifier === undefined + ? createJsxFactoryExpression( + factory, + context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), + compilerOptions.reactNamespace!, // TODO: GH#18217 + node + ) + : getImplicitImportForName("createElement"); + const element = createExpressionForJsxElement( factory, - context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), - compilerOptions.reactNamespace!, // TODO: GH#18217 + callee, tagName, objectProperties, mapDefined(children, transformJsxChildToExpression), - node, location ); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).js new file mode 100644 index 0000000000000..0a4e9ed38b339 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).js @@ -0,0 +1,29 @@ +//// [jsxJsxsCjsTransformKeyProp.tsx] +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + + +//// [jsxJsxsCjsTransformKeyProp.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var react_1 = require("react"); +var jsx_runtime_1 = require("react/jsx-runtime"); +/// +var props = { answer: 42 }; +var a = jsx_runtime_1.jsx("div", __assign({}, props, { children: "text" }), "foo"); +var b = react_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).symbols new file mode 100644 index 0000000000000..2dada593db2fa --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx === +/// +const props = { answer: 42 } +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>answer : Symbol(answer, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 15)) + +const a =
text
; +>a : Symbol(a, Decl(jsxJsxsCjsTransformKeyProp.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyProp.tsx, 2, 14)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(jsxJsxsCjsTransformKeyProp.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyProp.tsx, 3, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).types new file mode 100644 index 0000000000000..dd7730aada5d6 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsx).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx === +/// +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).js new file mode 100644 index 0000000000000..fc8b8fb64708a --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).js @@ -0,0 +1,30 @@ +//// [jsxJsxsCjsTransformKeyProp.tsx] +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + + +//// [jsxJsxsCjsTransformKeyProp.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var react_1 = require("react"); +var jsx_dev_runtime_1 = require("react/jsx-dev-runtime"); +var _jsxFileName = "tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx"; +/// +var props = { answer: 42 }; +var a = jsx_dev_runtime_1.jsxDEV("div", __assign({}, props, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 10 }, this); +var b = react_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).symbols new file mode 100644 index 0000000000000..2dada593db2fa --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx === +/// +const props = { answer: 42 } +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>answer : Symbol(answer, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 15)) + +const a =
text
; +>a : Symbol(a, Decl(jsxJsxsCjsTransformKeyProp.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyProp.tsx, 2, 14)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(jsxJsxsCjsTransformKeyProp.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyProp.tsx, 1, 5)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyProp.tsx, 3, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).types new file mode 100644 index 0000000000000..dd7730aada5d6 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx === +/// +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).js new file mode 100644 index 0000000000000..5183b42663027 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).js @@ -0,0 +1,29 @@ +//// [jsxJsxsCjsTransformKeyPropCustomImport.tsx] +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + + +//// [jsxJsxsCjsTransformKeyPropCustomImport.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var preact_1 = require("preact"); +var jsx_runtime_1 = require("preact/jsx-runtime"); +/// +var props = { answer: 42 }; +var a = jsx_runtime_1.jsx("div", __assign({}, props, { children: "text" }), "foo"); +var b = preact_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).symbols new file mode 100644 index 0000000000000..801d791f75ef1 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx === +/// +const props = { answer: 42 } +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>answer : Symbol(answer, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 15)) + +const a =
text
; +>a : Symbol(a, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 2, 14)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 3, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).types new file mode 100644 index 0000000000000..4a50274fb66b6 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsx).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx === +/// +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).js new file mode 100644 index 0000000000000..ef1e4bd6a9983 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).js @@ -0,0 +1,30 @@ +//// [jsxJsxsCjsTransformKeyPropCustomImport.tsx] +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + + +//// [jsxJsxsCjsTransformKeyPropCustomImport.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var preact_1 = require("preact"); +var jsx_dev_runtime_1 = require("preact/jsx-dev-runtime"); +var _jsxFileName = "tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx"; +/// +var props = { answer: 42 }; +var a = jsx_dev_runtime_1.jsxDEV("div", __assign({}, props, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 10 }, this); +var b = preact_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).symbols new file mode 100644 index 0000000000000..801d791f75ef1 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx === +/// +const props = { answer: 42 } +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>answer : Symbol(answer, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 15)) + +const a =
text
; +>a : Symbol(a, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 2, 14)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 1, 5)) +>key : Symbol(key, Decl(jsxJsxsCjsTransformKeyPropCustomImport.tsx, 3, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).types new file mode 100644 index 0000000000000..4a50274fb66b6 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImport(jsx=react-jsxdev).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx === +/// +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).js new file mode 100644 index 0000000000000..2daf68d6ce31b --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).js @@ -0,0 +1,65 @@ +//// [tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImportPragma.tsx] //// + +//// [preact.tsx] +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + +//// [react.tsx] +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +const a2 =
text
; +const b2 =
text
; + +export {}; + + +//// [preact.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var preact_1 = require("preact"); +var jsx_runtime_1 = require("preact/jsx-runtime"); +/// +/* @jsxImportSource preact */ +var props = { answer: 42 }; +var a = jsx_runtime_1.jsx("div", __assign({}, props, { children: "text" }), "foo"); +var b = preact_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); +//// [react.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var react_1 = require("react"); +var jsx_runtime_1 = require("react/jsx-runtime"); +/// +/* @jsxImportSource react */ +require("./preact"); +var props2 = { answer: 42 }; +var a2 = jsx_runtime_1.jsx("div", __assign({}, props2, { children: "text" }), "foo"); +var b2 = react_1.createElement("div", __assign({}, props2, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).symbols new file mode 100644 index 0000000000000..433cf36d0b5d2 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).symbols @@ -0,0 +1,47 @@ +=== tests/cases/conformance/jsx/jsxs/react.tsx === +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>answer : Symbol(answer, Decl(react.tsx, 3, 16)) + +const a2 =
text
; +>a2 : Symbol(a2, Decl(react.tsx, 4, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(react.tsx, 4, 15)) +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b2 =
text
; +>b2 : Symbol(b2, Decl(react.tsx, 5, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>key : Symbol(key, Decl(react.tsx, 5, 27)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + +=== tests/cases/conformance/jsx/jsxs/preact.tsx === +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>answer : Symbol(answer, Decl(preact.tsx, 2, 15)) + +const a =
text
; +>a : Symbol(a, Decl(preact.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(preact.tsx, 3, 14)) +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(preact.tsx, 4, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>key : Symbol(key, Decl(preact.tsx, 4, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).types new file mode 100644 index 0000000000000..7f625b5856091 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsx).types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/jsx/jsxs/react.tsx === +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +>props2 : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a2 =
text
; +>a2 : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props2 : { answer: number; } +>div : any + +const b2 =
text
; +>b2 : JSX.Element +>
text
: JSX.Element +>div : any +>props2 : { answer: number; } +>key : string +>div : any + +export {}; + +=== tests/cases/conformance/jsx/jsxs/preact.tsx === +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).js b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).js new file mode 100644 index 0000000000000..8aa24328c00fb --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).js @@ -0,0 +1,67 @@ +//// [tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImportPragma.tsx] //// + +//// [preact.tsx] +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + +//// [react.tsx] +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +const a2 =
text
; +const b2 =
text
; + +export {}; + + +//// [preact.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var preact_1 = require("preact"); +var jsx_dev_runtime_1 = require("preact/jsx-dev-runtime"); +var _jsxFileName = "tests/cases/conformance/jsx/jsxs/preact.tsx"; +/// +/* @jsxImportSource preact */ +var props = { answer: 42 }; +var a = jsx_dev_runtime_1.jsxDEV("div", __assign({}, props, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 4, columnNumber: 10 }, this); +var b = preact_1.createElement("div", __assign({}, props, { key: "bar" }), "text"); +//// [react.js] +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var react_1 = require("react"); +var jsx_dev_runtime_1 = require("react/jsx-dev-runtime"); +var _jsxFileName = "tests/cases/conformance/jsx/jsxs/react.tsx"; +/// +/* @jsxImportSource react */ +require("./preact"); +var props2 = { answer: 42 }; +var a2 = jsx_dev_runtime_1.jsxDEV("div", __assign({}, props2, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 11 }, this); +var b2 = react_1.createElement("div", __assign({}, props2, { key: "bar" }), "text"); diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).symbols b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).symbols new file mode 100644 index 0000000000000..433cf36d0b5d2 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).symbols @@ -0,0 +1,47 @@ +=== tests/cases/conformance/jsx/jsxs/react.tsx === +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>answer : Symbol(answer, Decl(react.tsx, 3, 16)) + +const a2 =
text
; +>a2 : Symbol(a2, Decl(react.tsx, 4, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(react.tsx, 4, 15)) +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b2 =
text
; +>b2 : Symbol(b2, Decl(react.tsx, 5, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props2 : Symbol(props2, Decl(react.tsx, 3, 5)) +>key : Symbol(key, Decl(react.tsx, 5, 27)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + +=== tests/cases/conformance/jsx/jsxs/preact.tsx === +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>answer : Symbol(answer, Decl(preact.tsx, 2, 15)) + +const a =
text
; +>a : Symbol(a, Decl(preact.tsx, 3, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>key : Symbol(key, Decl(preact.tsx, 3, 14)) +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +const b =
text
; +>b : Symbol(b, Decl(preact.tsx, 4, 5)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) +>props : Symbol(props, Decl(preact.tsx, 2, 5)) +>key : Symbol(key, Decl(preact.tsx, 4, 25)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114)) + +export {}; + diff --git a/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).types b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).types new file mode 100644 index 0000000000000..7f625b5856091 --- /dev/null +++ b/tests/baselines/reference/jsxJsxsCjsTransformKeyPropCustomImportPragma(jsx=react-jsxdev).types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/jsx/jsxs/react.tsx === +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +>props2 : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a2 =
text
; +>a2 : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props2 : { answer: number; } +>div : any + +const b2 =
text
; +>b2 : JSX.Element +>
text
: JSX.Element +>div : any +>props2 : { answer: number; } +>key : string +>div : any + +export {}; + +=== tests/cases/conformance/jsx/jsxs/preact.tsx === +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +>props : { answer: number; } +>{ answer: 42 } : { answer: number; } +>answer : number +>42 : 42 + +const a =
text
; +>a : JSX.Element +>
text
: JSX.Element +>div : any +>key : string +>props : { answer: number; } +>div : any + +const b =
text
; +>b : JSX.Element +>
text
: JSX.Element +>div : any +>props : { answer: number; } +>key : string +>div : any + +export {}; + diff --git a/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx new file mode 100644 index 0000000000000..4b10dba80c485 --- /dev/null +++ b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyProp.tsx @@ -0,0 +1,9 @@ +// @jsx: react-jsx,react-jsxdev +// @strict: true +// @module: commonjs +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; diff --git a/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx new file mode 100644 index 0000000000000..fb4f96a4b7d43 --- /dev/null +++ b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImport.tsx @@ -0,0 +1,10 @@ +// @jsx: react-jsx,react-jsxdev +// @jsxImportSource: preact +// @strict: true +// @module: commonjs +/// +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; diff --git a/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImportPragma.tsx b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImportPragma.tsx new file mode 100644 index 0000000000000..2da0af4f2ce1c --- /dev/null +++ b/tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformKeyPropCustomImportPragma.tsx @@ -0,0 +1,21 @@ +// @jsx: react-jsx,react-jsxdev +// @strict: true +// @module: commonjs +// @filename: preact.tsx +/// +/* @jsxImportSource preact */ +const props = { answer: 42 } +const a =
text
; +const b =
text
; + +export {}; + +// @filename: react.tsx +/// +/* @jsxImportSource react */ +import "./preact"; +const props2 = { answer: 42 } +const a2 =
text
; +const b2 =
text
; + +export {};