Skip to content

Commit

Permalink
fix: Gérer des patrons identiques.
Browse files Browse the repository at this point in the history
  • Loading branch information
regseb committed Apr 1, 2024
1 parent df84dc8 commit 1af4024
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 46 deletions.
58 changes: 32 additions & 26 deletions src/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,24 +109,31 @@ export default class Metalint {
level: options.level,
},
);
return new Metalint({ root, patterns, reporters, checkers });
return new Metalint({ patterns, reporters, checkers }, { root });
}

constructor(config) {
this.#root = config.root;
this.#glob = new Glob(config.patterns, { root: config.root });
/**
* Crée une instance de Metalint.
*
* @param {FlattenedConfig} config La configuration de Metalint.
* @param {Object} context Le contexte.
* @param {string} context.root Le répertoire racine.
*/
constructor(config, { root }) {
this.#root = root;
this.#glob = new Glob(config.patterns, { root: this.#root });

this.#formatters = config.reporters.map((reporter) => {
// eslint-disable-next-line new-cap
return new reporter.formatter(reporter.level, reporter.options);
});

this.#checkers = config.checkers.map((checker) => ({
...checker,
glob: new Glob(checker.patterns, { root: this.#root }),
linters: checker.linters,
overrides: checker.overrides.map((override) => ({
...override,
glob: new Glob(override.patterns, { root: this.#root }),
linters: override.linters,
})),
}));
}
Expand All @@ -143,42 +150,41 @@ export default class Metalint {
* fichier.
*/
async lintFiles(bases) {
const files = [];
const files = /** @type {string[]} */ ([]);
for (const base of bases) {
files.push(...(await this.#glob.walk(base)));
}
const results = new Results(files);
for (const file of files) {
for (const checker of this.#checkers) {
for (const [i, checker] of Object.entries(this.#checkers)) {
if (checker.glob.test(file)) {
let key = checker.patterns.join();
let key = i.toString();
const values = [checker.linters];
for (const override of checker.overrides) {
for (const [j, override] of Object.entries(
checker.overrides,
)) {
if (override.glob.test(file)) {
key += "|" + override.patterns.join();
key += `.${j}`;
values.push(override.linters);
}
}

let wrappers = [];
let wrappers;
if (this.#cache.has(key)) {
wrappers = this.#cache.get(key);
} else {
const linters = values.reduce(mergeLinters);
for (const linter of linters) {
wrappers.push(
// eslint-disable-next-line new-cap
new linter.wrapper(
{
fix: linter.fix,
level: linter.level,
root: this.#root,
files,
},
linter.options,
),
wrappers = values.reduce(mergeLinters).map((linter) => {
// eslint-disable-next-line new-cap
return new linter.wrapper(
{
fix: linter.fix,
level: linter.level,
root: this.#root,
files,
},
linter.options,
);
}
});
this.#cache.set(key, wrappers);
}
for (const wrapper of wrappers) {
Expand Down
114 changes: 94 additions & 20 deletions test/unit/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import AddonsLinterWrapper from "../../../src/core/wrapper/addons-linter.js";
import ESLintWrapper from "../../../src/core/wrapper/eslint.js";
import HTMLHintWrapper from "../../../src/core/wrapper/htmlhint.js";
import JSHintWrapper from "../../../src/core/wrapper/jshint.js";
import Prettier from "../../../src/core/wrapper/prettier.js";
import MarkdownlintWrapper from "../../../src/core/wrapper/markdownlint.js";
import PrettierWrapper from "../../../src/core/wrapper/prettier.js";
import createTempFileSystem from "../../utils/fake.js";

describe("src/core/index.js", function () {
Expand Down Expand Up @@ -65,12 +66,14 @@ describe("src/core/index.js", function () {
},
];

const metalint = new Metalint({
root: ".",
patterns: ["**"],
reporters: [],
checkers,
});
const metalint = new Metalint(
{
patterns: ["**"],
reporters: [],
checkers,
},
{ root: "." },
);
const results = await metalint.lintFiles(files);
assert.deepEqual(results, {
"foo.html": [],
Expand Down Expand Up @@ -129,7 +132,7 @@ describe("src/core/index.js", function () {
patterns: ["**"],
linters: [
{
wrapper: Prettier,
wrapper: PrettierWrapper,
level: Levels.INFO,
fix: false,
options:
Expand All @@ -140,12 +143,14 @@ describe("src/core/index.js", function () {
},
];

const metalint = new Metalint({
root: ".",
patterns: ["**"],
reporters: [],
checkers,
});
const metalint = new Metalint(
{
patterns: ["**"],
reporters: [],
checkers,
},
{ root: "." },
);
const results = await metalint.lintFiles(files);
assert.deepEqual(results, {
"foo.json": [
Expand Down Expand Up @@ -183,12 +188,14 @@ describe("src/core/index.js", function () {
},
];

const metalint = new Metalint({
root: ".",
patterns: ["**"],
reporters: [],
checkers,
});
const metalint = new Metalint(
{
patterns: ["**"],
reporters: [],
checkers,
},
{ root: "." },
);
const results = await metalint.lintFiles(files);
assert.deepEqual(results, {
"foo/": [
Expand All @@ -213,6 +220,73 @@ describe("src/core/index.js", function () {
],
});
});

it("should support same patterns", async function () {
await createTempFileSystem({
"README.md": "# Foo",
});

const files = ["README.md"];
const checkers = [
{
patterns: ["*.md"],
linters: [
{
wrapper: MarkdownlintWrapper,
level: Levels.INFO,
fix: false,
options:
/** @type {Record<string, unknown>} */ ({}),
},
],
overrides: [],
},
{
patterns: ["*.md"],
linters: [
{
wrapper: PrettierWrapper,
level: Levels.INFO,
fix: false,
options:
/** @type {Record<string, unknown>} */ ({}),
},
],
overrides: [],
},
];

const metalint = new Metalint(
{
patterns: ["**"],
reporters: [],
checkers,
},
{ root: "." },
);
const results = await metalint.lintFiles(files);
assert.deepEqual(results, {
"README.md": [
{
file: "README.md",
linter: "prettier",
rule: undefined,
severity: Severities.ERROR,
message: "Code style issues found.",
locations: [],
},
{
file: "README.md",
linter: "markdownlint",
rule: "MD047/single-trailing-newline",
severity: Severities.ERROR,
message:
"Files should end with a single newline character []",
locations: [{ line: 1 }],
},
],
});
});
});
});
});

0 comments on commit 1af4024

Please sign in to comment.