191 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const CONFIG = 'org.vue.eslintrc'
 | |
| 
 | |
| const CATEGORIES = [
 | |
|   'essential',
 | |
|   'strongly-recommended',
 | |
|   'recommended',
 | |
|   'uncategorized'
 | |
| ]
 | |
| 
 | |
| const DEFAULT_CATEGORY = 'essential'
 | |
| const RULE_SETTING_OFF = 'off'
 | |
| const RULE_SETTING_ERROR = 'error'
 | |
| const RULE_SETTING_WARNING = 'warn'
 | |
| const RULE_SETTINGS = [RULE_SETTING_OFF, RULE_SETTING_ERROR, RULE_SETTING_WARNING]
 | |
| 
 | |
| const defaultChoices = [
 | |
|   {
 | |
|     name: 'org.vue.eslint.config.eslint.setting.off',
 | |
|     value: JSON.stringify(RULE_SETTING_OFF)
 | |
|   },
 | |
|   {
 | |
|     name: 'org.vue.eslint.config.eslint.setting.error',
 | |
|     value: JSON.stringify(RULE_SETTING_ERROR)
 | |
|   },
 | |
|   {
 | |
|     name: 'org.vue.eslint.config.eslint.setting.warning',
 | |
|     value: JSON.stringify(RULE_SETTING_WARNING)
 | |
|   }
 | |
| ]
 | |
| 
 | |
| function escapeHTML (text) {
 | |
|   return text.replace(/</g, '<').replace(/>/g, '>')
 | |
| }
 | |
| 
 | |
| function getEslintConfigName (eslint) {
 | |
|   let config = eslint.extends
 | |
| 
 | |
|   if (eslint.extends instanceof Array) {
 | |
|     config = eslint.extends.find(configName => configName.startsWith('plugin:vue/'))
 | |
|   }
 | |
| 
 | |
|   return config && config.startsWith('plugin:vue/') ? config : null
 | |
| }
 | |
| 
 | |
| // Sets default value regarding selected global config
 | |
| function getDefaultValue (rule, data) {
 | |
|   const { category: ruleCategory } = rule.meta.docs
 | |
|   const currentCategory = getEslintConfigName(data.eslint)
 | |
| 
 | |
|   if (!currentCategory || ruleCategory === undefined) return RULE_SETTING_OFF
 | |
| 
 | |
|   return CATEGORIES.indexOf(ruleCategory) <= CATEGORIES.indexOf(currentCategory.split('/')[1])
 | |
|     ? RULE_SETTING_ERROR
 | |
|     : RULE_SETTING_OFF
 | |
| }
 | |
| 
 | |
| function getEslintPrompts (data, rules) {
 | |
|   const allRules = Object.keys(rules)
 | |
|     .map(ruleKey => ({
 | |
|       ...rules[ruleKey],
 | |
|       name: `vue/${ruleKey}`
 | |
|     }))
 | |
| 
 | |
|   return CATEGORIES
 | |
|     .map(category =>
 | |
|       allRules.filter(rule =>
 | |
|         rule.meta.docs.category === category || (
 | |
|           category === 'uncategorized' &&
 | |
|           rule.meta.docs.category === undefined
 | |
|         )
 | |
|       )
 | |
|     )
 | |
|     .reduce((acc, rulesArr) => [...acc, ...rulesArr], [])
 | |
|     .map(rule => {
 | |
|       const value = data.eslint &&
 | |
|         data.eslint.rules &&
 | |
|         data.eslint.rules[rule.name]
 | |
| 
 | |
|       return {
 | |
|         name: rule.name,
 | |
|         type: 'list',
 | |
|         message: rule.name,
 | |
|         group: `org.vue.eslint.config.eslint.groups.${rule.meta.docs.category || 'uncategorized'}`,
 | |
|         description: escapeHTML(rule.meta.docs.description),
 | |
|         link: rule.meta.docs.url,
 | |
|         default: JSON.stringify(getDefaultValue(rule, data)),
 | |
|         value: JSON.stringify(value),
 | |
|         choices: !value || RULE_SETTINGS.indexOf(value) > -1
 | |
|           ? defaultChoices
 | |
|           : [...defaultChoices, {
 | |
|             name: 'org.vue.eslint.config.eslint.setting.custom',
 | |
|             value: JSON.stringify(value)
 | |
|           }]
 | |
|       }
 | |
|     })
 | |
| }
 | |
