Skip to content

Commit 4888e4f

Browse files
authored
Merge pull request #13636 from ds300/preserve-jsx-but-output-.js-files
Add option to output .js files while preserving jsx
2 parents f6ee80c + 0a4632f commit 4888e4f

21 files changed

+257
-14
lines changed

src/compiler/commandLineParser.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ namespace ts {
6767
name: "jsx",
6868
type: createMapFromTemplate({
6969
"preserve": JsxEmit.Preserve,
70+
"react-native": JsxEmit.ReactNative,
7071
"react": JsxEmit.React
7172
}),
7273
paramType: Diagnostics.KIND,
73-
description: Diagnostics.Specify_JSX_code_generation_Colon_preserve_or_react,
74+
description: Diagnostics.Specify_JSX_code_generation_Colon_preserve_react_native_or_react,
7475
},
7576
{
7677
name: "reactNamespace",

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2713,7 +2713,7 @@
27132713
"category": "Message",
27142714
"code": 6079
27152715
},
2716-
"Specify JSX code generation: 'preserve' or 'react'": {
2716+
"Specify JSX code generation: 'preserve', 'react-native', or 'react'": {
27172717
"category": "Message",
27182718
"code": 6080
27192719
},

src/compiler/transformers/es5.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ namespace ts {
1111
export function transformES5(context: TransformationContext) {
1212
const compilerOptions = context.getCompilerOptions();
1313

14-
// enable emit notification only if using --jsx preserve
14+
// enable emit notification only if using --jsx preserve or react-native
1515
let previousOnEmitNode: (emitContext: EmitContext, node: Node, emitCallback: (emitContext: EmitContext, node: Node) => void) => void;
1616
let noSubstitution: boolean[];
17-
if (compilerOptions.jsx === JsxEmit.Preserve) {
17+
if (compilerOptions.jsx === JsxEmit.Preserve || compilerOptions.jsx === JsxEmit.ReactNative) {
1818
previousOnEmitNode = context.onEmitNode;
1919
context.onEmitNode = onEmitNode;
2020
context.enableEmitNotification(SyntaxKind.JsxOpeningElement);
@@ -116,4 +116,4 @@ namespace ts {
116116
return undefined;
117117
}
118118
}
119-
}
119+
}

src/compiler/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3298,7 +3298,8 @@
32983298
export const enum JsxEmit {
32993299
None = 0,
33003300
Preserve = 1,
3301-
React = 2
3301+
React = 2,
3302+
ReactNative = 3
33023303
}
33033304

33043305
export const enum NewLineKind {

src/harness/unittests/commandLineParsing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ namespace ts {
8787
start: undefined,
8888
length: undefined,
8989
}, {
90-
messageText: "Argument for '--jsx' option must be: 'preserve', 'react'",
90+
messageText: "Argument for '--jsx' option must be: 'preserve', 'react-native', 'react'",
9191
category: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.category,
9292
code: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
9393

src/harness/unittests/convertCompilerOptionsFromJson.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ namespace ts {
9494
file: undefined,
9595
start: 0,
9696
length: 0,
97-
messageText: "Argument for '--jsx' option must be: 'preserve', 'react'",
97+
messageText: "Argument for '--jsx' option must be: 'preserve', 'react-native', 'react'",
9898
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
9999
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
100100
}]

src/harness/unittests/matchFiles.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,31 @@ namespace ts {
909909
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveMixedExtensionHost, caseInsensitiveBasePath);
910910
assertParsed(actual, expected);
911911
});
912+
it("with jsx=react-native, allowJs=false", () => {
913+
const json = {
914+
compilerOptions: {
915+
jsx: "react-native",
916+
allowJs: false
917+
}
918+
};
919+
const expected: ts.ParsedCommandLine = {
920+
options: {
921+
jsx: ts.JsxEmit.ReactNative,
922+
allowJs: false
923+
},
924+
errors: [],
925+
fileNames: [
926+
"c:/dev/a.ts",
927+
"c:/dev/b.tsx",
928+
"c:/dev/c.tsx",
929+
],
930+
wildcardDirectories: {
931+
"c:/dev": ts.WatchDirectoryFlags.Recursive
932+
}
933+
};
934+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveMixedExtensionHost, caseInsensitiveBasePath);
935+
assertParsed(actual, expected);
936+
});
912937
it("with jsx=none, allowJs=true", () => {
913938
const json = {
914939
compilerOptions: {
@@ -961,6 +986,33 @@ namespace ts {
961986
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveMixedExtensionHost, caseInsensitiveBasePath);
962987
assertParsed(actual, expected);
963988
});
989+
it("with jsx=react-native, allowJs=true", () => {
990+
const json = {
991+
compilerOptions: {
992+
jsx: "react-native",
993+
allowJs: true
994+
}
995+
};
996+
const expected: ts.ParsedCommandLine = {
997+
options: {
998+
jsx: ts.JsxEmit.ReactNative,
999+
allowJs: true
1000+
},
1001+
errors: [],
1002+
fileNames: [
1003+
"c:/dev/a.ts",
1004+
"c:/dev/b.tsx",
1005+
"c:/dev/c.tsx",
1006+
"c:/dev/d.js",
1007+
"c:/dev/e.jsx",
1008+
],
1009+
wildcardDirectories: {
1010+
"c:/dev": ts.WatchDirectoryFlags.Recursive
1011+
}
1012+
};
1013+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveMixedExtensionHost, caseInsensitiveBasePath);
1014+
assertParsed(actual, expected);
1015+
});
9641016
it("exclude .min.js files using wildcards", () => {
9651017
const json = {
9661018
compilerOptions: {
@@ -1306,4 +1358,4 @@ namespace ts {
13061358
});
13071359
});
13081360
});
1309-
}
1361+
}

