-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
101 lines (85 loc) · 3.3 KB
/
index.js
File metadata and controls
101 lines (85 loc) · 3.3 KB
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
const emojis = {
build: "🏗️",
chore: "🔧",
ci: "👷",
docs: "📚",
feat: "✨",
fix: "🐛",
perf: "🏎",
refactor: "♻️",
revert: "⏪️",
style: "🎨",
test: "🧪",
wip: "🚧",
};
function getLastCharacter(subject) {
if (subject == undefined) {
return false;
}
return [...subject].pop();
}
module.exports = {
extends: "@commitlint/config-conventional",
plugins: [
{
rules: {
"header-ends-with-emoji": (parsed) => {
// Get subject from parsed message
const { subject } = parsed;
// Get last character from subject
let lastCharacter = getLastCharacter(subject);
// Check if last character is an UTF-8 emoji
if (!subject || !/\p{Emoji}/u.test(lastCharacter)) {
return [false, "subject must end with a emoji"];
}
return [true, ""];
},
"header-ends-with-allowed-emoji": (parsed) => {
// Get subject from parsed message
const { subject } = parsed;
// Get last character from subject
let lastCharacter = getLastCharacter(subject);
// Check if last character matches one of the known emojis
if (!subject || !Object.values(emojis).includes(lastCharacter)) {
return [
false,
`subject must end with one emoji of ${Object.keys(emojis)
.map((emojiType) => `${emojis[emojiType]}`)
.join(", ")}`,
];
}
return [true, ""];
},
"header-ends-with-matching-emoji": (parsed) => {
// Get type and subject from parsed message
const { type, subject } = parsed;
// Get last character from subject
let lastCharacter = getLastCharacter(subject);
// Check if last character matches the emoji of the type
if (!subject || emojis[type] != lastCharacter) {
// Check if type is defined
if (type == undefined || type == null) {
return [false, `type must not be empty to find matching emoji`];
}
// Check if type is one of the known types
if (emojis[type] == undefined) {
return [false, `type must not be ${type}: check configuration of type-enum rule`];
}
return [false, `subject must end with ${emojis[type]} for commit type ${type}`];
}
return [true, ""];
},
},
},
],
rules: {
"header-ends-with-emoji": [2, "always"],
"header-ends-with-allowed-emoji": [2, "always"],
"header-ends-with-matching-emoji": [2, "always"],
"type-enum": [
2,
"always",
["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test", "wip"],
],
},
};