From 79d5c2517666bd2172a1fd0cd49bc11023019eb2 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 12:12:30 +0100 Subject: [PATCH 1/9] =?UTF-8?q?Build=20both=20legacy=20and=20flat=20config?= =?UTF-8?q?=20=F0=9F=AB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/all-legacy.ts | 3 ++ config/all.ts | 4 +- config/eslint/build-config.ts | 45 ----------------- config/eslint/build-flat-config.ts | 44 +++++++++++++++++ config/eslint/build-legacy-config.ts | 42 ++++++++++++++++ config/eslint/plugins.ts | 21 ++++++++ config/eslint/rules/index.ts | 20 ++++++++ config/eslint/rules/jest.ts | 4 +- eslint.config.js | 12 ++--- package.json | 1 + yarn.lock | 73 ++++++++++++++++++++++++++++ 11 files changed, 213 insertions(+), 56 deletions(-) create mode 100644 config/all-legacy.ts delete mode 100644 config/eslint/build-config.ts create mode 100644 config/eslint/build-flat-config.ts create mode 100644 config/eslint/build-legacy-config.ts create mode 100644 config/eslint/plugins.ts create mode 100644 config/eslint/rules/index.ts diff --git a/config/all-legacy.ts b/config/all-legacy.ts new file mode 100644 index 0000000..2a52eff --- /dev/null +++ b/config/all-legacy.ts @@ -0,0 +1,3 @@ +import buildLegacyConfig from './eslint/build-legacy-config' + +export default buildLegacyConfig() diff --git a/config/all.ts b/config/all.ts index 930301a..3ffe8d4 100644 --- a/config/all.ts +++ b/config/all.ts @@ -1,3 +1,3 @@ -import buildConfig from './eslint/build-config' +import buildFlatConfig from './eslint/build-flat-config' -export default buildConfig() +export default buildFlatConfig() diff --git a/config/eslint/build-config.ts b/config/eslint/build-config.ts deleted file mode 100644 index c7d6549..0000000 --- a/config/eslint/build-config.ts +++ /dev/null @@ -1,45 +0,0 @@ -import ESLintComments from './rules/eslint-comments' -import InclusiveLanguage from './rules/inclusive-language' -import { JestRules, JestTypescriptRules } from './rules/jest' -import JestFormatting from './rules/jest-formatting' -import PromiseRules from './rules/promise' -import SortDestructureKeys from './rules/sort-destructure-keys' -import SortExports from './rules/sort-exports' - -const buildConfig = () => ({ - env: { - 'jest/globals': true, - }, - plugins: [ - 'eslint-comments', - 'inclusive-language', - 'promise', - 'sort-destructure-keys', - 'sort-exports', - ], - rules: { - ...ESLintComments, - ...InclusiveLanguage, - ...PromiseRules, - ...SortDestructureKeys, - ...SortExports, - }, - overrides: [{ - files: ['*.spec.*', '*.test.*'], - plugins: [ - 'jest', - 'jest-formatting', - ], - rules: { - ...JestRules, - ...JestFormatting, - }, - }, { - files: ['*.spec.ts', '*.spec.tsx', '*.test.ts', '*.test.tsx'], - rules: { - ...JestTypescriptRules, - }, - }], -}) - -export default buildConfig diff --git a/config/eslint/build-flat-config.ts b/config/eslint/build-flat-config.ts new file mode 100644 index 0000000..7377aed --- /dev/null +++ b/config/eslint/build-flat-config.ts @@ -0,0 +1,44 @@ +import Plugins from './plugins' +import Rules from './rules' + +const buildFlatConfig = () => ([{ + plugins: { + 'eslint-comments': Plugins.eslintComments, + 'inclusive-language': Plugins.inclusiveLanguage, + 'promise': Plugins.promise, + 'sort-destructure-keys': Plugins.sortDestructureKeys, + 'sort-exports': Plugins.sortExports, + }, + rules: { + ...Rules.ESLintComments, + ...Rules.InclusiveLanguage, + ...Rules.Promise, + ...Rules.SortDestructureKeys, + ...Rules.SortExports, + }, +}, { + files: ['*.spec.*', '*.test.*'], + languageOptions: { + globals: { + 'jest/globals': true, + }, + }, + plugins: { + 'jest': Plugins.jest, + 'jest-formatting': Plugins.jestFormatting, + }, + rules: { + ...Rules.Jest, + ...Rules.JestFormatting, + }, +}, { + files: ['*.spec.ts', '*.spec.tsx', '*.test.ts', '*.test.tsx'], + plugins: { + 'jest': Plugins.jest, + }, + rules: { + ...Rules.JestFormatting, + }, +}]) + +export default buildFlatConfig diff --git a/config/eslint/build-legacy-config.ts b/config/eslint/build-legacy-config.ts new file mode 100644 index 0000000..3a6e75e --- /dev/null +++ b/config/eslint/build-legacy-config.ts @@ -0,0 +1,42 @@ +import Rules from './rules' + +const buildLegacyConfig = () => ({ + env: { + 'jest/globals': true, + }, + plugins: [ + 'eslint-comments', + 'inclusive-language', + 'promise', + 'sort-destructure-keys', + 'sort-exports', + ], + rules: { + ...Rules.ESLintComments, + ...Rules.InclusiveLanguage, + ...Rules.Promise, + ...Rules.SortDestructureKeys, + ...Rules.SortExports, + }, + overrides: [{ + files: ['*.spec.*', '*.test.*'], + plugins: [ + 'jest', + 'jest-formatting', + ], + rules: { + ...Rules.Jest, + ...Rules.JestFormatting, + }, + }, { + files: ['*.spec.ts', '*.spec.tsx', '*.test.ts', '*.test.tsx'], + plugins: [ + 'jest', + ], + rules: { + ...Rules.JestTypescript, + }, + }], +}) + +export default buildLegacyConfig diff --git a/config/eslint/plugins.ts b/config/eslint/plugins.ts new file mode 100644 index 0000000..7e72218 --- /dev/null +++ b/config/eslint/plugins.ts @@ -0,0 +1,21 @@ +// @ts-nocheck + +import eslintComments from 'eslint-plugin-eslint-comments' +import inclusiveLanguage from 'eslint-plugin-inclusive-language' +import jest from 'eslint-plugin-jest' +import jestFormatting from 'eslint-plugin-jest-formatting' +import promise from 'eslint-plugin-promise' +import sortDestructureKeys from 'eslint-plugin-sort-destructure-keys' +import sortExports from 'eslint-plugin-sort-exports' + +const Plugins = { + eslintComments, + inclusiveLanguage, + jest, + jestFormatting, + promise, + sortDestructureKeys, + sortExports, +} + +export default Plugins diff --git a/config/eslint/rules/index.ts b/config/eslint/rules/index.ts new file mode 100644 index 0000000..19135d5 --- /dev/null +++ b/config/eslint/rules/index.ts @@ -0,0 +1,20 @@ +import ESLintComments from './eslint-comments' +import InclusiveLanguage from './inclusive-language' +import { Jest, JestTypescript } from './jest' +import JestFormatting from './jest-formatting' +import Promise from './promise' +import SortDestructureKeys from './sort-destructure-keys' +import SortExports from './sort-exports' + +const Rules = { + ESLintComments, + InclusiveLanguage, + Jest, + JestFormatting, + JestTypescript, + Promise, + SortDestructureKeys, + SortExports, +} + +export default Rules diff --git a/config/eslint/rules/jest.ts b/config/eslint/rules/jest.ts index f32688b..7ef06f7 100644 --- a/config/eslint/rules/jest.ts +++ b/config/eslint/rules/jest.ts @@ -1,6 +1,6 @@ // https://github.com/jest-community/eslint-plugin-jest -export const JestRules = { +export const Jest = { 'jest/consistent-test-it': 2, 'jest/expect-expect': [2, { assertFunctionNames: ['expect', 'expect*'], @@ -64,7 +64,7 @@ export const JestRules = { 'jest/valid-title': 2, } -export const JestTypescriptRules = { +export const JestTypescript = { 'jest/no-untyped-mock-factory': 2, 'jest/unbound-method': 1, } diff --git a/eslint.config.js b/eslint.config.js index 31d5c88..8a718af 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,7 +1,5 @@ -export default [{ - rules: { - 'comma-dangle': [2, 'always-multiline'], - quotes: [2, 'single'], - semi: [2, 'never'], - }, -}] +import config from './config/all.ts' + +export default [ + ...config, +] diff --git a/package.json b/package.json index 3b38682..79b1b87 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@rollup/plugin-typescript": "11.1.6", "@types/eslint": "8.56.10", "@types/jest": "29.5.12", + "@types/markdownlint-rule-helpers": "0.21.5", "@types/node-notifier": "8.0.5", "babel-plugin-transform-import-meta": "2.2.1", "jest": "29.7.0", diff --git a/yarn.lock b/yarn.lock index ba13939..a555306 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1757,6 +1757,33 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/linkify-it@^5": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== + +"@types/markdown-it@*": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" + integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== + dependencies: + "@types/linkify-it" "^5" + "@types/mdurl" "^2" + +"@types/markdownlint-rule-helpers@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@types/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.21.5.tgz#604c71c29bc47d624832c484431c5a25e00c9e62" + integrity sha512-rqFCfRMEQSM2S4lxUTJwoeGH83iKo1wlcMtyGbSwu+7rdtB6X31xLMWTuUqONo2Vp4Yr9n8bdbU7sxPztwKxMg== + dependencies: + "@types/markdown-it" "*" + "@types/node" "*" + markdownlint "^0.30.0" + +"@types/mdurl@^2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== + "@types/node-notifier@8.0.5": version "8.0.5" resolved "https://registry.yarnpkg.com/@types/node-notifier/-/node-notifier-8.0.5.tgz#c5786810d16bbff10550e2d10efe5a17eaf1095e" @@ -2378,6 +2405,11 @@ entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +entities@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -3553,6 +3585,13 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== + dependencies: + uc.micro "^1.0.1" + linkify-it@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" @@ -3640,6 +3679,17 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +markdown-it@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== + dependencies: + argparse "^2.0.1" + entities "~3.0.1" + linkify-it "^4.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-it@14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" @@ -3657,6 +3707,11 @@ markdownlint-micromark@0.1.2: resolved "https://registry.yarnpkg.com/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz#5520e04febffa46741875a2f297509ffdb561f5c" integrity sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ== +markdownlint-micromark@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz#c465091b30d61a56027ccbfb981c80c96448c165" + integrity sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q== + markdownlint-micromark@0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz#4876996b60d4dceb3a02f4eee2d3a366eb9569fa" @@ -3677,6 +3732,14 @@ markdownlint@0.34.0: markdown-it "14.1.0" markdownlint-micromark "0.1.9" +markdownlint@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.30.0.tgz#e5b43f794c6810299cd4be86f8d54108e9169860" + integrity sha512-nInuFvI/rEzanAOArW5490Ez4EYpB5ODqVM0mcDYCPx9DKJWCQqCgejjiCvbSeE7sjbDscVtZmwr665qpF5xGA== + dependencies: + markdown-it "13.0.1" + markdownlint-micromark "0.1.7" + mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" @@ -3687,6 +3750,11 @@ mdn-data@2.0.30: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + mdurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" @@ -4567,6 +4635,11 @@ typescript@5.4.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" From 8c036c26372b54c96b294cc403f3d323b4379147 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 12:13:10 +0100 Subject: [PATCH 2/9] =?UTF-8?q?Resolve=20node=20modules=20and=20ignore=20t?= =?UTF-8?q?ests=20when=20building=20with=20Rollup=20=F0=9F=A5=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + rollup.config.js | 8 +++++++- yarn.lock | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 79b1b87..934c62d 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@babel/core": "7.24.6", "@babel/preset-env": "7.24.6", "@babel/preset-typescript": "7.24.7", + "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-replace": "5.0.7", "@rollup/plugin-typescript": "11.1.6", "@types/eslint": "8.56.10", diff --git a/rollup.config.js b/rollup.config.js index 907acea..034311c 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,6 +1,7 @@ import { readFileSync } from 'fs' import { resolve } from 'path' +import { nodeResolve } from '@rollup/plugin-node-resolve' import replace from '@rollup/plugin-replace' import typescript from '@rollup/plugin-typescript' import { terser } from 'rollup-plugin-terser' @@ -15,11 +16,16 @@ export default { format: 'es', }, plugins: [ + nodeResolve({ + preferBuiltins: true, + }), replace({ 'process.env.NODE_ENV': JSON.stringify('production'), preventAssignment: true, }), terser(), - typescript(), + typescript({ + exclude: ['**/*.spec.*'], + }), ], } diff --git a/yarn.lock b/yarn.lock index a555306..7051483 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1528,6 +1528,18 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@rollup/plugin-node-resolve@15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + "@rollup/plugin-replace@5.0.7": version "5.0.7" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" @@ -1798,6 +1810,11 @@ dependencies: undici-types "~5.26.4" +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" @@ -2129,6 +2146,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2985,6 +3007,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -3019,6 +3048,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" From 4ad5f017c0f60b9df3bd89fd7072e31325d77776 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 12:16:49 +0100 Subject: [PATCH 3/9] =?UTF-8?q?Use=20constants=20to=20define=20file=20path?= =?UTF-8?q?s=20=F0=9F=8C=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/eslint/build-flat-config.ts | 5 +++-- config/eslint/build-legacy-config.ts | 5 +++-- config/eslint/constants.ts | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 config/eslint/constants.ts diff --git a/config/eslint/build-flat-config.ts b/config/eslint/build-flat-config.ts index 7377aed..5db6687 100644 --- a/config/eslint/build-flat-config.ts +++ b/config/eslint/build-flat-config.ts @@ -1,3 +1,4 @@ +import { FILE_PATHS } from './constants' import Plugins from './plugins' import Rules from './rules' @@ -17,7 +18,7 @@ const buildFlatConfig = () => ([{ ...Rules.SortExports, }, }, { - files: ['*.spec.*', '*.test.*'], + files: FILE_PATHS.TESTS, languageOptions: { globals: { 'jest/globals': true, @@ -32,7 +33,7 @@ const buildFlatConfig = () => ([{ ...Rules.JestFormatting, }, }, { - files: ['*.spec.ts', '*.spec.tsx', '*.test.ts', '*.test.tsx'], + files: FILE_PATHS.TESTS_TYPESCRIPT, plugins: { 'jest': Plugins.jest, }, diff --git a/config/eslint/build-legacy-config.ts b/config/eslint/build-legacy-config.ts index 3a6e75e..4ed2fe2 100644 --- a/config/eslint/build-legacy-config.ts +++ b/config/eslint/build-legacy-config.ts @@ -1,3 +1,4 @@ +import { FILE_PATHS } from './constants' import Rules from './rules' const buildLegacyConfig = () => ({ @@ -19,7 +20,7 @@ const buildLegacyConfig = () => ({ ...Rules.SortExports, }, overrides: [{ - files: ['*.spec.*', '*.test.*'], + files: FILE_PATHS.TESTS, plugins: [ 'jest', 'jest-formatting', @@ -29,7 +30,7 @@ const buildLegacyConfig = () => ({ ...Rules.JestFormatting, }, }, { - files: ['*.spec.ts', '*.spec.tsx', '*.test.ts', '*.test.tsx'], + files: FILE_PATHS.TESTS_TYPESCRIPT, plugins: [ 'jest', ], diff --git a/config/eslint/constants.ts b/config/eslint/constants.ts new file mode 100644 index 0000000..9477531 --- /dev/null +++ b/config/eslint/constants.ts @@ -0,0 +1,16 @@ +const FILE_PATHS = { + TESTS: [ + '*.spec.*', + '*.test.*', + ], + TESTS_TYPESCRIPT: [ + '*.spec.ts', + '*.spec.tsx', + '*.test.ts', + '*.test.tsx', + ] +} + +export { + FILE_PATHS, +} From be22f278d648b07eacb44ef6dd047164ea2d0f26 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 13:44:50 +0100 Subject: [PATCH 4/9] =?UTF-8?q?Support=20both=20legacy=20and=20flat=20conf?= =?UTF-8?q?ig=20types=20for=20ESLint=20=F0=9F=8C=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc | 16 ++++++++ eslint.config.js | 5 +++ package.json | 4 +- src/index.ts | 30 ++++++++++---- src/linters/eslint.ts | 10 +++-- src/types/index.ts | 3 ++ yarn.lock | 96 +++++++++++++++++++++++++------------------ 7 files changed, 110 insertions(+), 54 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..b808fdb --- /dev/null +++ b/.eslintrc @@ -0,0 +1,16 @@ +{ + "extends": [ + "./lib/all-legacy" + ], + "rules": { + // "semi": [1, "always"] + }, + "parserOptions": { + "ecmaFeatures": { + "modules": true + }, + "ecmaVersion": 2018, + "requireConfigFile": false, + "sourceType": "module" + } +} diff --git a/eslint.config.js b/eslint.config.js index 8a718af..fb257b6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,4 +2,9 @@ import config from './config/all.ts' export default [ ...config, + { + rules: { + // semi: [2, 'always'], + } + } ] diff --git a/package.json b/package.json index 934c62d..3b7f91a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "chalk": "5.3.0", "chokidar": "3.6.0", "commander": "12.1.0", - "eslint": "9.4.0", + "eslint": "9.8.0", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-inclusive-language": "2.2.1", "eslint-plugin-jest": "28.6.0", @@ -47,7 +47,7 @@ "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-replace": "5.0.7", "@rollup/plugin-typescript": "11.1.6", - "@types/eslint": "8.56.10", + "@types/eslint": "9.6.0", "@types/jest": "29.5.12", "@types/markdownlint-rule-helpers": "0.21.5", "@types/node-notifier": "8.0.5", diff --git a/src/index.ts b/src/index.ts index a1ef394..7ac4aaf 100755 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ program .addHelpText('beforeAll', '\n✈️ Lint Pilot ✈️\n') .showHelpAfterError('\n💡 Run `lint-pilot --help` for more information.\n') -const runLinter = async ({ cache, filePattern, fix, linter, ignore }: RunLinter) => { +const runLinter = async ({ cache, eslintUseLegacyConfig, filePattern, fix, linter, ignore }: RunLinter) => { const startTime = new Date().getTime() colourLog.info(`Running ${linter.toLowerCase()}...`) @@ -35,6 +35,7 @@ const runLinter = async ({ cache, filePattern, fix, linter, ignore }: RunLinter) const report: LintReport = await linters[linter].lintFiles({ cache, + eslintUseLegacyConfig, files, fix, }) @@ -44,7 +45,7 @@ const runLinter = async ({ cache, filePattern, fix, linter, ignore }: RunLinter) return report } -const runLintPilot = ({ cache, filePatterns, fix, title, watch }: RunLintPilot) => { +const runLintPilot = ({ cache, eslintUseLegacyConfig, filePatterns, fix, title, watch }: RunLintPilot) => { const commonArgs = { cache, fix, @@ -54,6 +55,7 @@ const runLintPilot = ({ cache, filePatterns, fix, title, watch }: RunLintPilot) Promise.all([ runLinter({ ...commonArgs, + eslintUseLegacyConfig, filePattern: filePatterns.includePatterns[Linter.ESLint], linter: Linter.ESLint, }), @@ -96,12 +98,14 @@ program .option('--cache', 'cache linting results', false) .option('--clearCache', 'clear the cache', false) - .option('--ignore-dirs ', 'Directories to ignore globally') - .option('--ignore-patterns ', 'File patterns to ignore globally') - .option('--eslint-include ', 'File patterns to include for ESLint') + .option('--ignore-dirs ', 'directories to ignore globally') + .option('--ignore-patterns ', 'file patterns to ignore globally') + .option('--eslint-include ', 'file patterns to include for ESLint') .option('--debug', 'output additional debug information including the list of files being linted', false) - .action(({ cache, clearCache, debug, emoji, eslintInclude, fix, ignoreDirs, ignorePatterns, title, watch }) => { + .option('--eslint-use-legacy-config', 'set to true to use the legacy ESLint configuration', false) + + .action(({ cache, clearCache, debug, emoji, eslintInclude, eslintUseLegacyConfig, fix, ignoreDirs, ignorePatterns, title, watch }) => { clearTerminal() colourLog.title(`${emoji} ${title} ${emoji}`) console.log() @@ -117,7 +121,17 @@ program ignoreDirs, ignorePatterns, }) - runLintPilot({ cache, filePatterns, fix, title, watch }) + + const lintPilotOptions = { + cache, + eslintUseLegacyConfig, + filePatterns, + fix, + title, + watch, + } + + runLintPilot(lintPilotOptions) if (watch) { watchFiles({ @@ -129,7 +143,7 @@ program clearTerminal() colourLog.info(message) console.log() - runLintPilot({ cache, filePatterns, fix, title, watch }) + runLintPilot(lintPilotOptions) }) } }) diff --git a/src/linters/eslint.ts b/src/linters/eslint.ts index 9118c3f..19b3205 100644 --- a/src/linters/eslint.ts +++ b/src/linters/eslint.ts @@ -1,4 +1,4 @@ -import { ESLint } from 'eslint' +import { ESLint, loadESLint } from 'eslint' import { Linter, RuleSeverity } from '@Types' import { getCacheDirectory } from '@Utils/cache' @@ -7,9 +7,13 @@ import { formatResult } from '@Utils/transform' import type { LintFiles, LintReport, ReportResults, ReportSummary } from '@Types' -const lintFiles = async ({ cache, files, fix }: LintFiles): Promise => { +const lintFiles = async ({ cache, eslintUseLegacyConfig, files, fix }: LintFiles): Promise => { try { - const eslint = new ESLint({ + const CustomESLint = await loadESLint({ + useFlatConfig: eslintUseLegacyConfig ? false : true, + }) + + const eslint = new CustomESLint({ cache, cacheLocation: cache ? getCacheDirectory('.eslintcache') : undefined, fix, diff --git a/src/types/index.ts b/src/types/index.ts index cf9f16d..42430ba 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -63,12 +63,14 @@ interface FilePatterns { interface LintFiles { cache: boolean + eslintUseLegacyConfig?: boolean files: Array fix: boolean } interface RunLinter { cache: boolean + eslintUseLegacyConfig?: boolean filePattern: Array fix: boolean ignore: Array @@ -77,6 +79,7 @@ interface RunLinter { interface RunLintPilot { cache: boolean + eslintUseLegacyConfig: boolean filePatterns: FilePatterns fix: boolean title: string diff --git a/yarn.lock b/yarn.lock index 7051483..fc943d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1180,19 +1180,19 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== +"@eslint-community/regexpp@^4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== -"@eslint/config-array@^0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.15.1.tgz#1fa78b422d98f4e7979f2211a1fde137e26c7d61" - integrity sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ== +"@eslint/config-array@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" + integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== dependencies: - "@eslint/object-schema" "^2.1.3" + "@eslint/object-schema" "^2.1.4" debug "^4.3.1" - minimatch "^3.0.5" + minimatch "^3.1.2" "@eslint/eslintrc@^3.1.0": version "3.1.0" @@ -1209,15 +1209,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.4.0": - version "9.4.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.4.0.tgz#96a2edd37ec0551ce5f9540705be23951c008a0c" - integrity sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg== +"@eslint/js@9.8.0": + version "9.8.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.8.0.tgz#ae9bc14bb839713c5056f5018bcefa955556d3a4" + integrity sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA== -"@eslint/object-schema@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.3.tgz#e65ae80ee2927b4fd8c5c26b15ecacc2b2a6cc2a" - integrity sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw== +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -1717,10 +1717,10 @@ dependencies: "@babel/types" "^7.20.7" -"@types/eslint@8.56.10": - version "8.56.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== +"@types/eslint@9.6.0": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" + integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -1892,6 +1892,11 @@ acorn@^8.11.3, acorn@^8.4.1, acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.12.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -2539,10 +2544,10 @@ eslint-plugin-sort-exports@0.9.1: dependencies: minimatch "^9.0.3" -eslint-scope@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" - integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -2557,16 +2562,16 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -eslint@9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.4.0.tgz#79150c3610ae606eb131f1d648d5f43b3d45f3cd" - integrity sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA== +eslint@9.8.0: + version "9.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.8.0.tgz#a4f4a090c8ea2d10864d89a6603e02ce9f649f0f" + integrity sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/config-array" "^0.15.1" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.17.1" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.4.0" + "@eslint/js" "9.8.0" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.3.0" "@nodelib/fs.walk" "^1.2.8" @@ -2575,10 +2580,10 @@ eslint@9.4.0: cross-spawn "^7.0.2" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.0.1" + eslint-scope "^8.0.2" eslint-visitor-keys "^4.0.0" - espree "^10.0.1" - esquery "^1.4.2" + espree "^10.1.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^8.0.0" @@ -2606,15 +2611,24 @@ espree@^10.0.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" +espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -3822,7 +3836,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== From 8485343ddef094be29bfe3dd708925864d154b23 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 13:47:05 +0100 Subject: [PATCH 5/9] =?UTF-8?q?Fixed=20Jest=20mocks=20=F0=9F=8C=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rollup.config.js | 4 +--- src/linters/__tests__/stylelint.spec.ts | 2 +- src/linters/markdownlint/__tests__/fixFile.spec.ts | 4 ++-- tsconfig.json | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index 034311c..1c2a419 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -24,8 +24,6 @@ export default { preventAssignment: true, }), terser(), - typescript({ - exclude: ['**/*.spec.*'], - }), + typescript(), ], } diff --git a/src/linters/__tests__/stylelint.spec.ts b/src/linters/__tests__/stylelint.spec.ts index 88ebd0a..ac8bea4 100644 --- a/src/linters/__tests__/stylelint.spec.ts +++ b/src/linters/__tests__/stylelint.spec.ts @@ -15,7 +15,7 @@ describe('stylelint', () => { jest.spyOn(colourLog, 'error').mockImplementation(() => {}) const testFiles = ['index.css'] - const lintFilesMock = stylelint.lint as jest.Mock + const lintFilesMock = jest.mocked(stylelint.lint) const noErrorLintResults: Array = [{ deprecations: [], diff --git a/src/linters/markdownlint/__tests__/fixFile.spec.ts b/src/linters/markdownlint/__tests__/fixFile.spec.ts index bfdde3a..5f26d5d 100644 --- a/src/linters/markdownlint/__tests__/fixFile.spec.ts +++ b/src/linters/markdownlint/__tests__/fixFile.spec.ts @@ -21,8 +21,8 @@ describe('fixFile', () => { const fixedFileContent = 'Fixed file content' beforeEach(() => { - (readFileSync as jest.Mock).mockReturnValue(mockFileContent) - applyFixes.mockReturnValue(fixedFileContent) + jest.mocked(readFileSync).mockReturnValue(mockFileContent) + jest.mocked(applyFixes).mockReturnValue(fixedFileContent) }) it('reads the correct file and writes the fixed content back to the file', () => { diff --git a/tsconfig.json b/tsconfig.json index e4d4910..e1eacfc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "moduleResolution": "node", "outDir": "./lib", "paths": { - "@Jest": ["./jest-config/*"], + "@Jest/*": ["./jest-config/*"], "@Types": ["./src/types/index.ts"], "@Utils/*": ["./src/utils/*"], }, From 5adc3dd6c14ef738c6257f6e1932f9b4eaa79d4d Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 14:17:27 +0100 Subject: [PATCH 6/9] =?UTF-8?q?Added=20unit=20tests=20for=20legacy=20and?= =?UTF-8?q?=20flat=20config=20settings=20=F0=9F=8D=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/linters/__tests__/eslint.spec.ts | 48 ++++++++++++++++++------- src/linters/__tests__/stylelint.spec.ts | 29 +++++++++++---- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/linters/__tests__/eslint.spec.ts b/src/linters/__tests__/eslint.spec.ts index 3dfb386..522804d 100644 --- a/src/linters/__tests__/eslint.spec.ts +++ b/src/linters/__tests__/eslint.spec.ts @@ -1,4 +1,4 @@ -import { ESLint } from 'eslint' +import { ESLint, loadESLint } from 'eslint' import { expectedResultThemes } from '@Jest/testData' import colourLog from '@Utils/colourLog' @@ -13,8 +13,9 @@ describe('eslint', () => { jest.spyOn(colourLog, 'error').mockImplementation(() => {}) const testFiles = ['index.ts'] - const lintFilesMock = ESLint.prototype.lintFiles as jest.Mock - const outputFixesMock = ESLint.outputFixes as jest.Mock + const lintFilesMock = jest.mocked(ESLint.prototype.lintFiles) + const loadESLintMock = jest.mocked(loadESLint).mockResolvedValue(ESLint) + const outputFixesMock = jest.mocked(ESLint.outputFixes) const noErrorLintResults: Array = [{ errorCount: 0, @@ -28,8 +29,8 @@ describe('eslint', () => { warningCount: 0, }] - it('creates a new ESLint instance', async () => { - lintFilesMock.mockImplementationOnce(() => []) + it('creates a new ESLint instance using flat config', async () => { + lintFilesMock.mockImplementationOnce(async () => []) await eslintLib.lintFiles({ cache: false, @@ -37,6 +38,29 @@ describe('eslint', () => { fix: false }) + expect(loadESLintMock).toHaveBeenCalledOnceWith({ + useFlatConfig: true, + }) + expect(ESLint).toHaveBeenCalledOnceWith({ + cache: false, + cacheLocation: undefined, + fix: false, + }) + }) + + it('creates a new ESLint instance using legacy config', async () => { + lintFilesMock.mockImplementationOnce(async () => []) + + await eslintLib.lintFiles({ + cache: false, + eslintUseLegacyConfig: true, + files: testFiles, + fix: false + }) + + expect(loadESLintMock).toHaveBeenCalledOnceWith({ + useFlatConfig: false, + }) expect(ESLint).toHaveBeenCalledOnceWith({ cache: false, cacheLocation: undefined, @@ -45,7 +69,7 @@ describe('eslint', () => { }) it('creates a new ESLint instance with cacheing enabled', async () => { - lintFilesMock.mockImplementationOnce(() => []) + lintFilesMock.mockImplementationOnce(async () => []) await eslintLib.lintFiles({ cache: true, @@ -61,7 +85,7 @@ describe('eslint', () => { }) it('calls ESLint.lintFiles with the files', async () => { - lintFilesMock.mockImplementationOnce(() => []) + lintFilesMock.mockImplementationOnce(async () => []) await eslintLib.lintFiles({ cache: false, @@ -96,7 +120,7 @@ describe('eslint', () => { it('returns results and a summary when eslint successfully lints (no files)', async () => { const lintResults: Array = [] - lintFilesMock.mockImplementationOnce(() => lintResults) + lintFilesMock.mockImplementationOnce(async () => lintResults) expect(await eslintLib.lintFiles({ cache: false, @@ -117,7 +141,7 @@ describe('eslint', () => { }) it('returns results and a summary when eslint successfully lints (no errors)', async () => { - lintFilesMock.mockImplementationOnce(() => noErrorLintResults) + lintFilesMock.mockImplementationOnce(async () => noErrorLintResults) expect(await eslintLib.lintFiles({ cache: false, @@ -223,7 +247,7 @@ describe('eslint', () => { warningCount: 0, }] - lintFilesMock.mockImplementationOnce(() => lintResults) + lintFilesMock.mockImplementationOnce(async () => lintResults) expect(await eslintLib.lintFiles({ cache: false, @@ -283,7 +307,7 @@ describe('eslint', () => { }) it('does not fix lint errors when the fix option is disabled', async () => { - lintFilesMock.mockImplementationOnce(() => noErrorLintResults) + lintFilesMock.mockImplementationOnce(async () => noErrorLintResults) await eslintLib.lintFiles({ cache: false, @@ -299,7 +323,7 @@ describe('eslint', () => { }) it('fixes lint errors when the fix option is enabled', async () => { - lintFilesMock.mockImplementationOnce(() => noErrorLintResults) + lintFilesMock.mockImplementationOnce(async () => noErrorLintResults) await eslintLib.lintFiles({ cache: false, diff --git a/src/linters/__tests__/stylelint.spec.ts b/src/linters/__tests__/stylelint.spec.ts index ac8bea4..bfd014b 100644 --- a/src/linters/__tests__/stylelint.spec.ts +++ b/src/linters/__tests__/stylelint.spec.ts @@ -17,6 +17,14 @@ describe('stylelint', () => { const testFiles = ['index.css'] const lintFilesMock = jest.mocked(stylelint.lint) + const commonLintFilesResult = { + cwd: '', + errored: false, + output: '', + report: '', + reportedDisables: [], + } + const noErrorLintResults: Array = [{ deprecations: [], invalidOptionWarnings: [], @@ -26,7 +34,8 @@ describe('stylelint', () => { }] it('calls stylelint.lint with the files', async () => { - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: [], ruleMetadata: {}, })) @@ -52,7 +61,8 @@ describe('stylelint', () => { }) it('calls stylelint.lint with cacheing enabled', async () => { - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: [], ruleMetadata: {}, })) @@ -101,7 +111,8 @@ describe('stylelint', () => { it('returns results and a summary when stylelint successfully lints (no files)', async () => { const lintResults: Array = [] - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: lintResults, ruleMetadata: {}, })) @@ -125,7 +136,8 @@ describe('stylelint', () => { }) it('returns results and a summary when stylelint successfully lints (no errors)', async () => { - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: noErrorLintResults, ruleMetadata: {}, })) @@ -228,7 +240,8 @@ describe('stylelint', () => { }], }] - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: lintResults, ruleMetadata: { 'fixable-rule': { fixable: true }, @@ -288,7 +301,8 @@ describe('stylelint', () => { }) it('does not fix lint errors when the fix option is disabled', async () => { - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: noErrorLintResults, ruleMetadata: {}, })) @@ -306,7 +320,8 @@ describe('stylelint', () => { }) it('fixes lint errors when the fix option is enabled', async () => { - lintFilesMock.mockImplementationOnce(() => ({ + lintFilesMock.mockImplementationOnce(async () => ({ + ...commonLintFilesResult, results: noErrorLintResults, ruleMetadata: {}, })) From 1511a37b4388ea94c1d423c136450cf19994a496 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 14:17:52 +0100 Subject: [PATCH 7/9] =?UTF-8?q?Run=20lint=20command=20in=20the=20test=20Gi?= =?UTF-8?q?tHub=20action=20=F0=9F=A5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 572ad63..20116e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,6 +27,9 @@ jobs: - name: Install Dependencies run: yarn install --immutable + - name: Lint + run: yarn lint --ignore-patterns '**/*.ts' + - name: Run Tests run: yarn test --coverage From 5d1571f2c5a778ed8780804acf0f1042ae2e82ef Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 15:19:18 +0100 Subject: [PATCH 8/9] =?UTF-8?q?Fixed=20JestTypescript=20config=20?= =?UTF-8?q?=F0=9F=A5=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/eslint/build-flat-config.ts | 5 +---- config/eslint/build-legacy-config.ts | 3 --- src/linters/eslint.ts | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/config/eslint/build-flat-config.ts b/config/eslint/build-flat-config.ts index 5db6687..25c5bd8 100644 --- a/config/eslint/build-flat-config.ts +++ b/config/eslint/build-flat-config.ts @@ -34,11 +34,8 @@ const buildFlatConfig = () => ([{ }, }, { files: FILE_PATHS.TESTS_TYPESCRIPT, - plugins: { - 'jest': Plugins.jest, - }, rules: { - ...Rules.JestFormatting, + ...Rules.JestTypescript, }, }]) diff --git a/config/eslint/build-legacy-config.ts b/config/eslint/build-legacy-config.ts index 4ed2fe2..82b794d 100644 --- a/config/eslint/build-legacy-config.ts +++ b/config/eslint/build-legacy-config.ts @@ -31,9 +31,6 @@ const buildLegacyConfig = () => ({ }, }, { files: FILE_PATHS.TESTS_TYPESCRIPT, - plugins: [ - 'jest', - ], rules: { ...Rules.JestTypescript, }, diff --git a/src/linters/eslint.ts b/src/linters/eslint.ts index 19b3205..6120f31 100644 --- a/src/linters/eslint.ts +++ b/src/linters/eslint.ts @@ -10,7 +10,7 @@ import type { LintFiles, LintReport, ReportResults, ReportSummary } from '@Types const lintFiles = async ({ cache, eslintUseLegacyConfig, files, fix }: LintFiles): Promise => { try { const CustomESLint = await loadESLint({ - useFlatConfig: eslintUseLegacyConfig ? false : true, + useFlatConfig: !eslintUseLegacyConfig, }) const eslint = new CustomESLint({ From 28e029de44c6d0127a26a78817f02e04aa164890 Mon Sep 17 00:00:00 2001 From: Patrick Taylor Date: Fri, 2 Aug 2024 15:22:11 +0100 Subject: [PATCH 9/9] =?UTF-8?q?Use=20consistent=20formatting=20for=20rules?= =?UTF-8?q?=20and=20plugins=20=F0=9F=8D=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/eslint/build-flat-config.ts | 14 +++++++------- config/eslint/plugins.ts | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/config/eslint/build-flat-config.ts b/config/eslint/build-flat-config.ts index 25c5bd8..4304ba5 100644 --- a/config/eslint/build-flat-config.ts +++ b/config/eslint/build-flat-config.ts @@ -4,11 +4,11 @@ import Rules from './rules' const buildFlatConfig = () => ([{ plugins: { - 'eslint-comments': Plugins.eslintComments, - 'inclusive-language': Plugins.inclusiveLanguage, - 'promise': Plugins.promise, - 'sort-destructure-keys': Plugins.sortDestructureKeys, - 'sort-exports': Plugins.sortExports, + 'eslint-comments': Plugins.EslintComments, + 'inclusive-language': Plugins.InclusiveLanguage, + 'promise': Plugins.Promise, + 'sort-destructure-keys': Plugins.SortDestructureKeys, + 'sort-exports': Plugins.SortExports, }, rules: { ...Rules.ESLintComments, @@ -25,8 +25,8 @@ const buildFlatConfig = () => ([{ }, }, plugins: { - 'jest': Plugins.jest, - 'jest-formatting': Plugins.jestFormatting, + 'jest': Plugins.Jest, + 'jest-formatting': Plugins.JestFormatting, }, rules: { ...Rules.Jest, diff --git a/config/eslint/plugins.ts b/config/eslint/plugins.ts index 7e72218..5d1093a 100644 --- a/config/eslint/plugins.ts +++ b/config/eslint/plugins.ts @@ -1,21 +1,21 @@ // @ts-nocheck -import eslintComments from 'eslint-plugin-eslint-comments' -import inclusiveLanguage from 'eslint-plugin-inclusive-language' -import jest from 'eslint-plugin-jest' -import jestFormatting from 'eslint-plugin-jest-formatting' -import promise from 'eslint-plugin-promise' -import sortDestructureKeys from 'eslint-plugin-sort-destructure-keys' -import sortExports from 'eslint-plugin-sort-exports' +import EslintComments from 'eslint-plugin-eslint-comments' +import InclusiveLanguage from 'eslint-plugin-inclusive-language' +import Jest from 'eslint-plugin-jest' +import JestFormatting from 'eslint-plugin-jest-formatting' +import Promise from 'eslint-plugin-promise' +import SortDestructureKeys from 'eslint-plugin-sort-destructure-keys' +import SortExports from 'eslint-plugin-sort-exports' const Plugins = { - eslintComments, - inclusiveLanguage, - jest, - jestFormatting, - promise, - sortDestructureKeys, - sortExports, + EslintComments, + InclusiveLanguage, + Jest, + JestFormatting, + Promise, + SortDestructureKeys, + SortExports, } export default Plugins