From 88e2c60428166321c619081664fc2b055e3128a3 Mon Sep 17 00:00:00 2001 From: songhn233 Date: Sat, 31 Jul 2021 00:44:17 +0800 Subject: [PATCH 1/6] feat(load): add cosmiconfig typescript loader --- @commitlint/load/package.json | 1 + @commitlint/load/src/utils/load-config.ts | 19 +++++- yarn.lock | 78 ++++++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/@commitlint/load/package.json b/@commitlint/load/package.json index 239d75d1ff..db9e289ca9 100644 --- a/@commitlint/load/package.json +++ b/@commitlint/load/package.json @@ -44,6 +44,7 @@ "@commitlint/execute-rule": "^13.0.0", "@commitlint/resolve-extends": "^13.0.0", "@commitlint/types": "^13.1.0", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", "lodash": "^4.17.19", diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index 63613a5e4e..eaed0e533f 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -1,5 +1,6 @@ import path from 'path'; import {cosmiconfig} from 'cosmiconfig'; +import TSLoader from '@endemolshinegroup/cosmiconfig-typescript-loader'; export interface LoadConfigResult { config: unknown; @@ -11,7 +12,23 @@ export async function loadConfig( cwd: string, configPath?: string ): Promise { - const explorer = cosmiconfig('commitlint'); + const moduleName = 'commitlint'; + const explorer = cosmiconfig('commitlint', { + searchPlaces: [ + 'package.json', + `.${moduleName}rc`, + `.${moduleName}rc.json`, + `.${moduleName}rc.yaml`, + `.${moduleName}rc.yml`, + `.${moduleName}rc.ts`, + `.${moduleName}rc.js`, + `${moduleName}.config.ts`, + `${moduleName}.config.js`, + ], + loaders: { + '.ts': TSLoader, + }, + }); const explicitPath = configPath ? path.resolve(cwd, configPath) : undefined; const explore = explicitPath ? explorer.load : explorer.search; diff --git a/yarn.lock b/yarn.lock index 1ac8996319..53e8f908a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1236,6 +1236,16 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@endemolshinegroup/cosmiconfig-typescript-loader@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" + integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA== + dependencies: + lodash.get "^4" + make-error "^1" + ts-node "^9" + tslib "^2" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -2938,6 +2948,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +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" @@ -4019,6 +4034,11 @@ cp-file@^7.0.0: nested-error-stacks "^2.0.0" p-event "^4.1.0" +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-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4291,6 +4311,11 @@ diff-sequences@^27.0.6: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== +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" @@ -7170,6 +7195,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.get@^4: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -7210,11 +7240,21 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@4.17.15, lodash@4.x, lodash@^3.3.1, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.5.1, lodash@^4.7.0: +lodash@4.17.15: + version "4.17.15" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@4.x, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.5.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lodash@^3.3.1: + version "3.10.1" + resolved "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= + log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -7298,6 +7338,11 @@ make-error@1.x: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== +make-error@^1, 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@^8.0.9: version "8.0.14" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" @@ -7546,6 +7591,7 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== dependencies: + encoding "^0.1.12" minipass "^3.1.0" minipass-sized "^1.0.3" minizlib "^2.0.0" @@ -9536,6 +9582,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.6: version "0.5.16" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" @@ -10168,6 +10222,18 @@ ts-jest@27.0.4: semver "7.x" yargs-parser "20.x" +ts-node@^9: + version "9.1.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tsconfig-paths@^3.9.0: version "3.9.0" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" @@ -10188,6 +10254,11 @@ tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^2: + version "2.3.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -10871,3 +10942,8 @@ yargs@^17.0.0: string-width "^4.2.0" y18n "^5.0.5" yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From af4ec606e8cbe3808fd24537eb6fe59c3a412342 Mon Sep 17 00:00:00 2001 From: songhn233 Date: Sat, 31 Jul 2021 01:05:32 +0800 Subject: [PATCH 2/6] fix(types): prompt messages props optional --- @commitlint/types/src/prompt.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/@commitlint/types/src/prompt.ts b/@commitlint/types/src/prompt.ts index 28bea77b1b..d81b5f0648 100644 --- a/@commitlint/types/src/prompt.ts +++ b/@commitlint/types/src/prompt.ts @@ -36,13 +36,12 @@ export type PromptConfig = { }; export type PromptMessages = { - skip: string; - max: string; - min: string; - emptyWarning: string; - upperLimitWarning: string; - lowerLimitWarning: string; - [_key: string]: string; + skip?: string; + max?: string; + min?: string; + emptyWarning?: string; + upperLimitWarning?: string; + lowerLimitWarning?: string; }; export type UserPromptConfig = DeepPartial; From 27dfa0e91b1500cfa8938e88b4b9074c62673b40 Mon Sep 17 00:00:00 2001 From: songhn233 Date: Sat, 31 Jul 2021 01:17:30 +0800 Subject: [PATCH 3/6] fix(types): prompt messages key --- @commitlint/types/src/prompt.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/@commitlint/types/src/prompt.ts b/@commitlint/types/src/prompt.ts index d81b5f0648..d9eda48f05 100644 --- a/@commitlint/types/src/prompt.ts +++ b/@commitlint/types/src/prompt.ts @@ -42,6 +42,7 @@ export type PromptMessages = { emptyWarning?: string; upperLimitWarning?: string; lowerLimitWarning?: string; + [_key: string]: string | undefined; }; export type UserPromptConfig = DeepPartial; From 2f762d8cc7523d843f68bd3d9b18746326760455 Mon Sep 17 00:00:00 2001 From: songhn233 Date: Sat, 31 Jul 2021 10:44:26 +0800 Subject: [PATCH 4/6] fix(types): user config prompt --- @commitlint/load/src/utils/load-config.ts | 4 ++-- @commitlint/types/src/load.ts | 6 +++--- @commitlint/types/src/prompt.ts | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index eaed0e533f..7ee33b8e1b 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -1,6 +1,6 @@ import path from 'path'; import {cosmiconfig} from 'cosmiconfig'; -import TSLoader from '@endemolshinegroup/cosmiconfig-typescript-loader'; +import TypeScriptLoader from '@endemolshinegroup/cosmiconfig-typescript-loader'; export interface LoadConfigResult { config: unknown; @@ -26,7 +26,7 @@ export async function loadConfig( `${moduleName}.config.js`, ], loaders: { - '.ts': TSLoader, + '.ts': TypeScriptLoader, }, }); diff --git a/@commitlint/types/src/load.ts b/@commitlint/types/src/load.ts index b46b49b0ff..aafd5c40d9 100644 --- a/@commitlint/types/src/load.ts +++ b/@commitlint/types/src/load.ts @@ -1,4 +1,4 @@ -import {PromptConfig, UserPromptConfig} from './prompt'; +import {UserPromptConfig} from './prompt'; import { AsyncRule, Rule, @@ -29,7 +29,7 @@ export interface UserConfig { defaultIgnores?: boolean; plugins?: (string | Plugin)[]; helpUrl?: string; - prompt?: PromptConfig; + prompt?: UserPromptConfig; } export interface UserPreset { @@ -40,7 +40,7 @@ export interface UserPreset { ignores?: ((commit: string) => boolean)[]; defaultIgnores?: boolean; plugins: PluginRecords; - prompt?: PromptConfig; + prompt?: UserPromptConfig; } export type QualifiedRules = Partial>; diff --git a/@commitlint/types/src/prompt.ts b/@commitlint/types/src/prompt.ts index d9eda48f05..28bea77b1b 100644 --- a/@commitlint/types/src/prompt.ts +++ b/@commitlint/types/src/prompt.ts @@ -36,13 +36,13 @@ export type PromptConfig = { }; export type PromptMessages = { - skip?: string; - max?: string; - min?: string; - emptyWarning?: string; - upperLimitWarning?: string; - lowerLimitWarning?: string; - [_key: string]: string | undefined; + skip: string; + max: string; + min: string; + emptyWarning: string; + upperLimitWarning: string; + lowerLimitWarning: string; + [_key: string]: string; }; export type UserPromptConfig = DeepPartial; From dd1854890eb1a0ff4ff55002c86eb2523f61d76d Mon Sep 17 00:00:00 2001 From: Songhn Date: Wed, 4 Aug 2021 12:28:27 +0800 Subject: [PATCH 5/6] style(load-config): variable instead of literal Co-authored-by: Ade Attwood --- @commitlint/load/src/utils/load-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index 7ee33b8e1b..ee5759aaa3 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -13,7 +13,7 @@ export async function loadConfig( configPath?: string ): Promise { const moduleName = 'commitlint'; - const explorer = cosmiconfig('commitlint', { + const explorer = cosmiconfig(moduleName, { searchPlaces: [ 'package.json', `.${moduleName}rc`, From 0494a58d4fa62f4d65a34fda49d9523de0fb4c20 Mon Sep 17 00:00:00 2001 From: songhn233 Date: Fri, 6 Aug 2021 03:20:36 +0800 Subject: [PATCH 6/6] test(load): recursive extends with ts file --- .../recursive-extends-ts/commitlint.config.ts | 9 +++++++++ .../recursive-extends-ts/first-extended/index.ts | 7 +++++++ .../first-extended/second-extended/index.ts | 6 ++++++ .../load/fixtures/recursive-extends-ts/types.ts | 11 +++++++++++ @commitlint/load/src/load.test.ts | 16 ++++++++++++++++ 5 files changed, 49 insertions(+) create mode 100644 @commitlint/load/fixtures/recursive-extends-ts/commitlint.config.ts create mode 100644 @commitlint/load/fixtures/recursive-extends-ts/first-extended/index.ts create mode 100644 @commitlint/load/fixtures/recursive-extends-ts/first-extended/second-extended/index.ts create mode 100644 @commitlint/load/fixtures/recursive-extends-ts/types.ts diff --git a/@commitlint/load/fixtures/recursive-extends-ts/commitlint.config.ts b/@commitlint/load/fixtures/recursive-extends-ts/commitlint.config.ts new file mode 100644 index 0000000000..396cef436b --- /dev/null +++ b/@commitlint/load/fixtures/recursive-extends-ts/commitlint.config.ts @@ -0,0 +1,9 @@ +import type {UserConfig} from './types'; + +const Configuration: UserConfig = { + extends: ['./first-extended'], + rules: { + zero: [0, 'never', 'zero'] + } +}; +module.exports = Configuration; \ No newline at end of file diff --git a/@commitlint/load/fixtures/recursive-extends-ts/first-extended/index.ts b/@commitlint/load/fixtures/recursive-extends-ts/first-extended/index.ts new file mode 100644 index 0000000000..6111626aea --- /dev/null +++ b/@commitlint/load/fixtures/recursive-extends-ts/first-extended/index.ts @@ -0,0 +1,7 @@ +import type {UserConfig} from '../types'; +module.exports = { + extends: ['./second-extended'], + rules: { + one: [1, 'never', 'one'] + } +} as UserConfig; diff --git a/@commitlint/load/fixtures/recursive-extends-ts/first-extended/second-extended/index.ts b/@commitlint/load/fixtures/recursive-extends-ts/first-extended/second-extended/index.ts new file mode 100644 index 0000000000..fb8d23b4cd --- /dev/null +++ b/@commitlint/load/fixtures/recursive-extends-ts/first-extended/second-extended/index.ts @@ -0,0 +1,6 @@ +import type {UserConfig} from '../../types'; +module.exports = { + rules: { + two: [2, 'never', 'two'] + } +} as UserConfig; diff --git a/@commitlint/load/fixtures/recursive-extends-ts/types.ts b/@commitlint/load/fixtures/recursive-extends-ts/types.ts new file mode 100644 index 0000000000..5a4f43fbee --- /dev/null +++ b/@commitlint/load/fixtures/recursive-extends-ts/types.ts @@ -0,0 +1,11 @@ +export interface UserConfig { + extends?: string[]; + formatter?: string; + rules?: any; + parserPreset?: any; + ignores?: ((commit: string) => boolean)[]; + defaultIgnores?: boolean; + plugins?: (string | Plugin)[]; + helpUrl?: string; + prompt?: any; +} \ No newline at end of file diff --git a/@commitlint/load/src/load.test.ts b/@commitlint/load/src/load.test.ts index d192ff3548..024323d468 100644 --- a/@commitlint/load/src/load.test.ts +++ b/@commitlint/load/src/load.test.ts @@ -248,6 +248,22 @@ test('recursive extends with package.json file', async () => { }); }); +test('recursive extends with ts file', async () => { + const cwd = await gitBootstrap('fixtures/recursive-extends-ts'); + const actual = await load({}, {cwd}); + + expect(actual).toMatchObject({ + formatter: '@commitlint/format', + extends: ['./first-extended'], + plugins: {}, + rules: { + zero: [0, 'never', 'zero'], + one: [1, 'never', 'one'], + two: [2, 'never', 'two'], + }, + }); +}); + test('parser preset overwrites completely instead of merging', async () => { const cwd = await gitBootstrap('fixtures/parser-preset-override'); const actual = await load({}, {cwd});