-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path.czferc.js
132 lines (124 loc) · 4.15 KB
/
.czferc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// ==============================
// Base on https://github.com/commitizen/cz-conventional-changelog
// ==============================
const {types} = require('./commit_types.json');
const issueRegEx = /^((fix)|(re))\s\#[1-9][0-9]{0,4}$/g;
const pairRegEx = /^\w{3,15}(\/\w{3,15}){1,2}$/g;
const alphaNumericRegEx = /^[a-zA-Z0-9_ ]*$/g;
const numRegEx = /^[0-9]*$/g;
const longMessageRegEx = /^[a-zA-Z\d-_\/\(\) ]+$/g;
const alphaNumericValidator = value =>
value.match(alphaNumericRegEx) ? true : 'input should be alphanumeric only';
const numericValidator = value =>
value.match(numRegEx) ? true : 'issue should be numeric only';
const longMessageValidator = value =>
value
? value.match(longMessageRegEx)
? true
: 'input should not contain any special symbol'
: true;
/**
* @typedef {{type: string; scope: string; subject: string; body: string; isBreaking: boolean; breakingBody: string; breaking: string; isIssueAffected: boolean; issuesBody: string; issues: string;}} Answers
*/
/** @type import('cz-format-extension').Config<Answers> */
module.exports = {
questions({inquirer}) {
return [
{
type: 'list',
name: 'type',
message: "Select the type of change that you're committing",
choices: types,
},
// {
// type: 'input',
// name: 'scope',
// message:
// 'What is the scope of this change (e.g. component or file name): (press enter to skip)\n',
// validate: alphaNumericValidator,
// },
{
type: 'input',
name: 'issues',
message: 'Add issue references:\n',
// when: answers => answers.isIssueAffected,
default: undefined,
validate: numericValidator,
},
{
type: 'input',
name: 'pair',
message:
'Provide working dev pair names (e.g. dev1/dev2): (press enter to skip)\n',
validate: pair =>
pair
? pair.match(pairRegEx)
? true
: 'pair names should be in given format (e.g. dev1/dev2)(max 15 chars per dev)'
: true,
},
{
type: 'input',
name: 'subject',
message:
'Write a short, imperative tense description of the change (max 95 chars)\n',
validate: subject =>
subject.length === 0 ? 'subject is required' : true,
},
{
type: 'input',
name: 'body',
message:
'Provide a longer description of the change: (press enter to skip)\n',
validate: longMessageValidator,
},
// {
// type: 'confirm',
// name: 'isBreaking',
// message: 'Are there any breaking changes?',
// default: false,
// },
{
type: 'input',
name: 'breakingBody',
default: '-',
message:
'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself:\n',
when: answers => answers.isBreaking && !answers.body,
validate: longMessageValidator,
},
{
type: 'input',
name: 'breaking',
message: 'Describe the breaking changes:\n',
when: answers => answers.isBreaking,
},
// {
// type: 'confirm',
// name: 'isIssueAffected',
// message: 'Does this change affect any open issues?',
// default: false,
// },
{
type: 'input',
name: 'issuesBody',
default: '-',
message:
'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself:\n',
when: answers =>
answers.isIssueAffected && !answers.body && !answers.breakingBody,
validate: longMessageValidator,
},
];
},
commitMessage({answers}) {
const pair = answers.pair ? `[${answers.pair}]` : '';
const body = answers.body ? answers.body : '';
const breaking = answers.breaking
? `BREAKING CHANGE: ${answers.breaking}`
: '';
const issues = answers.issues ? `[#${answers.issues}]` : '';
const head = `${answers.type}${issues}:${pair} ${answers.subject}`;
return [head, body, breaking].join('\n\n').trim();
},
};