diff --git a/index.js b/index.js index 7dfe0adfb..115f670d8 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,5 @@ "use strict"; -const docblock = require("jest-docblock"); - const version = require("./package.json").version; const privateUtil = require("./src/common/util"); @@ -38,11 +36,6 @@ function attachComments(text, ast, opts) { return astComments; } -function hasPragma(text) { - const pragmas = Object.keys(docblock.parse(docblock.extract(text))); - return pragmas.indexOf("prettier") !== -1 || pragmas.indexOf("format") !== -1; -} - function ensureAllCommentsPrinted(astComments) { if (!astComments) { return; @@ -69,7 +62,9 @@ function ensureAllCommentsPrinted(astComments) { } function formatWithCursor(text, opts, addAlignmentSize) { - if (opts.requirePragma && !hasPragma(text)) { + const selectedParser = parser.resolveParser(opts); + const hasPragma = !selectedParser.hasPragma || selectedParser.hasPragma(text); + if (opts.requirePragma && !hasPragma) { return { formatted: text }; } @@ -81,19 +76,12 @@ function formatWithCursor(text, opts, addAlignmentSize) { if ( opts.insertPragma && - !hasPragma(text) && + opts.printer.insertPragma && + !hasPragma && opts.rangeStart === 0 && opts.rangeEnd === Infinity ) { - const parsedDocblock = docblock.parseWithComments(docblock.extract(text)); - const pragmas = Object.assign({ format: "" }, parsedDocblock.pragmas); - const newDocblock = docblock.print({ - pragmas, - comments: parsedDocblock.comments.replace(/^(\s+?\r?\n)+/, "") // remove leading newlines - }); - const strippedText = docblock.strip(text); - const separatingNewlines = strippedText.startsWith("\n") ? "\n" : "\n\n"; - text = newDocblock + separatingNewlines + strippedText; + text = opts.printer.insertPragma(text); } addAlignmentSize = addAlignmentSize || 0; diff --git a/src/language-js/index.js b/src/language-js/index.js index 527158307..69d40941f 100644 --- a/src/language-js/index.js +++ b/src/language-js/index.js @@ -1,6 +1,7 @@ "use strict"; const printer = require("./printer-estree"); +const hasPragma = require("./pragma").hasPragma; const options = require("./options"); const privateUtil = require("../common/util"); @@ -161,6 +162,7 @@ const typescript = { return eval("require")("./parser-typescript"); }, astFormat: "estree", + hasPragma, locStart, locEnd }; @@ -170,18 +172,24 @@ const babylon = { return eval("require")("./parser-babylon"); }, astFormat: "estree", + hasPragma, locStart, locEnd }; const parsers = { babylon, - json: babylon, + json: Object.assign({}, babylon, { + hasPragma() { + return false; + } + }), flow: { get parse() { return eval("require")("./parser-flow"); }, astFormat: "estree", + hasPragma, locStart, locEnd }, diff --git a/src/language-js/pragma.js b/src/language-js/pragma.js new file mode 100644 index 000000000..031359a8f --- /dev/null +++ b/src/language-js/pragma.js @@ -0,0 +1,25 @@ +"use strict"; + +const docblock = require("jest-docblock"); + +function hasPragma(text) { + const pragmas = Object.keys(docblock.parse(docblock.extract(text))); + return pragmas.indexOf("prettier") !== -1 || pragmas.indexOf("format") !== -1; +} + +function insertPragma(text) { + const parsedDocblock = docblock.parseWithComments(docblock.extract(text)); + const pragmas = Object.assign({ format: "" }, parsedDocblock.pragmas); + const newDocblock = docblock.print({ + pragmas, + comments: parsedDocblock.comments.replace(/^(\s+?\r?\n)+/, "") // remove leading newlines + }); + const strippedText = docblock.strip(text); + const separatingNewlines = strippedText.startsWith("\n") ? "\n" : "\n\n"; + return newDocblock + separatingNewlines + strippedText; +} + +module.exports = { + hasPragma, + insertPragma +}; diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index ffdbd0250..7d4fc4fad 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -8,6 +8,7 @@ const sharedUtil = require("../common/util-shared"); const isIdentifierName = require("esutils").keyword.isIdentifierNameES6; const embed = require("./embed"); const clean = require("./clean"); +const insertPragma = require("./pragma").insertPragma; const doc = require("../doc"); const docBuilders = doc.builders; @@ -5408,6 +5409,7 @@ function printJsDocComment(comment) { module.exports = { print: genericPrint, embed, + insertPragma, massageAstNode: clean, hasPrettierIgnore, willPrintOwnComments, diff --git a/tests/insert-pragma/__snapshots__/jsfmt.spec.js.snap b/tests/insert-pragma/js/__snapshots__/jsfmt.spec.js.snap similarity index 100% rename from tests/insert-pragma/__snapshots__/jsfmt.spec.js.snap rename to tests/insert-pragma/js/__snapshots__/jsfmt.spec.js.snap diff --git a/tests/insert-pragma/js/jsfmt.spec.js b/tests/insert-pragma/js/jsfmt.spec.js new file mode 100644 index 000000000..4f802b63e --- /dev/null +++ b/tests/insert-pragma/js/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, ["flow", "babylon", "typescript"], { insertPragma: true }); diff --git a/tests/insert-pragma/module-with-late-docblock.js b/tests/insert-pragma/js/module-with-late-docblock.js similarity index 100% rename from tests/insert-pragma/module-with-late-docblock.js rename to tests/insert-pragma/js/module-with-late-docblock.js diff --git a/tests/insert-pragma/module-with-multiple-same-pragma.js b/tests/insert-pragma/js/module-with-multiple-same-pragma.js similarity index 100% rename from tests/insert-pragma/module-with-multiple-same-pragma.js rename to tests/insert-pragma/js/module-with-multiple-same-pragma.js diff --git a/tests/insert-pragma/module-with-pragma.js b/tests/insert-pragma/js/module-with-pragma.js similarity index 100% rename from tests/insert-pragma/module-with-pragma.js rename to tests/insert-pragma/js/module-with-pragma.js diff --git a/tests/insert-pragma/module-without-docblock.js b/tests/insert-pragma/js/module-without-docblock.js similarity index 100% rename from tests/insert-pragma/module-without-docblock.js rename to tests/insert-pragma/js/module-without-docblock.js diff --git a/tests/insert-pragma/module-without-pragma.js b/tests/insert-pragma/js/module-without-pragma.js similarity index 100% rename from tests/insert-pragma/module-without-pragma.js rename to tests/insert-pragma/js/module-without-pragma.js diff --git a/tests/insert-pragma/trailing-spaces-first-line.js b/tests/insert-pragma/js/trailing-spaces-first-line.js similarity index 100% rename from tests/insert-pragma/trailing-spaces-first-line.js rename to tests/insert-pragma/js/trailing-spaces-first-line.js diff --git a/tests/insert-pragma/jsfmt.spec.js b/tests/insert-pragma/jsfmt.spec.js deleted file mode 100644 index ff094ca9f..000000000 --- a/tests/insert-pragma/jsfmt.spec.js +++ /dev/null @@ -1 +0,0 @@ -run_spec(__dirname, ["flow"], { insertPragma: true }); diff --git a/tests/require-pragma/__snapshots__/jsfmt.spec.js.snap b/tests/require-pragma/js/__snapshots__/jsfmt.spec.js.snap similarity index 100% rename from tests/require-pragma/__snapshots__/jsfmt.spec.js.snap rename to tests/require-pragma/js/__snapshots__/jsfmt.spec.js.snap diff --git a/tests/require-pragma/js/jsfmt.spec.js b/tests/require-pragma/js/jsfmt.spec.js new file mode 100644 index 000000000..9351e117f --- /dev/null +++ b/tests/require-pragma/js/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, ["flow", "babylon", "typescript"], { requirePragma: true }); diff --git a/tests/require-pragma/module-with-pragma.js b/tests/require-pragma/js/module-with-pragma.js similarity index 100% rename from tests/require-pragma/module-with-pragma.js rename to tests/require-pragma/js/module-with-pragma.js diff --git a/tests/require-pragma/module-without-pragma.js b/tests/require-pragma/js/module-without-pragma.js similarity index 100% rename from tests/require-pragma/module-without-pragma.js rename to tests/require-pragma/js/module-without-pragma.js diff --git a/tests/require-pragma/jsfmt.spec.js b/tests/require-pragma/jsfmt.spec.js deleted file mode 100644 index fdccdebd0..000000000 --- a/tests/require-pragma/jsfmt.spec.js +++ /dev/null @@ -1 +0,0 @@ -run_spec(__dirname, ["flow"], { requirePragma: true });