diff --git a/src/language-js/embed.js b/src/language-js/embed.js index 603848fb..f182ad27 100644 --- a/src/language-js/embed.js +++ b/src/language-js/embed.js @@ -107,7 +107,7 @@ function embed(path, print, textToDoc /*, options */) { } if (doc) { - doc = escapeBackticks(doc); + doc = escapeTemplateCharacters(doc, false); if (!isFirst && startsWithBlankLine) { parts.push(""); } @@ -175,7 +175,7 @@ function embed(path, print, textToDoc /*, options */) { function printMarkdown(text) { const doc = textToDoc(text, { parser: "markdown", __inJsTemplate: true }); - return stripTrailingHardline(escapeBackticks(doc)); + return stripTrailingHardline(escapeTemplateCharacters(doc, true)); } } @@ -196,7 +196,7 @@ function getIndentation(str) { return firstMatchedIndent === null ? "" : firstMatchedIndent[1]; } -function escapeBackticks(doc) { +function escapeTemplateCharacters(doc, raw) { return mapDoc(doc, currentDoc => { if (!currentDoc.parts) { return currentDoc; @@ -206,7 +206,11 @@ function escapeBackticks(doc) { currentDoc.parts.forEach(part => { if (typeof part === "string") { - parts.push(part.replace(/(\\*)`/g, "$1$1\\`")); + parts.push( + raw + ? part.replace(/(\\*)`/g, "$1$1\\`") + : part.replace(/([\\`]|\$\{)/g, "\\$1") + ); } else { parts.push(part); } diff --git a/tests/multiparser_js_graphql/__snapshots__/jsfmt.spec.js.snap b/tests/multiparser_js_graphql/__snapshots__/jsfmt.spec.js.snap index 463a6be6..fc35c26a 100644 --- a/tests/multiparser_js_graphql/__snapshots__/jsfmt.spec.js.snap +++ b/tests/multiparser_js_graphql/__snapshots__/jsfmt.spec.js.snap @@ -1,22 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`backticks.js - babylon-verify 1`] = ` -gql\` - "\\\`foo\\\` mutation payload." - type FooPayload { - bar: String - } -\` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -gql\` - "\\\`foo\\\` mutation payload." - type FooPayload { - bar: String - } -\`; - -`; - exports[`comment-tag.js - babylon-verify 1`] = ` const query = /* GraphQL */\` { @@ -63,6 +46,93 @@ graphql\` `; +exports[`escape.js - babylon-verify 1`] = ` +gql\` + "\\\`foo\\\` mutation payload." + type FooPayload { + bar: String + } +\` + +gql\` +type Project { + "Pattern: \\\`\\\${project}\\\`" + pattern: String + """ + Pattern: \\\`\\\${project}\\\` + """ + pattern: String + + # Also: Escaping the first parentheses... + "Pattern: \\\`$\\{project}\\\`" + pattern: String + # Or escaping the first and second parentheses... + "Pattern: \\\`$\\{project\\}\\\`" + pattern: String +} +\` + +gql\` + """ + - \\\` + - \\\\\\\` + - \\\\ a + - \\\\\\\\ + - $ + - \\$ + - \\\${ + - \\\\\\\${ + - \\u1234 + """ + type A { + a + } +\` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +gql\` + "\\\`foo\\\` mutation payload." + type FooPayload { + bar: String + } +\`; + +gql\` + type Project { + "Pattern: \\\`\\\${project}\\\`" + pattern: String + """ + Pattern: \\\`\\\${project}\\\` + """ + pattern: String + + # Also: Escaping the first parentheses... + "Pattern: \\\`\\\${project}\\\`" + pattern: String + # Or escaping the first and second parentheses... + "Pattern: \\\`\\\${project}\\\`" + pattern: String + } +\`; + +gql\` + """ + - \\\` + - \\\\\\\` + - \\\\ a + - \\\\\\\\ + - $ + - \\$ + - \\\${ + - \\\\\\\${ + - \\u1234 + """ + type A { + a + } +\`; + +`; + exports[`expressions.js - babylon-verify 1`] = ` graphql(schema, \` query allPartsByManufacturerName($name: String!) { diff --git a/tests/multiparser_js_graphql/backticks.js b/tests/multiparser_js_graphql/backticks.js deleted file mode 100644 index 0ffaa37b..00000000 --- a/tests/multiparser_js_graphql/backticks.js +++ /dev/null @@ -1,6 +0,0 @@ -gql` - "\`foo\` mutation payload." - type FooPayload { - bar: String - } -` diff --git a/tests/multiparser_js_graphql/escape.js b/tests/multiparser_js_graphql/escape.js new file mode 100644 index 00000000..a9def4b6 --- /dev/null +++ b/tests/multiparser_js_graphql/escape.js @@ -0,0 +1,41 @@ +gql` + "\`foo\` mutation payload." + type FooPayload { + bar: String + } +` + +gql` +type Project { + "Pattern: \`\${project}\`" + pattern: String + """ + Pattern: \`\${project}\` + """ + pattern: String + + # Also: Escaping the first parentheses... + "Pattern: \`$\{project}\`" + pattern: String + # Or escaping the first and second parentheses... + "Pattern: \`$\{project\}\`" + pattern: String +} +` + +gql` + """ + - \` + - \\\` + - \\ a + - \\\\ + - $ + - \$ + - \${ + - \\\${ + - \u1234 + """ + type A { + a + } +` diff --git a/tests/multiparser_js_markdown/__snapshots__/jsfmt.spec.js.snap b/tests/multiparser_js_markdown/__snapshots__/jsfmt.spec.js.snap index a59c8998..3dba2868 100644 --- a/tests/multiparser_js_markdown/__snapshots__/jsfmt.spec.js.snap +++ b/tests/multiparser_js_markdown/__snapshots__/jsfmt.spec.js.snap @@ -79,6 +79,7 @@ markdown\` markdown\` - \\\` - \\\\\\\` + - \\\\ a - \\\\\\\\ - \\$ - \\u1234 @@ -91,6 +92,7 @@ markdown\` markdown\` - \\\` - \\\\\\\` + - \\\\ a - \\\\\\\\ - \\\\$ - \\u1234 diff --git a/tests/multiparser_js_markdown/escape.js b/tests/multiparser_js_markdown/escape.js index 05567584..9f603819 100644 --- a/tests/multiparser_js_markdown/escape.js +++ b/tests/multiparser_js_markdown/escape.js @@ -7,6 +7,7 @@ markdown` markdown` - \` - \\\` + - \\ a - \\\\ - \$ - \u1234