src/server/protocol.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ namespace ts.server.protocol {
417417
startOffset: number;
418418

419419
/**
420-
* Position (can be specified instead of line/offset pair)
420+
* Position (can be specified instead of line/offset pair)
421421
*/
422422
/* @internal */
423423
startPosition?: number;
@@ -433,7 +433,7 @@ namespace ts.server.protocol {
433433
endOffset: number;
434434

435435
/**
436-
* Position (can be specified instead of line/offset pair)
436+
* Position (can be specified instead of line/offset pair)
437437
*/
438438
/* @internal */
439439
endPosition?: number;
@@ -445,7 +445,7 @@ namespace ts.server.protocol {
445445
}
446446

447447
/**
448-
* Response for GetCodeFixes request.
448+
* Response for GetCodeFixes request.
449449
*/
450450
export interface GetCodeFixesResponse extends Response {
451451
body?: CodeAction[];
@@ -2272,10 +2272,11 @@ namespace ts.server.protocol {
22722272
export namespace JsxEmit {
22732273
export type None = "None";
22742274
export type Preserve = "Preserve";
2275+
export type ReactNative = "ReactNative";
22752276
export type React = "React";
22762277
}
22772278

2278-
export type JsxEmit = JsxEmit.None | JsxEmit.Preserve | JsxEmit.React;
2279+
export type JsxEmit = JsxEmit.None | JsxEmit.Preserve | JsxEmit.React | JsxEmit.ReactNative;
22792280

22802281
export namespace ModuleKind {
22812282
export type None = "None";
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [es3-jsx-preserve.tsx]
2+
3+
const React: any = null;
4+
5+
const elem = <div></div>;
6+
7+
8+
9+
//// [es3-jsx-preserve.jsx]
10+
var React = null;
11+
var elem = <div></div>;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/es3-jsx-preserve.tsx ===
2+
3+
const React: any = null;
4+
>React : Symbol(React, Decl(es3-jsx-preserve.tsx, 1, 5))
5+
6+
const elem = <div></div>;
7+
>elem : Symbol(elem, Decl(es3-jsx-preserve.tsx, 3, 5))
8+
>div : Symbol(unknown)
9+
>div : Symbol(unknown)
10+
11+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/es3-jsx-preserve.tsx ===
2+
3+
const React: any = null;
4+
>React : any
5+
>null : null
6+
7+
const elem = <div></div>;
8+
>elem : any
9+
><div></div> : any
10+
>div : any
11+
>div : any
12+
13+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [es3-jsx-react-native.tsx]
2+
3+
const React: any = null;
4+
5+
const elem = <div></div>;
6+
7+
8+
9+
//// [es3-jsx-react-native.js]
10+
var React = null;
11+
var elem = <div></div>;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/es3-jsx-react-native.tsx ===
2+
3+
const React: any = null;
4+
>React : Symbol(React, Decl(es3-jsx-react-native.tsx, 1, 5))
5+
6+
const elem = <div></div>;
7+
>elem : Symbol(elem, Decl(es3-jsx-react-native.tsx, 3, 5))
8+
>div : Symbol(unknown)
9+
>div : Symbol(unknown)
10+
11+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/es3-jsx-react-native.tsx ===
2+
3+
const React: any = null;
4+
>React : any
5+
>null : null
6+
7+
const elem = <div></div>;
8+
>elem : any
9+
><div></div> : any
10+
>div : any
11+
>div : any
12+
13+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [es3-jsx-react.tsx]
2+
3+
const React: any = null;
4+
5+
const elem = <div></div>;
6+
7+
8+
9+
//// [es3-jsx-react.js]
10+
var React = null;
11+
var elem = React.createElement("div", null);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/es3-jsx-react.tsx ===
2+
3+
const React: any = null;
4+
>React : Symbol(React, Decl(es3-jsx-react.tsx, 1, 5))
5+
6+
const elem = <div></div>;
7+
>elem : Symbol(elem, Decl(es3-jsx-react.tsx, 3, 5))
8+
>div : Symbol(unknown)
9+
>div : Symbol(unknown)
10+
11+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/es3-jsx-react.tsx ===
2+
3+
const React: any = null;
4+
>React : any
5+
>null : null
6+
7+
const elem = <div></div>;
8+
>elem : any
9+
><div></div> : any
10+
>div : any
11+
>div : any
12+
13+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @target: ES3
2+
// @sourcemap: false
3+
// @declaration: false
4+
// @jsx: preserve
5+
6+
const React: any = null;
7+
8+
const elem = <div></div>;
9+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @target: ES3
2+
// @sourcemap: false
3+
// @declaration: false
4+
// @jsx: react-native
5+
6+
const React: any = null;
7+
8+
const elem = <div></div>;
9+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @target: ES3
2+
// @sourcemap: false
3+
// @declaration: false
4+
// @jsx: react
5+
6+
const React: any = null;
7+
8+
const elem = <div></div>;
9+

0 commit comments

Comments
 (0)