diff --git a/src/compiler/transformers/jsx.ts b/src/compiler/transformers/jsx.ts
index 4bc523a262..8982c0faf2 100644
--- a/src/compiler/transformers/jsx.ts
+++ b/src/compiler/transformers/jsx.ts
@@ -210,15 +210,21 @@ namespace ts {
}
/**
- * Decodes JSX entities.
+ * Replace entities like " ", "{", and "" with the characters they encode.
+ * See https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
*/
function decodeEntities(text: string) {
- return text.replace(/&(\w+);/g, function(s: any, m: string) {
- if (entities[m] !== undefined) {
- return String.fromCharCode(entities[m]);
+ return text.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, (match, _all, _number, _digits, decimal, hex, word) => {
+ if (decimal) {
+ return String.fromCharCode(parseInt(decimal, 10));
+ }
+ else if (hex) {
+ return String.fromCharCode(parseInt(hex, 16));
}
else {
- return s;
+ const ch = entities[word];
+ // If this is not a valid entity, then just use `match` (replace it with itself, i.e. don't replace)
+ return ch ? String.fromCharCode(ch) : match;
}
});
}
diff --git a/tests/baselines/reference/tsxReactEmitEntities.js b/tests/baselines/reference/tsxReactEmitEntities.js
index 2a5c1ec496..8fbf59a376 100644
--- a/tests/baselines/reference/tsxReactEmitEntities.js
+++ b/tests/baselines/reference/tsxReactEmitEntities.js
@@ -9,8 +9,10 @@ declare var React: any;
Dot goes here: · ¬AnEntity;
;
Be careful of "-ed strings!
;
+{{braces}}
;
//// [file.js]
React.createElement("div", null, "Dot goes here: \u00B7 ¬AnEntity; ");
React.createElement("div", null, "Be careful of \"-ed strings!");
+React.createElement("div", null, "{{braces}}");
diff --git a/tests/baselines/reference/tsxReactEmitEntities.symbols b/tests/baselines/reference/tsxReactEmitEntities.symbols
index 5a0274029e..873830773b 100644
--- a/tests/baselines/reference/tsxReactEmitEntities.symbols
+++ b/tests/baselines/reference/tsxReactEmitEntities.symbols
@@ -23,3 +23,7 @@ declare var React: any;
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 1, 22))
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 1, 22))
+{{braces}}
;
+>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 1, 22))
+>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 1, 22))
+
diff --git a/tests/baselines/reference/tsxReactEmitEntities.types b/tests/baselines/reference/tsxReactEmitEntities.types
index 111653ea14..7fe68df5f4 100644
--- a/tests/baselines/reference/tsxReactEmitEntities.types
+++ b/tests/baselines/reference/tsxReactEmitEntities.types
@@ -25,3 +25,8 @@ declare var React: any;
>div : any
>div : any
+{{braces}}
;
+>{{braces}}
: JSX.Element
+>div : any
+>div : any
+
diff --git a/tests/cases/conformance/jsx/tsxReactEmitEntities.tsx b/tests/cases/conformance/jsx/tsxReactEmitEntities.tsx
index 4726008d6b..8af5bf206e 100644
--- a/tests/cases/conformance/jsx/tsxReactEmitEntities.tsx
+++ b/tests/cases/conformance/jsx/tsxReactEmitEntities.tsx
@@ -10,3 +10,4 @@ declare var React: any;
Dot goes here: · ¬AnEntity;
;
Be careful of "-ed strings!
;
+{{braces}}
;