Skip to content

Commit 646a699

Browse files
author
chenjiajun79
committed
feat: 支持 eslint 9 配置以及stylelint检测
1 parent eed156a commit 646a699

5 files changed

Lines changed: 4401 additions & 31 deletions

File tree

index.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MessageKind, Message, ValidateResult } from './js-binding';
1+
import { Message, MessageKind, ValidateResult } from './js-binding';
22
declare const _default: (ctx: any) => void;
33
export default _default;
44
export declare function validateConfig(projectConfig: any, helper: any): Promise<ValidateResult>;
@@ -11,4 +11,5 @@ export declare function validateRecommend(appPath: string): ValidateResult;
1111
export declare function validateRecommendPrint(appPath: string): boolean;
1212
export declare function validateEslint(projectConfig: any, chalk: any): Promise<ValidateResult>;
1313
export declare function validateEslintPrint(projectConfig: any, chalk: any): Promise<boolean>;
14-
export { MessageKind, ValidateResult, Message };
14+
export declare function validateStylelintPrint(projectConfig: any, chalk: any): Promise<boolean>;
15+
export { Message, MessageKind, ValidateResult };

index.js

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
});
1010
};
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.validateEslintPrint = exports.validateEslint = exports.validateRecommendPrint = exports.validateRecommend = exports.validatePackagePrint = exports.validatePackage = exports.validateEnvPrint = exports.validateEnv = exports.validateConfigPrint = exports.validateConfig = void 0;
12+
exports.validateStylelintPrint = exports.validateEslintPrint = exports.validateEslint = exports.validateRecommendPrint = exports.validateRecommend = exports.validatePackagePrint = exports.validatePackage = exports.validateEnvPrint = exports.validateEnv = exports.validateConfigPrint = exports.validateConfig = void 0;
1313
const path = require("path");
1414
const eslint_1 = require("eslint");
1515
const glob = require("glob");
16+
const stylelint = require("stylelint");
1617
const js_binding_1 = require("./js-binding");
1718
exports.default = (ctx) => {
1819
ctx.registerCommand({
@@ -30,6 +31,7 @@ exports.default = (ctx) => {
3031
validatePackagePrint(appPath, nodeModulesPath);
3132
validateRecommendPrint(appPath);
3233
yield validateEslintPrint(ctx.initialConfig, chalk);
34+
yield validateStylelintPrint(ctx.initialConfig, chalk);
3335
});
3436
},
3537
});
@@ -126,21 +128,77 @@ function validateEslintPrint(projectConfig, chalk) {
126128
});
127129
}
128130
exports.validateEslintPrint = validateEslintPrint;
131+
function validateStylelintPrint(projectConfig, chalk) {
132+
return __awaiter(this, void 0, void 0, function* () {
133+
const result = yield validateStylelintCore(projectConfig, chalk);
134+
let is_valid = result.isValid;
135+
let report = result.messages[0].content;
136+
console.log(`\u{1F3AF} 检查 Stylelint (以下为 Stylelint 的输出)!`);
137+
if (is_valid) {
138+
console.log(`${chalk.green('[\u{2713}]')} Stylelint 检查通过!`);
139+
}
140+
else {
141+
console.log(report);
142+
}
143+
return is_valid;
144+
});
145+
}
146+
exports.validateStylelintPrint = validateStylelintPrint;
147+
function validateStylelintCore(projectConfig, chalk) {
148+
return __awaiter(this, void 0, void 0, function* () {
149+
const appPath = process.cwd();
150+
const linterResult = yield stylelint.lint({
151+
files: path.join(appPath, projectConfig.sourceRoot, '**/*.{css,less,scss,sass}'),
152+
configBasedir: appPath,
153+
formatter: 'string'
154+
});
155+
let report = linterResult.report;
156+
let is_valid = true;
157+
for (const result of linterResult.results) {
158+
if (result.warnings.length > 0) {
159+
is_valid = false;
160+
break;
161+
}
162+
}
163+
if (is_valid) {
164+
report = `${chalk.green('[\u{2713}]')} Stylelint 检查通过!`;
165+
}
166+
return {
167+
isValid: is_valid,
168+
messages: [
169+
{
170+
kind: is_valid ? 2 /* MessageKind.Success */ : 1 /* MessageKind.Error */,
171+
content: report,
172+
},
173+
],
174+
};
175+
});
176+
}
129177
function validateEslintCore(projectConfig, chalk) {
130178
return __awaiter(this, void 0, void 0, function* () {
131179
const appPath = process.cwd();
132-
const globPattern = glob.sync(path.join(appPath, '.eslintrc*'));
133-
const eslintCli = new eslint_1.ESLint({
134-
cwd: process.cwd(),
135-
useEslintrc: Boolean(globPattern.length),
180+
const legacyConfigPattern = glob.sync(path.join(appPath, '.eslintrc*'));
181+
const flatConfigPattern = glob.sync(path.join(appPath, 'eslint.config.{js,cjs,mjs}'));
182+
const useFlatConfig = Boolean(flatConfigPattern.length);
183+
const cwd = process.cwd();
184+
const flatConfig = {
185+
cwd,
186+
};
187+
// 兼容 eslint8
188+
const legacyConfig = {
189+
cwd,
190+
useEslintrc: Boolean(legacyConfigPattern.length),
136191
baseConfig: {
137192
extends: [`taro/${projectConfig.framework}`],
138193
},
139-
});
140-
const sourceFiles = path.join(process.cwd(), projectConfig.sourceRoot, '**/*.{js,ts,jsx,tsx}');
194+
};
195+
const ESLint = yield (0, eslint_1.loadESLint)({ useFlatConfig });
196+
const options = useFlatConfig ? flatConfig : legacyConfig;
197+
const eslintCli = new ESLint(options);
198+
const sourceFiles = path.join(cwd, projectConfig.sourceRoot, '**/*.{js,ts,jsx,tsx}');
141199
const report = yield eslintCli.lintFiles([sourceFiles]);
142200
const formatter = yield eslintCli.loadFormatter();
143-
let rawReport = formatter.format(report);
201+
let rawReport = yield formatter.format(report);
144202
let is_valid = true;
145203
if (rawReport) {
146204
is_valid = false;

index.ts

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import * as path from 'path'
22

3-
import { ESLint } from 'eslint'
3+
import { ESLint, loadESLint } from 'eslint'
44
import * as glob from 'glob'
55

6+
import * as stylelint from 'stylelint'
67
import {
7-
validateEnvPrint as validateEnvPrintBinding,
8+
Message,
9+
MessageKind,
10+
validateConfig as validateConfigBinding,
811
validateConfigPrint as validateConfigPrintBinding,
9-
validatePackagePrint as validatePackagePrintBinding,
10-
validateRecommendPrint as validateRecommendPrintBinding,
1112
validateEnv as validateEnvBinding,
12-
validateConfig as validateConfigBinding,
13+
validateEnvPrint as validateEnvPrintBinding,
1314
validatePackage as validatePackageBinding,
15+
validatePackagePrint as validatePackagePrintBinding,
1416
validateRecommend as validateRecommendBinding,
15-
MessageKind,
16-
Message,
17+
validateRecommendPrint as validateRecommendPrintBinding,
1718
ValidateResult,
1819
} from './js-binding'
1920

@@ -33,6 +34,7 @@ export default (ctx) => {
3334
validatePackagePrint(appPath, nodeModulesPath)
3435
validateRecommendPrint(appPath)
3536
await validateEslintPrint(ctx.initialConfig, chalk)
37+
await validateStylelintPrint(ctx.initialConfig, chalk)
3638
},
3739
})
3840
}
@@ -118,22 +120,77 @@ export async function validateEslintPrint(projectConfig, chalk): Promise<boolean
118120
return is_valid
119121
}
120122

