From 7f880b6114c576c29e33116cc534d157d24699b4 Mon Sep 17 00:00:00 2001 From: Curly Date: Sat, 1 May 2021 16:34:50 +0800 Subject: [PATCH 1/5] refactor(cz-commitlint): set "keywords" and "bugs" in package.json --- @commitlint/cz-commitlint/package.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/@commitlint/cz-commitlint/package.json b/@commitlint/cz-commitlint/package.json index 63e6c32c80..339dc28ddd 100644 --- a/@commitlint/cz-commitlint/package.json +++ b/@commitlint/cz-commitlint/package.json @@ -6,10 +6,20 @@ "files": [ "lib" ], + "keywords": [ + "conventional-changelog", + "commitlint", + "cz", + "commitizen", + "cz-commitlint" + ], "scripts": { "commit": "git-cz" }, "homepage": "https://github.com/conventional-changelog/commitlint#readme", + "bugs": { + "url": "https://github.com/conventional-changelog/commitlint/issues" + }, "repository": { "type": "git", "url": "https://github.com/conventional-changelog/commitlint.git" From d059b866560cda15a4beb5dff1a06b9b98ceeae9 Mon Sep 17 00:00:00 2001 From: Curly Date: Sat, 1 May 2021 16:36:51 +0800 Subject: [PATCH 2/5] docs(cz-commitlint): make the introduction more readable --- @commitlint/cz-commitlint/README.md | 51 +++++++--------------------- docs/assets/cz-commitlint.png | Bin 26953 -> 76707 bytes 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/@commitlint/cz-commitlint/README.md b/@commitlint/cz-commitlint/README.md index 3f572ba595..f2bef1967f 100644 --- a/@commitlint/cz-commitlint/README.md +++ b/@commitlint/cz-commitlint/README.md @@ -10,15 +10,17 @@ The interactive process is inspired by [cz-conventional-changelog](https://githu ## Getting started -### Using commitizen adapter +### Configure commitizen adapter ```bash npm install --save-dev @commitlint/cz-commitlint commitizen +# or yarn +yarn add -D @commitlint/cz-commitlint commitizen ``` In package.json -``` +```json { "scripts": { "commit": "git-cz" @@ -33,56 +35,27 @@ In package.json ### Configure commitlint +**⚠️ Important: The required version of commitlint and shared configuration is above 12.1.2, update them if already existed in project** + ```bash # Install commitlint cli and conventional config npm install --save-dev @commitlint/config-conventional @commitlint/cli +# or yarn +yarn add @commitlint/config-conventional @commitlint/cli -D # Simple: config with conventional echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js - -# commitlint configuration is shareable, -# Install lerna-scopes -npm install --save-dev @commitlint/config-lerna-scopes -# Scalable: config with lerna-scopes in monorepo mode -echo "module.exports = {extends: ['@commitlint/config-conventional', '@commitlint/config-lerna-scopes']};" > commitlint.config.js -``` - -### Set Git Hooks by husky - -```base - -# ------- using npm ---------- -# Install Husky -npm install husky --save-dev -# Active hooks -npx husky install -# Add commitlint hook -npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1' -# Add commitizen hook -npx husky add .husky/prepare-commit-msg 'exec < /dev/tty && node_modules/.bin/cz --hook || true' - - -# ------- using yarn ---------- -# Install Husky -yarn add husky --dev -# Active hooks -yarn husky install -# Add commitlint hook -yarn husky add .husky/commit-msg 'yarn --no-install commitlint --edit $1' -# Add commitizen hook -yarn husky add .husky/prepare-commit-msg 'exec < /dev/tty && node_modules/.bin/cz --hook || true' - ``` ### Try it out ```bash git add . -npm run commit -# or -yarn run commit +npm run cz +# or yarn +yarn cz ``` ## Related -- [Commitlint Shared Configuration](https://github.com/conventional-changelog/commitlint#shared-configuration) - You can find more shared configurations are available to install and use with commitlint +- [Commitlint Reference Prompt](https://commitlint.js.org/#/reference-prompt) - How to customize prompt information by setting commitlint.config.js diff --git a/docs/assets/cz-commitlint.png b/docs/assets/cz-commitlint.png index 4f06b71d5007526576e4c5a7d7d40987d79fa761..35098c26f188def2208cab90febfc64695e36efd 100644 GIT binary patch literal 76707 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�f3JQit}=Rtc*w~7HxLlC`bmj>6W%}7e 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 D+Ttau literal 26953 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 z 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 Date: Mon, 11 Oct 2021 17:34:58 +0800 Subject: [PATCH 3/5] feat(cz-commitlint): support multiple scopes BREAKING CHANGE: add prompt.settings configuration Closes #2782 --- .../cz-commitlint/src/Question.test.ts | 57 ++++++++++++++++++- @commitlint/cz-commitlint/src/Question.ts | 28 +++++++-- .../cz-commitlint/src/SectionHeader.test.ts | 36 +++++++++++- .../cz-commitlint/src/SectionHeader.ts | 24 +++++++- .../src/store/defaultPromptConfigs.ts | 3 + .../cz-commitlint/src/store/prompts.test.ts | 24 ++++++++ .../cz-commitlint/src/store/prompts.ts | 22 ++++++- @commitlint/types/src/prompt.ts | 3 + docs/reference-prompt.md | 8 ++- 9 files changed, 196 insertions(+), 9 deletions(-) diff --git a/@commitlint/cz-commitlint/src/Question.test.ts b/@commitlint/cz-commitlint/src/Question.test.ts index 7a3cfb7d5b..ae316756d4 100644 --- a/@commitlint/cz-commitlint/src/Question.test.ts +++ b/@commitlint/cz-commitlint/src/Question.test.ts @@ -47,7 +47,7 @@ describe('name', () => { }); describe('type', () => { - test('should return "list" type when enumList is array', () => { + test('should return "list" type when enumList is array and multipleSelectDefaultDelimiter is undefined', () => { const question = new Question('scope', { ...QUESTION_CONFIG, enumList: ['cli', 'core'], @@ -57,6 +57,17 @@ describe('type', () => { expect(question).not.toHaveProperty('transformer'); }); + test('should return "checkbox" type when enumList is array and multipleSelectDefaultDelimiter is defined', () => { + const question = new Question('scope', { + ...QUESTION_CONFIG, + enumList: ['cli', 'core'], + multipleSelectDefaultDelimiter: ',', + }).question; + expect(question).toHaveProperty('type', 'checkbox'); + expect(question).toHaveProperty('choices', ['cli', 'core']); + expect(question).not.toHaveProperty('transformer'); + }); + test('should contain "skip" list item when enumList is array and skip is true', () => { const question = new Question('scope', { ...QUESTION_CONFIG, @@ -191,6 +202,50 @@ describe('filter', () => { expect(question.filter?.('xxxx', {})).toBe('Xxxx!'); }); + test('should split the string to items when multipleValueDelimiters is defined', () => { + const question = new Question('body', { + ...QUESTION_CONFIG, + caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + fullStopFn: (input: string) => input + '!', + multipleValueDelimiters: /,|\|/g, + }).question; + + expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); + }); + + test('should delimiters keep origin when multipleSelectDefaultDelimiter is defined', () => { + const question = new Question('body', { + ...QUESTION_CONFIG, + caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + fullStopFn: (input: string) => input + '!', + multipleValueDelimiters: /,|\|/g, + multipleSelectDefaultDelimiter: '/', + }).question; + + expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); + }); + + test('should fix each item when input is array', () => { + const question = new Question('body', { + ...QUESTION_CONFIG, + caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + fullStopFn: (input: string) => input + '!', + }).question; + + expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx,Yyyy!'); + }); + + test('should concat items with multipleSelectDefaultDelimiter when input is array', () => { + const question = new Question('body', { + ...QUESTION_CONFIG, + caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + fullStopFn: (input: string) => input + '!', + multipleSelectDefaultDelimiter: '|', + }).question; + + expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx|Yyyy!'); + }); + test('should works well when does not pass caseFn/fullStopFn', () => { const question = new Question('body', { ...QUESTION_CONFIG, diff --git a/@commitlint/cz-commitlint/src/Question.ts b/@commitlint/cz-commitlint/src/Question.ts index 109db59ef8..068082ac78 100644 --- a/@commitlint/cz-commitlint/src/Question.ts +++ b/@commitlint/cz-commitlint/src/Question.ts @@ -16,6 +16,8 @@ export type QuestionConfig = { name: string; value: string; }> | null; + multipleValueDelimiters?: RegExp; + multipleSelectDefaultDelimiter?: string; fullStopFn?: FullStopFn; caseFn?: CaseFn; }; @@ -29,6 +31,8 @@ export default class Question { private title: string; private caseFn: CaseFn; private fullStopFn: FullStopFn; + private multipleValueDelimiters?: RegExp; + private multipleSelectDefaultDelimiter?: string; constructor( name: PromptName, { @@ -42,6 +46,8 @@ export default class Question { caseFn, maxLength, minLength, + multipleValueDelimiters, + multipleSelectDefaultDelimiter, }: QuestionConfig ) { if (!name || typeof name !== 'string') @@ -54,10 +60,12 @@ export default class Question { this.skip = skip ?? false; this.fullStopFn = fullStopFn ?? ((_: string) => _); this.caseFn = caseFn ?? ((_: string) => _); + this.multipleValueDelimiters = multipleValueDelimiters; + this.multipleSelectDefaultDelimiter = multipleSelectDefaultDelimiter; if (enumList && Array.isArray(enumList)) { this._question = { - type: 'list', + type: multipleSelectDefaultDelimiter ? 'checkbox' : 'list', choices: skip ? [ ...enumList, @@ -140,8 +148,20 @@ export default class Question { return true; } - protected filter(input: string): string { - return this.caseFn(this.fullStopFn(input)); + protected filter(input: string | string[]): string { + // Array + // String,is enable MultiSelect -> input.replace(delimeter, this.case); -> Array + + const toCased = Array.isArray(input) + ? input.map(this.caseFn).join(this.multipleSelectDefaultDelimiter) + : this.multipleValueDelimiters + ? input.replace( + new RegExp(`[^${this.multipleValueDelimiters.source}]+`, 'g'), + this.caseFn + ) + : this.caseFn(input); + + return this.fullStopFn(toCased); } protected transformer(input: string, _answers: Answers): string { @@ -154,7 +174,7 @@ export default class Question { output.length <= this.maxLength && output.length >= this.minLength ? chalk.green : chalk.red; - return color('(' + output.length + ') ' + input); + return color('(' + output.length + ') ' + output); } protected decorateMessage(_answers: Answers): string { diff --git a/@commitlint/cz-commitlint/src/SectionHeader.test.ts b/@commitlint/cz-commitlint/src/SectionHeader.test.ts index 90fe7358be..6da978ff92 100644 --- a/@commitlint/cz-commitlint/src/SectionHeader.test.ts +++ b/@commitlint/cz-commitlint/src/SectionHeader.test.ts @@ -1,7 +1,16 @@ import {RuleConfigSeverity} from '@commitlint/types'; -import {combineCommitMessage, getQuestions} from './SectionHeader'; +import { + combineCommitMessage, + getQuestions, + getQuestionConfig, +} from './SectionHeader'; import {setPromptConfig} from './store/prompts'; import {setRules} from './store/rules'; + +beforeEach(() => { + setRules({}); + setPromptConfig({}); +}); describe('getQuestions', () => { test("should contain 'type','scope','subject'", () => { const questions = getQuestions(); @@ -36,6 +45,31 @@ describe('getQuestions', () => { }); }); +describe('getQuestionConfig', () => { + test("should 'scope' supports multiple items separated with ',\\/'", () => { + const config = getQuestionConfig('scope'); + expect(config).toEqual( + expect.objectContaining({ + multipleValueDelimiters: /\/|\\|,/g, + }) + ); + }); + + test("should 'scope' supports multiple select separated with settings.scopeEnumSeparator", () => { + setPromptConfig({ + settings: { + scopeEnumSeparator: '/', + }, + }); + const config = getQuestionConfig('scope'); + expect(config).toEqual( + expect.objectContaining({ + multipleSelectDefaultDelimiter: '/', + }) + ); + }); +}); + describe('combineCommitMessage', () => { test('should return correct string when type,scope,subject are not empty', () => { const commitMessage = combineCommitMessage({ diff --git a/@commitlint/cz-commitlint/src/SectionHeader.ts b/@commitlint/cz-commitlint/src/SectionHeader.ts index 9905ddcc33..dfc71d80de 100644 --- a/@commitlint/cz-commitlint/src/SectionHeader.ts +++ b/@commitlint/cz-commitlint/src/SectionHeader.ts @@ -2,6 +2,7 @@ import {PromptName, RuleField} from '@commitlint/types'; import {Answers, DistinctQuestion} from 'inquirer'; import Question, {QuestionConfig} from './Question'; import getRuleQuestionConfig from './services/getRuleQuestionConfig'; +import {getPromptSettings} from './store/prompts'; export class HeaderQuestion extends Question { headerMaxLength: number; @@ -47,8 +48,13 @@ export function getQuestions(): Array { } headerRuleFields.forEach((name) => { - const questionConfig = getRuleQuestionConfig(name); + const questionConfig = getQuestionConfig(name); if (questionConfig) { + if (name === 'scope') { + questionConfig.multipleSelectDefaultDelimiter = + getPromptSettings()['scopeEnumSeparator']; + questionConfig.multipleValueDelimiters = /\/|\\|,/g; + } const instance = new HeaderQuestion( name, questionConfig, @@ -60,3 +66,19 @@ export function getQuestions(): Array { }); return questions; } + +export function getQuestionConfig( + name: RuleField +): ReturnType { + const questionConfig = getRuleQuestionConfig(name); + + if (questionConfig) { + if (name === 'scope') { + questionConfig.multipleSelectDefaultDelimiter = + getPromptSettings()['scopeEnumSeparator']; + questionConfig.multipleValueDelimiters = /\/|\\|,/g; + } + } + + return questionConfig; +} diff --git a/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts b/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts index 99c649a1e5..f2824dd2cf 100644 --- a/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts +++ b/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts @@ -1,4 +1,7 @@ export default { + settings: { + scopeEnumSeparator: ',', + }, messages: { skip: '(press enter to skip)', max: '(max %d chars)', diff --git a/@commitlint/cz-commitlint/src/store/prompts.test.ts b/@commitlint/cz-commitlint/src/store/prompts.test.ts index b1584d6d4b..799eb69d08 100644 --- a/@commitlint/cz-commitlint/src/store/prompts.test.ts +++ b/@commitlint/cz-commitlint/src/store/prompts.test.ts @@ -2,10 +2,12 @@ import * as prompts from './prompts'; let getPromptQuestions: typeof prompts.getPromptQuestions; let getPromptMessages: typeof prompts.getPromptMessages; +let getPromptSettings: typeof prompts.getPromptSettings; let setPromptConfig: typeof prompts.setPromptConfig; beforeEach(() => { jest.resetModules(); + getPromptSettings = require('./prompts').getPromptSettings; getPromptMessages = require('./prompts').getPromptMessages; getPromptQuestions = require('./prompts').getPromptQuestions; setPromptConfig = require('./prompts').setPromptConfig; @@ -106,4 +108,26 @@ describe('setPromptConfig', () => { }); expect(getPromptMessages()).toEqual(initialMessages); }); + + test('should settings scopeEnumSeparator be set when value is ",\\/"', () => { + setPromptConfig({ + settings: { + scopeEnumSeparator: '/', + }, + }); + expect(getPromptSettings()).toEqual({ + scopeEnumSeparator: '/', + }); + + const processExit = jest + .spyOn(process, 'exit') + .mockImplementation(() => undefined as never); + setPromptConfig({ + settings: { + scopeEnumSeparator: '-', + }, + }); + expect(processExit).toHaveBeenCalledWith(1); + processExit.mockClear(); + }); }); diff --git a/@commitlint/cz-commitlint/src/store/prompts.ts b/@commitlint/cz-commitlint/src/store/prompts.ts index 649cd8d804..8e97f8ff89 100644 --- a/@commitlint/cz-commitlint/src/store/prompts.ts +++ b/@commitlint/cz-commitlint/src/store/prompts.ts @@ -11,7 +11,7 @@ const store: { }; export function setPromptConfig(newPromptConfig: UserPromptConfig): void { - const {messages, questions} = newPromptConfig; + const {settings, messages, questions} = newPromptConfig; if (messages) { const requiredMessageKeys = Object.keys(defaultPromptConfigs.messages); requiredMessageKeys.forEach((key: string) => { @@ -25,6 +25,22 @@ export function setPromptConfig(newPromptConfig: UserPromptConfig): void { if (questions && isPlainObject(questions)) { store[storeKey]['questions'] = questions; } + + if (settings && isPlainObject(settings)) { + if ( + settings['scopeEnumSeparator'] && + !/^\/|\\|,$/.test(settings['scopeEnumSeparator']) + ) { + console.log( + `prompt.settings.scopeEnumSeparator must be one of ',', '\\', '/'.` + ); + process.exit(1); + } + store[storeKey]['settings'] = { + ...defaultPromptConfigs.settings, + ...settings, + }; + } } export function getPromptMessages(): Readonly { @@ -34,3 +50,7 @@ export function getPromptMessages(): Readonly { export function getPromptQuestions(): Readonly { return (store[storeKey] && store[storeKey]['questions']) ?? {}; } + +export function getPromptSettings(): Readonly { + return (store[storeKey] && store[storeKey]['settings']) ?? {}; +} diff --git a/@commitlint/types/src/prompt.ts b/@commitlint/types/src/prompt.ts index 28bea77b1b..6e623ade87 100644 --- a/@commitlint/types/src/prompt.ts +++ b/@commitlint/types/src/prompt.ts @@ -16,6 +16,9 @@ export type PromptName = | 'issues'; export type PromptConfig = { + settings: { + scopeEnumSeparator: string; + }; messages: PromptMessages; questions: Partial< Record< diff --git a/docs/reference-prompt.md b/docs/reference-prompt.md index 0c4794ffd7..3d18f4fd0a 100644 --- a/docs/reference-prompt.md +++ b/docs/reference-prompt.md @@ -2,7 +2,13 @@ Prompt Config is used by `@commitlint/cz-commitlint`. -There are two fields: `messages` and `questions` +There are three fields: `settings`, `messages` and `questions` + +## `settings` + +Set optional options. + +- scopeEnumSeparator: Commitlint supports [multiple scopes](./concepts-commit-conventions.md?id=multiple-scopes), you can specify the delimiter. ## `messages` From 8cd15ee68ac5657f8c1996b3ea4262d33300d6f9 Mon Sep 17 00:00:00 2001 From: Curly Date: Tue, 12 Oct 2021 08:44:36 +0800 Subject: [PATCH 4/5] fix(cz-commitlint): support multiple cases & fix to sentence-case --- @commitlint/cz-commitlint/package.json | 4 +- .../cz-commitlint/src/Question.test.ts | 44 +++++++-------- @commitlint/cz-commitlint/src/Question.ts | 40 +++++++++----- .../cz-commitlint/src/utils/case-fn.test.ts | 51 +++++++++++------- .../cz-commitlint/src/utils/case-fn.ts | 54 +++++++++++++------ yarn.lock | 14 ++++- 6 files changed, 131 insertions(+), 76 deletions(-) diff --git a/@commitlint/cz-commitlint/package.json b/@commitlint/cz-commitlint/package.json index 420cfb9353..ddbeb7c6d7 100644 --- a/@commitlint/cz-commitlint/package.json +++ b/@commitlint/cz-commitlint/package.json @@ -36,6 +36,7 @@ } }, "dependencies": { + "@commitlint/ensure": "^13.2.0", "@commitlint/load": "^13.2.1", "@commitlint/types": "^13.2.0", "chalk": "^4.1.0", @@ -47,6 +48,7 @@ "inquirer": "^8.0.0" }, "devDependencies": { - "@types/inquirer": "^8.0.0" + "@types/inquirer": "^8.0.0", + "commitizen": "^4.2.4" } } diff --git a/@commitlint/cz-commitlint/src/Question.test.ts b/@commitlint/cz-commitlint/src/Question.test.ts index ae316756d4..18516eda48 100644 --- a/@commitlint/cz-commitlint/src/Question.test.ts +++ b/@commitlint/cz-commitlint/src/Question.test.ts @@ -15,6 +15,11 @@ const QUESTION_CONFIG = { messages: MESSAGES, }; +const caseFn = (input: string | string[], delimiter?: string) => + (Array.isArray(input) ? input : [input]) + .map((segment) => segment[0].toUpperCase() + segment.slice(1)) + .join(delimiter); + describe('name', () => { test('should throw error when name is not a meaningful string', () => { expect( @@ -195,55 +200,44 @@ describe('filter', () => { test('should auto fix case and full-stop', () => { const question = new Question('body', { ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + caseFn, fullStopFn: (input: string) => input + '!', }).question; expect(question.filter?.('xxxx', {})).toBe('Xxxx!'); }); - test('should split the string to items when multipleValueDelimiters is defined', () => { - const question = new Question('body', { - ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), - fullStopFn: (input: string) => input + '!', - multipleValueDelimiters: /,|\|/g, - }).question; - - expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); - }); - - test('should delimiters keep origin when multipleSelectDefaultDelimiter is defined', () => { + test('should transform each item with same case when input is array', () => { const question = new Question('body', { ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + caseFn, fullStopFn: (input: string) => input + '!', - multipleValueDelimiters: /,|\|/g, - multipleSelectDefaultDelimiter: '/', }).question; - expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); + expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx,Yyyy!'); }); - test('should fix each item when input is array', () => { + test('should concat items with multipleSelectDefaultDelimiter when input is array', () => { const question = new Question('body', { ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + caseFn, fullStopFn: (input: string) => input + '!', + multipleSelectDefaultDelimiter: '|', }).question; - expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx,Yyyy!'); + expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx|Yyyy!'); }); - test('should concat items with multipleSelectDefaultDelimiter when input is array', () => { + test('should split the string to items when multipleValueDelimiters is defined', () => { const question = new Question('body', { ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + caseFn, fullStopFn: (input: string) => input + '!', - multipleSelectDefaultDelimiter: '|', + multipleValueDelimiters: /,|\|/g, }).question; - expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx|Yyyy!'); + expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); + expect(question.filter?.('xxxx-yyyy-zzzz', {})).toBe('Xxxx-yyyy-zzzz!'); }); test('should works well when does not pass caseFn/fullStopFn', () => { @@ -307,7 +301,7 @@ describe('transformer', () => { test('should auto transform case and full-stop', () => { const question = new Question('body', { ...QUESTION_CONFIG, - caseFn: (input: string) => input[0].toUpperCase() + input.slice(1), + caseFn, fullStopFn: (input: string) => input + '!', }).question; diff --git a/@commitlint/cz-commitlint/src/Question.ts b/@commitlint/cz-commitlint/src/Question.ts index 068082ac78..ab5f611c05 100644 --- a/@commitlint/cz-commitlint/src/Question.ts +++ b/@commitlint/cz-commitlint/src/Question.ts @@ -59,7 +59,10 @@ export default class Question { this.title = title ?? ''; this.skip = skip ?? false; this.fullStopFn = fullStopFn ?? ((_: string) => _); - this.caseFn = caseFn ?? ((_: string) => _); + this.caseFn = + caseFn ?? + ((input: string | string[], delimiter?: string) => + Array.isArray(input) ? input.join(delimiter) : input); this.multipleValueDelimiters = multipleValueDelimiters; this.multipleSelectDefaultDelimiter = multipleSelectDefaultDelimiter; @@ -149,17 +152,30 @@ export default class Question { } protected filter(input: string | string[]): string { - // Array - // String,is enable MultiSelect -> input.replace(delimeter, this.case); -> Array - - const toCased = Array.isArray(input) - ? input.map(this.caseFn).join(this.multipleSelectDefaultDelimiter) - : this.multipleValueDelimiters - ? input.replace( - new RegExp(`[^${this.multipleValueDelimiters.source}]+`, 'g'), - this.caseFn - ) - : this.caseFn(input); + let toCased; + + // array + // - multipleSelectDefaultDelimiter + // - no multipleSelectDefaultDelimiter + // string + multipleValueDelimiters + // - split + // - not split + // string + if (Array.isArray(input)) { + toCased = this.caseFn(input, this.multipleSelectDefaultDelimiter); + } else if (this.multipleValueDelimiters) { + const segments = input.split(this.multipleValueDelimiters); + const casedString = this.caseFn(segments, ','); + const casedSegments = casedString.split(','); + toCased = input.replace( + new RegExp(`[^${this.multipleValueDelimiters.source}]+`, 'g'), + (segment) => { + return casedSegments[segments.indexOf(segment)]; + } + ); + } else { + toCased = this.caseFn(input); + } return this.fullStopFn(toCased); } diff --git a/@commitlint/cz-commitlint/src/utils/case-fn.test.ts b/@commitlint/cz-commitlint/src/utils/case-fn.test.ts index 038f70589f..a2ff502ba0 100644 --- a/@commitlint/cz-commitlint/src/utils/case-fn.test.ts +++ b/@commitlint/cz-commitlint/src/utils/case-fn.test.ts @@ -1,7 +1,7 @@ import {RuleConfigSeverity} from '@commitlint/types'; import getCaseFn from './case-fn'; -test('should not apply', () => { +test('should not transform when rule is disabled', () => { let rule = getCaseFn([RuleConfigSeverity.Disabled]); expect(rule('test')).toBe('test'); expect(rule('test-foo')).toBe('test-foo'); @@ -19,29 +19,17 @@ test('should not apply', () => { expect(rule('test-foo')).toBe('test-foo'); expect(rule('testFoo')).toBe('testFoo'); expect(rule('TEST_FOO')).toBe('TEST_FOO'); - - rule = getCaseFn([ - RuleConfigSeverity.Warning, - 'always', - ['camel-case', 'lowercase'], - ]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); }); test('should throw error on invalid casing', () => { - expect(() => getCaseFn([RuleConfigSeverity.Warning, 'always'])).toThrow( - 'Unknown target case "undefined"' - ); + let rule = getCaseFn([RuleConfigSeverity.Warning, 'always']); + expect(() => rule('test')).toThrow('Unknown target case "undefined"'); - expect(() => - getCaseFn([RuleConfigSeverity.Warning, 'always', 'foo']) - ).toThrow('Unknown target case "foo"'); + rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'foo']); + expect(() => rule('test')).toThrow('Unknown target case "foo"'); }); -test('should convert text correctly', () => { +test('should transform text correctly with single case', () => { let rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'camel-case']); expect(rule('TEST_FOOBar-baz baz')).toBe('testFooBarBazBaz'); @@ -64,10 +52,10 @@ test('should convert text correctly', () => { expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBAR-BAZ BAZ'); rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'sentence-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('Test_foobar-baz baz'); + expect(rule('tEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'sentencecase']); - expect(rule('TEST_FOOBar-baz baz')).toBe('Test_foobar-baz baz'); + expect(rule('tEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lower-case']); expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); @@ -77,4 +65,27 @@ test('should convert text correctly', () => { rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + + rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); + expect(rule(['TEST_FOOBar-baz', 'bAz'])).toBe('test_foobar-baz,baz'); + + rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); + expect(rule(['TEST_FOOBar-baz', 'bAz'], '|')).toBe('test_foobar-baz|baz'); +}); + +test('should transform text correctly with multiple cases', () => { + const rule = getCaseFn([ + RuleConfigSeverity.Warning, + 'always', + ['camel-case', 'lowercase'], + ]); + expect(rule('test')).toBe('test'); + expect(rule('test-foo')).toBe('test-foo'); + expect(rule('testFoo')).toBe('testFoo'); + expect(rule('TEST_FOO')).toBe('testFoo'); + + expect(rule(['testFoo', 'test_foo'])).toBe('testFoo,testFoo'); + expect(rule(['TEST_foo', 'test_foo'])).toBe('test_foo,test_foo'); + expect(rule(['TEST_FOO', 'Test_foo'])).toBe('testFoo,testFoo'); + expect(rule(['TEST_FOO', 'Test_foo'], '|')).toBe('testFoo|testFoo'); }); diff --git a/@commitlint/cz-commitlint/src/utils/case-fn.ts b/@commitlint/cz-commitlint/src/utils/case-fn.ts index 0bb098c7bf..f51b39c7be 100644 --- a/@commitlint/cz-commitlint/src/utils/case-fn.ts +++ b/@commitlint/cz-commitlint/src/utils/case-fn.ts @@ -1,12 +1,15 @@ +import _ from 'lodash'; import camelCase from 'lodash/camelCase'; import kebabCase from 'lodash/kebabCase'; import snakeCase from 'lodash/snakeCase'; import startCase from 'lodash/startCase'; import upperFirst from 'lodash/upperFirst'; -import {Rule} from '../types'; import {ruleIsActive, ruleIsNotApplicable} from './rules'; +import {TargetCaseType} from '@commitlint/types'; +import {case as ensureCase} from '@commitlint/ensure'; +import {Rule} from '../types'; -export type CaseFn = (input: string) => string; +export type CaseFn = (input: string | string[], delimiter?: string) => string; /** * Get forced case for rule @@ -14,40 +17,59 @@ export type CaseFn = (input: string) => string; * @return transform function applying the enforced case */ export default function getCaseFn(rule?: Rule): CaseFn { - const noop = (input: string) => input; + const noop = (input: string | string[], delimiter?: string) => + Array.isArray(input) ? input.join(delimiter) : input; if (!rule || !ruleIsActive(rule) || ruleIsNotApplicable(rule)) { return noop; } - const target = rule[2]; + const value = rule[2]; - if (Array.isArray(target)) { - return noop; - } + const caseList = Array.isArray(value) ? value : [value]; + + return (input: string | string[], delimiter?: string) => { + let matchedCase: TargetCaseType = caseList[0]; + const segments = Array.isArray(input) ? input : [input]; + + for (const segment of segments) { + const check = caseList.find((a) => ensureCase(segment, a)); + if (check) { + matchedCase = check; + break; + } + } + + return segments + .map((segment) => { + return toCase(segment, matchedCase); + }) + .join(delimiter); + }; +} +function toCase(input: string, target: TargetCaseType): string { switch (target) { case 'camel-case': - return (input: string) => camelCase(input); + return camelCase(input); case 'kebab-case': - return (input: string) => kebabCase(input); + return kebabCase(input); case 'snake-case': - return (input: string) => snakeCase(input); + return snakeCase(input); case 'pascal-case': - return (input: string) => upperFirst(camelCase(input)); + return upperFirst(camelCase(input)); case 'start-case': - return (input: string) => startCase(input); + return startCase(input); case 'upper-case': case 'uppercase': - return (input: string) => input.toUpperCase(); + return input.toUpperCase(); case 'sentence-case': case 'sentencecase': - return (input: string) => - `${input.charAt(0).toUpperCase()}${input.substring(1).toLowerCase()}`; + return input.charAt(0).toUpperCase() + input.slice(1); case 'lower-case': case 'lowercase': case 'lowerCase': // Backwards compat config-angular v4 - return (input: string) => input.toLowerCase(); + return input.toLowerCase(); default: throw new TypeError(`Unknown target case "${target}"`); } diff --git a/yarn.lock b/yarn.lock index 92557af63d..840e349eaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3798,7 +3798,7 @@ commander@~2.20.3: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commitizen@4.2.4: +commitizen@4.2.4, commitizen@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.2.4.tgz#a3e5b36bd7575f6bf6e7aa19dbbf06b0d8f37165" integrity sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw== @@ -7352,11 +7352,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-update@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" From 65835c522d31409ca95f36de50bb4af4938f3867 Mon Sep 17 00:00:00 2001 From: Curly Date: Tue, 12 Oct 2021 09:56:30 +0800 Subject: [PATCH 5/5] style(cz-commitlint): prettieer fix & remove meaningless comment --- @commitlint/cz-commitlint/src/Question.ts | 8 -------- @commitlint/load/src/load.ts | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/@commitlint/cz-commitlint/src/Question.ts b/@commitlint/cz-commitlint/src/Question.ts index ab5f611c05..5ed72223a4 100644 --- a/@commitlint/cz-commitlint/src/Question.ts +++ b/@commitlint/cz-commitlint/src/Question.ts @@ -153,14 +153,6 @@ export default class Question { protected filter(input: string | string[]): string { let toCased; - - // array - // - multipleSelectDefaultDelimiter - // - no multipleSelectDefaultDelimiter - // string + multipleValueDelimiters - // - split - // - not split - // string if (Array.isArray(input)) { toCased = this.caseFn(input, this.multipleSelectDefaultDelimiter); } else if (this.multipleValueDelimiters) { diff --git a/@commitlint/load/src/load.ts b/@commitlint/load/src/load.ts index a86d25fc08..4b835a546f 100644 --- a/@commitlint/load/src/load.ts +++ b/@commitlint/load/src/load.ts @@ -60,9 +60,9 @@ export default async function load( parserPreset: config.parserPreset, }); - const preset = (pickConfig( + const preset = pickConfig( mergeWith(extended, config, w) - ) as unknown) as UserPreset; + ) as unknown as UserPreset; preset.plugins = {}; // TODO: check if this is still necessary with the new factory based conventional changelog parsers