From 0ce3a697fda0f95aadfe4e89cbb37630e0890a43 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 25 Sep 2023 17:13:53 +0800 Subject: [PATCH] feat!: use unified stylistic rules --- README.md | 3 +- eslint.config.js | 3 -- package.json | 5 +-- pnpm-lock.yaml | 59 +++++++++++++++----------------- src/configs/stylistic.ts | 73 +++++----------------------------------- src/factory.ts | 12 +++---- src/plugins.ts | 3 +- 7 files changed, 43 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index 1ef60db6fc..33bc1f4453 100644 --- a/README.md +++ b/README.md @@ -208,8 +208,7 @@ Since flat config requires us to explicitly provide the plugin names (instead of | `i/*` | `import/*` | [eslint-plugin-i](https://github.com/un-es/eslint-plugin-i) | | `n/*` | `node/*` | [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) | `@typescript-eslint/*` | `ts/*` | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint) | -| `@stylistic/js/*` | `style/*` | [@stylistic/eslint-plugin-js](https://github.com/eslint-stylistic/eslint-stylistic) | -| `@stylistic/ts/*` | `style-ts/*` | [@stylistic/eslint-plugin-ts](https://github.com/eslint-stylistic/eslint-stylistic) | +| `@stylistic/*` | `style/*` | [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic) | When you want to overrides rules, or disable them inline, you need to update to the new prefix: diff --git a/eslint.config.js b/eslint.config.js index a084d94033..5b6129a297 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,4 +1,3 @@ -import stylisticMigrate from '@stylistic/eslint-plugin-migrate' import sortKeys from 'eslint-plugin-sort-keys' import antfu from '@antfu/eslint-config' @@ -12,11 +11,9 @@ export default antfu( { files: ['src/**/*.ts'], plugins: { - '@stylistic/migrate': stylisticMigrate, 'sort-keys': sortKeys, }, rules: { - '@stylistic/migrate/rules': 'error', 'sort-keys/sort-keys-fix': 'error', }, }, diff --git a/package.json b/package.json index daec7db1a6..4d0d41c663 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,7 @@ "eslint": ">=8.0.0" }, "dependencies": { - "@eslint-stylistic/metadata": "0.0.4", - "@stylistic/eslint-plugin-js": "0.0.4", - "@stylistic/eslint-plugin-ts": "0.0.4", + "@stylistic/eslint-plugin": "0.0.5", "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", "eslint-config-flat-gitignore": "^0.1.0", @@ -64,7 +62,6 @@ "devDependencies": { "@antfu/eslint-config": "workspace:*", "@antfu/ni": "^0.21.8", - "@stylistic/eslint-plugin-migrate": "0.0.4", "@types/fs-extra": "^11.0.2", "@types/node": "^20.6.4", "bumpp": "^9.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2468d4a198..eb29a9ab28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,15 +8,9 @@ importers: .: dependencies: - '@eslint-stylistic/metadata': - specifier: 0.0.4 - version: 0.0.4 - '@stylistic/eslint-plugin-js': - specifier: 0.0.4 - version: 0.0.4 - '@stylistic/eslint-plugin-ts': - specifier: 0.0.4 - version: 0.0.4(eslint@8.50.0)(typescript@5.2.2) + '@stylistic/eslint-plugin': + specifier: 0.0.5 + version: 0.0.5(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/eslint-plugin': specifier: ^6.7.2 version: 6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2) @@ -87,9 +81,6 @@ importers: '@antfu/ni': specifier: ^0.21.8 version: 0.21.8 - '@stylistic/eslint-plugin-migrate': - specifier: 0.0.4 - version: 0.0.4(eslint@8.50.0)(typescript@5.2.2) '@types/fs-extra': specifier: ^11.0.2 version: 11.0.2 @@ -989,9 +980,6 @@ packages: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint-stylistic/metadata@0.0.4: - resolution: {integrity: sha512-PlM+6bksCXBSS31s8NNHV2NuUy05N70tLwlQJ9pQ7FQqXwkefULcdAEWUeX8CAk3FK29Jw0l+J8U/nOYJdPrOg==} - /@eslint/eslintrc@2.1.2: resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1220,8 +1208,8 @@ packages: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@stylistic/eslint-plugin-js@0.0.4: - resolution: {integrity: sha512-W1rq2xxlFNhgZZJO+L59wtvlDI0xARYxx0WD8EeWNBO7NDybUSYSozCIcY9XvxQbTAsEXBjwqokeYm0crt7RxQ==} + /@stylistic/eslint-plugin-js@0.0.5: + resolution: {integrity: sha512-Ca3DAk4lHGELPHnHIOUc/SF3Pg58xd/AATqNMSTSoxjoadRk6MGDblriURXjEg7gif4ygiB3+EcIuphAceFYvQ==} dependencies: acorn: 8.10.0 escape-string-regexp: 4.0.0 @@ -1231,32 +1219,33 @@ packages: graphemer: 1.4.0 dev: false - /@stylistic/eslint-plugin-migrate@0.0.4(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-3rrerhj6xnhnZelOa6gzqFs9LiDqrY3tKZKSJpmCSQCijdfZYOJi6y00uCHGsSJK+gXNhRXgWU35q7DKu6dxsg==} + /@stylistic/eslint-plugin-ts@0.0.5(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-Ei/arToTJEF2nxxJLsXqK9qMxPgZi8IyM2X+1q8HRA11Q3zRMut8u1B1zwE8q9EhorBwZsgnmphgzmDG0Mot+w==} + peerDependencies: + eslint: '*' dependencies: - '@eslint-stylistic/metadata': 0.0.4 + '@stylistic/eslint-plugin-js': 0.0.5 + '@typescript-eslint/scope-manager': 6.7.2 + '@typescript-eslint/type-utils': 6.7.2(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/utils': 6.7.2(eslint@8.50.0)(typescript@5.2.2) + eslint: 8.50.0 + graphemer: 1.4.0 transitivePeerDependencies: - - eslint - supports-color - typescript - dev: true + dev: false - /@stylistic/eslint-plugin-ts@0.0.4(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-sWL4Km5j8S+TLyzya/3adxMWGkCm3lVasJIVQqhxVfwnlGkpMI0GgYVIu/ubdKPS+dSvqjUHpsXgqWfMRF2+cQ==} + /@stylistic/eslint-plugin@0.0.5(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-8InMNsdJrQqdKxCxd7Zc8HCYg2p5a4XXkqxRzjG7Soy+RWQdj7bAGfTmaDWB0i28CffYabOfOsAgRlfG9oe3Wg==} peerDependencies: eslint: '*' - typescript: '*' dependencies: - '@stylistic/eslint-plugin-js': 0.0.4 - '@typescript-eslint/scope-manager': 6.7.2 - '@typescript-eslint/type-utils': 6.7.2(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.2(eslint@8.50.0)(typescript@5.2.2) + '@stylistic/eslint-plugin-js': 0.0.5 + '@stylistic/eslint-plugin-ts': 0.0.5(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 - graphemer: 1.4.0 - typescript: 5.2.2 transitivePeerDependencies: - supports-color + - typescript dev: false /@types/chai-subset@1.3.3: @@ -1282,6 +1271,7 @@ packages: /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: false /@types/jsonfile@6.1.2: resolution: {integrity: sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w==} @@ -1309,6 +1299,7 @@ packages: /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: false /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} @@ -1370,6 +1361,7 @@ packages: dependencies: '@typescript-eslint/types': 6.7.2 '@typescript-eslint/visitor-keys': 6.7.2 + dev: false /@typescript-eslint/type-utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==} @@ -1394,6 +1386,7 @@ packages: /@typescript-eslint/types@6.7.2: resolution: {integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==} engines: {node: ^16.0.0 || >=18.0.0} + dev: false /@typescript-eslint/typescript-estree@6.7.2(typescript@5.2.2): resolution: {integrity: sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==} @@ -1414,6 +1407,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==} @@ -1432,6 +1426,7 @@ packages: transitivePeerDependencies: - supports-color - typescript + dev: false /@typescript-eslint/visitor-keys@6.7.2: resolution: {integrity: sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==} @@ -1439,6 +1434,7 @@ packages: dependencies: '@typescript-eslint/types': 6.7.2 eslint-visitor-keys: 3.4.3 + dev: false /@vitest/expect@0.34.5: resolution: {integrity: sha512-/3RBIV9XEH+nRpRMqDJBufKIOQaYUH2X6bt0rKSCW0MfKhXFLYsR5ivHifeajRSTsln0FwJbitxLKHSQz/Xwkw==} @@ -3950,6 +3946,7 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.2.2 + dev: false /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} diff --git a/src/configs/stylistic.ts b/src/configs/stylistic.ts index e58f3918aa..2fa6bc5748 100644 --- a/src/configs/stylistic.ts +++ b/src/configs/stylistic.ts @@ -1,28 +1,22 @@ import type { FlatESLintConfigItem } from 'eslint-define-config' -import { packages } from '@eslint-stylistic/metadata' -import { pluginStylisticJs, pluginStylisticTs, pluginTs } from '../plugins' -import { OFF } from '../flags' +import { pluginStylistic } from '../plugins' -const tsPackage = packages.find(i => i.shortId === 'ts')! - -export const javascriptStylistic: FlatESLintConfigItem[] = [ +export const stylistic: FlatESLintConfigItem[] = [ { plugins: { - style: pluginStylisticJs, + style: pluginStylistic, }, rules: { 'antfu/consistent-list-newline': 'error', 'antfu/if-newline': 'error', - 'comma-dangle': ['error', 'always-multiline'], 'curly': ['error', 'multi-or-nest', 'consistent'], - 'quotes': ['error', 'single'], - 'semi': ['error', 'never'], 'style/array-bracket-spacing': ['error', 'never'], 'style/arrow-spacing': ['error', { after: true, before: true }], 'style/block-spacing': ['error', 'always'], 'style/brace-style': ['error', 'stroustrup', { allowSingleLine: true }], + 'style/comma-dangle': ['error', 'always-multiline'], 'style/comma-spacing': ['error', { after: true, before: false }], 'style/comma-style': ['error', 'last'], 'style/computed-property-spacing': ['error', 'never', { enforceForClassMembers: true }], @@ -68,6 +62,7 @@ export const javascriptStylistic: FlatESLintConfigItem[] = [ 'style/key-spacing': ['error', { afterColon: true, beforeColon: false }], 'style/keyword-spacing': ['error', { after: true, before: true }], 'style/lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }], + 'style/member-delimiter-style': ['error', { multiline: { delimiter: 'none' } }], 'style/multiline-ternary': ['error', 'always-multiline'], 'style/no-mixed-spaces-and-tabs': 'error', 'style/no-multi-spaces': 'error', @@ -79,7 +74,9 @@ export const javascriptStylistic: FlatESLintConfigItem[] = [ 'style/object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }], 'style/operator-linebreak': ['error', 'before'], 'style/padded-blocks': ['error', { blocks: 'never', classes: 'never', switches: 'never' }], + 'style/quotes': ['error', 'single'], 'style/rest-spread-spacing': ['error', 'never'], + 'style/semi': ['error', 'never'], 'style/semi-spacing': ['error', { after: true, before: false }], 'style/space-before-blocks': ['error', 'always'], 'style/space-before-function-paren': ['error', { anonymous: 'always', asyncArrow: 'always', named: 'never' }], @@ -99,62 +96,8 @@ export const javascriptStylistic: FlatESLintConfigItem[] = [ }], 'style/template-curly-spacing': 'error', 'style/template-tag-spacing': ['error', 'never'], + 'style/type-annotation-spacing': ['error', {}], 'style/yield-star-spacing': ['error', 'both'], }, }, ] - -export const typescriptStylistic: FlatESLintConfigItem[] = [ - { - plugins: { - 'style-ts': pluginStylisticTs, - 'ts': pluginTs as any, - }, - rules: { - ...stylisticJsToTS(javascriptStylistic[0].rules!), - - 'comma-dangle': OFF, - 'quotes': OFF, - 'semi': OFF, - - 'style-ts/member-delimiter-style': ['error', { multiline: { delimiter: 'none' } }], - 'style-ts/type-annotation-spacing': ['error', {}], - - 'ts/comma-dangle': ['error', 'always-multiline'], - 'ts/quotes': ['error', 'single'], - 'ts/semi': ['error', 'never'], - }, - }, -] - -// TODO: move to ESLint Stylistic -function stylisticJsToTS(input: Record) { - return { - // turn off all stylistic rules from style - ...Object.fromEntries( - Object.entries(input) - .map(([key]) => { - if (!key.startsWith('style/')) - return null! - const basename = key.replace('style/', '') - if (tsPackage.rules.find(i => i.name === basename)) - return [key, OFF] - return null! - }) - .filter(Boolean), - ), - // rename all stylistic rules from style to style/ts - ...Object.fromEntries( - Object.entries(input) - .map(([key, value]) => { - if (!key.startsWith('style/')) - return null! - const basename = key.replace('style/', '') - return tsPackage.rules.find(i => i.name === basename) - ? [`style-ts/${basename}`, value] - : null! - }) - .filter(Boolean), - ), - } -} diff --git a/src/factory.ts b/src/factory.ts index 7d88c173e5..60ea70cf4d 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -8,16 +8,15 @@ import { ignores, imports, javascript, - javascriptStylistic, jsdoc, jsonc, markdown, node, sortPackageJson, sortTsconfig, + stylistic, test, typescript, - typescriptStylistic, typescriptWithLanguageServer, unicorn, vue, @@ -76,9 +75,6 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use if (enableVue) componentExts.push('vue') - if (enableStylistic) - configs.push(javascriptStylistic) - if (enableTypeScript) { configs.push(typescript({ componentExts })) @@ -88,11 +84,11 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use componentExts, })) } - - if (enableStylistic) - configs.push(typescriptStylistic) } + if (enableStylistic) + configs.push(stylistic) + if (options.test ?? true) configs.push(test({ isInEditor })) diff --git a/src/plugins.ts b/src/plugins.ts index 6ca6d3a726..0340f8e058 100644 --- a/src/plugins.ts +++ b/src/plugins.ts @@ -8,8 +8,7 @@ export { default as pluginJsdoc } from 'eslint-plugin-jsdoc' export { default as pluginJsonc } from 'eslint-plugin-jsonc' export { default as pluginMarkdown } from 'eslint-plugin-markdown' export { default as pluginNode } from 'eslint-plugin-n' -export { default as pluginStylisticJs } from '@stylistic/eslint-plugin-js' -export { default as pluginStylisticTs } from '@stylistic/eslint-plugin-ts' +export { default as pluginStylistic } from '@stylistic/eslint-plugin' export { default as pluginTs } from '@typescript-eslint/eslint-plugin' export { default as pluginUnicorn } from 'eslint-plugin-unicorn' export { default as pluginUnusedImports } from 'eslint-plugin-unused-imports'