123+
export async function validateStylelintPrint(projectConfig, chalk): Promise<boolean> {
124+
const result = await validateStylelintCore(projectConfig, chalk)
125+
let is_valid = result.isValid
126+
let report = result.messages[0].content
127+
console.log(`\u{1F3AF} 检查 Stylelint (以下为 Stylelint 的输出)!`)
128+
if (is_valid) {
129+
console.log(`${chalk.green('[\u{2713}]')} Stylelint 检查通过!`)
130+
} else {
131+
console.log(report)
132+
}
133+
return is_valid
134+
}
135+
136+
async function validateStylelintCore(projectConfig, chalk): Promise<ValidateResult> {
137+
const appPath = process.cwd()
138+
const linterResult = await stylelint.lint({
139+
files: path.join(appPath, projectConfig.sourceRoot, '**/*.{css,less,scss,sass}'),
140+
configBasedir: appPath,
141+
formatter: 'string'
142+
})
143+
let report = linterResult.report
144+
let is_valid = true
145+
for (const result of linterResult.results) {
146+
if (result.warnings.length > 0) {
147+
is_valid = false
148+
break
149+
}
150+
}
151+
if (is_valid) {
152+
report = `${chalk.green('[\u{2713}]')} Stylelint 检查通过!`
153+
}
154+
return {
155+
isValid: is_valid,
156+
messages: [
157+
{
158+
kind: is_valid ? MessageKind.Success : MessageKind.Error,
159+
content: report,
160+
},
161+
],
162+
}
163+
}
164+
121165
async function validateEslintCore(projectConfig, chalk): Promise<ValidateResult> {
122166
const appPath = process.cwd()
123-
const globPattern = glob.sync(path.join(appPath, '.eslintrc*'))
167+
const legacyConfigPattern = glob.sync(path.join(appPath, '.eslintrc*'))
168+
const flatConfigPattern = glob.sync(path.join(appPath, 'eslint.config.{js,cjs,mjs}'))
169+
const useFlatConfig = Boolean(flatConfigPattern.length)
170+
171+
const cwd = process.cwd()
124172

125-
const eslintCli = new ESLint({
126-
cwd: process.cwd(),
127-
useEslintrc: Boolean(globPattern.length),
173+
const flatConfig: ESLint.Options = {
174+
cwd,
175+
}
176+
177+
// 兼容 eslint8
178+
const legacyConfig: ESLint.LegacyOptions = {
179+
cwd,
180+
useEslintrc: Boolean(legacyConfigPattern.length),
128181
baseConfig: {
129182
extends: [`taro/${projectConfig.framework}`],
130183
},
131-
})
184+
}
185+
186+
const ESLint = await loadESLint({ useFlatConfig })
187+
const options = useFlatConfig ? flatConfig : legacyConfig
188+
const eslintCli = new ESLint(options as any)
132189

133-
const sourceFiles = path.join(process.cwd(), projectConfig.sourceRoot, '**/*.{js,ts,jsx,tsx}')
190+
const sourceFiles = path.join(cwd, projectConfig.sourceRoot, '**/*.{js,ts,jsx,tsx}')
134191
const report = await eslintCli.lintFiles([sourceFiles])
135192
const formatter = await eslintCli.loadFormatter()
136-
let rawReport = formatter.format(report)
193+
let rawReport = await formatter.format(report)
137194
let is_valid = true
138195
if (rawReport) {
139196
is_valid = false
@@ -152,8 +209,4 @@ async function validateEslintCore(projectConfig, chalk): Promise<ValidateResult>
152209
}
153210
}
154211

155-
export {
156-
MessageKind,
157-
ValidateResult,
158-
Message
159-
}
212+
export { Message, MessageKind, ValidateResult }

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020
],
2121
"license": "MIT",
2222
"dependencies": {
23-
"eslint": "8.41.0",
24-
"glob": "10.2.6"
23+
"eslint": "^9.12.0",
24+
"glob": "10.2.6",
25+
"stylelint": "^16.19.1"
2526
},
2627
"devDependencies": {
2728
"@napi-rs/cli": "^2.15.2",

0 commit comments

Comments
 (0)