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