diff --git a/src/printer.js b/src/printer.js index 0457538fbf29..b5701458a851 100644 --- a/src/printer.js +++ b/src/printer.js @@ -1028,8 +1028,17 @@ function genericPrintNoParens(path, options, print) { case "JSXAttribute": parts.push(path.call(print, "name")); - if (n.value) + if (n.value) { + // JSX doesn't allow attributes with escaped quotes, so wrap in JSXExpressionContainer + if (n.value.type === "Literal") { + const str = nodeStr(n.value.value, options); + if (str.match(/\\['"]/)) { + parts.push("=", "{", path.call(print, "value"), "}"); + return concat(parts); + } + } parts.push("=", path.call(print, "value")); + } return concat(parts); case "JSXIdentifier": diff --git a/tests/prettier/__snapshots__/jsfmt.spec.js.snap b/tests/prettier/__snapshots__/jsfmt.spec.js.snap index 441a9fcb1625..2e479538e901 100644 --- a/tests/prettier/__snapshots__/jsfmt.spec.js.snap +++ b/tests/prettier/__snapshots__/jsfmt.spec.js.snap @@ -178,6 +178,18 @@ const notJSX = (aaaaaaaaaaaaaaaaa, bbbbbbbbbbb) => " `; +exports[`test jsx-string-escape.js 1`] = ` +"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +
; +" +`; + exports[`test optional-type-name.js 1`] = ` "type Foo = (any) => string diff --git a/tests/prettier/jsx-string-escape.js b/tests/prettier/jsx-string-escape.js new file mode 100644 index 000000000000..225f1fb49ef9 --- /dev/null +++ b/tests/prettier/jsx-string-escape.js @@ -0,0 +1,6 @@ +