123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- 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)
- }
- )
- }
|