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