11import * as path from 'path'
22
3- import { ESLint } from 'eslint'
3+ import { ESLint , loadESLint } from 'eslint'
44import * as glob from 'glob'
55
6+ import * as stylelint from 'stylelint'
67import {
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+
121165async 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 }
0 commit comments