| 
 | |
| function onRead ({ data, cwd }) {
 | |
|   const { loadModule } = require('@vue/cli-shared-utils')
 | |
|   const rules = loadModule('eslint-plugin-vue', cwd, true).rules
 | |
| 
 | |
|   return {
 | |
|     tabs: [
 | |
|       {
 | |
|         id: 'general',
 | |
|         label: 'org.vue.eslint.config.eslint.general.label',
 | |
|         prompts: [
 | |
|           {
 | |
|             name: 'lintOnSave',
 | |
|             type: 'confirm',
 | |
|             message: 'org.vue.eslint.config.eslint.general.lintOnSave.message',
 | |
|             description: 'org.vue.eslint.config.eslint.general.lintOnSave.description',
 | |
|             link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint#configuration',
 | |
|             default: true,
 | |
|             value: data.vue && data.vue.lintOnSave
 | |
|           },
 | |
|           {
 | |
|             name: 'config',
 | |
|             type: 'list',
 | |
|             message: 'org.vue.eslint.config.eslint.general.config.message',
 | |
|             description: 'org.vue.eslint.config.eslint.general.config.description',
 | |
|             link: 'https://github.com/vuejs/eslint-plugin-vue',
 | |
|             default: `plugin:vue/${DEFAULT_CATEGORY}`,
 | |
|             choices: CATEGORIES.filter(category => category !== 'uncategorized').map(category => ({
 | |
|               name: `org.vue.eslint.config.eslint.groups.${category}`,
 | |
|               value: `plugin:vue/${category}`
 | |
|             })),
 | |
|             value: getEslintConfigName(data.eslint)
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         id: 'rules',
 | |
|         label: 'org.vue.eslint.config.eslint.rules.label',
 | |
|         prompts: getEslintPrompts(data, rules)
 | |
|       }
 | |
|     ]
 | |
|   }
 | |
| }
 | |
| 
 | |
| async function onWrite ({ data, api, prompts }) {
 | |
|   const eslintData = { ...data.eslint }
 | |
|   const vueData = {}
 | |
|   for (const prompt of prompts) {
 | |
|     // eslintrc
 | |
|     if (prompt.id === 'config') {
 | |
|       if (eslintData.extends instanceof Array) {
 | |
|         const vueEslintConfig = eslintData.extends.find(config => config.indexOf('plugin:vue/') === 0)
 | |
|         const index = eslintData.extends.indexOf(vueEslintConfig)
 | |
|         eslintData.extends[index] = JSON.parse(prompt.value)
 | |
|       } else {
 | |
|         eslintData.extends = JSON.parse(prompt.value)
 | |
|       }
 | |
|     } else if (prompt.id.indexOf('vue/') === 0) {
 | |
|       eslintData[`rules.${prompt.id}`] = await api.getAnswer(prompt.id, JSON.parse)
 | |
|     } else {
 | |
|       // vue.config.js
 | |
|       vueData[prompt.id] = await api.getAnswer(prompt.id)
 | |
|     }
 | |
|   }
 | |
|   api.setData('eslint', eslintData)
 | |
|   api.setData('vue', vueData)
 | |
| }
 | |
| 
 | |
| const config = {
 | |
|   id: CONFIG,
 | |
|   name: 'ESLint configuration',
 | |
|   description: 'org.vue.eslint.config.eslint.description',
 | |
|   link: 'https://github.com/vuejs/eslint-plugin-vue',
 | |
|   files: {
 | |
|     eslint: {
 | |
|       js: ['.eslintrc.js'],
 | |
|       json: ['.eslintrc', '.eslintrc.json'],
 | |
|       yaml: ['.eslintrc.yaml', '.eslintrc.yml'],
 | |
|       package: 'eslintConfig'
 | |
|     },
 | |
|     vue: {
 | |
|       js: ['vue.config.js']
 | |
|     }
 | |
|   },
 | |
|   onRead,
 | |
|   onWrite
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   config,
 | |
|   getEslintConfigName,
 | |
|   getDefaultValue,
 | |
|   getEslintPrompts
 | |
| }
 | 
