Skip to content

Commit f44e851

Browse files
committed
feat: improve config handling
1 parent a5351f2 commit f44e851

File tree

7 files changed

+86
-131
lines changed

7 files changed

+86
-131
lines changed

Diff for: biome.json

+1-8
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,7 @@
44
"enabled": true
55
},
66
"linter": {
7-
"enabled": true,
8-
"ignore": ["dist/**/*"],
9-
"rules": {
10-
"recommended": true,
11-
"style":{
12-
"useSingleVarDeclarator": "off"
13-
}
14-
}
7+
"enabled": false
158
},
169
"formatter": {
1710
"enabled": true,

Diff for: bun.lockb

-724 Bytes
Binary file not shown.

Diff for: package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nivalis/linter",
3-
"version": "0.0.5",
3+
"version": "0.0.6",
44
"module": "src/index.ts",
55
"type": "module",
66
"publishConfig": {
@@ -60,7 +60,6 @@
6060
"@biomejs/js-api": "^0.6.2",
6161
"eslint": "^9.11.0",
6262
"fast-glob": "^3.3.2",
63-
"p-limit": "^6.1.0",
6463
"yargs": "^17.7.2"
6564
}
6665
}

Diff for: src/biome.ts

+68-51
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { Biome, Distribution } from "@biomejs/js-api";
2-
import pLimit from "p-limit";
2+
import type { LintResult as BiomeLintResult } from "@biomejs/js-api";
33
import { readFileSync, existsSync } from "node:fs";
44
import { readFile, writeFile } from "node:fs/promises";
55
import path from "node:path";
6-
import os from "node:os";
76
import { performance } from "node:perf_hooks";
8-
import type { Configuration, LintResult } from "@biomejs/js-api";
7+
import type {
8+
Configuration,
9+
LintResult as ESLintLintResult,
10+
} from "@biomejs/js-api";
911
import type { ESLint } from "eslint";
12+
import { getFilesToLint } from "./files";
1013

11-
const getSeverity = (severity: LintResult["diagnostics"][0]["severity"]) => {
14+
const getSeverity = (
15+
severity: ESLintLintResult["diagnostics"][0]["severity"],
16+
) => {
1217
switch (severity) {
1318
case "fatal": {
1419
return 2;
@@ -61,8 +66,21 @@ const getLineAncColFromByteOffset = (
6166
return { line, column };
6267
};
6368

69+
const getEmptyLintResult = (filePath: string): ESLint.LintResult =>
70+
({
71+
filePath,
72+
fatalErrorCount: 0,
73+
errorCount: 0,
74+
warningCount: 0,
75+
fixableErrorCount: 0,
76+
fixableWarningCount: 0,
77+
usedDeprecatedRules: [],
78+
suppressedMessages: [],
79+
messages: [],
80+
}) satisfies ESLint.LintResult;
81+
6482
const convertBiomeResult = (
65-
result: LintResult,
83+
result: ESLintLintResult,
6684
filePath: string,
6785
fileContent: string,
6886
): ESLint.LintResult => {
@@ -110,20 +128,34 @@ const convertBiomeResult = (
110128

111129
const biomeLintFile = async (
112130
biome: Biome,
131+
config: Configuration,
113132
filePath: string,
114-
fix = true,
115-
unsafe = false,
133+
fix: boolean,
134+
unsafe: boolean,
116135
) => {
136+
const shouldLint = config.linter?.enabled ?? true;
137+
138+
if (!shouldLint && !fix) {
139+
return getEmptyLintResult(filePath);
140+
}
141+
117142
const initialContent = await readFile(filePath, "utf8");
118143

119-
const result = biome.lintContent(initialContent, {
120-
filePath,
121-
fixFileMode: fix
122-
? unsafe
123-
? "SafeAndUnsafeFixes"
124-
: "SafeFixes"
125-
: undefined,
126-
});
144+
let result: BiomeLintResult = {
145+
content: initialContent,
146+
diagnostics: [],
147+
};
148+
149+
if (shouldLint) {
150+
result = biome.lintContent(initialContent, {
151+
filePath,
152+
fixFileMode: fix
153+
? unsafe
154+
? "SafeAndUnsafeFixes"
155+
: "SafeFixes"
156+
: undefined,
157+
});
158+
}
127159

128160
if (fix) {
129161
const formatted = biome.formatContent(result.content, {
@@ -138,23 +170,6 @@ const biomeLintFile = async (
138170
return convertBiomeResult(result, filePath, result.content);
139171
};
140172

141-
const biomeLintFiles = async (
142-
biome: Biome,
143-
files: string[],
144-
concurrency: number = os.cpus().length,
145-
fix = true,
146-
unsafe = false,
147-
) => {
148-
const limit = pLimit(concurrency);
149-
const results = await Promise.all(
150-
files.map((file) =>
151-
limit(async () => await biomeLintFile(biome, file, fix, unsafe)),
152-
),
153-
);
154-
155-
return results;
156-
};
157-
158173
const findNearestBiomeConfig = () => {
159174
const cwd = process.cwd();
160175

@@ -217,16 +232,18 @@ const defaultConfig: Configuration = {
217232
},
218233
};
219234

220-
const getBiomeConfig = (): Configuration => {
235+
export const getBiomeConfig = (): Configuration => {
221236
try {
222237
let config = defaultConfig;
223238
const biomeConfigPath = findNearestBiomeConfig();
224239

225240
if (biomeConfigPath) {
226241
const biomeConfig = readFileSync(biomeConfigPath, "utf8");
227-
config = Object.assign(config, JSON.parse(biomeConfig));
242+
config = JSON.parse(biomeConfig);
228243
}
229244

245+
console.log(config);
246+
230247
return config;
231248
} catch (error) {
232249
console.warn(error);
@@ -235,28 +252,28 @@ const getBiomeConfig = (): Configuration => {
235252
};
236253

237254
export const lintWithBiome = async (
238-
files: string[],
239-
concurrency: number = os.cpus().length,
240-
fix = true,
241-
debug = false,
242-
unsafe = false,
255+
patterns: string[],
256+
fix: boolean,
257+
debug: boolean,
258+
unsafe: boolean,
243259
) => {
260+
const [biome, files, config] = await Promise.all([
261+
Biome.create({
262+
distribution: Distribution.NODE,
263+
}),
264+
getFilesToLint(patterns),
265+
getBiomeConfig(),
266+
]);
267+
biome.applyConfiguration(config);
268+
244269
if (debug) {
245270
performance.mark("biome-start");
246271
}
247272

248-
const biome = await Biome.create({
249-
distribution: Distribution.NODE,
250-
});
251-
252-
biome.applyConfiguration(getBiomeConfig());
253-
254-
const biomeResults = await biomeLintFiles(
255-
biome,
256-
files,
257-
concurrency,
258-
fix,
259-
unsafe,
273+
const biomeResults = await Promise.all(
274+
files.map(
275+
async (file) => await biomeLintFile(biome, config, file, fix, unsafe),
276+
),
260277
);
261278

262279
if (debug) {

Diff for: src/eslint.ts

+7-20
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,22 @@
11
import { ESLint } from "eslint";
2-
import os from "node:os";
32
import { performance } from "node:perf_hooks";
4-
import pLimit from "p-limit";
53
import type { Linter } from "eslint";
64

75
export const lintWithEslint = async (
86
eslint: ESLint,
97
files: string[],
10-
concurrency: number = os.cpus().length,
11-
fix = true,
12-
debug = false,
8+
fix: boolean,
9+
debug: boolean,
1310
) => {
1411
if (debug) {
1512
performance.mark("eslint-start");
1613
}
1714

18-
const limit = pLimit(concurrency);
19-
20-
const eslintResults = (
21-
await Promise.all(
22-
files.map((file) =>
23-
limit(async () => {
24-
const results = await eslint.lintFiles([file]);
25-
if (fix && results.length > 0) {
26-
await ESLint.outputFixes(results);
27-
}
28-
return results;
29-
}),
30-
),
31-
)
32-
).flat();
15+
const eslintResults = await eslint.lintFiles(files);
16+
if (fix && eslintResults.length > 0) {
17+
console.log("Fixing...");
18+
await ESLint.outputFixes(eslintResults);
19+
}
3320

3421
if (debug) {
3522
performance.mark("eslint-end");

Diff for: src/files.ts

+2-26
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
import path from "node:path";
22
import fs from "node:fs";
3-
import os from "node:os";
43
import fg from "fast-glob";
5-
import type { ESLint } from "eslint";
6-
import pLimit from "p-limit";
74

8-
export const getFilesToLint = async (
9-
eslint: ESLint,
10-
patterns: string[],
11-
12-
concurrency: number = os.cpus().length,
13-
) => {
5+
export const getFilesToLint = async (patterns: string[]) => {
146
const globPatterns = patterns.flatMap((pattern) => {
157
if (!fs.existsSync(pattern)) {
168
return pattern;
@@ -30,21 +22,5 @@ export const getFilesToLint = async (
3022
});
3123

3224
const files = await fg(globPatterns, { dot: true, absolute: true });
33-
34-
await eslint.isPathIgnored(files[0]);
35-
36-
const limit = pLimit(concurrency);
37-
38-
const results = (
39-
await Promise.all(
40-
files.map(async (file) =>
41-
limit(async () => {
42-
const isIgnored = await eslint.isPathIgnored(file);
43-
return !isIgnored ? file : null;
44-
}),
45-
),
46-
)
47-
).filter(Boolean) as string[];
48-
49-
return results;
25+
return files;
5026
};

Diff for: src/index.ts

+7-24
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
#!/usr/bin/env node
22

33
import { ESLint } from "eslint";
4-
import { getFilesToLint } from "./files";
54
import { lintWithBiome } from "./biome";
6-
import { lintWithEslint, mergeResults, overrideConfig } from "./eslint";
5+
import { lintWithEslint, mergeResults } from "./eslint";
76
import pkgJson from "../package.json" assert { type: "json" };
87
import yargs from "yargs";
98
import { hideBin } from "yargs/helpers";
109
import { performance } from "node:perf_hooks";
11-
import os from "node:os";
1210

1311
const instance = yargs(hideBin(process.argv))
1412
.scriptName("@nivalis/linter")
@@ -29,56 +27,41 @@ const instance = yargs(hideBin(process.argv))
2927
})
3028
.option("fix", {
3129
type: "boolean",
32-
default: true,
30+
default: false,
3331
description: "Automatically fix linting errors",
3432
})
3533
.option("debug", {
3634
type: "boolean",
3735
default: false,
3836
description: "Run in debug mode",
3937
})
40-
.option("concurrency", {
41-
type: "number",
42-
default: os.cpus().length,
43-
description:
44-
"Number of concurrent linting processes (default: number of CPU cores)",
45-
})
4638
.option("unsafe", {
4739
type: "boolean",
4840
default: false,
4941
description: "Allow unsafe fixes",
5042
})
5143
.help(),
5244
async (args) => {
53-
const { files: files_, fix, debug, concurrency, unsafe } = args;
45+
const { files: files_, fix, debug, unsafe } = args;
5446
try {
5547
const patterns = Array.isArray(files_) ? files_ : [files_];
5648

5749
const eslint = new ESLint({
5850
fix,
5951
cache: true,
60-
overrideConfig: overrideConfig,
52+
// overrideConfig: overrideConfig,
6153
});
6254

63-
const formatter = await eslint.loadFormatter("stylish");
64-
const files = await getFilesToLint(eslint, patterns, concurrency);
55+
const biomeResults = await lintWithBiome(patterns, fix, debug, unsafe);
6556

6657
const eslintResults = await lintWithEslint(
6758
eslint,
68-
files,
69-
concurrency,
70-
fix,
71-
debug,
72-
);
73-
74-
const biomeResults = await lintWithBiome(
75-
files,
76-
concurrency,
59+
patterns,
7760
fix,
7861
debug,
79-
unsafe,
8062
);
8163

64+
const formatter = await eslint.loadFormatter("stylish");
8265
const resultText = await formatter.format(
8366
mergeResults([...biomeResults, ...eslintResults]),
8467
);

0 commit comments

Comments
 (0)