UNPKG

@witheslint/preset-vue

Version:
187 lines (186 loc) 6.21 kB
import { combineRules, interopDefault } from "@witheslint/core"; //#region src/preset.ts const GLOB_VUE = "**/*.vue"; const EXTENSION_VUE = ".vue"; function presetVue() { return { name: "preset:vue", prepare: ({ settings }) => { settings.ignores.push(...["**/.nuxt"]); settings.typescript.extensions.push(EXTENSION_VUE); }, install: async ({ features, settings }) => { const { typescript, stylistic } = features; const { indent, blockSpacing, braceStyle, commaDangle, quoteProps } = settings.stylistic.config; const parserTs = settings.typescript.parser; const [parserVue, pluginVue] = await Promise.all([interopDefault(import("vue-eslint-parser")), interopDefault(import("eslint-plugin-vue"))]); return [{ name: "witheslint:vue:plugins", plugins: { vue: pluginVue } }, { name: "witheslint:vue:configs", files: [GLOB_VUE], languageOptions: { parser: parserVue, parserOptions: { ecmaFeatures: { jsx: true }, extraFileExtensions: [EXTENSION_VUE], parser: typescript ? parserTs : void 0, sourceType: "module" } }, processor: pluginVue.processors[EXTENSION_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", "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" } } }]; } }; } //#endregion export { EXTENSION_VUE, GLOB_VUE, presetVue };