fix(cz-commitlint): handle modifiers correctly#4667
Conversation
Review Summary by QodoFix VS16 placement for emojis with skin tone modifiers
WalkthroughsDescription• Fix VS16 placement for emojis with modifiers like skin tones • Insert VS16 between base emoji and modifiers, not at end • Add comprehensive test coverage for emoji normalization • Improve documentation of emoji normalization logic Diagramflowchart LR
A["Emoji with modifier<br/>e.g., 🛠🏽"] --> B["Extract base char<br/>and modifiers"]
B --> C["Check if VS16 needed"]
C --> D["Insert VS16 between<br/>base and modifiers"]
D --> E["Normalized emoji<br/>🛠\uFE0F🏽"]
File Changes1. @commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts
|
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewⓘ The new review experience is currently in Beta. Learn more |
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
This comment was marked as resolved.
This comment was marked as resolved.
When adding VS16 to emojis with modifiers, VS16 can not be appended at the end - this creates an invalid unicode symbol. VS16 must be appended between emoji and modifiers.
7b31d1d to
420f1ef
Compare
There was a problem hiding this comment.
Pull request overview
Updates emoji normalization in @commitlint/cz-commitlint to ensure terminal column alignment remains consistent when enum option emojis include additional codepoints (notably skin tone modifiers), and adds regression coverage.
Changes:
- Adjust
normalizeEmojito insert VS16 (U+FE0F) immediately after the emoji base codepoint within a single grapheme cluster (rather than appending at the end of the string). - Add a test case covering normalization behavior for emojis with skin tone modifiers (and ensuring Emoji_Presentation emojis remain unchanged).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| @commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts | Fixes emoji normalization to place VS16 after the base character so modifiers/ZWJ sequences aren’t disrupted. |
| @commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts | Adds regression test for skin-tone-modified emoji normalization and expected enum list formatting. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
…ocker tag to v21 (#63) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [cr.codefloe.com/docker.io/commitlint/commitlint](https://github.com/conventional-changelog/commitlint) | major | `20.5.3` → `21.0.0` | --- ### Release Notes <details> <summary>conventional-changelog/commitlint (cr.codefloe.com/docker.io/commitlint/commitlint)</summary> ### [`v21.0.0`](https://github.com/conventional-changelog/commitlint/blob/HEAD/CHANGELOG.md#2100-2026-05-08) [Compare Source](conventional-changelog/commitlint@v20.5.3...v21.0.0) ##### Bug Fixes - widen cz-commitlint inquirer peer dep to support v9-v12 [#​4554](conventional-changelog/commitlint#4554) ([#​4682](conventional-changelog/commitlint#4682)) ([341f0c4](conventional-changelog/commitlint@341f0c4)) - chore!: minimum node version v22 ([#​4679](conventional-changelog/commitlint#4679)) ([ac2b3f4](conventional-changelog/commitlint@ac2b3f4)), closes [#​4679](conventional-changelog/commitlint#4679) ##### BREAKING CHANGES - drop node v18 and v20 support * Bump engines to >=v22 in all 39 package.json files * Update [@​types/node](https://github.com/types/node) to ^22.0.0 * Update CI matrix to \[22, 24] * Update Ubuntu baseline job to ubuntu:26.04 * Update Dockerfile.ci, .mise.toml, .codesandbox/ci.json * Update pre-commit hook to use --ignore-engines * Update README and docs Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> #### [20.5.3](conventional-changelog/commitlint@v20.5.2...v20.5.3) (2026-04-30) **Note:** Version bump only for package [@​commitlint/root](https://github.com/commitlint/root) #### [20.5.2](conventional-changelog/commitlint@v20.5.1...v20.5.2) (2026-04-25) ##### Bug Fixes - update dependency global-directory to v5 ([#​4698](conventional-changelog/commitlint#4698)) ([a8b6224](conventional-changelog/commitlint@a8b6224)) #### [20.5.1](conventional-changelog/commitlint@v20.5.0...v20.5.1) (2026-03-31) ##### Bug Fixes - **cz-commitlint:** add VS16 to single character emojis ([#​4666](conventional-changelog/commitlint#4666)) ([9e3e2d3](conventional-changelog/commitlint@9e3e2d3)) - **cz-commitlint:** handle modifiers correctly ([#​4667](conventional-changelog/commitlint#4667)) ([5a3ebf5](conventional-changelog/commitlint@5a3ebf5)) - update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671)) ([a300d32](conventional-changelog/commitlint@a300d32)) ##### Reverts - Revert "fix: update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671))" ([#​4677](conventional-changelog/commitlint#4677)) ([0f124c9](conventional-changelog/commitlint@0f124c9)), closes [#​4671](conventional-changelog/commitlint#4671) [#​4677](conventional-changelog/commitlint#4677) </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zMS4wIiwidXBkYXRlZEluVmVyIjoiNDMuMzEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: devxy-bot <no-reply@devxy.io> Reviewed-on: https://codefloe.com/devxy/ansible-posit/pulls/63
…ocker tag to v21 (#88) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [cr.codefloe.com/docker.io/commitlint/commitlint](https://github.com/conventional-changelog/commitlint) | major | `20.5.3` → `21.0.1` | --- ### Release Notes <details> <summary>conventional-changelog/commitlint (cr.codefloe.com/docker.io/commitlint/commitlint)</summary> ### [`v21.0.1`](https://github.com/conventional-changelog/commitlint/blob/HEAD/CHANGELOG.md#2101-2026-05-12) [Compare Source](conventional-changelog/commitlint@v21.0.0...v21.0.1) ##### Bug Fixes - **load:** only resolve relative formatter paths ([#​4761](conventional-changelog/commitlint#4761)) ([f8be069](conventional-changelog/commitlint@f8be069)) - **types:** add presetConfig to ParserPreset interface ([#​4749](conventional-changelog/commitlint#4749)) ([e402cd4](conventional-changelog/commitlint@e402cd4)), closes [#​4748](conventional-changelog/commitlint#4748) ### [`v21.0.0`](https://github.com/conventional-changelog/commitlint/blob/HEAD/CHANGELOG.md#2100-2026-05-08) [Compare Source](conventional-changelog/commitlint@v20.5.3...v21.0.0) ##### Bug Fixes - widen cz-commitlint inquirer peer dep to support v9-v12 [#​4554](conventional-changelog/commitlint#4554) ([#​4682](conventional-changelog/commitlint#4682)) ([341f0c4](conventional-changelog/commitlint@341f0c4)) - chore!: minimum node version v22 ([#​4679](conventional-changelog/commitlint#4679)) ([ac2b3f4](conventional-changelog/commitlint@ac2b3f4)), closes [#​4679](conventional-changelog/commitlint#4679) ##### BREAKING CHANGES - drop node v18 and v20 support * Bump engines to >=v22 in all 39 package.json files * Update [@​types/node](https://github.com/types/node) to ^22.0.0 * Update CI matrix to \[22, 24] * Update Ubuntu baseline job to ubuntu:26.04 * Update Dockerfile.ci, .mise.toml, .codesandbox/ci.json * Update pre-commit hook to use --ignore-engines * Update README and docs Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> #### [20.5.3](conventional-changelog/commitlint@v20.5.2...v20.5.3) (2026-04-30) **Note:** Version bump only for package [@​commitlint/root](https://github.com/commitlint/root) #### [20.5.2](conventional-changelog/commitlint@v20.5.1...v20.5.2) (2026-04-25) ##### Bug Fixes - update dependency global-directory to v5 ([#​4698](conventional-changelog/commitlint#4698)) ([a8b6224](conventional-changelog/commitlint@a8b6224)) #### [20.5.1](conventional-changelog/commitlint@v20.5.0...v20.5.1) (2026-03-31) ##### Bug Fixes - **cz-commitlint:** add VS16 to single character emojis ([#​4666](conventional-changelog/commitlint#4666)) ([9e3e2d3](conventional-changelog/commitlint@9e3e2d3)) - **cz-commitlint:** handle modifiers correctly ([#​4667](conventional-changelog/commitlint#4667)) ([5a3ebf5](conventional-changelog/commitlint@5a3ebf5)) - update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671)) ([a300d32](conventional-changelog/commitlint@a300d32)) ##### Reverts - Revert "fix: update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671))" ([#​4677](conventional-changelog/commitlint#4677)) ([0f124c9](conventional-changelog/commitlint@0f124c9)), closes [#​4671](conventional-changelog/commitlint#4671) [#​4677](conventional-changelog/commitlint#4677) </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zMS4wIiwidXBkYXRlZEluVmVyIjoiNDMuMzEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: devxy-bot <no-reply@devxy.io> Reviewed-on: https://codefloe.com/devxy/ansible-data-science-core/pulls/88
…ocker tag to v21 (#16) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [cr.codefloe.com/docker.io/commitlint/commitlint](https://github.com/conventional-changelog/commitlint) | major | `20.5.3` → `21.0.1` | --- ### Release Notes <details> <summary>conventional-changelog/commitlint (cr.codefloe.com/docker.io/commitlint/commitlint)</summary> ### [`v21.0.1`](https://github.com/conventional-changelog/commitlint/blob/HEAD/CHANGELOG.md#2101-2026-05-12) [Compare Source](conventional-changelog/commitlint@v21.0.0...v21.0.1) ##### Bug Fixes - **load:** only resolve relative formatter paths ([#​4761](conventional-changelog/commitlint#4761)) ([f8be069](conventional-changelog/commitlint@f8be069)) - **types:** add presetConfig to ParserPreset interface ([#​4749](conventional-changelog/commitlint#4749)) ([e402cd4](conventional-changelog/commitlint@e402cd4)), closes [#​4748](conventional-changelog/commitlint#4748) ### [`v21.0.0`](https://github.com/conventional-changelog/commitlint/blob/HEAD/CHANGELOG.md#2100-2026-05-08) [Compare Source](conventional-changelog/commitlint@v20.5.3...v21.0.0) ##### Bug Fixes - widen cz-commitlint inquirer peer dep to support v9-v12 [#​4554](conventional-changelog/commitlint#4554) ([#​4682](conventional-changelog/commitlint#4682)) ([341f0c4](conventional-changelog/commitlint@341f0c4)) - chore!: minimum node version v22 ([#​4679](conventional-changelog/commitlint#4679)) ([ac2b3f4](conventional-changelog/commitlint@ac2b3f4)), closes [#​4679](conventional-changelog/commitlint#4679) ##### BREAKING CHANGES - drop node v18 and v20 support * Bump engines to >=v22 in all 39 package.json files * Update [@​types/node](https://github.com/types/node) to ^22.0.0 * Update CI matrix to \[22, 24] * Update Ubuntu baseline job to ubuntu:26.04 * Update Dockerfile.ci, .mise.toml, .codesandbox/ci.json * Update pre-commit hook to use --ignore-engines * Update README and docs Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> #### [20.5.3](conventional-changelog/commitlint@v20.5.2...v20.5.3) (2026-04-30) **Note:** Version bump only for package [@​commitlint/root](https://github.com/commitlint/root) #### [20.5.2](conventional-changelog/commitlint@v20.5.1...v20.5.2) (2026-04-25) ##### Bug Fixes - update dependency global-directory to v5 ([#​4698](conventional-changelog/commitlint#4698)) ([a8b6224](conventional-changelog/commitlint@a8b6224)) #### [20.5.1](conventional-changelog/commitlint@v20.5.0...v20.5.1) (2026-03-31) ##### Bug Fixes - **cz-commitlint:** add VS16 to single character emojis ([#​4666](conventional-changelog/commitlint#4666)) ([9e3e2d3](conventional-changelog/commitlint@9e3e2d3)) - **cz-commitlint:** handle modifiers correctly ([#​4667](conventional-changelog/commitlint#4667)) ([5a3ebf5](conventional-changelog/commitlint@5a3ebf5)) - update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671)) ([a300d32](conventional-changelog/commitlint@a300d32)) ##### Reverts - Revert "fix: update dependency global-directory to v5 ([#​4671](conventional-changelog/commitlint#4671))" ([#​4677](conventional-changelog/commitlint#4677)) ([0f124c9](conventional-changelog/commitlint@0f124c9)), closes [#​4671](conventional-changelog/commitlint#4671) [#​4677](conventional-changelog/commitlint#4677) </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zMS4wIiwidXBkYXRlZEluVmVyIjoiNDMuMzEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: devxy-bot <no-reply@devxy.io> Reviewed-on: https://codefloe.com/devxy/starlight-theme-celestia/pulls/16
When adding VS16 to emojis with modifiers, VS16 can not be appended at the end - this creates an invalid unicode symbol. VS16 must be appended between emoji and modifiers.
Description
When emojis are used with modifiers like skin tones the VS16 must be added between emoji and modifier, not at the end.
Motivation and Context
This was a review finding of the fix that added VS16 for emojis without modifiers as a potential bug.
Usage examples
How Has This Been Tested?
Types of changes
Checklist: