Skip to content

Commit ee368bd

Browse files
Merge pull request #74 from JarvisInvestInsight/feat/emoji-config
feat: add configurable emoji support for commit messages
2 parents 8961f8c + d513d8b commit ee368bd

File tree

8 files changed

+73
-7
lines changed

8 files changed

+73
-7
lines changed

src/cli/commands/commit.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export function createCommitCommand({ config }) {
5555
model: config.get('model'),
5656
language: config.get('language'),
5757
prefixEnabled: config.get('prefixEnabled'),
58+
allowEmojis: config.get('allowEmojis'),
5859
},
5960
)
6061

src/cli/commands/emoji.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { select } from '../../services/prompt.js'
2+
3+
/**
4+
* Create the emoji toggle command handler
5+
* @param {object} deps - Dependencies
6+
* @param {import('../../config/index.js').ConfigManager} deps.config - Config manager
7+
* @returns {Function} The command handler
8+
*/
9+
export function createEmojiCommand({ config }) {
10+
return async function emojiAction() {
11+
const currentEnabled = config.get('allowEmojis')
12+
13+
console.log(
14+
`Emojis are currently ${currentEnabled ? 'enabled' : 'disabled'}.`,
15+
)
16+
17+
const choices = [
18+
{ title: 'Enable emojis 🎉', value: true },
19+
{ title: 'Disable emojis', value: false },
20+
]
21+
22+
const selectedValue = await select(
23+
'Allow emojis in commit messages?',
24+
choices,
25+
currentEnabled ? 0 : 1,
26+
)
27+
28+
if (selectedValue !== undefined) {
29+
config.set('allowEmojis', selectedValue)
30+
console.log(
31+
`Emojis ${selectedValue ? 'enabled' : 'disabled'} and saved to configuration`,
32+
)
33+
}
34+
}
35+
}

src/cli/commands/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ export { createCommitCommand } from './commit.js'
22
export { createModelCommand } from './model.js'
33
export { createLangCommand } from './lang.js'
44
export { createPrefixCommand } from './prefix.js'
5+
export { createEmojiCommand } from './emoji.js'
56
export { createApiKeyCommand } from './apiKey.js'
67
export { createConfigCommand } from './config.js'

src/cli/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
createModelCommand,
88
createLangCommand,
99
createPrefixCommand,
10+
createEmojiCommand,
1011
createApiKeyCommand,
1112
createConfigCommand,
1213
} from './commands/index.js'
@@ -49,6 +50,11 @@ export function setupCli(options = {}) {
4950
.description('Toggle commit message prefix (e.g., fix:, feat:, refactor:)')
5051
.action(createPrefixCommand(deps))
5152

53+
program
54+
.command('emoji')
55+
.description('Toggle emoji support in commit messages')
56+
.action(createEmojiCommand(deps))
57+
5258
program
5359
.command('open-api-key')
5460
.description('Manage your OpenAI API key')

src/config/defaults.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const defaults = {
1616
model: 'gpt-4o-mini',
1717
language: 'English',
1818
prefixEnabled: true,
19+
allowEmojis: true,
1920
apiKey: null,
2021
}
2122

src/core/commitGenerator.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import { buildMessages } from './messageBuilder.js'
1212
* @param {string} options.model - The GPT model to use
1313
* @param {string} options.language - The target language
1414
* @param {boolean} options.prefixEnabled - Whether to use prefixes
15+
* @param {boolean} [options.allowEmojis=true] - Whether to allow emojis
1516
* @returns {Promise<string>} The sanitized commit message
1617
*/
1718
export async function generateCommitMessage(deps, options) {
1819
const { openaiService, client } = deps
19-
const { diff, model, language, prefixEnabled } = options
20+
const { diff, model, language, prefixEnabled, allowEmojis = true } = options
2021

2122
const messages = buildMessages({ diff, language, prefixEnabled })
2223

@@ -27,5 +28,5 @@ export async function generateCommitMessage(deps, options) {
2728
maxTokens: 200,
2829
})
2930

30-
return sanitizeCommitMessage(rawMessage)
31+
return sanitizeCommitMessage(rawMessage, allowEmojis)
3132
}

src/utils/sanitizeCommitMessage.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,23 @@
33
* issues with shell commands.
44
*
55
* Only removes: " (double quote), ' (single quote), ` (backtick)
6-
* All other characters including emojis, symbols, and Unicode are preserved.
6+
* When allowEmojis is false, also removes emoji characters.
77
*
88
* @param {string} message - The commit message to sanitize
9+
* @param {boolean} [allowEmojis=true] - Whether to preserve emoji characters
910
* @returns {string} The sanitized commit message
1011
*/
11-
export function sanitizeCommitMessage(message) {
12-
// Remove only quote literals that can cause shell escaping issues
13-
return message.replace(/["'`]/g, '')
12+
export function sanitizeCommitMessage(message, allowEmojis = true) {
13+
// Remove quote literals that can cause shell escaping issues
14+
let result = message.replace(/["'`]/g, '')
15+
16+
// Strip emojis if disabled
17+
if (!allowEmojis) {
18+
result = result.replace(
19+
/\p{Emoji_Presentation}|\p{Extended_Pictographic}/gu,
20+
'',
21+
)
22+
}
23+
24+
return result
1425
}

utils/sanitizeCommitMessage.test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,20 @@ describe('sanitizeCommitMessage', () => {
6060
)
6161
})
6262

63-
it('should allow emojis', () => {
63+
it('should allow emojis by default', () => {
6464
expect(sanitizeCommitMessage('fix: bug 🐛🔥💥')).toBe('fix: bug 🐛🔥💥')
6565
})
6666

67+
it('should allow emojis when allowEmojis is true', () => {
68+
expect(sanitizeCommitMessage('fix: bug 🐛🔥💥', true)).toBe(
69+
'fix: bug 🐛🔥💥',
70+
)
71+
})
72+
73+
it('should strip emojis when allowEmojis is false', () => {
74+
expect(sanitizeCommitMessage('fix: bug 🐛🔥💥', false)).toBe('fix: bug ')
75+
})
76+
6777
it('should only remove quotes from mixed content', () => {
6878
expect(
6979
sanitizeCommitMessage('feat(scope)!: add "dark mode" for issue #42 🎨'),

0 commit comments

Comments
 (0)