Skip to content

Commit 06d62ed

Browse files
committed
Merge pull request #6949 from Microsoft/jsEmittedAsJsx
Fix emitted file extension for JavaScript files with JSX.Preserve
2 parents 0619eb0 + af0a0ee commit 06d62ed

File tree

5 files changed

+125
-2
lines changed

5 files changed

+125
-2
lines changed

src/compiler/utilities.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2040,8 +2040,22 @@ namespace ts {
20402040
}
20412041

20422042
function onSingleFileEmit(host: EmitHost, sourceFile: SourceFile) {
2043-
const jsFilePath = getOwnEmitOutputFilePath(sourceFile, host,
2044-
sourceFile.languageVariant === LanguageVariant.JSX && options.jsx === JsxEmit.Preserve ? ".jsx" : ".js");
2043+
// JavaScript files are always LanguageVariant.JSX, as JSX syntax is allowed in .js files also.
2044+
// So for JavaScript files, '.jsx' is only emitted if the input was '.jsx', and JsxEmit.Preserve.
2045+
// For TypeScript, the only time to emit with a '.jsx' extension, is on JSX input, and JsxEmit.Preserve
2046+
let extension = ".js";
2047+
if (options.jsx === JsxEmit.Preserve) {
2048+
if (isSourceFileJavaScript(sourceFile)) {
2049+
if (fileExtensionIs(sourceFile.fileName, ".jsx")) {
2050+
extension = ".jsx";
2051+
}
2052+
}
2053+
else if (sourceFile.languageVariant === LanguageVariant.JSX) {
2054+
// TypeScript source file preserving JSX syntax
2055+
extension = ".jsx";
2056+
}
2057+
}
2058+
const jsFilePath = getOwnEmitOutputFilePath(sourceFile, host, extension);
20452059
const emitFileNames: EmitFileNames = {
20462060
jsFilePath,
20472061
sourceMapFilePath: getSourceMapFilePath(jsFilePath, options),
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/compiler/jsxPreserveWithJsInput.ts] ////
2+
3+
//// [a.js]
4+
5+
var elemA = 42;
6+
7+
//// [b.jsx]
8+
var elemB = <b>{"test"}</b>;
9+
10+
//// [c.js]
11+
var elemC = <c>{42}</c>;
12+
13+
//// [d.ts]
14+
var elemD = 42;
15+
16+
//// [e.tsx]
17+
var elemE = <e>{true}</e>;
18+
19+
20+
//// [a.js]
21+
var elemA = 42;
22+
//// [b.jsx]
23+
var elemB = <b>{"test"}</b>;
24+
//// [c.js]
25+
var elemC = <c>{42}</c>;
26+
//// [d.js]
27+
var elemD = 42;
28+
//// [e.jsx]
29+
var elemE = <e>{true}</e>;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/compiler/a.js ===
2+
3+
var elemA = 42;
4+
>elemA : Symbol(elemA, Decl(a.js, 1, 3))
5+
6+
=== tests/cases/compiler/b.jsx ===
7+
var elemB = <b>{"test"}</b>;
8+
>elemB : Symbol(elemB, Decl(b.jsx, 0, 3))
9+
>b : Symbol(unknown)
10+
>b : Symbol(unknown)
11+
12+
=== tests/cases/compiler/c.js ===
13+
var elemC = <c>{42}</c>;
14+
>elemC : Symbol(elemC, Decl(c.js, 0, 3))
15+
>c : Symbol(unknown)
16+
>c : Symbol(unknown)
17+
18+
=== tests/cases/compiler/d.ts ===
19+
var elemD = 42;
20+
>elemD : Symbol(elemD, Decl(d.ts, 0, 3))
21+
22+
=== tests/cases/compiler/e.tsx ===
23+
var elemE = <e>{true}</e>;
24+
>elemE : Symbol(elemE, Decl(e.tsx, 0, 3))
25+
>e : Symbol(unknown)
26+
>e : Symbol(unknown)
27+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/a.js ===
2+
3+
var elemA = 42;
4+
>elemA : number
5+
>42 : number
6+
7+
=== tests/cases/compiler/b.jsx ===
8+
var elemB = <b>{"test"}</b>;
9+
>elemB : any
10+
><b>{"test"}</b> : any
11+
>b : any
12+
>"test" : string
13+
>b : any
14+
15+
=== tests/cases/compiler/c.js ===
16+
var elemC = <c>{42}</c>;
17+
>elemC : any
18+
><c>{42}</c> : any
19+
>c : any
20+
>42 : number
21+
>c : any
22+
23+
=== tests/cases/compiler/d.ts ===
24+
var elemD = 42;
25+
>elemD : number
26+
>42 : number
27+
28+
=== tests/cases/compiler/e.tsx ===
29+
var elemE = <e>{true}</e>;
30+
>elemE : any
31+
><e>{true}</e> : any
32+
>e : any
33+
>true : boolean
34+
>e : any
35+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @outdir: out
2+
// @jsx: preserve
3+
// @allowjs: true
4+
5+
// @filename: a.js
6+
var elemA = 42;
7+
8+
// @filename: b.jsx
9+
var elemB = <b>{"test"}</b>;
10+
11+
// @filename: c.js
12+
var elemC = <c>{42}</c>;
13+
14+
// @filename: d.ts
15+
var elemD = 42;
16+
17+
// @filename: e.tsx
18+
var elemE = <e>{true}</e>;

0 commit comments

Comments
 (0)