You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.9 KiB
88 lines
2.9 KiB
3 years ago
|
const path = require('path')
|
||
|
const eslintWebpackPlugin = require('eslint-webpack-plugin')
|
||
|
|
||
|
/** @type {import('@vue/cli-service').ServicePlugin} */
|
||
|
module.exports = (api, options) => {
|
||
|
if (options.lintOnSave) {
|
||
|
const extensions = require('./eslintOptions').extensions(api)
|
||
|
// Use loadModule to allow users to customize their ESLint dependency version.
|
||
|
const { resolveModule, loadModule } = require('@vue/cli-shared-utils')
|
||
|
const cwd = api.getCwd()
|
||
|
|
||
|
const eslintPkg =
|
||
|
loadModule('eslint/package.json', cwd, true) ||
|
||
|
loadModule('eslint/package.json', __dirname, true)
|
||
|
|
||
|
// ESLint doesn't clear the cache when you upgrade ESLint plugins (ESlint do consider config changes)
|
||
|
// so we have to manually generate a cache identifier that takes lock file into account.
|
||
|
const { cacheIdentifier, cacheDirectory } = api.genCacheConfig(
|
||
|
'eslint',
|
||
|
{
|
||
|
eslint: eslintPkg.version
|
||
|
},
|
||
|
['package.json']
|
||
|
)
|
||
|
|
||
|
api.chainWebpack(webpackConfig => {
|
||
|
const { lintOnSave } = options
|
||
|
const treatAllAsWarnings = lintOnSave === true || lintOnSave === 'warning'
|
||
|
const treatAllAsErrors = lintOnSave === 'error'
|
||
|
|
||
|
const failOnWarning = treatAllAsErrors
|
||
|
const failOnError = !treatAllAsWarnings
|
||
|
|
||
|
/** @type {import('eslint-webpack-plugin').Options & import('eslint').ESLint.Options} */
|
||
|
const eslintWebpackPluginOptions = {
|
||
|
// common to both plugin and ESlint
|
||
|
extensions,
|
||
|
// ESlint options
|
||
|
cwd,
|
||
|
cache: true,
|
||
|
cacheLocation: path.format({
|
||
|
dir: cacheDirectory,
|
||
|
name: process.env.VUE_CLI_TEST
|
||
|
? 'cache'
|
||
|
: cacheIdentifier,
|
||
|
ext: '.json'
|
||
|
}),
|
||
|
// plugin options
|
||
|
context: cwd,
|
||
|
|
||
|
failOnWarning,
|
||
|
failOnError,
|
||
|
|
||
|
eslintPath: path.dirname(
|
||
|
resolveModule('eslint/package.json', cwd) ||
|
||
|
resolveModule('eslint/package.json', __dirname)
|
||
|
),
|
||
|
formatter: 'stylish'
|
||
|
}
|
||
|
webpackConfig.plugin('eslint').use(eslintWebpackPlugin, [eslintWebpackPluginOptions])
|
||
|
})
|
||
|
}
|
||
|
|
||
|
api.registerCommand(
|
||
|
'lint',
|
||
|
{
|
||
|
description: 'lint and fix source files',
|
||
|
usage: 'vue-cli-service lint [options] [...files]',
|
||
|
options: {
|
||
|
'--format [formatter]': 'specify formatter (default: stylish)',
|
||
|
'--no-fix': 'do not fix errors or warnings',
|
||
|
'--no-fix-warnings': 'fix errors, but do not fix warnings',
|
||
|
'--max-errors [limit]':
|
||
|
'specify number of errors to make build failed (default: 0)',
|
||
|
'--max-warnings [limit]':
|
||
|
'specify number of warnings to make build failed (default: Infinity)',
|
||
|
'--output-file [file_path]':
|
||
|
'specify file to write report to'
|
||
|
},
|
||
|
details:
|
||
|
'For more options, see https://eslint.org/docs/user-guide/command-line-interface#options'
|
||
|
},
|
||
|
async args => {
|
||
|
await require('./lint')(args, api)
|
||
|
}
|
||
|
)
|
||
|
}
|