From 2d567b3c726125530dc13e6315d35549906a545b Mon Sep 17 00:00:00 2001 From: Jesse Oberstein <7157500+joberstein@users.noreply.github.com> Date: Mon, 23 Oct 2023 22:53:47 -0400 Subject: [PATCH 1/4] feat(load): use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load --- @commitlint/load/package.json | 13 ++-- yarn.lock | 114 ++++------------------------------ 2 files changed, 16 insertions(+), 111 deletions(-) diff --git a/@commitlint/load/package.json b/@commitlint/load/package.json index db8c3bf719..891b67d80f 100644 --- a/@commitlint/load/package.json +++ b/@commitlint/load/package.json @@ -36,28 +36,25 @@ "license": "MIT", "devDependencies": { "@commitlint/test": "^18.0.0", - "@commitlint/utils": "^18.0.0", + "@commitlint/types": "^18.0.0", "@types/lodash.isplainobject": "^4.0.8", "@types/lodash.merge": "^4.6.8", "@types/lodash.uniq": "^4.5.8", + "@types/node": "^18.11.9", "conventional-changelog-atom": "^4.0.0", - "execa": "^5.0.0" + "typescript": "^5.2.2" }, "dependencies": { "@commitlint/config-validator": "^18.0.0", "@commitlint/execute-rule": "^18.0.0", "@commitlint/resolve-extends": "^18.0.0", - "@commitlint/types": "^18.0.0", - "@types/node": "^18.11.9", "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^5.2.2" + "resolve-from": "^5.0.0" }, "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" } diff --git a/yarn.lock b/yarn.lock index 0cacd1a7e2..08765c1dc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -302,13 +302,6 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -615,11 +608,6 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -635,14 +623,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" @@ -1821,26 +1801,6 @@ resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - "@types/babel__core@^7.1.14": version "7.20.2" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" @@ -2300,16 +2260,6 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.7.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - acorn@^8.9.0: version "8.10.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -2475,11 +2425,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3374,10 +3319,12 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig-typescript-loader@^4.0.0: - version "4.4.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" - integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" cosmiconfig@^7.0.0: version "7.1.0" @@ -3423,11 +3370,6 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-env@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -3637,11 +3579,6 @@ diff-sequences@^29.6.3: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5820,6 +5757,11 @@ jest@^29.6.2: import-local "^3.0.2" jest-cli "^29.7.0" +jiti@^1.19.1: + version "1.20.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6296,11 +6238,6 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: version "10.2.1" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" @@ -8519,25 +8456,6 @@ ts-api-utils@^1.0.1: resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -ts-node@^10.8.1: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -8819,11 +8737,6 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -9190,11 +9103,6 @@ yargs@^17.0.0, yargs@^17.3.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From e10033425908921a1839e24bbf4a8ab0e7b0d3c9 Mon Sep 17 00:00:00 2001 From: Jesse Oberstein <7157500+joberstein@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:39:43 -0500 Subject: [PATCH 2/4] fix(load): add support for async loaders for ESM applications --- .../load/fixtures/basic-config/.commitlintrc | 5 + .../fixtures/basic-config/.commitlintrc.cjs | 8 ++ .../fixtures/basic-config/.commitlintrc.js | 8 ++ .../fixtures/basic-config/.commitlintrc.json | 8 ++ .../fixtures/basic-config/.commitlintrc.yaml | 5 + .../fixtures/basic-config/.commitlintrc.yml | 5 + .../basic-config/commitlint.config.cjs | 8 ++ .../basic-config/commitlint.config.js | 8 ++ .../basic-config/esm/.commitlintrc.js | 8 ++ .../basic-config/esm/.commitlintrc.mjs | 8 ++ .../basic-config/esm/commitlint.config.js | 8 ++ .../basic-config/esm/commitlint.config.mjs | 8 ++ .../load/fixtures/basic-template/package.json | 3 + @commitlint/load/fixtures/config/package.json | 13 -- .../{config => extends-config}/.commitlintrc | 0 .../.commitlintrc.cjs | 0 .../.commitlintrc.js | 0 .../.commitlintrc.json | 0 .../.commitlintrc.yaml | 0 .../.commitlintrc.yml | 0 .../commitlint.config.cjs | 0 .../commitlint.config.js | 0 .../esm/.commitlintrc.js} | 0 .../esm/.commitlintrc.mjs} | 0 .../extends-config/esm/commitlint.config.js | 6 + .../extends-config/esm/commitlint.config.mjs | 6 + .../first-extended/index.js | 0 .../first-extended/second-extended/index.js | 0 .../fixtures/extends-js-template/package.json | 3 + @commitlint/load/src/load.test.ts | 117 ++++++++++++++---- @commitlint/load/src/utils/load-config.ts | 28 +++-- 31 files changed, 217 insertions(+), 46 deletions(-) create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc.cjs create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc.js create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc.json create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc.yaml create mode 100644 @commitlint/load/fixtures/basic-config/.commitlintrc.yml create mode 100644 @commitlint/load/fixtures/basic-config/commitlint.config.cjs create mode 100644 @commitlint/load/fixtures/basic-config/commitlint.config.js create mode 100644 @commitlint/load/fixtures/basic-config/esm/.commitlintrc.js create mode 100644 @commitlint/load/fixtures/basic-config/esm/.commitlintrc.mjs create mode 100644 @commitlint/load/fixtures/basic-config/esm/commitlint.config.js create mode 100644 @commitlint/load/fixtures/basic-config/esm/commitlint.config.mjs create mode 100644 @commitlint/load/fixtures/basic-template/package.json delete mode 100644 @commitlint/load/fixtures/config/package.json rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc (100%) rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc.cjs (100%) rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc.js (100%) rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc.json (100%) rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc.yaml (100%) rename @commitlint/load/fixtures/{config => extends-config}/.commitlintrc.yml (100%) rename @commitlint/load/fixtures/{config => extends-config}/commitlint.config.cjs (100%) rename @commitlint/load/fixtures/{config => extends-config}/commitlint.config.js (100%) rename @commitlint/load/fixtures/{config/.commitlintrc.mjs => extends-config/esm/.commitlintrc.js} (100%) rename @commitlint/load/fixtures/{config/commitlint.config.mjs => extends-config/esm/.commitlintrc.mjs} (100%) create mode 100644 @commitlint/load/fixtures/extends-config/esm/commitlint.config.js create mode 100644 @commitlint/load/fixtures/extends-config/esm/commitlint.config.mjs rename @commitlint/load/fixtures/{recursive-extends-js-template => extends-js-template}/first-extended/index.js (100%) rename @commitlint/load/fixtures/{recursive-extends-js-template => extends-js-template}/first-extended/second-extended/index.js (100%) create mode 100644 @commitlint/load/fixtures/extends-js-template/package.json diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc b/@commitlint/load/fixtures/basic-config/.commitlintrc new file mode 100644 index 0000000000..c0c57253b1 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc @@ -0,0 +1,5 @@ +formatter: '@commitlint/format' +rules: + zero: [0, 'never'] + one: [1, 'always'] + two: [2, 'never'] \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs b/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs new file mode 100644 index 0000000000..2f37065f43 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs @@ -0,0 +1,8 @@ +module.exports = { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.js b/@commitlint/load/fixtures/basic-config/.commitlintrc.js new file mode 100644 index 0000000000..2f37065f43 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.js @@ -0,0 +1,8 @@ +module.exports = { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.json b/@commitlint/load/fixtures/basic-config/.commitlintrc.json new file mode 100644 index 0000000000..df7c0e9b36 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.json @@ -0,0 +1,8 @@ +{ + "formatter": "@commitlint/format", + "rules": { + "zero": [0, "never"], + "one": [1, "always"], + "two": [2, "never"] + } +} \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.yaml b/@commitlint/load/fixtures/basic-config/.commitlintrc.yaml new file mode 100644 index 0000000000..c0c57253b1 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.yaml @@ -0,0 +1,5 @@ +formatter: '@commitlint/format' +rules: + zero: [0, 'never'] + one: [1, 'always'] + two: [2, 'never'] \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.yml b/@commitlint/load/fixtures/basic-config/.commitlintrc.yml new file mode 100644 index 0000000000..c0c57253b1 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.yml @@ -0,0 +1,5 @@ +formatter: '@commitlint/format' +rules: + zero: [0, 'never'] + one: [1, 'always'] + two: [2, 'never'] \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/commitlint.config.cjs b/@commitlint/load/fixtures/basic-config/commitlint.config.cjs new file mode 100644 index 0000000000..2f37065f43 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/commitlint.config.cjs @@ -0,0 +1,8 @@ +module.exports = { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/commitlint.config.js b/@commitlint/load/fixtures/basic-config/commitlint.config.js new file mode 100644 index 0000000000..2f37065f43 --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/commitlint.config.js @@ -0,0 +1,8 @@ +module.exports = { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.js b/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.js new file mode 100644 index 0000000000..fea4afc3ae --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.js @@ -0,0 +1,8 @@ +export default { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.mjs b/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.mjs new file mode 100644 index 0000000000..fea4afc3ae --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/esm/.commitlintrc.mjs @@ -0,0 +1,8 @@ +export default { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/esm/commitlint.config.js b/@commitlint/load/fixtures/basic-config/esm/commitlint.config.js new file mode 100644 index 0000000000..fea4afc3ae --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/esm/commitlint.config.js @@ -0,0 +1,8 @@ +export default { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-config/esm/commitlint.config.mjs b/@commitlint/load/fixtures/basic-config/esm/commitlint.config.mjs new file mode 100644 index 0000000000..fea4afc3ae --- /dev/null +++ b/@commitlint/load/fixtures/basic-config/esm/commitlint.config.mjs @@ -0,0 +1,8 @@ +export default { + formatter: '@commitlint/format', + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/basic-template/package.json b/@commitlint/load/fixtures/basic-template/package.json new file mode 100644 index 0000000000..0cef8e445f --- /dev/null +++ b/@commitlint/load/fixtures/basic-template/package.json @@ -0,0 +1,3 @@ +{ + "name": "load-test-js" +} \ No newline at end of file diff --git a/@commitlint/load/fixtures/config/package.json b/@commitlint/load/fixtures/config/package.json deleted file mode 100644 index 72a2dd6652..0000000000 --- a/@commitlint/load/fixtures/config/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commitlint": { - "extends": [ - "./first-extended" - ], - "rules": { - "zero": [ - 0, - "never" - ] - } - } -} \ No newline at end of file diff --git a/@commitlint/load/fixtures/config/.commitlintrc b/@commitlint/load/fixtures/extends-config/.commitlintrc similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc rename to @commitlint/load/fixtures/extends-config/.commitlintrc diff --git a/@commitlint/load/fixtures/config/.commitlintrc.cjs b/@commitlint/load/fixtures/extends-config/.commitlintrc.cjs similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.cjs rename to @commitlint/load/fixtures/extends-config/.commitlintrc.cjs diff --git a/@commitlint/load/fixtures/config/.commitlintrc.js b/@commitlint/load/fixtures/extends-config/.commitlintrc.js similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.js rename to @commitlint/load/fixtures/extends-config/.commitlintrc.js diff --git a/@commitlint/load/fixtures/config/.commitlintrc.json b/@commitlint/load/fixtures/extends-config/.commitlintrc.json similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.json rename to @commitlint/load/fixtures/extends-config/.commitlintrc.json diff --git a/@commitlint/load/fixtures/config/.commitlintrc.yaml b/@commitlint/load/fixtures/extends-config/.commitlintrc.yaml similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.yaml rename to @commitlint/load/fixtures/extends-config/.commitlintrc.yaml diff --git a/@commitlint/load/fixtures/config/.commitlintrc.yml b/@commitlint/load/fixtures/extends-config/.commitlintrc.yml similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.yml rename to @commitlint/load/fixtures/extends-config/.commitlintrc.yml diff --git a/@commitlint/load/fixtures/config/commitlint.config.cjs b/@commitlint/load/fixtures/extends-config/commitlint.config.cjs similarity index 100% rename from @commitlint/load/fixtures/config/commitlint.config.cjs rename to @commitlint/load/fixtures/extends-config/commitlint.config.cjs diff --git a/@commitlint/load/fixtures/config/commitlint.config.js b/@commitlint/load/fixtures/extends-config/commitlint.config.js similarity index 100% rename from @commitlint/load/fixtures/config/commitlint.config.js rename to @commitlint/load/fixtures/extends-config/commitlint.config.js diff --git a/@commitlint/load/fixtures/config/.commitlintrc.mjs b/@commitlint/load/fixtures/extends-config/esm/.commitlintrc.js similarity index 100% rename from @commitlint/load/fixtures/config/.commitlintrc.mjs rename to @commitlint/load/fixtures/extends-config/esm/.commitlintrc.js diff --git a/@commitlint/load/fixtures/config/commitlint.config.mjs b/@commitlint/load/fixtures/extends-config/esm/.commitlintrc.mjs similarity index 100% rename from @commitlint/load/fixtures/config/commitlint.config.mjs rename to @commitlint/load/fixtures/extends-config/esm/.commitlintrc.mjs diff --git a/@commitlint/load/fixtures/extends-config/esm/commitlint.config.js b/@commitlint/load/fixtures/extends-config/esm/commitlint.config.js new file mode 100644 index 0000000000..bd3061cabb --- /dev/null +++ b/@commitlint/load/fixtures/extends-config/esm/commitlint.config.js @@ -0,0 +1,6 @@ +export default { + extends: ['./first-extended'], + rules: { + zero: [0, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/extends-config/esm/commitlint.config.mjs b/@commitlint/load/fixtures/extends-config/esm/commitlint.config.mjs new file mode 100644 index 0000000000..bd3061cabb --- /dev/null +++ b/@commitlint/load/fixtures/extends-config/esm/commitlint.config.mjs @@ -0,0 +1,6 @@ +export default { + extends: ['./first-extended'], + rules: { + zero: [0, 'never'], + }, +}; \ No newline at end of file diff --git a/@commitlint/load/fixtures/recursive-extends-js-template/first-extended/index.js b/@commitlint/load/fixtures/extends-js-template/first-extended/index.js similarity index 100% rename from @commitlint/load/fixtures/recursive-extends-js-template/first-extended/index.js rename to @commitlint/load/fixtures/extends-js-template/first-extended/index.js diff --git a/@commitlint/load/fixtures/recursive-extends-js-template/first-extended/second-extended/index.js b/@commitlint/load/fixtures/extends-js-template/first-extended/second-extended/index.js similarity index 100% rename from @commitlint/load/fixtures/recursive-extends-js-template/first-extended/second-extended/index.js rename to @commitlint/load/fixtures/extends-js-template/first-extended/second-extended/index.js diff --git a/@commitlint/load/fixtures/extends-js-template/package.json b/@commitlint/load/fixtures/extends-js-template/package.json new file mode 100644 index 0000000000..0cef8e445f --- /dev/null +++ b/@commitlint/load/fixtures/extends-js-template/package.json @@ -0,0 +1,3 @@ +{ + "name": "load-test-js" +} \ No newline at end of file diff --git a/@commitlint/load/src/load.test.ts b/@commitlint/load/src/load.test.ts index c2b053689e..c4690774ef 100644 --- a/@commitlint/load/src/load.test.ts +++ b/@commitlint/load/src/load.test.ts @@ -188,41 +188,108 @@ test('respects cwd option', async () => { }); }); -const mjsConfigFiles = isDynamicAwaitSupported() - ? ['commitlint.config.mjs', '.commitlintrc.mjs'] - : []; +describe.each([['basic'], ['extends']])('%s config', (template) => { + const isExtendsTemplate = template === 'extends'; -test.each( - [ + const configFiles = [ 'commitlint.config.cjs', 'commitlint.config.js', + 'commitlint.config.mjs', 'package.json', '.commitlintrc', '.commitlintrc.cjs', '.commitlintrc.js', '.commitlintrc.json', + '.commitlintrc.mjs', '.commitlintrc.yml', '.commitlintrc.yaml', - ...mjsConfigFiles, - ].map((configFile) => [configFile]) -)('recursive extends with %s', async (configFile) => { - const cwd = await gitBootstrap(`fixtures/recursive-extends-js-template`); - const configPath = path.join(__dirname, `../fixtures/config/${configFile}`); - const config = readFileSync(configPath); - - writeFileSync(path.join(cwd, configFile), config); - - const actual = await load({}, {cwd}); - - expect(actual).toMatchObject({ - formatter: '@commitlint/format', - extends: ['./first-extended'], - plugins: {}, - rules: { - zero: [0, 'never'], - one: [1, 'always'], - two: [2, 'never'], - }, + ]; + + const configTestCases = [ + ...configFiles + .filter((filename) => !filename.endsWith('.mjs')) + .map((filename) => ({filename, isEsm: false})), + ...configFiles + .filter((filename) => + ['.mjs', '.js'].some((ext) => filename.endsWith(ext)) + ) + .map((filename) => ({filename, isEsm: true})), + ]; + + const getConfigContents = ({ + filename, + isEsm, + }): string | NodeJS.ArrayBufferView => { + if (filename === 'package.json') { + const configPath = path.join( + __dirname, + `../fixtures/${template}-config/.commitlintrc.json` + ); + const commitlint = JSON.parse( + readFileSync(configPath, {encoding: 'utf-8'}) + ); + return JSON.stringify({commitlint}); + } else { + const filePath = ['..', 'fixtures', `${template}-config`, filename]; + + if (isEsm) { + filePath.splice(3, 0, 'esm'); + } + + const configPath = path.join(__dirname, filePath.join('/')); + return readFileSync(configPath); + } + }; + + const esmBootstrap = (cwd: string) => { + const packageJsonPath = path.join(cwd, 'package.json'); + const packageJSON = JSON.parse( + readFileSync(packageJsonPath, {encoding: 'utf-8'}) + ); + + writeFileSync( + packageJsonPath, + JSON.stringify({ + ...packageJSON, + type: 'module', + }) + ); + }; + + const templateFolder = [template, isExtendsTemplate ? 'js' : '', 'template'] + .filter((elem) => elem) + .join('-'); + + it.each( + configTestCases + // Skip ESM tests for the extends suite until resolve-extends supports ESM + .filter(({isEsm}) => template !== 'extends' || !isEsm) + // Skip ESM tests if dynamic await is not supported; Jest will crash with a seg fault error + .filter(({isEsm}) => isDynamicAwaitSupported() || !isEsm) + )('$filename, ESM: $isEsm', async ({filename, isEsm}) => { + const cwd = await gitBootstrap(`fixtures/${templateFolder}`); + + if (isEsm) { + esmBootstrap(cwd); + } + + writeFileSync( + path.join(cwd, filename), + getConfigContents({filename, isEsm}) + ); + + const actual = await load({}, {cwd}); + + expect(actual).toMatchObject({ + formatter: '@commitlint/format', + extends: isExtendsTemplate ? ['./first-extended'] : [], + plugins: {}, + rules: { + zero: [0, 'never'], + one: [1, 'always'], + two: [2, 'never'], + }, + }); }); }); diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index e08353d8c4..e8d5550036 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -1,10 +1,11 @@ import { cosmiconfig, defaultLoadersSync, - Options, + type Options, type Loader, } from 'cosmiconfig'; import {TypeScriptLoader} from 'cosmiconfig-typescript-loader'; +import {existsSync, readFileSync} from 'fs'; import path from 'path'; export interface LoadConfigResult { @@ -27,7 +28,7 @@ export async function loadConfig( return tsLoaderInstance(...args); }; - const {searchPlaces, loaders} = getDynamicAwaitConfig(); + const {searchPlaces, loaders} = getDynamicAwaitConfig(cwd); const explorer = cosmiconfig(moduleName, { searchPlaces: [ @@ -71,7 +72,7 @@ export async function loadConfig( return null; } -// See the following issues for more context: +// See the following issues for more context, contributing to failing Jest tests: // - Issue: https://github.com/nodejs/node/issues/40058 // - Resolution: https://github.com/nodejs/node/pull/48510 (Node v20.8.0) export const isDynamicAwaitSupported = () => { @@ -83,16 +84,27 @@ export const isDynamicAwaitSupported = () => { return major >= 20 && minor >= 8; }; -// If dynamic await is supported (Node >= v20.8.0), support mjs config. +// Is the given directory is set up to use ESM (ECMAScript Modules)? +export const isEsmModule = (cwd: string) => { + const packagePath = path.join(cwd, 'package.json'); + + if (!existsSync(packagePath)) { + return false; + } + + const packageJSON = readFileSync(packagePath, {encoding: 'utf-8'}); + return JSON.parse(packageJSON)?.type === 'module'; +}; + +// If dynamic await is supported (Node >= v20.8.0) or directory uses ESM, +// support mjs config and async js/cjs loaders (dynamic import). // Otherwise, don't support mjs and use synchronous js/cjs loaders. -export const getDynamicAwaitConfig = (): Partial => - isDynamicAwaitSupported() +const getDynamicAwaitConfig = (cwd: string): Partial => + isDynamicAwaitSupported() || isEsmModule(cwd) ? { searchPlaces: [`.${moduleName}rc.mjs`, `${moduleName}.config.mjs`], - loaders: {}, } : { - searchPlaces: [], loaders: { '.cjs': defaultLoadersSync['.cjs'], '.js': defaultLoadersSync['.js'], From 6ce74e5bfa8a0937449359db16b7736b3bdd6888 Mon Sep 17 00:00:00 2001 From: Jesse Oberstein <7157500+joberstein@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:32:54 -0500 Subject: [PATCH 3/4] chore(load): simplify loader selection for js/cjs files --- @commitlint/load/src/utils/load-config.ts | 34 ++++++++--------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index e8d5550036..9d4a9b8728 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -1,8 +1,8 @@ import { cosmiconfig, defaultLoadersSync, - type Options, type Loader, + defaultLoaders, } from 'cosmiconfig'; import {TypeScriptLoader} from 'cosmiconfig-typescript-loader'; import {existsSync, readFileSync} from 'fs'; @@ -28,7 +28,12 @@ export async function loadConfig( return tsLoaderInstance(...args); }; - const {searchPlaces, loaders} = getDynamicAwaitConfig(cwd); + // If dynamic await is supported (Node >= v20.8.0) or directory uses ESM, support + // async js/cjs loaders (dynamic import). Otherwise, use synchronous js/cjs loaders. + const loaders = + isDynamicAwaitSupported() || isEsmModule(cwd) + ? defaultLoaders + : defaultLoadersSync; const explorer = cosmiconfig(moduleName, { searchPlaces: [ @@ -41,22 +46,22 @@ export async function loadConfig( `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `.${moduleName}rc.cjs`, + `.${moduleName}rc.mjs`, `${moduleName}.config.js`, `${moduleName}.config.cjs`, + `${moduleName}.config.mjs`, // files supported by TypescriptLoader `.${moduleName}rc.ts`, `.${moduleName}rc.cts`, `${moduleName}.config.ts`, `${moduleName}.config.cts`, - - ...(searchPlaces || []), ], loaders: { '.ts': tsLoader, '.cts': tsLoader, - - ...(loaders || {}), + '.cjs': loaders['.cjs'], + '.js': loaders['.js'], }, }); @@ -84,7 +89,7 @@ export const isDynamicAwaitSupported = () => { return major >= 20 && minor >= 8; }; -// Is the given directory is set up to use ESM (ECMAScript Modules)? +// Is the given directory set up to use ESM (ECMAScript Modules)? export const isEsmModule = (cwd: string) => { const packagePath = path.join(cwd, 'package.json'); @@ -95,18 +100,3 @@ export const isEsmModule = (cwd: string) => { const packageJSON = readFileSync(packagePath, {encoding: 'utf-8'}); return JSON.parse(packageJSON)?.type === 'module'; }; - -// If dynamic await is supported (Node >= v20.8.0) or directory uses ESM, -// support mjs config and async js/cjs loaders (dynamic import). -// Otherwise, don't support mjs and use synchronous js/cjs loaders. -const getDynamicAwaitConfig = (cwd: string): Partial => - isDynamicAwaitSupported() || isEsmModule(cwd) - ? { - searchPlaces: [`.${moduleName}rc.mjs`, `${moduleName}.config.mjs`], - } - : { - loaders: { - '.cjs': defaultLoadersSync['.cjs'], - '.js': defaultLoadersSync['.js'], - }, - }; From caa286f004ac36b050149cfa2d980ada0bf9486d Mon Sep 17 00:00:00 2001 From: Jesse Oberstein <7157500+joberstein@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:45:26 -0500 Subject: [PATCH 4/4] docs: remove node version restriction from mjs config --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a70bc84e67..3417f83813 100644 --- a/README.md +++ b/README.md @@ -142,12 +142,12 @@ Check the [husky documentation](https://typicode.github.io/husky/#/?id=manual) o - `.commitlintrc.yml` - `.commitlintrc.js` - `.commitlintrc.cjs` - - `.commitlintrc.mjs` (Node >= v20.8.0) + - `.commitlintrc.mjs` - `.commitlintrc.ts` - `.commitlintrc.cts` - `commitlint.config.js` - `commitlint.config.cjs` - - `commitlint.config.mjs` (Node >= v20.8.0) + - `commitlint.config.mjs` - `commitlint.config.ts` - `commitlint.config.cts` - `commitlint` field in `package.json`