From 696b7122bef3aa82f0b2666dfa92c6a38542ac34 Mon Sep 17 00:00:00 2001 From: Volodymyr Minchenko Date: Tue, 11 Jun 2024 06:59:57 +0300 Subject: [PATCH] feat: add new development flow thjs-123 --- commitlint.config.ts | 50 ++++++-------------------- dangerfile.ts | 84 +++++++++++++++++++++----------------------- package-lock.json | 26 ++++++++++++++ package.json | 1 + project.config.ts | 21 +++++++++-- 5 files changed, 98 insertions(+), 84 deletions(-) diff --git a/commitlint.config.ts b/commitlint.config.ts index fc6bb1ce..7c755b79 100644 --- a/commitlint.config.ts +++ b/commitlint.config.ts @@ -1,50 +1,22 @@ -import { type SyncRule, type UserConfig } from '@commitlint/types'; +import { RuleConfigSeverity, type UserConfig } from '@commitlint/types'; import { ProjectPrefix } from './project.config.js'; -const COMMIT_MODIFIERS = ['+', '*', '-']; -const COMMIT_MESSAGE_REGEXP = new RegExp( - `^(((${ProjectPrefix.APP})-[0-9]{1,6})|(${ProjectPrefix.ENVIRONMENTS.join( - '|' - )})): ([${COMMIT_MODIFIERS.join(',')}]) (.*\\S)$` -); -const COMMIT_MESSAGE_MATCH_RULE_MESSAGE = `commit message doesn't match format requirements -Commit message must have one of the following formats: - - -: - - : -Where: - - : ${ProjectPrefix.APP} - - : ${COMMIT_MODIFIERS.join(', ')} - - : ${ProjectPrefix.ENVIRONMENTS.join(', ')} -Examples: - - ${ProjectPrefix.APP}-5: + ui/ux lecture - - ${ProjectPrefix.APP}-12: * docker homework - - production: - comments in ui/ux homework`; - -const configuration: UserConfig = { - defaultIgnores: true, +const config: UserConfig = { + extends: ['@commitlint/config-conventional'], parserPreset: { parserOpts: { - headerCorrespondence: ['prefix', 'modifier', 'description'], - headerPattern: COMMIT_MESSAGE_REGEXP + issuePrefixes: ProjectPrefix.ISSUE_PREFIXES.map(prefix => `${prefix}-`) } }, - plugins: [ - { - rules: { - 'commit-message-match': (({ header }) => { - if (!COMMIT_MESSAGE_REGEXP.test(header as string)) { - return [false, COMMIT_MESSAGE_MATCH_RULE_MESSAGE]; - } - - return [true]; - }) as SyncRule - } - } - ], rules: { - 'commit-message-match': [2, 'always'] + 'references-empty': [RuleConfigSeverity.Error, 'never'], + 'scope-enum': [ + RuleConfigSeverity.Error, + 'always', + [...ProjectPrefix.SCOPES.APPS, ...ProjectPrefix.SCOPES.PACKAGES] + ] } }; -export default configuration; +export default config; diff --git a/dangerfile.ts b/dangerfile.ts index 9177c165..2ff29fb5 100644 --- a/dangerfile.ts +++ b/dangerfile.ts @@ -1,58 +1,56 @@ -import { - danger, - fail, - type GitHubPRDSL as LibraryGitHubDSL, - GitHubMergeRef, - GitHubRepo, - GitHubDSL -} from 'danger'; +import { type GitHubPRDSL as LibraryGitHubDSL, danger, fail } from 'danger'; -import { ProjectPrefix } from './project.config'; +import { ProjectPrefix } from './project.config.js'; + +const LABELS_EMPTY_LENGTH = 0; type GitHubPRDSL = LibraryGitHubDSL & { - head: GitHubMergeRef & { - repo: GitHubRepo & { - has_projects: boolean; - }; - }; - milestone: Record | null; labels: unknown[]; - project_id: string | null; + milestone: Record | null; + project_id: null | string; }; -const BranchPrefix = { - TASK: 'task', - FIX: 'fix' -} as const; - -const DangerConfig = { +type DangerConfig = { + ASSIGNEES: { + IS_REQUIRED: boolean; + }; + BRANCH: { + PATTERN: RegExp | null; + }; + LABELS: { + IS_REQUIRED: boolean; + }; + MILESTONE: { + IS_REQUIRED: boolean; + }; TITLE: { - IS_REQUIRED: true, + PATTERN: RegExp | null; + }; +}; + +const config: DangerConfig = { + ASSIGNEES: { + IS_REQUIRED: true + }, + BRANCH: { PATTERN: new RegExp( - `^((${ - ProjectPrefix.APP - })-[0-9]{1,6}): (.*\\S)$|(${ProjectPrefix.ENVIRONMENTS.join( - '|' - )}) to (${ProjectPrefix.ENVIRONMENTS.join('|')})$` + `^[0-9]{1,6}-${ProjectPrefix.CHANGE_TYPES.join('|')}-[a-zA-Z0-9-]+$|(${ProjectPrefix.ENVIRONMENTS.join('|')})$` ) }, - ASSIGNEES: { + LABELS: { IS_REQUIRED: true }, - LABELS: { + MILESTONE: { IS_REQUIRED: true }, - BRANCH: { - IS_REQUIRED: true, + TITLE: { PATTERN: new RegExp( - `^((${Object.values(BranchPrefix).join('|')})/(${ - ProjectPrefix.APP - })-[0-9]{1,6})-[a-zA-Z0-9-]+$|(${ProjectPrefix.ENVIRONMENTS.join('|')})$` + `^(${ProjectPrefix.CHANGE_TYPES.join('|')})(\\((${ProjectPrefix.SCOPES.APPS.join('|')}|${ProjectPrefix.SCOPES.PACKAGES.join('|')})(\\/(${ProjectPrefix.SCOPES.APPS.join('|')}|${ProjectPrefix.SCOPES.PACKAGES.join('|')}))*\\))?: (.*\\S )?(${ProjectPrefix.ISSUE_PREFIXES.join('|')})-[0-9]{1,6}((\\.[0-9]+){1,2})?$` ) } }; -const { pr } = danger.github as GitHubDSL & Record<'pr', GitHubPRDSL>; +const pr = danger.github.pr as GitHubPRDSL; const checkAssignees = (): void => { const hasAssignees = Boolean(pr.assignee); @@ -75,7 +73,7 @@ const checkTitle = (titlePattern: RegExp): void => { }; const checkLabels = (): void => { - const hasLabels = pr.labels.length > 0; + const hasLabels = pr.labels.length > LABELS_EMPTY_LENGTH; if (!hasLabels) { fail('This pull request should have at least one label.'); @@ -95,20 +93,20 @@ const checkBranch = (branchPattern: RegExp): void => { }; const applyDanger = (): void => { - if (DangerConfig.TITLE.IS_REQUIRED) { - checkTitle(DangerConfig.TITLE.PATTERN); + if (config.TITLE.PATTERN) { + checkTitle(config.TITLE.PATTERN); } - if (DangerConfig.ASSIGNEES.IS_REQUIRED) { + if (config.ASSIGNEES.IS_REQUIRED) { checkAssignees(); } - if (DangerConfig.LABELS.IS_REQUIRED) { + if (config.LABELS.IS_REQUIRED) { checkLabels(); } - if (DangerConfig.BRANCH.IS_REQUIRED) { - checkBranch(DangerConfig.BRANCH.PATTERN); + if (config.BRANCH.PATTERN) { + checkBranch(config.BRANCH.PATTERN); } }; diff --git a/package-lock.json b/package-lock.json index cb0a3a83..18526085 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ ], "devDependencies": { "@commitlint/cli": "19.3.0", + "@commitlint/config-conventional": "19.2.2", "@commitlint/types": "19.0.3", "@eslint/js": "9.4.0", "@ls-lint/ls-lint": "2.2.3", @@ -774,6 +775,19 @@ "node": ">=v18" } }, + "node_modules/@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, "node_modules/@commitlint/config-validator": { "version": "19.0.3", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", @@ -5046,6 +5060,18 @@ "node": ">=16" } }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/conventional-commits-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", diff --git a/package.json b/package.json index 1f250309..618fe84f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ }, "devDependencies": { "@commitlint/cli": "19.3.0", + "@commitlint/config-conventional": "19.2.2", "@commitlint/types": "19.0.3", "@eslint/js": "9.4.0", "@ls-lint/ls-lint": "2.2.3", diff --git a/project.config.ts b/project.config.ts index 1074f0fb..31aae286 100644 --- a/project.config.ts +++ b/project.config.ts @@ -1,6 +1,23 @@ const ProjectPrefix = { - APP: 'thjs', - ENVIRONMENTS: ['development', 'production'] + CHANGE_TYPES: [ + 'build', + 'chore', + 'ci', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test' + ], + ENVIRONMENTS: ['production', 'development'], + ISSUE_PREFIXES: ['thjs'], + SCOPES: { + APPS: ['frontend', 'backend'], + PACKAGES: ['shared'] + } } as const; export { ProjectPrefix };