@witheslint/preset-vue
Version:
The vue preset for witheslint.
140 lines (139 loc) • 6.73 kB
JavaScript
import { combineRules } from "@witheslint/core";
import { parserTs } from "@witheslint/core/modules";
import { parserVue, pluginVue } from "./modules.mjs";
export const GLOB_VUE = "**/*.vue";
export const GLOB_VUE_EXT = ".vue";
export const GLOB_VUE_EXCLUDES = ["**/.nuxt"];
export function presetVue() {
return {
name: "preset:vue",
prepare: ({ settings }) => {
settings.ignores.push(...GLOB_VUE_EXCLUDES);
settings.typescript.extensions.push(GLOB_VUE_EXT);
},
install: ({ features, settings }) => {
const { typescript, stylistic } = features;
const { indent, blockSpacing, braceStyle, commaDangle, quoteProps } = settings.stylistic;
return [
{
name: "witheslint:vue:plugins",
plugins: { vue: pluginVue }
},
{
name: "witheslint:vue:configs",
files: [GLOB_VUE],
languageOptions: {
parser: parserVue,
parserOptions: {
ecmaFeatures: {
jsx: true
},
extraFileExtensions: [".vue"],
parser: typescript ? parserTs : void 0,
sourceType: "module"
}
},
processor: pluginVue.processors[".vue"],
rules: {
...combineRules(pluginVue.configs["flat/recommended"]),
"vue/block-order": ["error", { order: ["script", "template", "style"] }],
"vue/component-name-in-template-casing": ["error", "PascalCase"],
"vue/component-options-name-casing": ["error", "PascalCase"],
"vue/component-tags-order": "off",
// This rule was deprecated and replaced by vue/block-order rule
"vue/custom-event-name-casing": ["error", "camelCase"],
"vue/define-macros-order": ["error", { order: ["defineOptions", "defineProps", "defineEmits", "defineModel", "defineSlots"], defineExposeLast: true }],
"vue/dot-location": ["error", "property"],
"vue/dot-notation": ["error", { allowKeywords: true }],
"vue/eqeqeq": ["error", "smart"],
"vue/html-indent": ["error", indent],
"vue/html-quotes": ["error", "double"],
"vue/max-attributes-per-line": "off",
"vue/multi-word-component-names": "off",
"vue/no-dupe-keys": "off",
"vue/no-empty-pattern": "error",
"vue/no-extra-parens": ["error", "functions"],
"vue/no-irregular-whitespace": "error",
"vue/no-loss-of-precision": "error",
"vue/no-restricted-syntax": ["error", "DebuggerStatement", "LabeledStatement", "WithStatement"],
"vue/no-restricted-v-bind": ["error", "/^v-/"],
"vue/no-setup-props-reactivity-loss": "off",
"vue/no-sparse-arrays": "error",
"vue/no-unused-refs": "error",
"vue/no-useless-v-bind": "error",
"vue/no-v-html": "off",
"vue/object-shorthand": ["error", "always", { avoidQuotes: true, ignoreConstructors: false }],
"vue/padding-line-between-blocks": ["error", "always"],
"vue/prefer-separate-static-class": "error",
"vue/prefer-template": "error",
"vue/prop-name-casing": ["error", "camelCase"],
"vue/require-default-prop": "off",
"vue/require-prop-types": "off",
"vue/space-infix-ops": "error",
"vue/space-unary-ops": ["error", { nonwords: false, words: true }],
...stylistic ? {
"vue/array-bracket-spacing": ["error", "never"],
"vue/arrow-spacing": ["error", { after: true, before: true }],
"vue/block-spacing": ["error", blockSpacing ? "always" : "never"],
"vue/block-tag-newline": ["error", { multiline: "always", singleline: "always" }],
"vue/brace-style": ["error", braceStyle, { allowSingleLine: true }],
"vue/comma-dangle": ["error", commaDangle],
"vue/comma-spacing": ["error", { after: true, before: false }],
"vue/comma-style": ["error", "last"],
"vue/html-comment-content-spacing": ["error", "always", { exceptions: ["-"] }],
"vue/key-spacing": ["error", { afterColon: true, beforeColon: false }],
"vue/keyword-spacing": ["error", { after: true, before: true }],
"vue/object-curly-newline": "off",
"vue/object-curly-spacing": ["error", "always"],
"vue/object-property-newline": ["error", { allowMultiplePropertiesPerLine: true }],
"vue/operator-linebreak": ["error", "before"],
"vue/quote-props": ["error", quoteProps],
"vue/space-in-parens": ["error", "never"],
"vue/template-curly-spacing": "error"
} : {
"vue/array-bracket-newline": "off",
"vue/array-bracket-spacing": "off",
"vue/array-element-newline": "off",
"vue/arrow-spacing": "off",
"vue/block-spacing": "off",
"vue/block-tag-newline": "off",
"vue/brace-style": "off",
"vue/comma-dangle": "off",
"vue/comma-spacing": "off",
"vue/comma-style": "off",
"vue/dot-location": "off",
"vue/func-call-spacing": "off",
"vue/max-len": "off",
"vue/html-closing-bracket-newline": "off",
"vue/html-closing-bracket-spacing": "off",
"vue/html-end-tags": "off",
"vue/html-indent": "off",
"vue/html-quotes": "off",
"vue/html-self-closing": "off",
"vue/key-spacing": "off",
"vue/keyword-spacing": "off",
"vue/max-attributes-per-line": "off",
"vue/multiline-html-element-content-newline": "off",
"vue/multiline-ternary": "off",
"vue/mustache-interpolation-spacing": "off",
"vue/no-extra-parens": "off",
"vue/no-multi-spaces": "off",
"vue/no-spaces-around-equal-signs-in-attribute": "off",
"vue/object-curly-newline": "off",
"vue/object-curly-spacing": "off",
"vue/object-property-newline": "off",
"vue/operator-linebreak": "off",
"vue/quote-props": "off",
"vue/script-indent": "off",
"vue/singleline-html-element-content-newline": "off",
"vue/space-in-parens": "off",
"vue/space-infix-ops": "off",
"vue/space-unary-ops": "off",
"vue/template-curly-spacing": "off"
}
}
}
];
}
};
}