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.
190 lines
5.5 KiB
190 lines
5.5 KiB
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 |
|
}
|
|
|