Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix: Ensure that dot files are found with globs. (#16550)
Previously, glob patterns didn't match dot files and couldn't be changed
while we were using globby for flat config. Because we moved to our own glob search, we
can now include dot files in our searches automatically.

Fixes #16265
  • Loading branch information
nzakas committed Nov 15, 2022
1 parent a8d0a57 commit c50ae4f
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 7 deletions.
5 changes: 3 additions & 2 deletions lib/eslint/eslint-helpers.js
Expand Up @@ -26,6 +26,7 @@ const isPathInside = require("is-path-inside");

const doFsWalk = util.promisify(fswalk.walk);
const Minimatch = minimatch.Minimatch;
const MINIMATCH_OPTIONS = { dot: true };

//-----------------------------------------------------------------------------
// Types
Expand Down Expand Up @@ -158,7 +159,7 @@ function globMatch({ basePath, pattern }) {
? normalizeToPosix(path.relative(basePath, pattern))
: pattern;

const matcher = new Minimatch(patternToUse);
const matcher = new Minimatch(patternToUse, MINIMATCH_OPTIONS);

const fsWalkSettings = {

Expand Down Expand Up @@ -257,7 +258,7 @@ async function globSearch({

relativeToPatterns.set(patternToUse, patterns[i]);

return new minimatch.Minimatch(patternToUse);
return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
});

/*
Expand Down
Empty file.
1 change: 1 addition & 0 deletions tests/fixtures/dot-files/.a.js
@@ -0,0 +1 @@
console.log("Running");
1 change: 1 addition & 0 deletions tests/fixtures/dot-files/.c.js
@@ -0,0 +1 @@
console.log("Running");
1 change: 1 addition & 0 deletions tests/fixtures/dot-files/b.js
@@ -0,0 +1 @@
console.log("Running");
8 changes: 8 additions & 0 deletions tests/fixtures/dot-files/eslint.config.js
@@ -0,0 +1,8 @@
module.exports = [
{
files: ["*.js"]
},
{
ignores: ["eslint.config.js"]
}
];
88 changes: 83 additions & 5 deletions tests/lib/eslint/flat-eslint.js
Expand Up @@ -24,6 +24,23 @@ const hash = require("../../../lib/cli-engine/hash");
const { unIndent, createCustomTeardown } = require("../../_utils");
const coreRules = require("../../../lib/rules");

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

/**
* Creates a directory if it doesn't already exist.
* @param {string} dirPath The path to the directory that should exist.
* @returns {void}
*/
function ensureDirectoryExists(dirPath) {
try {
fs.statSync(dirPath);
} catch {
fs.mkdirSync(dirPath);
}
}

//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
Expand Down Expand Up @@ -773,7 +790,7 @@ describe("FlatESLint", () => {
});
const results = await eslint.lintFiles(["fixtures/files/"]);

assert.strictEqual(results.length, 2);
assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[0].suppressedMessages.length, 0);
Expand Down Expand Up @@ -823,6 +840,58 @@ describe("FlatESLint", () => {
assert.strictEqual(results[0].suppressedMessages.length, 0);
});

// https://github.com/eslint/eslint/issues/16265
describe("Dot files in searches", () => {

it("should find dot files in current directory when a . pattern is used", async () => {
eslint = new FlatESLint({
cwd: getFixturePath("dot-files")
});
const results = await eslint.lintFiles(["."]);

assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[1].filePath, getFixturePath("dot-files/.c.js"));
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[2].filePath, getFixturePath("dot-files/b.js"));
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

it("should find dot files in current directory when a *.js pattern is used", async () => {
eslint = new FlatESLint({
cwd: getFixturePath("dot-files")
});
const results = await eslint.lintFiles(["*.js"]);

assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[1].filePath, getFixturePath("dot-files/.c.js"));
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[2].filePath, getFixturePath("dot-files/b.js"));
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

it("should find dot files in current directory when a .a.js pattern is used", async () => {
eslint = new FlatESLint({
cwd: getFixturePath("dot-files")
});
const results = await eslint.lintFiles([".a.js"]);

assert.strictEqual(results.length, 1);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
assert.strictEqual(results[0].suppressedMessages.length, 0);
});
});

// https://github.com/eslint/eslint/issues/16275
describe("Glob patterns without matches", () => {

Expand Down Expand Up @@ -992,11 +1061,13 @@ describe("FlatESLint", () => {
});
const results = await eslint.lintFiles(["fixtures/files/*"]);

assert.strictEqual(results.length, 2);
assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

it("should resolve globs when 'globInputPaths' option is true", async () => {
Expand All @@ -1009,11 +1080,13 @@ describe("FlatESLint", () => {
});
const results = await eslint.lintFiles(["fixtures/files/*"]);

assert.strictEqual(results.length, 2);
assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

// only works on a Windows machine
Expand All @@ -1029,11 +1102,13 @@ describe("FlatESLint", () => {
});
const results = await eslint.lintFiles(["fixtures\\files\\*"]);

assert.strictEqual(results.length, 2);
assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

}
Expand Down Expand Up @@ -1358,11 +1433,13 @@ describe("FlatESLint", () => {
});
const results = await eslint.lintFiles(["fixtures/files/*.?s*"]);

assert.strictEqual(results.length, 2);
assert.strictEqual(results.length, 3);
assert.strictEqual(results[0].messages.length, 0);
assert.strictEqual(results[0].suppressedMessages.length, 0);
assert.strictEqual(results[1].messages.length, 0);
assert.strictEqual(results[1].suppressedMessages.length, 0);
assert.strictEqual(results[2].messages.length, 0);
assert.strictEqual(results[2].suppressedMessages.length, 0);
});

it("should return one error message when given a config with rules with options and severity level set to error", async () => {
Expand Down Expand Up @@ -2785,6 +2862,7 @@ describe("FlatESLint", () => {
});

it("should throw if the directory exists and is empty", async () => {
ensureDirectoryExists(getFixturePath("cli-engine/empty"));
await assert.rejects(async () => {
await eslint.lintFiles(["empty"]);
}, /No files matching 'empty' were found\./u);
Expand Down

0 comments on commit c50ae4f

Please sign in to comment.