From 30c870d05f57d05d0fa0ebf9a4f3ed5412a8b5e1 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 27 Sep 2023 18:05:23 +0800 Subject: [PATCH] feat: granular stylistic control --- fixtures/input/javascript.js | 10 ++-- fixtures/input/vue.vue | 4 +- fixtures/output/no-style/javascript.js | 62 ++++++++++++++++++++ fixtures/output/no-style/typescript.ts | 79 ++++++++++++++++++++++++++ fixtures/output/no-style/vue-ts.vue | 22 +++++++ fixtures/output/no-style/vue.vue | 24 ++++++++ src/configs/imports.ts | 14 ++++- src/configs/jsdoc.ts | 16 +++++- src/configs/jsonc.ts | 36 ++++++++---- src/configs/vue.ts | 60 ++++++++++--------- src/configs/yaml.ts | 35 +++++++----- src/factory.ts | 15 ++++- src/types.ts | 4 ++ test/fixtures.test.ts | 5 ++ 14 files changed, 319 insertions(+), 67 deletions(-) create mode 100644 fixtures/output/no-style/javascript.js create mode 100644 fixtures/output/no-style/typescript.ts create mode 100644 fixtures/output/no-style/vue-ts.vue create mode 100644 fixtures/output/no-style/vue.vue diff --git a/fixtures/input/javascript.js b/fixtures/input/javascript.js index 9482cf2421..ceccfb1ce5 100644 --- a/fixtures/input/javascript.js +++ b/fixtures/input/javascript.js @@ -7,13 +7,13 @@ var log = console.log class Person { constructor(name, age) { this.name = name; - this.age = age; + this.age = age; } - // Define a method within the class - sayHello() { - log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); - } +// Define a method within the class +sayHello() { + log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); +} } // Create an array of objects diff --git a/fixtures/input/vue.vue b/fixtures/input/vue.vue index 14c5b0bb20..635aa784dc 100644 --- a/fixtures/input/vue.vue +++ b/fixtures/input/vue.vue @@ -9,10 +9,10 @@ + + diff --git a/fixtures/output/no-style/vue.vue b/fixtures/output/no-style/vue.vue new file mode 100644 index 0000000000..532a5cf991 --- /dev/null +++ b/fixtures/output/no-style/vue.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/configs/imports.ts b/src/configs/imports.ts index a78d48ec0b..81820279dc 100644 --- a/src/configs/imports.ts +++ b/src/configs/imports.ts @@ -1,7 +1,12 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' import { pluginImport } from '../plugins' +import type { OptionsStylistic } from '../types' + +export function imports(options: OptionsStylistic = {}): FlatESLintConfigItem[] { + const { + stylistic = true, + } = options -export function imports(): FlatESLintConfigItem[] { return [ { plugins: { @@ -10,13 +15,18 @@ export function imports(): FlatESLintConfigItem[] { rules: { 'import/export': 'error', 'import/first': 'error', - 'import/newline-after-import': ['error', { considerComments: true, count: 1 }], 'import/no-duplicates': 'error', 'import/no-mutable-exports': 'error', 'import/no-named-default': 'error', 'import/no-self-import': 'error', 'import/no-webpack-loader-syntax': 'error', 'import/order': 'error', + + ...stylistic + ? { + 'import/newline-after-import': ['error', { considerComments: true, count: 1 }], + } + : {}, }, }, ] diff --git a/src/configs/jsdoc.ts b/src/configs/jsdoc.ts index 6690f051d0..4d690cc970 100644 --- a/src/configs/jsdoc.ts +++ b/src/configs/jsdoc.ts @@ -1,7 +1,12 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' import { pluginJsdoc } from '../plugins' +import type { OptionsStylistic } from '../types' + +export function jsdoc(options: OptionsStylistic = {}): FlatESLintConfigItem[] { + const { + stylistic = true, + } = options -export function jsdoc(): FlatESLintConfigItem[] { return [ { plugins: { @@ -9,13 +14,11 @@ export function jsdoc(): FlatESLintConfigItem[] { }, rules: { 'jsdoc/check-access': 'warn', - 'jsdoc/check-alignment': 'warn', 'jsdoc/check-param-names': 'warn', 'jsdoc/check-property-names': 'warn', 'jsdoc/check-types': 'warn', 'jsdoc/empty-tags': 'warn', 'jsdoc/implements-on-classes': 'warn', - 'jsdoc/multiline-blocks': 'warn', 'jsdoc/no-defaults': 'warn', 'jsdoc/no-multi-asterisks': 'warn', 'jsdoc/require-param-name': 'warn', @@ -26,6 +29,13 @@ export function jsdoc(): FlatESLintConfigItem[] { 'jsdoc/require-returns-description': 'warn', 'jsdoc/require-yields-check': 'warn', 'jsdoc/valid-types': 'warn', + + ...stylistic + ? { + 'jsdoc/check-alignment': 'warn', + 'jsdoc/multiline-blocks': 'warn', + } + : {}, }, }, ] diff --git a/src/configs/jsonc.ts b/src/configs/jsonc.ts index 3437ab4da8..ae204c45b5 100644 --- a/src/configs/jsonc.ts +++ b/src/configs/jsonc.ts @@ -1,8 +1,14 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' import { GLOB_JSON, GLOB_JSON5, GLOB_JSONC } from '../globs' import { parserJsonc, pluginJsonc } from '../plugins' +import type { OptionsOverrides, OptionsStylistic } from '../types' + +export function jsonc(options: OptionsStylistic & OptionsOverrides = {}): FlatESLintConfigItem[] { + const { + stylistic = true, + overrides = {}, + } = options -export function jsonc(): FlatESLintConfigItem[] { return [ { plugins: { @@ -15,11 +21,7 @@ export function jsonc(): FlatESLintConfigItem[] { parser: parserJsonc, }, rules: { - 'jsonc/array-bracket-spacing': ['error', 'never'], - 'jsonc/comma-dangle': ['error', 'never'], - 'jsonc/comma-style': ['error', 'last'], - 'jsonc/indent': ['error', 2], - 'jsonc/key-spacing': ['error', { afterColon: true, beforeColon: false }], + 'jsonc/no-bigint-literals': 'error', 'jsonc/no-binary-expression': 'error', 'jsonc/no-binary-numeric-literals': 'error', @@ -43,14 +45,26 @@ export function jsonc(): FlatESLintConfigItem[] { 'jsonc/no-undefined-value': 'error', 'jsonc/no-unicode-codepoint-escapes': 'error', 'jsonc/no-useless-escape': 'error', - 'jsonc/object-curly-newline': ['error', { consistent: true, multiline: true }], - 'jsonc/object-curly-spacing': ['error', 'always'], - 'jsonc/object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }], - 'jsonc/quote-props': 'error', - 'jsonc/quotes': 'error', 'jsonc/space-unary-ops': 'error', 'jsonc/valid-json-number': 'error', 'jsonc/vue-custom-block/no-parsing-error': 'error', + + ...stylistic + ? { + 'jsonc/array-bracket-spacing': ['error', 'never'], + 'jsonc/comma-dangle': ['error', 'never'], + 'jsonc/comma-style': ['error', 'last'], + 'jsonc/indent': ['error', 2], + 'jsonc/key-spacing': ['error', { afterColon: true, beforeColon: false }], + 'jsonc/object-curly-newline': ['error', { consistent: true, multiline: true }], + 'jsonc/object-curly-spacing': ['error', 'always'], + 'jsonc/object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }], + 'jsonc/quote-props': 'error', + 'jsonc/quotes': 'error', + } + : {}, + + ...overrides, }, }, ] diff --git a/src/configs/vue.ts b/src/configs/vue.ts index 2d85876de2..461647a84c 100644 --- a/src/configs/vue.ts +++ b/src/configs/vue.ts @@ -2,14 +2,16 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' import { GLOB_VUE } from '../globs' import { parserTs, parserVue, pluginVue } from '../plugins' import { OFF } from '../flags' -import type { OptionsHasTypeScript, OptionsOverrides } from '../types' +import type { OptionsHasTypeScript, OptionsOverrides, OptionsStylistic } from '../types' export function vue( - options: OptionsHasTypeScript & OptionsOverrides = {}, + options: OptionsHasTypeScript & OptionsOverrides & OptionsStylistic = {}, ): FlatESLintConfigItem[] { const { overrides = {}, + stylistic = true, } = options + return [ { plugins: { @@ -38,21 +40,9 @@ export function vue( 'node/prefer-global/process': OFF, - 'vue/array-bracket-spacing': ['error', 'never'], - 'vue/arrow-spacing': ['error', { after: true, before: true }], 'vue/block-order': ['error', { order: ['script', 'template', 'style'], }], - 'vue/block-spacing': ['error', 'always'], - 'vue/block-tag-newline': ['error', { - multiline: 'always', - singleline: 'always', - }], - 'vue/brace-style': ['error', 'stroustrup', { allowSingleLine: true }], - 'vue/comma-dangle': ['error', 'always-multiline'], - 'vue/comma-spacing': ['error', { after: true, before: false }], - - 'vue/comma-style': ['error', 'last'], 'vue/component-name-in-template-casing': ['error', 'PascalCase'], 'vue/component-options-name-casing': ['error', 'PascalCase'], 'vue/custom-event-name-casing': ['error', 'camelCase'], @@ -62,11 +52,6 @@ export function vue( 'vue/dot-location': ['error', 'property'], 'vue/dot-notation': ['error', { allowKeywords: true }], 'vue/eqeqeq': ['error', 'smart'], - '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/max-attributes-per-line': OFF, 'vue/multi-word-component-names': OFF, 'vue/no-dupe-keys': OFF, @@ -86,9 +71,6 @@ export function vue( 'vue/no-unused-refs': 'error', 'vue/no-useless-v-bind': 'error', 'vue/no-v-html': OFF, - 'vue/object-curly-newline': OFF, - 'vue/object-curly-spacing': ['error', 'always'], - 'vue/object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }], 'vue/object-shorthand': [ 'error', 'always', @@ -97,17 +79,41 @@ export function vue( ignoreConstructors: false, }, ], - 'vue/operator-linebreak': ['error', 'before'], - 'vue/padding-line-between-blocks': ['error', 'always'], 'vue/prefer-separate-static-class': 'error', 'vue/prefer-template': 'error', - 'vue/quote-props': ['error', 'consistent-as-needed'], 'vue/require-default-prop': OFF, 'vue/require-prop-types': OFF, - 'vue/space-in-parens': ['error', 'never'], 'vue/space-infix-ops': 'error', 'vue/space-unary-ops': ['error', { nonwords: false, words: true }], - 'vue/template-curly-spacing': 'error', + + ...stylistic + ? { + 'vue/array-bracket-spacing': ['error', 'never'], + 'vue/arrow-spacing': ['error', { after: true, before: true }], + 'vue/block-spacing': ['error', 'always'], + 'vue/block-tag-newline': ['error', { + multiline: 'always', + singleline: 'always', + }], + 'vue/brace-style': ['error', 'stroustrup', { allowSingleLine: true }], + 'vue/comma-dangle': ['error', 'always-multiline'], + '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/padding-line-between-blocks': ['error', 'always'], + 'vue/quote-props': ['error', 'consistent-as-needed'], + 'vue/space-in-parens': ['error', 'never'], + 'vue/template-curly-spacing': 'error', + } + : {}, ...overrides, }, diff --git a/src/configs/yaml.ts b/src/configs/yaml.ts index 57ff544443..231b5c6710 100644 --- a/src/configs/yaml.ts +++ b/src/configs/yaml.ts @@ -2,11 +2,14 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' import { GLOB_YAML } from '../globs' import { parserYaml, pluginYaml } from '../plugins' import { OFF } from '../flags' -import type { OptionsOverrides } from '../types' +import type { OptionsOverrides, OptionsStylistic } from '../types' -export function yaml(options: OptionsOverrides = {}): FlatESLintConfigItem[] { +export function yaml( + options: OptionsOverrides & OptionsStylistic = {}, +): FlatESLintConfigItem[] { const { overrides = {}, + stylistic = true, } = options return [ @@ -24,26 +27,30 @@ export function yaml(options: OptionsOverrides = {}): FlatESLintConfigItem[] { 'style/spaced-comment': OFF, 'yaml/block-mapping': 'error', - 'yaml/block-mapping-question-indicator-newline': 'error', 'yaml/block-sequence': 'error', - 'yaml/block-sequence-hyphen-indicator-newline': 'error', - 'yaml/flow-mapping-curly-newline': 'error', - 'yaml/flow-mapping-curly-spacing': 'error', - 'yaml/flow-sequence-bracket-newline': 'error', - 'yaml/flow-sequence-bracket-spacing': 'error', - 'yaml/indent': ['error', 2], - 'yaml/key-spacing': 'error', 'yaml/no-empty-key': 'error', 'yaml/no-empty-sequence-entry': 'error', 'yaml/no-irregular-whitespace': 'error', - 'yaml/no-tab-indent': 'error', 'yaml/plain-scalar': 'error', - 'yaml/quotes': ['error', { avoidEscape: false, prefer: 'single' }], - 'yaml/spaced-comment': 'error', - 'yaml/vue-custom-block/no-parsing-error': 'error', + ...stylistic + ? { + 'yaml/block-mapping-question-indicator-newline': 'error', + 'yaml/block-sequence-hyphen-indicator-newline': 'error', + 'yaml/flow-mapping-curly-newline': 'error', + 'yaml/flow-mapping-curly-spacing': 'error', + 'yaml/flow-sequence-bracket-newline': 'error', + 'yaml/flow-sequence-bracket-spacing': 'error', + 'yaml/indent': ['error', 2], + 'yaml/key-spacing': 'error', + 'yaml/no-tab-indent': 'error', + 'yaml/quotes': ['error', { avoidEscape: false, prefer: 'single' }], + 'yaml/spaced-comment': 'error', + } + : {}, + ...overrides, }, }, diff --git a/src/factory.ts b/src/factory.ts index bd410cfd7e..ca015f151b 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -77,8 +77,12 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use }), comments(), node(), - jsdoc(), - imports(), + jsdoc({ + stylistic: enableStylistic, + }), + imports({ + stylistic: enableStylistic, + }), unicorn(), ) @@ -116,13 +120,17 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use if (enableVue) { configs.push(vue({ overrides: overrides.vue, + stylistic: enableStylistic, typescript: !!enableTypeScript, })) } if (options.jsonc ?? true) { configs.push( - jsonc(), + jsonc({ + overrides: overrides.jsonc, + stylistic: enableStylistic, + }), sortPackageJson(), sortTsconfig(), ) @@ -131,6 +139,7 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use if (options.yaml ?? true) { configs.push(yaml({ overrides: overrides.yaml, + stylistic: enableStylistic, })) } diff --git a/src/types.ts b/src/types.ts index 2dda1bbb6a..7c9ce949ba 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,6 +20,10 @@ export interface OptionsHasTypeScript { typescript?: boolean } +export interface OptionsStylistic { + stylistic?: boolean +} + export interface OptionsOverrides { overrides?: FlatESLintConfigItem['rules'] } diff --git a/test/fixtures.test.ts b/test/fixtures.test.ts index a3779091be..ad6a8d01e1 100644 --- a/test/fixtures.test.ts +++ b/test/fixtures.test.ts @@ -21,6 +21,11 @@ runWithConfig('all', { typescript: true, vue: true, }) +runWithConfig('no-style', { + typescript: true, + vue: true, + stylistic: false, +}) // https://github.com/antfu/eslint-config/issues/255 runWithConfig(