Skip to content

Commit c50ae4f

Browse files
authored
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
1 parent a8d0a57 commit c50ae4f

File tree

7 files changed

+97
-7
lines changed

7 files changed

+97
-7
lines changed

lib/eslint/eslint-helpers.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const isPathInside = require("is-path-inside");
2626

2727
const doFsWalk = util.promisify(fswalk.walk);
2828
const Minimatch = minimatch.Minimatch;
29+
const MINIMATCH_OPTIONS = { dot: true };
2930

3031
//-----------------------------------------------------------------------------
3132
// Types
@@ -158,7 +159,7 @@ function globMatch({ basePath, pattern }) {
158159
? normalizeToPosix(path.relative(basePath, pattern))
159160
: pattern;
160161

161-
const matcher = new Minimatch(patternToUse);
162+
const matcher = new Minimatch(patternToUse, MINIMATCH_OPTIONS);
162163

163164
const fsWalkSettings = {
164165

@@ -257,7 +258,7 @@ async function globSearch({
257258

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

260-
return new minimatch.Minimatch(patternToUse);
261+
return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
261262
});
262263

263264
/*

tests/fixtures/cli-engine/empty/.keep

Whitespace-only changes.

tests/fixtures/dot-files/.a.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log("Running");

tests/fixtures/dot-files/.c.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log("Running");

tests/fixtures/dot-files/b.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log("Running");
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = [
2+
{
3+
files: ["*.js"]
4+
},
5+
{
6+
ignores: ["eslint.config.js"]
7+
}
8+
];

tests/lib/eslint/flat-eslint.js

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,23 @@ const hash = require("../../../lib/cli-engine/hash");
2424
const { unIndent, createCustomTeardown } = require("../../_utils");
2525
const coreRules = require("../../../lib/rules");
2626

27+
//------------------------------------------------------------------------------
28+
// Helpers
29+
//------------------------------------------------------------------------------
30+
31+
/**
32+
* Creates a directory if it doesn't already exist.
33+
* @param {string} dirPath The path to the directory that should exist.
34+
* @returns {void}
35+
*/
36+
function ensureDirectoryExists(dirPath) {
37+
try {
38+
fs.statSync(dirPath);
39+
} catch {
40+
fs.mkdirSync(dirPath);
41+
}
42+
}
43+
2744
//------------------------------------------------------------------------------
2845
// Tests
2946
//------------------------------------------------------------------------------
@@ -773,7 +790,7 @@ describe("FlatESLint", () => {
773790
});
774791
const results = await eslint.lintFiles(["fixtures/files/"]);
775792

776-
assert.strictEqual(results.length, 2);
793+
assert.strictEqual(results.length, 3);
777794
assert.strictEqual(results[0].messages.length, 0);
778795
assert.strictEqual(results[1].messages.length, 0);
779796
assert.strictEqual(results[0].suppressedMessages.length, 0);
@@ -823,6 +840,58 @@ describe("FlatESLint", () => {
823840
assert.strictEqual(results[0].suppressedMessages.length, 0);
824841
});
825842

843+
// https://github.com/eslint/eslint/issues/16265
844+
describe("Dot files in searches", () => {
845+
846+
it("should find dot files in current directory when a . pattern is used", async () => {
847+
eslint = new FlatESLint({
848+
cwd: getFixturePath("dot-files")
849+
});
850+
const results = await eslint.lintFiles(["."]);
851+
852+
assert.strictEqual(results.length, 3);
853+
assert.strictEqual(results[0].messages.length, 0);
854+
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
855+
assert.strictEqual(results[0].suppressedMessages.length, 0);
856+
assert.strictEqual(results[1].messages.length, 0);
857+
assert.strictEqual(results[1].filePath, getFixturePath("dot-files/.c.js"));
858+
assert.strictEqual(results[1].suppressedMessages.length, 0);
859+
assert.strictEqual(results[2].messages.length, 0);
860+
assert.strictEqual(results[2].filePath, getFixturePath("dot-files/b.js"));
861+
assert.strictEqual(results[2].suppressedMessages.length, 0);
862+
});
863+
864+
it("should find dot files in current directory when a *.js pattern is used", async () => {
865+
eslint = new FlatESLint({
866+
cwd: getFixturePath("dot-files")
867+
});
868+
const results = await eslint.lintFiles(["*.js"]);
869+
870+
assert.strictEqual(results.length, 3);
871+
assert.strictEqual(results[0].messages.length, 0);
872+
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
873+
assert.strictEqual(results[0].suppressedMessages.length, 0);
874+
assert.strictEqual(results[1].messages.length, 0);
875+
assert.strictEqual(results[1].filePath, getFixturePath("dot-files/.c.js"));
876+
assert.strictEqual(results[1].suppressedMessages.length, 0);
877+
assert.strictEqual(results[2].messages.length, 0);
878+
assert.strictEqual(results[2].filePath, getFixturePath("dot-files/b.js"));
879+
assert.strictEqual(results[2].suppressedMessages.length, 0);
880+
});
881+
882+
it("should find dot files in current directory when a .a.js pattern is used", async () => {
883+
eslint = new FlatESLint({
884+
cwd: getFixturePath("dot-files")
885+
});
886+
const results = await eslint.lintFiles([".a.js"]);
887+
888+
assert.strictEqual(results.length, 1);
889+
assert.strictEqual(results[0].messages.length, 0);
890+
assert.strictEqual(results[0].filePath, getFixturePath("dot-files/.a.js"));
891+
assert.strictEqual(results[0].suppressedMessages.length, 0);
892+
});
893+
});
894+
826895
// https://github.com/eslint/eslint/issues/16275
827896
describe("Glob patterns without matches", () => {
828897

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

995-
assert.strictEqual(results.length, 2);
1064+
assert.strictEqual(results.length, 3);
9961065
assert.strictEqual(results[0].messages.length, 0);
9971066
assert.strictEqual(results[1].messages.length, 0);
1067+
assert.strictEqual(results[2].messages.length, 0);
9981068
assert.strictEqual(results[0].suppressedMessages.length, 0);
9991069
assert.strictEqual(results[1].suppressedMessages.length, 0);
1070+
assert.strictEqual(results[2].suppressedMessages.length, 0);
10001071
});
10011072

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

1012-
assert.strictEqual(results.length, 2);
1083+
assert.strictEqual(results.length, 3);
10131084
assert.strictEqual(results[0].messages.length, 0);
10141085
assert.strictEqual(results[1].messages.length, 0);
1086+
assert.strictEqual(results[2].messages.length, 0);
10151087
assert.strictEqual(results[0].suppressedMessages.length, 0);
10161088
assert.strictEqual(results[1].suppressedMessages.length, 0);
1089+
assert.strictEqual(results[2].suppressedMessages.length, 0);
10171090
});
10181091

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

1032-
assert.strictEqual(results.length, 2);
1105+
assert.strictEqual(results.length, 3);
10331106
assert.strictEqual(results[0].messages.length, 0);
10341107
assert.strictEqual(results[1].messages.length, 0);
1108+
assert.strictEqual(results[2].messages.length, 0);
10351109
assert.strictEqual(results[0].suppressedMessages.length, 0);
10361110
assert.strictEqual(results[1].suppressedMessages.length, 0);
1111+
assert.strictEqual(results[2].suppressedMessages.length, 0);
10371112
});
10381113

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

1361-
assert.strictEqual(results.length, 2);
1436+
assert.strictEqual(results.length, 3);
13621437
assert.strictEqual(results[0].messages.length, 0);
13631438
assert.strictEqual(results[0].suppressedMessages.length, 0);
13641439
assert.strictEqual(results[1].messages.length, 0);
13651440
assert.strictEqual(results[1].suppressedMessages.length, 0);
1441+
assert.strictEqual(results[2].messages.length, 0);
1442+
assert.strictEqual(results[2].suppressedMessages.length, 0);
13661443
});
13671444

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

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

0 commit comments

Comments
 (0)