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.
		
		
		
		
			
				
					76 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					76 lines
				
				2.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								const inquirer = require('inquirer')
							 | 
						||
| 
								 | 
							
								const { semver } = require('@vue/cli-shared-utils')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = async (api) => {
							 | 
						||
| 
								 | 
							
								  const pkg = require(api.resolve('package.json'))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let localESLintRange = pkg.devDependencies.eslint
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // if project is scaffolded by Vue CLI 3.0.x or earlier,
							 | 
						||
| 
								 | 
							
								  // the ESLint dependency (ESLint v4) is inside @vue/cli-plugin-eslint;
							 | 
						||
| 
								 | 
							
								  // in Vue CLI v4 it should be extracted to the project dependency list.
							 | 
						||
| 
								 | 
							
								  if (api.fromVersion('^3') && !localESLintRange) {
							 | 
						||
| 
								 | 
							
								    localESLintRange = '^4.19.1'
							 | 
						||
| 
								 | 
							
								    api.extendPackage({
							 | 
						||
| 
								 | 
							
								      devDependencies: {
							 | 
						||
| 
								 | 
							
								        eslint: localESLintRange,
							 | 
						||
| 
								 | 
							
								        'babel-eslint': '^8.2.5',
							 | 
						||
| 
								 | 
							
								        'eslint-plugin-vue': '^4.5.0'
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const localESLintMajor = semver.major(
							 | 
						||
| 
								 | 
							
								    semver.maxSatisfying(['4.99.0', '5.99.0', '6.99.0', '7.99.0'], localESLintRange) ||
							 | 
						||
| 
								 | 
							
								      // in case the user does not specify a typical caret range;
							 | 
						||
| 
								 | 
							
								      // it is used as **fallback** because the user may have not previously
							 | 
						||
| 
								 | 
							
								      // installed eslint yet, such as in the case that they are from v3.0.x
							 | 
						||
| 
								 | 
							
								      require('eslint/package.json').version
							 | 
						||
| 
								 | 
							
								  )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (localESLintMajor >= 6) {
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const { confirmUpgrade } = await inquirer.prompt([{
							 | 
						||
| 
								 | 
							
								    name: 'confirmUpgrade',
							 | 
						||
| 
								 | 
							
								    type: 'confirm',
							 | 
						||
| 
								 | 
							
								    message:
							 | 
						||
| 
								 | 
							
								    `Your current ESLint version is v${localESLintMajor}.\n` +
							 | 
						||
| 
								 | 
							
								    `The latest major version which supported by vue-cli is v6.\n` +
							 | 
						||
| 
								 | 
							
								    `Do you want to upgrade? (May contain breaking changes)\n`
							 | 
						||
| 
								 | 
							
								  }])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (confirmUpgrade) {
							 | 
						||
| 
								 | 
							
								    const { getDeps } = require('../eslintDeps')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const newDeps = getDeps(api)
							 | 
						||
| 
								 | 
							
								    if (pkg.devDependencies['@vue/eslint-config-airbnb']) {
							 | 
						||
| 
								 | 
							
								      Object.assign(newDeps, getDeps(api, 'airbnb'))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (pkg.devDependencies['@vue/eslint-config-standard']) {
							 | 
						||
| 
								 | 
							
								      Object.assign(newDeps, getDeps(api, 'standard'))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (pkg.devDependencies['@vue/eslint-config-prettier']) {
							 | 
						||
| 
								 | 
							
								      Object.assign(newDeps, getDeps(api, 'prettier'))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    api.extendPackage({ devDependencies: newDeps }, { warnIncompatibleVersions: false })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // in case anyone's upgrading from the legacy `typescript-eslint-parser`
							 | 
						||
| 
								 | 
							
								    if (api.hasPlugin('typescript')) {
							 | 
						||
| 
								 | 
							
								      api.extendPackage({
							 | 
						||
| 
								 | 
							
								        eslintConfig: {
							 | 
						||
| 
								 | 
							
								          parserOptions: {
							 | 
						||
| 
								 | 
							
								            parser: '@typescript-eslint/parser'
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // TODO:
							 | 
						||
| 
								 | 
							
								    // transform `@vue/prettier` to `eslint:recommended` + `@vue/prettier`
							 | 
						||
| 
								 | 
							
								    // transform `@vue/typescript` to `@vue/typescript/recommended` and also fix prettier compatibility for it
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |