diff --git a/src/__tests__/getFileMode.js b/src/__tests__/getFileMode.js new file mode 100644 index 0000000..91bcae6 --- /dev/null +++ b/src/__tests__/getFileMode.js @@ -0,0 +1,51 @@ +"use strict" + +const getFileMode = require("../getFileMode") + +test("undefined if filename is empty", () => { + expect( + getFileMode({ htmlExtensions: [], xmlExtensions: [] }, undefined) + ).toBe(undefined) +}) + +test("'html' if filename matches an HTML extension", () => { + expect( + getFileMode({ htmlExtensions: ["html"], xmlExtensions: [] }, "foo.html") + ).toBe("html") +}) + +test("'html' if filename matches an HTML and an XML extension", () => { + expect( + getFileMode( + { htmlExtensions: ["html"], xmlExtensions: ["html"] }, + "foo.html" + ) + ).toBe("html") +}) + +test("'xml' if filename matches an XML extension", () => { + expect( + getFileMode({ htmlExtensions: ["html"], xmlExtensions: ["xml"] }, "foo.xml") + ).toBe("xml") +}) + +test("undefined if filename ends with extension without dot", () => { + expect( + getFileMode({ htmlExtensions: [], xmlExtensions: ["xml"] }, "fooxml") + ).toBe(undefined) +}) + +test("works with extensions starting with a dot", () => { + expect( + getFileMode({ htmlExtensions: [".html"], xmlExtensions: [] }, "foo.html") + ).toBe("html") +}) + +test("works with extensions containgin a dot", () => { + expect( + getFileMode( + { htmlExtensions: [".html.in"], xmlExtensions: [] }, + "foo.html.in" + ) + ).toBe("html") +}) diff --git a/src/getFileMode.js b/src/getFileMode.js new file mode 100644 index 0000000..6219955 --- /dev/null +++ b/src/getFileMode.js @@ -0,0 +1,25 @@ +"use strict" + +module.exports = function getMode(pluginSettings, filenameOrOptions) { + const filename = + typeof filenameOrOptions === "object" + ? filenameOrOptions.filename + : filenameOrOptions + + if (!filename) { + return + } + if (pluginSettings.htmlExtensions.some(hasExtension)) { + return "html" + } + if (pluginSettings.xmlExtensions.some(hasExtension)) { + return "xml" + } + + function hasExtension(extension) { + if (!extension.startsWith(".")) { + extension = `.${extension}` + } + return filename.endsWith(extension) + } +} diff --git a/src/index.js b/src/index.js index db44d4f..1881dfc 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,7 @@ const extract = require("./extract") const utils = require("./utils") const splatSet = utils.splatSet const getSettings = require("./settings").getSettings +const getFileMode = require("./getFileMode") const PREPARE_RULE_NAME = "__eslint-plugin-html-prepare" const LINTER_ISPATCHED_PROPERTY_NAME = @@ -108,21 +109,6 @@ In the report, please include *all* those informations: } } -function getMode(pluginSettings, filenameOrOptions) { - const filename = - typeof filenameOrOptions === "object" - ? filenameOrOptions.filename - : filenameOrOptions - const extension = path.extname(filename || "") - - if (pluginSettings.htmlExtensions.indexOf(extension) >= 0) { - return "html" - } - if (pluginSettings.xmlExtensions.indexOf(extension) >= 0) { - return "xml" - } -} - function patch(Linter) { const verifyMethodName = Linter.prototype._verifyWithoutProcessors ? "_verifyWithoutProcessors" // ESLint 6+ @@ -145,7 +131,7 @@ function patch(Linter) { } const pluginSettings = getSettings(config.settings || {}) - const mode = getMode(pluginSettings, filenameOrOptions) + const mode = getFileMode(pluginSettings, filenameOrOptions) if (!mode || typeof textOrSourceCode !== "string") { return verify.call(