ccommit 4.1.0 → 4.2.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ $ tsdown
2
+ ℹ tsdown v0.22.0 powered by rolldown v1.1.3
3
+ ℹ config file: /home/runner/work/packages/packages/packages/ccommit/tsdown.config.ts
4
+ ℹ Build start
@@ -0,0 +1 @@
1
+ $ tsc --noEmit --declaration
package/README.md CHANGED
@@ -20,18 +20,8 @@ pnpm add ccommit --save-dev
20
20
 
21
21
  ```
22
22
 
23
- <!--
24
- ```bash
25
-
26
- # npm
27
- npm install ccommit --save-dev
28
-
29
- # yarn
30
- yarn add ccommit --dev
31
- ```
32
- -->
33
-
34
- > **📝 Note:** This is my preference as I try to limit globals wherever possible.
23
+ > [!NOTE]
24
+ > My preference as I try to limit globals wherever possible.
35
25
 
36
26
  ### Global
37
27
 
@@ -40,20 +30,8 @@ yarn add ccommit --dev
40
30
  pnpm add ccommit --global
41
31
  ```
42
32
 
43
- <!--
44
- ```bash
45
- # npm
46
- npm install ccommit --g
47
-
48
- # yarn
49
- yarn global add ccommit
50
-
51
- # homebrew
52
- brew install ccommit
53
- ```
54
- -->
55
-
56
- > **📝 Note:** For non-node projects this _can_ be helpful, but again, try to limit globals.
33
+ > [!NOTE]
34
+ > For non-node projects this _can_ be helpful, but again, try to limit globals.
57
35
 
58
36
  ### Client
59
37
 
@@ -67,14 +45,8 @@ pnpm ccommit -c
67
45
  ccommit -c
68
46
  ```
69
47
 
70
- <!--
71
- ```bash
72
- # packages
73
- # node ./packages/ccommit/dist/index.js -c
74
- ```
75
- -->
76
-
77
- > **📝 Note:** Choose `local` or `global`
48
+ > [!NOTE]
49
+ > Choose `local` or `global`
78
50
 
79
51
  ### Hook
80
52
 
@@ -89,14 +61,8 @@ pnpm ccommit --hook || true
89
61
  ccommit --hook || true
90
62
  ```
91
63
 
92
- <!--
93
- ```bash
94
- # packages
95
- # node ./packages/ccommit/dist/index.js --hook || true
96
- ```
97
- -->
98
-
99
- > **📝 Note:** Choose `local` or `global`
64
+ > [!NOTE]
65
+ > Choose `local` or `global`
100
66
 
101
67
  ## Options
102
68
 
@@ -150,18 +116,6 @@ ccommit --hook || true
150
116
  - fix-ci(github): 💚 subject
151
117
  - fix: 🐛 subject
152
118
 
153
- <!--
154
- ### Custom
155
-
156
- 🍕 Creating a `custom` configuration can be ideal if you want more control, or have more specific business needs for your application. Using `cosmiconfig` you can create:
157
-
158
- - `.ccommit`
159
- - `.ccommit.json`
160
- - `.ccommit.js`
161
-
162
- By providing configuration options for your project.
163
- -->
164
-
165
119
  ## Roadmap
166
120
 
167
121
  This was meant to sunset `@jeromefitz/git-cz` as a year-end personal hackathon. This will keep up with `gitmoji` and ideally some tenets of ‘best of both worlds’ could make it to `gitmoji-cli` some day. (There are a few closed issues on ‘boring’ versions already, and with this using `enquirer` probably less and less of a chance.)
@@ -41,4 +41,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41
41
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42
42
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43
43
  SOFTWARE.
44
-
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["process","commitTypes","commitTypes","commitTypes","commit","list"],"sources":["../src/lib/index.ts","../src/utils/cancel-if.ts","../src/data/types.ts","../src/utils/find-by.ts","../src/utils/find-command.ts","../src/utils/format.ts","../src/utils/generate-log.ts","../src/utils/get-chars-left.ts","../src/utils/get-git-root-dir.ts","../src/utils/get-issue-tracker.ts","../src/utils/get-staged-files.ts","../src/utils/print-dry-run.ts","../src/utils/register-hook-interruption-handler.ts","../src/commands/commit/questions.ts","../src/commands/commit/with-client.ts","../src/commands/commit/with-hook.ts","../src/commands/commit/commit.ts","../src/commands/commit/index.ts","../src/commands/list/list.ts","../src/commands/list/index.ts","../src/index.ts"],"sourcesContent":["const COMMANDS = {\n COMMIT: \"commit\",\n HOOK: \"hook\",\n LIST: \"list\",\n};\nconst COMMIT_FORMATS = {\n CONVENTIONAL: \"conventional\",\n CONVENTIONAL_NO_EMOJI: \"conventional-no-emoji\",\n GITMOJI: \"gitmoji\",\n};\n\nconst COMMIT_MODES = {\n CLIENT: \"client\",\n HOOK: \"hook\",\n};\n\nconst FIND_BY = {\n EMOJI: \"emoji\",\n TYPE: \"type\",\n};\n\nconst FLAGS = Object.freeze({\n BREAKING: \"breaking\",\n COMMIT: \"commit\",\n DRYRUN: \"dryrun\",\n EMOJI: \"emoji\",\n HELP: \"help\",\n HOOK: \"hook\",\n LIST: \"list\",\n SKIP: \"skip\",\n VERSION: \"version\",\n});\n\nconst FORMAT = {\n [COMMIT_FORMATS.CONVENTIONAL]: \"{type}{scope}{breaking}: {emoji}{title}\",\n [COMMIT_FORMATS.CONVENTIONAL_NO_EMOJI]: \"{type}{scope}{breaking}: {title}\",\n [COMMIT_FORMATS.GITMOJI]: \"{emoji}{breaking}{scope}{title}\",\n};\n\nconst LOGS = {\n MESSAGES: {\n COMMAND_LINE_WITHOUT_REQUIRED: \"❯ Command line option requires both: --title, --type\",\n COMMIT_FAIL: `❯ \\n\n ❯ Oops! An error occurred. There is likely additional logging output above.\\n\n ❯ You can run the same commit with this command:\\n\n ❯ \\t\n {REPLACE}\n `,\n GENERATOR_TAKING_OVER: \"❯ Generator will take it from here (CTRL+C to quit)\",\n MODE_CONFLICT: \"❯ Please choose one or the other: --commit, -c | --hook, -u\",\n REPLACE: \"{REPLACE}\",\n STAGED_FILES: \"❯ There are no staged files for git. Did you mean to do a dry-run (-n)?\",\n TYPE_INCORRECT: \"❯ There is no gitmoji/type associated with: {REPLACE}\",\n },\n TYPES: {\n ERROR: \"error\",\n INFO: \"info\",\n SUCCESS: \"success\",\n WARNING: \"warning\",\n },\n};\n\nconst OPTIONS = Object.freeze({\n FORMAT: \"format\",\n MESSAGE: \"message\",\n SCOPE: \"scope\",\n TITLE: \"title\",\n TYPE: \"type\",\n});\n\nconst SCOPE = {\n MAX: 12,\n MIN: 3,\n};\n\nconst SEMVER = {\n MAJOR: \"major\",\n MINOR: \"minor\",\n NULL: \"null\",\n PATCH: \"patch\",\n};\n\nconst TITLE = {\n MAX: 48,\n MAX_SWAG: 40,\n MIN: 3,\n MIN_SWAG: 15,\n};\n\nconst TYPE = {\n MAX: 15,\n};\n\nexport {\n COMMANDS,\n COMMIT_FORMATS,\n COMMIT_MODES,\n FIND_BY,\n FLAGS,\n FORMAT,\n LOGS,\n OPTIONS,\n SCOPE,\n SEMVER,\n TITLE,\n TYPE,\n};\n","/*!\n * reference: https://github.com/carloscuesta/gitmoji-cli\n */\nimport fs from \"node:fs\";\nimport process from \"node:process\";\n\nimport { execa } from \"execa\";\n\nconst cancelIfRebasing = (): Promise<void> =>\n execa(\"git\", [\"rev-parse\", \"--absolute-git-dir\"]).then(({ stdout: gitDirectory }) => {\n // see https://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress\n // to understand how a rebase is detected\n if (\n fs.existsSync(gitDirectory + \"/rebase-merge\") ||\n fs.existsSync(gitDirectory + \"/rebase-apply\")\n ) {\n process.exit(0);\n }\n });\n\nconst COMMIT_MESSAGE_SOURCE = 4;\n\nconst cancelIfAmending = (): Promise<void> =>\n new Promise<void>((resolve) => {\n /*\n from https://git-scm.com/docs/githooks#_prepare_commit_msg\n the commit message source is passed as second argument and corresponding 4 for ccommit\n `gitmoji --hook $1 $2`\n */\n const commitMessageSource: string = process.argv[COMMIT_MESSAGE_SOURCE];\n if (\n commitMessageSource &&\n (commitMessageSource.startsWith(\"commit\") || commitMessageSource.startsWith(\"merge\"))\n ) {\n process.exit(0);\n }\n resolve();\n });\n\n// I avoid Promise.all to avoid race condition in future cancel callbacks\nconst cancelIfNeeded = (): Promise<void> => cancelIfAmending().then(cancelIfRebasing);\n\nexport { COMMIT_MESSAGE_SOURCE, cancelIfAmending, cancelIfNeeded, cancelIfRebasing };\n","// @todo(ccommit) cache + generation from: @jeromefitz/conventional-gitmoji\nimport { SEMVER } from \"../lib/index.ts\";\n\n// @hack(ccommit) emojiLength is to help with formatting until can do it programmatically\nconst types = [\n {\n code: \":wheelchair:\",\n description: \"Improve Accessibility\",\n emoji: \"♿️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"access\",\n },\n {\n code: \":chart_with_upwards_trend:\",\n description: \"Add or Update Analytics or Track Code\",\n emoji: \"📈\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"analytics\",\n },\n {\n code: \":dizzy:\",\n description: \"Add or Update Animations and Transitions\",\n emoji: \"💫\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"animation\",\n },\n {\n code: \":building_construction:\",\n description: \"Make Architectural Changes\",\n emoji: \"🏗️\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"arch\",\n },\n {\n code: \":bento:\",\n description: \"Add or Update Assets\",\n emoji: \"🍱\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"assets\",\n },\n {\n code: \":t-rex:\",\n description: \"Backwards Compatibility\",\n emoji: \"🦖\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"backwards\",\n },\n {\n code: \":beers:\",\n description: \"Write Code Drunkenly\",\n emoji: \"🍻\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"beer\",\n },\n {\n code: \":boom:\",\n description: \"Introduce Breaking Changes\",\n emoji: \"💥\",\n emojiLength: 1,\n semver: SEMVER.MAJOR,\n type: \"breaking\",\n },\n {\n code: \":hammer:\",\n description: \"Add or Update Development Scripts\",\n emoji: \"🔨\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"build\",\n },\n {\n code: \":goal_net:\",\n description: \"Catch Errors\",\n emoji: \"🥅\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"catch\",\n },\n {\n code: \":computer_disk:\",\n description: \"Changes That Don’t Modify Src or Test Files\",\n emoji: \"💽️\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"chore\",\n },\n {\n code: \":construction_worker:\",\n description: \"Add or Update CI Build System\",\n emoji: \"👷\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"ci\",\n },\n {\n code: \":wastebasket:\",\n description: \"Deprecate Code That Needs to Be Cleaned Up\",\n emoji: \"🗑️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"clean\",\n },\n {\n code: \":alien:\",\n description: \"Update Code Due to External API Changes\",\n emoji: \"👽️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"compat\",\n },\n {\n code: \":thread:\",\n description: \"Add or Update Code Related to Multithreading or Concurrency\",\n emoji: \"🧵\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"concurrency\",\n },\n {\n code: \":wrench:\",\n description: \"Add or Update Configuration Files\",\n emoji: \"🔧\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"config\",\n },\n {\n code: \":busts_in_silhouette:\",\n description: \"Add or Update Contributor(s)\",\n emoji: \"👥\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"contrib-add\",\n },\n {\n code: \":monocle_face:\",\n description: \"Data Exploration/inspection\",\n emoji: \"🧐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"data\",\n },\n {\n code: \":card_file_box:\",\n description: \"Perform Database Related Changes\",\n emoji: \"🗃️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"db\",\n },\n {\n code: \":heavy_plus_sign:\",\n description: \"Add a Dependency\",\n emoji: \"➕\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-add\",\n },\n {\n code: \":heavy_minus_sign:\",\n description: \"Remove a Dependency\",\n emoji: \"➖\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-rm\",\n },\n {\n code: \":package:\",\n description: \"Add or Update Compiled Files or Packages\",\n emoji: \"📦️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-up\",\n },\n {\n code: \":rocket:\",\n description: \"Deploy Stuff\",\n emoji: \"🚀\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"deploy\",\n },\n {\n code: \":bulb:\",\n description: \"Add or Update Comments in Source Code\",\n emoji: \"💡\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"docs-code\",\n },\n {\n code: \":memo:\",\n description: \"Add or Update Documentation\",\n emoji: \"📝\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"docs\",\n },\n {\n code: \":arrow_down:\",\n description: \"Downgrade Dependencies\",\n emoji: \"⬇️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"downgrade\",\n },\n {\n code: \":technologist:\",\n description: \"Improve Developer Experience\",\n emoji: \"💻\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"dx\",\n },\n {\n code: \":egg:\",\n description: \"Add or Update an Easter Egg\",\n emoji: \"🥚\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"egg\",\n },\n {\n code: \":alembic:\",\n description: \"Perform Experiments\",\n emoji: \"⚗️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"experiment\",\n },\n {\n code: \":sparkles:\",\n description: \"Introduce New Features\",\n emoji: \"✨\",\n emojiLength: 1,\n semver: SEMVER.MINOR,\n type: \"feat\",\n },\n {\n code: \":bug:\",\n description: \"Fix a Bug\",\n emoji: \"🐛\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"fix\",\n },\n {\n code: \":green_heart:\",\n description: \"Fix CI Build\",\n emoji: \"💚\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"fix-ci\",\n },\n {\n code: \":triangular_flag_on_post:\",\n description: \"Add Update or Remove Feature Flags\",\n emoji: \"🚩\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"flags\",\n },\n {\n code: \":stethoscope:\",\n description: \"Add or Update Healthcheck\",\n emoji: \"🩺\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"healthcheck\",\n },\n {\n code: \":ambulance:\",\n description: \"Critical Hotfix\",\n emoji: \"🚑️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"hotfix\",\n },\n {\n code: \":globe_with_meridians:\",\n description: \"Internationalization and Localization\",\n emoji: \"🌐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"i18n\",\n },\n {\n code: \":see_no_evil:\",\n description: \"Add or Update a Gitignore File.\",\n emoji: \"🙈\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"ignore\",\n },\n {\n code: \":bricks:\",\n description: \"Infrastructure Related Changes\",\n emoji: \"🧱\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"inf\",\n },\n {\n code: \":tada:\",\n description: \"Begin a Project\",\n emoji: \"🎉\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"init\",\n },\n {\n code: \":iphone:\",\n description: \"Work on Responsive Design\",\n emoji: \"📱\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"iphone\",\n },\n {\n code: \":page_facing_up:\",\n description: \"Add or Update License\",\n emoji: \"📄\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"license\",\n },\n {\n code: \":rotating_light:\",\n description: \"Fix Compiler / Linter Warnings\",\n emoji: \"🚨\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"lint\",\n },\n {\n code: \":loud_sound:\",\n description: \"Add or Update Logs\",\n emoji: \"🔊\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"log-add\",\n },\n {\n code: \":mute:\",\n description: \"Remove Logs\",\n emoji: \"🔇\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"log-rm\",\n },\n {\n code: \":necktie:\",\n description: \"Add or Update Business Logic\",\n emoji: \"👔\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"logic\",\n },\n {\n code: \":twisted_rightwards_arrows:\",\n description: \"Merge Branches\",\n emoji: \"🔀\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"merge\",\n },\n {\n code: \":clown_face:\",\n description: \"Mock Things\",\n emoji: \"🤡\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"mock\",\n },\n {\n code: \":truck:\",\n description: \"Move or Rename Resources (Eg.: Files Paths Routes).\",\n emoji: \"🚚\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"mv\",\n },\n {\n code: \":airplane:\",\n description: \"Provide offline support\",\n emoji: \"✈️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"offline\",\n },\n {\n code: \":adhesive_bandage:\",\n description: \"Simple Fix for a Non-Critical Issue\",\n emoji: \"🩹\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"patch\",\n },\n {\n code: \":zap:\",\n description: \"Improve Performance\",\n emoji: \"⚡️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"perf\",\n },\n {\n code: \":poop:\",\n description: \"Write Bad Code That Needs to Be Improved\",\n emoji: \"💩\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"poo\",\n },\n {\n code: \":fire:\",\n description: \"Remove Code or Files\",\n emoji: \"🔥\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"prune\",\n },\n {\n code: \":pushpin:\",\n description: \"Pin Dependencies to Specific Versions\",\n emoji: \"📌\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"pushpin\",\n },\n {\n code: \":recycle:\",\n description: \"Refactor Code\",\n emoji: \"♻️\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"refactor\",\n },\n {\n code: \":bookmark:\",\n description: \"Release / Version Tags\",\n emoji: \"🔖\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"release\",\n },\n {\n code: \":rewind:\",\n description: \"Revert Changes\",\n emoji: \"⏪️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"revert\",\n },\n {\n code: \":coffin:\",\n description: \"Remove Dead Code\",\n emoji: \"⚰️\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"rip\",\n },\n {\n code: \":passport_control:\",\n description: \"Work on Code Related to Authorization Roles and Permissions\",\n emoji: \"🛂\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"roles\",\n },\n {\n code: \":fast_forward:\",\n description: \"Create Rollforward Version\",\n emoji: \"⏩️\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"rollforward\",\n },\n {\n code: \":rocket:\",\n description: \"Custom Type for CI/CD to Hook into Run Build Override\",\n emoji: \"🚀️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"run-build\",\n },\n {\n code: \":closed_lock_with_key:\",\n description: \"Add or Update Secrets\",\n emoji: \"🔐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"secrets\",\n },\n {\n code: \":lock:\",\n description: \"Fix Security Issues\",\n emoji: \"🔒️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"security\",\n },\n {\n code: \":seedling:\",\n description: \"Add or Update Seed Files\",\n emoji: \"🌱\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"seed\",\n },\n {\n code: \":mag:\",\n description: \"Improve Seo\",\n emoji: \"🔍️\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"seo\",\n },\n {\n code: \":camera_flash:\",\n description: \"Add or Update Snapshots\",\n emoji: \"📸\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"snapshot\",\n },\n {\n code: \":money_with_wings:\",\n description: \"Add Sponsorships or Money Related Infrastructure\",\n emoji: \"💸\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"sponsor\",\n },\n {\n code: \":art:\",\n description: \"Improve Structure / Format of the Code\",\n emoji: \"🎨\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"style\",\n },\n {\n code: \":test_tube:\",\n description: \"Add a Failing Test\",\n emoji: \"🧪\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"test-fail\",\n },\n {\n code: \":white_check_mark:\",\n description: \"Add Update or Pass Tests\",\n emoji: \"✅\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"test\",\n },\n {\n code: \":speech_balloon:\",\n description: \"Add or Update Text and Literals\",\n emoji: \"💬\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"texts\",\n },\n {\n code: \":label:\",\n description: \"Add or Update Types\",\n emoji: \"🏷️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"types\",\n },\n {\n code: \":pencil2:\",\n description: \"Fix Typos\",\n emoji: \"✏️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"typo\",\n },\n {\n code: \":lipstick:\",\n description: \"Add or Update the UI and Style Files\",\n emoji: \"💄\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"ui\",\n },\n {\n code: \":arrow_up:\",\n description: \"Upgrade Dependencies\",\n emoji: \"⬆️\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"upgrade\",\n },\n {\n code: \":children_crossing:\",\n description: \"Improve User Experience / Usability\",\n emoji: \"🚸\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"ux\",\n },\n {\n code: \":safety_vest:\",\n description: \"Add or update code related to validation\",\n emoji: \"🦺\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"validation\",\n },\n {\n code: \":construction:\",\n description: \"Work in Progress\",\n emoji: \"🚧\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"wip\",\n },\n];\n\nexport default types;\n","import commitTypes from \"../data/types.ts\";\n\nconst findBy = (str, from, to): string | undefined => {\n const key = commitTypes.findIndex((el) => el[from] === str);\n return commitTypes[key]?.[to];\n};\n\nexport { findBy };\n","import process from \"node:process\";\n\nimport { COMMIT_FORMATS, COMMIT_MODES, FLAGS, LOGS, OPTIONS } from \"../lib/index.ts\";\nimport { generateLog, getStagedFiles } from \"./index.ts\";\n\nconst getOptionsForCommand = (command: string, flags: any): any => {\n const commandsWithOptions = [FLAGS.COMMIT, FLAGS.HOOK];\n\n // @ts-ignore\n if (commandsWithOptions.includes(command)) {\n const options = {\n dryrun: flags[FLAGS.DRYRUN],\n emoji: flags[FLAGS.EMOJI],\n // options\n format:\n flags[OPTIONS.FORMAT] === COMMIT_FORMATS.CONVENTIONAL\n ? flags[FLAGS.EMOJI]\n ? COMMIT_FORMATS.CONVENTIONAL\n : COMMIT_FORMATS.CONVENTIONAL_NO_EMOJI\n : COMMIT_FORMATS.GITMOJI,\n message: flags[OPTIONS.MESSAGE],\n mode: command === FLAGS.HOOK ? COMMIT_MODES.HOOK : COMMIT_MODES.CLIENT,\n scope: flags[OPTIONS.SCOPE],\n skip: flags[FLAGS.SKIP],\n title: flags[OPTIONS.TITLE],\n type: flags[OPTIONS.TYPE],\n };\n\n return options;\n }\n\n return null;\n};\n\n// @todo(lint) complexity: 11\n// oxlint-disable-next-line complexity\nconst findCommand = (cli: any, options: any): void => {\n const flags = cli.flags;\n const commandFlag = Object.keys(flags)\n .map((flag) => flags[flag] && flag)\n .find((flag) => options[flag]);\n\n const filesChanged = getStagedFiles();\n\n if (!flags[FLAGS.DRYRUN] && !filesChanged) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.STAGED_FILES));\n process.exit(2);\n }\n\n if (flags[FLAGS.COMMIT] && flags[FLAGS.HOOK]) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.MODE_CONFLICT));\n process.exit(2);\n }\n\n if (\n flags[OPTIONS.MESSAGE] ||\n flags[OPTIONS.SCOPE] ||\n flags[OPTIONS.TITLE] ||\n flags[OPTIONS.TYPE]\n ) {\n flags[FLAGS.SKIP] = true;\n }\n\n if (flags[FLAGS.SKIP]) {\n if (flags[OPTIONS.TITLE] && flags[OPTIONS.TYPE]) {\n flags[FLAGS.SKIP] = true;\n } else {\n flags[FLAGS.SKIP] = false;\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.COMMAND_LINE_WITHOUT_REQUIRED));\n flags[OPTIONS.TITLE] = undefined;\n flags[OPTIONS.TYPE] = undefined;\n }\n }\n\n const commandOptions = getOptionsForCommand(commandFlag, flags);\n\n return options[commandFlag] ? options[commandFlag](commandOptions) : cli.showHelp();\n};\n\nexport { findCommand };\n","import { COMMIT_FORMATS, FORMAT, TYPE } from \"../lib/index.ts\";\n\nconst formatCliEmoji = ({ emoji, emojiLength }) =>\n emojiLength === 0 ? `${emoji} ` : `${emoji} `;\n\nconst formatCliType = (type) => type?.padEnd(TYPE.MAX);\n\nconst formatCliTypes = (commitTypes: any) => {\n // console.log(`EMOJI TYPE DESCRIPTION`)\n // console.log(`----- ---- -----------`)\n return commitTypes.map(({ description, emoji, emojiLength, type }) => {\n console.log(\n `${formatCliEmoji({\n emoji,\n emojiLength,\n })} ${formatCliType(type)} ${description}`,\n );\n });\n};\n\n// oxlint-disable-next-line complexity\nconst formatCommitSubject = (options, answers) => {\n const format = FORMAT[options?.format];\n\n // @note(ccommit) two spaces after emoji\n const emoji = answers?.gitmoji ? `${answers?.gitmoji} ` : \"\";\n\n let scope = answers?.scope\n ? `(${answers?.scope.replace(/ {2}/g, \"--\").replace(/ /g, \"-\").toLowerCase().trim()})`\n : \"\";\n // @note(ccommit) only add space to scope if format is: gitmoji\n scope = scope && options?.format === COMMIT_FORMATS.GITMOJI ? `${scope} ` : scope;\n\n /**\n * @todo(ccommit) breaking identification in commit subject\n */\n // const breaking = answers?.breaking\n // ? options?.format === COMMIT_FORMATS.GITMOJI\n // ? `💥 `\n // : '!'\n // : ''\n\n return format\n .replace(/\\{emoji\\}/g, emoji)\n .replace(/\\{scope\\}/g, scope)\n .replace(/\\{breaking\\}/g, \"\")\n .replace(/\\{title\\}/g, answers?.title)\n .replace(/\\{type\\}/g, answers?.type);\n};\n\nexport { formatCliEmoji, formatCliType, formatCliTypes, formatCommitSubject };\n","import colors from \"ansi-colors\";\n\nimport { LOGS } from \"../lib/index.ts\";\n\ntype GenerateLog = (type: string, message: string, replace?: string) => void;\n/**\n * @todo(ccommit) this is a bit much, can we reduce?\n */\nconst generateLog: GenerateLog = (type, message, replace) => {\n let msg = replace ? message.replace(/\\{REPLACE\\}/g, replace) : message;\n msg = `\\n${msg}\\n`;\n\n if (type === LOGS.TYPES.ERROR) {\n return colors.magenta.bold(msg);\n }\n if (type === LOGS.TYPES.INFO) {\n return colors.blue.bold(msg);\n }\n if (type === LOGS.TYPES.WARNING) {\n return colors.yellow.bold(msg);\n }\n return colors.green.bold(msg);\n};\n\nconst generateCount: GenerateLog = (type, message, replace) => {\n const msg = replace ? message.replace(/\\{REPLACE\\}/g, replace) : message;\n\n if (type === LOGS.TYPES.ERROR) {\n return colors.red.bold(msg);\n }\n if (type === LOGS.TYPES.INFO) {\n return colors.white.bold(msg);\n }\n if (type === LOGS.TYPES.WARNING) {\n return colors.yellow.bold(msg);\n }\n return colors.green.bold(msg);\n};\n\nexport { generateCount, generateLog };\n","import { LOGS, TITLE } from \"../lib/index.ts\";\nimport { generateCount } from \"./index.ts\";\n\nconst getCharsLeft = (str: string) => {\n const chars = str.length;\n const message = chars.toString();\n let logType = LOGS.TYPES.SUCCESS;\n\n if (chars < TITLE.MIN || chars > TITLE.MAX) {\n logType = LOGS.TYPES.ERROR;\n } else if (chars < TITLE.MIN_SWAG || chars > TITLE.MAX_SWAG) {\n logType = LOGS.TYPES.WARNING;\n }\n return generateCount(logType, LOGS.MESSAGES.REPLACE, message);\n};\n\nexport { getCharsLeft };\n","import { execSync } from \"node:child_process\";\n\nconst getGitRootDir = () => {\n const devNull = process.platform === \"win32\" ? \" nul\" : \"/dev/null\";\n const dir = execSync(\"git rev-parse --show-toplevel 2>\" + devNull)\n .toString()\n .trim();\n\n return dir;\n};\n\nexport { getGitRootDir };\n","import { execSync } from \"node:child_process\";\n\nconst getIssueTracker = () => {\n let branch: any,\n init = \"\";\n\n // branch = 'ABC-123'\n branch = execSync(\"git rev-parse --abbrev-ref HEAD\");\n branch = branch.toString().trim().split(\"/\");\n const branchType = branch[0];\n const branchName = !branch[1] ? branchType : branch[1];\n\n const it = branchName.split(\"-\");\n const itProject = it[0];\n const itNumber = !it[1] ? itProject : it[1];\n const itTicket = `${itProject}-${itNumber}`;\n\n if (!isNaN(parseFloat(itNumber)) && isFinite(parseFloat(itNumber))) {\n init = itTicket;\n }\n return init;\n};\n\nexport { getIssueTracker };\n","import { execSync } from \"node:child_process\";\n\nconst getStagedFiles = () => {\n const stagedFiles = execSync(\"git diff --name-only --staged\").toString().trim();\n\n return !!stagedFiles;\n};\n\nexport { getStagedFiles };\n","import colors from \"ansi-colors\";\n\nconst printDryRun = (v) => {\n console.log(colors.magenta.bold(`❯ dry-run mode: ${v}\\n`));\n};\n\nexport { printDryRun };\n","/*!\n * reference: https://github.com/carloscuesta/gitmoji-cli\n */\nimport process from \"node:process\";\n\nimport colors from \"ansi-colors\";\n\nconst registerHookInterruptionHandler = () => {\n // Allow to interrupt the hook without cancelling the commit\n process.on(\"SIGINT\", () => {\n console.log(colors.magenta.bold(\"❯ [ccommit] interrupted\"));\n process.exit(0);\n });\n};\n\nexport { registerHookInterruptionHandler };\n","import colors from \"ansi-colors\";\n\nimport commitTypes from \"../../data/types.ts\";\nimport { SCOPE, TITLE } from \"../../lib/index.ts\";\nimport { formatCliEmoji, formatCliType, getCharsLeft, getIssueTracker } from \"../../utils/index.ts\";\n\nconst getTypes = () =>\n commitTypes.map(({ description, emoji, emojiLength, type }) => ({\n description,\n emoji,\n emojiLength,\n type,\n }));\n\nconst characterCount = (input, max) => {\n const count = getCharsLeft(input);\n const countMessage = `Character Count (${count}/${max})`;\n return `${colors.dim.cyan(`›`)} ${colors.dim.bold(countMessage)}`;\n};\n\nconst prefixState = (state) => {\n return state.submitted\n ? state.cancelled\n ? colors.magenta(\"✖\")\n : colors.green(\"✔\")\n : colors.cyan(\"?\");\n};\n\n/**\n * @note(enquirier) 3.x will \"fix\" skip passing answers for now\n * you can access \"this\" state by __not__ using arrow functions\n */\nconst questions = [\n {\n default: \"(y/N)\",\n format(input) {\n const yn = input ? \"yes\" : \"no\";\n // @ts-ignore\n return this.state.submitted ? colors.green(yn) : colors.dim(yn);\n },\n initial: false,\n message: \"Is there a breaking change?\",\n name: \"breaking\",\n prefix() {\n // @ts-ignore\n return prefixState(this.state);\n },\n styles: { primary: colors.white },\n type: \"confirm\",\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, TITLE.MAX);\n },\n message: \"Please share breaking change info\",\n name: \"messageBreaking\",\n result(value) {\n return value ? `BREAKING CHANGE: ${value.trim()}` : \"\";\n },\n skip() {\n // @ts-ignore\n return !this.state.answers.breaking;\n },\n type: \"input\",\n validate(input) {\n const chars = input?.length || 0;\n // @ts-ignore\n if (!this.state.answers.breaking) {\n return true;\n } else if (chars < 15) {\n return `Must have at least 15 characters`;\n } else if (chars > TITLE.MAX) {\n return `Cannot exceed ${TITLE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n choices: getTypes().map(({ description, emoji, emojiLength, type }) => {\n const value = emoji;\n const name = ` ${formatCliEmoji({\n emoji,\n emojiLength,\n })} ${formatCliType(type)} ${description}`;\n return {\n name,\n value,\n };\n }),\n footer() {\n return `${colors.dim.cyan(`›`)} ${colors.dim.bold(`scroll up and down to reveal more ↕`)}`;\n },\n highlight(str) {\n return colors.cyanBright(str);\n },\n limit: 18,\n message: \"Please choose a commit type\",\n name: \"gitmoji\",\n type: \"autocomplete\",\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, SCOPE.MAX);\n },\n format() {\n // @ts-ignore\n return this.state.submitted ? colors.green(this.value) : this.value;\n },\n message: \"Please share the scope (if any)\",\n name: \"scope\",\n type: \"input\",\n validate(input) {\n const chars = input.length;\n if (chars === 0) {\n return true;\n } else if (chars < SCOPE.MIN) {\n return `Must have at least ${SCOPE.MIN} characters`;\n } else if (chars > SCOPE.MAX) {\n return `Cannot exceed ${SCOPE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, TITLE.MAX);\n },\n hint() {\n // @ts-ignore\n return this.state.initial ? `… tab to use initial value` : \"\";\n },\n initial: getIssueTracker() ? `${getIssueTracker()} ` : \"\",\n message: \"Please enter the commit title\",\n name: \"title\",\n type: \"input\",\n validate(input) {\n const chars = input.length;\n if (chars < TITLE.MIN) {\n return `Must have at least ${TITLE.MIN} characters`;\n } else if (chars > TITLE.MAX) {\n return `Cannot exceed ${TITLE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n footer() {\n return `${colors.dim.cyan(`›`)} ${colors.dim(\"Return twice to submit/skip: ⮑ ⮑\")}`;\n },\n message: \"Please share a more detailed commit message (if applicable)\",\n multiline: true,\n name: \"message\",\n result(input) {\n return input === \"\\n\" ? \"\" : input;\n },\n type: \"input\",\n },\n];\n\nexport default questions;\n","import process from \"node:process\";\n\nimport { execa } from \"execa\";\n\nimport { LOGS } from \"../../lib/index.ts\";\nimport { generateLog, printDryRun } from \"../../utils/index.ts\";\n\nconst withClient = async (answers, options) => {\n try {\n const title = answers?.subject;\n const message = answers?.message;\n const messageBreaking = answers?.messageBreaking;\n\n const commitArray = [\"commit\", \"-m\", title];\n if (message) commitArray.push(\"-m\", message);\n if (messageBreaking) commitArray.push(\"-m\", messageBreaking);\n\n if (options?.dryrun) {\n printDryRun([\"git\", ...commitArray].join(\" \"));\n } else {\n await execa(\"git\", commitArray, {\n buffer: false,\n // env: { HUSKY: '0' },\n stdio: \"inherit\",\n });\n }\n } catch (error: any) {\n console.error(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.COMMIT_FAIL, error.escapedCommand));\n process.exit(1);\n }\n};\n\nexport default withClient;\n","import fs from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\n\nimport { getGitRootDir, printDryRun } from \"../../utils/index.ts\";\n\nconst commitMsgFile = join(getGitRootDir(), \".git\", \"COMMIT_EDITMSG\");\n\n// oxlint-disable-next-line complexity\nconst withHook = (answers, options) => {\n try {\n let commitMessage = answers?.subject;\n if (answers?.message && answers?.message !== \"\\n\") {\n commitMessage += `\\n\\n${answers.message}`;\n }\n if (answers?.messageBreaking && answers?.messageBreaking !== \"\\n\") {\n commitMessage += `\\n\\n${answers.messageBreaking}`;\n }\n\n if (options?.dryrun) {\n printDryRun(commitMessage);\n } else {\n fs.writeFileSync(commitMsgFile, commitMessage);\n }\n } catch (error) {\n console.error(error);\n process.exit(1);\n } finally {\n process.exit(0);\n }\n};\n\nexport default withHook;\n","import process from \"node:process\";\n\nimport enquirer from \"enquirer\";\n\nimport { COMMIT_MODES, FIND_BY, LOGS } from \"../../lib/index.ts\";\nimport {\n cancelIfNeeded,\n findBy,\n formatCommitSubject,\n generateLog,\n registerHookInterruptionHandler,\n} from \"../../utils/index.ts\";\nimport questions from \"./questions.ts\";\nimport withClient from \"./with-client.ts\";\nimport withHook from \"./with-hook.ts\";\n\nconst { prompt } = enquirer;\n\nexport type CommitOptions = {\n message?: string;\n mode: typeof COMMIT_MODES.CLIENT;\n // mode: typeof COMMIT_MODES.CLIENT | typeof COMMIT_MODES.HOOK\n scope?: string;\n skip: boolean;\n title?: string;\n};\n\n/**\n * @todo(ccommit) this is a hacky way to bypass the generator :X\n */\nconst promptAndCommit = async (options: CommitOptions) => {\n let data: any = {};\n\n if (options.skip) {\n data = options;\n // @note(ccommit) very type is an actual type\n data.gitmoji = findBy(data.type, FIND_BY.TYPE, FIND_BY.EMOJI);\n if (!data.gitmoji) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.TYPE_INCORRECT, data.type));\n process.exit(2);\n }\n } else {\n // @ts-ignore\n await prompt(questions)\n .then((answers: any) => {\n answers.type = findBy(answers.gitmoji, FIND_BY.EMOJI, FIND_BY.TYPE);\n return answers;\n })\n .then((answers) => {\n data = answers;\n })\n .catch(console.error);\n }\n\n // oxlint-disable-next-line no-extra-boolean-cast\n data.subject = !!data ? formatCommitSubject(options, data) : \"\";\n\n if (options.mode === COMMIT_MODES.HOOK) {\n return withHook(data, options);\n } else {\n return withClient(data, options);\n }\n};\nconst commit = (options: CommitOptions) => {\n if (options.mode === COMMIT_MODES.HOOK) {\n registerHookInterruptionHandler();\n return cancelIfNeeded().then(() => promptAndCommit(options));\n }\n return promptAndCommit(options);\n};\n\nexport default commit;\n","import commit from \"./commit.ts\";\n\nexport default commit;\n","import commitTypes from \"../../data/types.ts\";\nimport { formatCliTypes } from \"../../utils/index.ts\";\n\nconst list = () => formatCliTypes(commitTypes);\n\nexport default list;\n","import list from \"./list.ts\";\n\nexport default list;\n","#!/usr/bin/env node\n\n/*!\n * For license information please see index.js.LICENSE.txt\n */\nimport meow from \"meow\";\n\nimport { commit, list } from \"./commands/index.ts\";\nimport { COMMANDS, COMMIT_FORMATS, FLAGS, OPTIONS } from \"./lib/index.ts\";\nimport { findCommand } from \"./utils/index.ts\";\n\nconst cli = meow(\n `\n Usage\n $ ccommit -c\n\n Flags\n --${FLAGS.BREAKING}, -b 💥 Breaking Change\n --${FLAGS.COMMIT}, -c 💽 Mode: Client\n --${FLAGS.DRYRUN}, -n 🎽 Mode: Dry Run\n --${FLAGS.EMOJI}, -e 😜 Emoji (default)\n --${FLAGS.HOOK}, -u 🪝 Mode: Hook\n --${FLAGS.LIST}, -l 📖 List all types\n --${FLAGS.VERSION}, -v 📦 Print installed version\n\n Options\n --${OPTIONS.FORMAT} 😜 Commit Format: conventional|gitmoji (default)\n --${OPTIONS.MESSAGE} 📝 Commit Message\n --${OPTIONS.SCOPE} 🔬 Commit Scope\n --${OPTIONS.TITLE} 📓 Commit Title\n --${OPTIONS.TYPE} ✨ Commit Type\n\n Notes\n - Pass any non-format options the following will be required: --title, --type\n - If you do not pass any options the Conventional Commit Generator prompt will run\n - Branch Name detection is enabled to pre-populate Issue Tracker information in prompt\n`,\n {\n flags: {\n // Flags\n [FLAGS.BREAKING]: { default: false, shortFlag: \"b\", type: \"boolean\" },\n [FLAGS.COMMIT]: { shortFlag: \"c\", type: \"boolean\" },\n [FLAGS.DRYRUN]: { shortFlag: \"n\", type: \"boolean\" },\n [FLAGS.EMOJI]: { default: true, shortFlag: \"e\", type: \"boolean\" },\n [FLAGS.HELP]: { shortFlag: \"h\", type: \"boolean\" },\n [FLAGS.HOOK]: { shortFlag: \"u\", type: \"boolean\" },\n [FLAGS.LIST]: { shortFlag: \"l\", type: \"boolean\" },\n [FLAGS.SKIP]: { default: false, type: \"boolean\" },\n [FLAGS.VERSION]: { shortFlag: \"v\", type: \"boolean\" },\n // Options\n [OPTIONS.FORMAT]: { default: COMMIT_FORMATS.GITMOJI, type: \"string\" },\n [OPTIONS.MESSAGE]: { type: \"string\" },\n [OPTIONS.SCOPE]: { type: \"string\" },\n [OPTIONS.TITLE]: { type: \"string\" },\n [OPTIONS.TYPE]: { type: \"string\" },\n },\n importMeta: import.meta,\n },\n);\n\nconst commands = {\n [COMMANDS.COMMIT]: (options: any) => commit(options),\n [COMMANDS.HOOK]: (options: any) => commit(options),\n [COMMANDS.LIST]: () => list(),\n};\n\nfindCommand(cli, commands);\n"],"mappings":";uOAAA,MAAM,EAAW,CACf,OAAQ,SACR,KAAM,OACN,KAAM,MACR,EACM,EAAiB,CACrB,aAAc,eACd,sBAAuB,wBACvB,QAAS,SACX,EAEM,EAAe,CACnB,OAAQ,SACR,KAAM,MACR,EAEM,EAAU,CACd,MAAO,QACP,KAAM,MACR,EAEM,EAAQ,OAAO,OAAO,CAC1B,SAAU,WACV,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,KAAM,OACN,KAAM,OACN,KAAM,OACN,KAAM,OACN,QAAS,SACX,CAAC,EAEK,EAAS,EACZ,EAAe,cAAe,2CAC9B,EAAe,uBAAwB,oCACvC,EAAe,SAAU,iCAC5B,EAEM,EAAO,CACX,SAAU,CACR,8BAA+B,uDAC/B,YAAa;;;;;;;;MAMb,sBAAuB,sDACvB,cAAe,8DACf,QAAS,YACT,aAAc,0EACd,eAAgB,uDAClB,EACA,MAAO,CACL,MAAO,QACP,KAAM,OACN,QAAS,UACT,QAAS,SACX,CACF,EAEM,EAAU,OAAO,OAAO,CAC5B,OAAQ,SACR,QAAS,UACT,MAAO,QACP,MAAO,QACP,KAAM,MACR,CAAC,EAEK,EAAQ,CACZ,IAAK,GACL,IAAK,CACP,EAEM,EAAS,CACb,MAAO,QACP,MAAO,QACP,KAAM,OACN,MAAO,OACT,EAEM,EAAQ,CACZ,IAAK,GACL,SAAU,GACV,IAAK,EACL,SAAU,EACZ,EAEM,EAAO,CACX,IAAK,EACP,ECnFM,MACJ,EAAM,MAAO,CAAC,YAAa,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAE,OAAQ,KAAmB;;;;CAIjF,EAAG,WAAW,EAAe,eAAe,GAC5C,EAAG,WAAW,EAAe,eAAe,IAE5C,EAAQ,KAAK,CAAC,CAElB,CAAC,EAIG,MACJ,IAAI,QAAe,GAAY,CAM7B,IAAM,EAA8BA,EAAQ,KAAA,GAE1C,IACC,EAAoB,WAAW,QAAQ,GAAK,EAAoB,WAAW,OAAO,IAEnF,EAAQ,KAAK,CAAC,EAEhB,EAAQ,CACV,CAAC,EAGG,MAAsC,EAAiB,CAAC,CAAC,KAAK,CAAgB,ECpC9E,EAAQ,CACZ,CACE,KAAM,eACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,6BACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,UACN,YAAa,2CACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,0BACN,YAAa,6BACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,UACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,UACN,YAAa,0BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,WACR,EACA,CACE,KAAM,UACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,SACN,YAAa,6BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,UACR,EACA,CACE,KAAM,WACN,YAAa,oCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,aACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,kBACN,YAAa,8CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,wBACN,YAAa,gCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,gBACN,YAAa,6CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,UACN,YAAa,0CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,8DACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,WACN,YAAa,oCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,wBACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,iBACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,kBACN,YAAa,mCACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,IACR,EACA,CACE,KAAM,oBACN,YAAa,mBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,qBACN,YAAa,sBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,YACN,YAAa,2CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,SACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,WACR,EACA,CACE,KAAM,SACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,eACN,YAAa,yBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,iBACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,QACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,KACR,EACA,CACE,KAAM,YACN,YAAa,sBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,YACR,EACA,CACE,KAAM,aACN,YAAa,yBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,QACN,YAAa,YACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,KACR,EACA,CACE,KAAM,gBACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,4BACN,YAAa,qCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,gBACN,YAAa,4BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,cACN,YAAa,kBACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,yBACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,gBACN,YAAa,kCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,iCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,SACN,YAAa,kBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,WACN,YAAa,4BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,mBACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,mBACN,YAAa,iCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,eACN,YAAa,qBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,SACN,YAAa,cACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,YACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,8BACN,YAAa,iBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,eACN,YAAa,cACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,UACN,YAAa,sDACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,aACN,YAAa,0BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,qBACN,YAAa,sCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,QACN,YAAa,sBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,SACN,YAAa,2CACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,SACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,YACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,YACN,YAAa,gBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,UACR,EACA,CACE,KAAM,aACN,YAAa,yBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,WACN,YAAa,iBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,mBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,qBACN,YAAa,8DACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,iBACN,YAAa,6BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,WACN,YAAa,wDACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,yBACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,SACN,YAAa,sBACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,UACR,EACA,CACE,KAAM,aACN,YAAa,2BACb,MAAO,KACP,YAAa,EACb,O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"}
package/package.json CHANGED
@@ -1,52 +1,61 @@
1
1
  {
2
2
  "name": "ccommit",
3
- "version": "4.1.0",
4
- "type": "module",
3
+ "version": "4.2.0-canary.1",
4
+ "private": false,
5
5
  "description": "😜 ➕ 👔 🟰 ccommit \n Conventional Commit Generator that interprets commit types from gitmoji and conventional",
6
- "repository": {
7
- "directory": "packages/ccommit",
8
- "type": "git",
9
- "url": "git+https://github.com/JeromeFitz/packages.git"
10
- },
6
+ "keywords": [
7
+ "commit",
8
+ "conventional changelog",
9
+ "conventional commits",
10
+ "enquirer",
11
+ "format",
12
+ "gitflow",
13
+ "githubflow",
14
+ "gitmoji",
15
+ "semver"
16
+ ],
11
17
  "homepage": "https://github.com/JeromeFitz/packages/tree/main/packages/ccommit#readme",
18
+ "license": "MIT",
12
19
  "author": {
13
20
  "name": "Jerome Fitzgerald",
14
21
  "email": "j@jeromefitzgerald.com",
15
22
  "url": "https://jeromefitzgerald.com"
16
23
  },
17
- "license": "MIT",
18
- "private": false,
19
- "engines": {
20
- "node": ">=24"
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/JeromeFitz/packages.git",
27
+ "directory": "packages/ccommit"
21
28
  },
22
29
  "bin": {
23
- "ccommit": "./index.mjs"
30
+ "ccommit": "./src/index.ts"
24
31
  },
32
+ "type": "module",
33
+ "sideEffects": false,
25
34
  "exports": {
26
- ".": "./index.mjs",
35
+ ".": {
36
+ "development": "./src/index.ts",
37
+ "default": "./dist/index.mjs"
38
+ },
27
39
  "./package.json": "./package.json"
28
40
  },
29
- "keywords": [
30
- "commit",
31
- "conventional changelog",
32
- "conventional commits",
33
- "enquirer",
34
- "format",
35
- "gitflow",
36
- "githubflow",
37
- "gitmoji",
38
- "semver"
39
- ],
41
+ "publishConfig": {
42
+ "bin": {
43
+ "ccommit": "./dist/index.mjs"
44
+ },
45
+ "exports": {
46
+ ".": "./dist/index.mjs",
47
+ "./package.json": "./package.json"
48
+ },
49
+ "provenance": true,
50
+ "registry": "https://registry.npmjs.org/"
51
+ },
40
52
  "scripts": {
41
53
  "build": "tsdown",
42
54
  "clean": "rm -rf .turbo && rm -rf dist",
43
55
  "clean:install": "pnpm run clean && rm -rf node_modules",
44
- "copy": "mkdir -p ./dist && ./scripts/copy.sh",
45
56
  "dev": "tsdown --watch",
46
- "dry:run": "pnpm run build && node ./index.js -c -n",
47
- "lint": "pnpm run lint:typescript",
48
- "lint:typescript": "tsc --noEmit --declaration",
49
- "prepare": "is-ci || pnpm run build",
57
+ "dry:run": "pnpm run build && node ./dist/index.js -c -n",
58
+ "lint:ts": "tsc --noEmit --declaration",
50
59
  "semantic-release": "semantic-release",
51
60
  "semantic-release:dry": "semantic-release --dry-run"
52
61
  },
@@ -58,11 +67,10 @@
58
67
  "meow": "14.1.0"
59
68
  },
60
69
  "devDependencies": {
61
- "is-ci": "4.1.0"
62
- },
63
- "publishConfig": {
64
- "registry": "https://registry.npmjs.org/",
65
- "provenance": true
70
+ "@types/node": "24.13.2",
71
+ "is-in-ci": "2.0.0"
66
72
  },
67
- "sideEffects": false
73
+ "engines": {
74
+ "node": ">=24"
75
+ }
68
76
  }
@@ -0,0 +1,25 @@
1
+ import { createRequire } from "node:module";
2
+
3
+ import { getConfig } from "@jeromefitz/semantic";
4
+ import isCI from "is-in-ci";
5
+
6
+ import { config as configDefault } from "../../release.config.js";
7
+
8
+ if (!isCI) {
9
+ const dotenv = await import("dotenv");
10
+ dotenv.config({ path: "../../.env" });
11
+ }
12
+
13
+ const require = createRequire(import.meta.url);
14
+ const pkg = require("./package.json");
15
+
16
+ const { name } = pkg;
17
+
18
+ const configPassed = {
19
+ ...configDefault,
20
+ tagFormat: `${name}@\${version}`,
21
+ };
22
+
23
+ const config = getConfig(configPassed);
24
+
25
+ export default config;
@@ -0,0 +1,72 @@
1
+ import process from "node:process";
2
+
3
+ import enquirer from "enquirer";
4
+
5
+ import { COMMIT_MODES, FIND_BY, LOGS } from "../../lib/index.ts";
6
+ import {
7
+ cancelIfNeeded,
8
+ findBy,
9
+ formatCommitSubject,
10
+ generateLog,
11
+ registerHookInterruptionHandler,
12
+ } from "../../utils/index.ts";
13
+ import questions from "./questions.ts";
14
+ import withClient from "./with-client.ts";
15
+ import withHook from "./with-hook.ts";
16
+
17
+ const { prompt } = enquirer;
18
+
19
+ export type CommitOptions = {
20
+ message?: string;
21
+ mode: typeof COMMIT_MODES.CLIENT;
22
+ // mode: typeof COMMIT_MODES.CLIENT | typeof COMMIT_MODES.HOOK
23
+ scope?: string;
24
+ skip: boolean;
25
+ title?: string;
26
+ };
27
+
28
+ /**
29
+ * @todo(ccommit) this is a hacky way to bypass the generator :X
30
+ */
31
+ const promptAndCommit = async (options: CommitOptions) => {
32
+ let data: any = {};
33
+
34
+ if (options.skip) {
35
+ data = options;
36
+ // @note(ccommit) very type is an actual type
37
+ data.gitmoji = findBy(data.type, FIND_BY.TYPE, FIND_BY.EMOJI);
38
+ if (!data.gitmoji) {
39
+ console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.TYPE_INCORRECT, data.type));
40
+ process.exit(2);
41
+ }
42
+ } else {
43
+ // @ts-ignore
44
+ await prompt(questions)
45
+ .then((answers: any) => {
46
+ answers.type = findBy(answers.gitmoji, FIND_BY.EMOJI, FIND_BY.TYPE);
47
+ return answers;
48
+ })
49
+ .then((answers) => {
50
+ data = answers;
51
+ })
52
+ .catch(console.error);
53
+ }
54
+
55
+ // oxlint-disable-next-line no-extra-boolean-cast
56
+ data.subject = !!data ? formatCommitSubject(options, data) : "";
57
+
58
+ if (options.mode === COMMIT_MODES.HOOK) {
59
+ return withHook(data, options);
60
+ } else {
61
+ return withClient(data, options);
62
+ }
63
+ };
64
+ const commit = (options: CommitOptions) => {
65
+ if (options.mode === COMMIT_MODES.HOOK) {
66
+ registerHookInterruptionHandler();
67
+ return cancelIfNeeded().then(() => promptAndCommit(options));
68
+ }
69
+ return promptAndCommit(options);
70
+ };
71
+
72
+ export default commit;
@@ -0,0 +1,3 @@
1
+ import commit from "./commit.ts";
2
+
3
+ export default commit;
@@ -0,0 +1,166 @@
1
+ import colors from "ansi-colors";
2
+
3
+ import commitTypes from "../../data/types.ts";
4
+ import { SCOPE, TITLE } from "../../lib/index.ts";
5
+ import { formatCliEmoji, formatCliType, getCharsLeft, getIssueTracker } from "../../utils/index.ts";
6
+
7
+ const getTypes = () =>
8
+ commitTypes.map(({ description, emoji, emojiLength, type }) => ({
9
+ description,
10
+ emoji,
11
+ emojiLength,
12
+ type,
13
+ }));
14
+
15
+ const characterCount = (input, max) => {
16
+ const count = getCharsLeft(input);
17
+ const countMessage = `Character Count (${count}/${max})`;
18
+ return `${colors.dim.cyan(`›`)} ${colors.dim.bold(countMessage)}`;
19
+ };
20
+
21
+ const prefixState = (state) => {
22
+ return state.submitted
23
+ ? state.cancelled
24
+ ? colors.magenta("✖")
25
+ : colors.green("✔")
26
+ : colors.cyan("?");
27
+ };
28
+
29
+ /**
30
+ * @note(enquirier) 3.x will "fix" skip passing answers for now
31
+ * you can access "this" state by __not__ using arrow functions
32
+ */
33
+ const questions = [
34
+ {
35
+ default: "(y/N)",
36
+ format(input) {
37
+ const yn = input ? "yes" : "no";
38
+ // @ts-ignore
39
+ return this.state.submitted ? colors.green(yn) : colors.dim(yn);
40
+ },
41
+ initial: false,
42
+ message: "Is there a breaking change?",
43
+ name: "breaking",
44
+ prefix() {
45
+ // @ts-ignore
46
+ return prefixState(this.state);
47
+ },
48
+ styles: { primary: colors.white },
49
+ type: "confirm",
50
+ },
51
+ {
52
+ footer() {
53
+ // @ts-ignore
54
+ return characterCount(this.state.input, TITLE.MAX);
55
+ },
56
+ message: "Please share breaking change info",
57
+ name: "messageBreaking",
58
+ result(value) {
59
+ return value ? `BREAKING CHANGE: ${value.trim()}` : "";
60
+ },
61
+ skip() {
62
+ // @ts-ignore
63
+ return !this.state.answers.breaking;
64
+ },
65
+ type: "input",
66
+ validate(input) {
67
+ const chars = input?.length || 0;
68
+ // @ts-ignore
69
+ if (!this.state.answers.breaking) {
70
+ return true;
71
+ } else if (chars < 15) {
72
+ return `Must have at least 15 characters`;
73
+ } else if (chars > TITLE.MAX) {
74
+ return `Cannot exceed ${TITLE.MAX} characters`;
75
+ } else {
76
+ return true;
77
+ }
78
+ },
79
+ },
80
+ {
81
+ choices: getTypes().map(({ description, emoji, emojiLength, type }) => {
82
+ const value = emoji;
83
+ const name = ` ${formatCliEmoji({
84
+ emoji,
85
+ emojiLength,
86
+ })} ${formatCliType(type)} ${description}`;
87
+ return {
88
+ name,
89
+ value,
90
+ };
91
+ }),
92
+ footer() {
93
+ return `${colors.dim.cyan(`›`)} ${colors.dim.bold(`scroll up and down to reveal more ↕`)}`;
94
+ },
95
+ highlight(str) {
96
+ return colors.cyanBright(str);
97
+ },
98
+ limit: 18,
99
+ message: "Please choose a commit type",
100
+ name: "gitmoji",
101
+ type: "autocomplete",
102
+ },
103
+ {
104
+ footer() {
105
+ // @ts-ignore
106
+ return characterCount(this.state.input, SCOPE.MAX);
107
+ },
108
+ format() {
109
+ // @ts-ignore
110
+ return this.state.submitted ? colors.green(this.value) : this.value;
111
+ },
112
+ message: "Please share the scope (if any)",
113
+ name: "scope",
114
+ type: "input",
115
+ validate(input) {
116
+ const chars = input.length;
117
+ if (chars === 0) {
118
+ return true;
119
+ } else if (chars < SCOPE.MIN) {
120
+ return `Must have at least ${SCOPE.MIN} characters`;
121
+ } else if (chars > SCOPE.MAX) {
122
+ return `Cannot exceed ${SCOPE.MAX} characters`;
123
+ } else {
124
+ return true;
125
+ }
126
+ },
127
+ },
128
+ {
129
+ footer() {
130
+ // @ts-ignore
131
+ return characterCount(this.state.input, TITLE.MAX);
132
+ },
133
+ hint() {
134
+ // @ts-ignore
135
+ return this.state.initial ? `… tab to use initial value` : "";
136
+ },
137
+ initial: getIssueTracker() ? `${getIssueTracker()} ` : "",
138
+ message: "Please enter the commit title",
139
+ name: "title",
140
+ type: "input",
141
+ validate(input) {
142
+ const chars = input.length;
143
+ if (chars < TITLE.MIN) {
144
+ return `Must have at least ${TITLE.MIN} characters`;
145
+ } else if (chars > TITLE.MAX) {
146
+ return `Cannot exceed ${TITLE.MAX} characters`;
147
+ } else {
148
+ return true;
149
+ }
150
+ },
151
+ },
152
+ {
153
+ footer() {
154
+ return `${colors.dim.cyan(`›`)} ${colors.dim("Return twice to submit/skip: ⮑ ⮑")}`;
155
+ },
156
+ message: "Please share a more detailed commit message (if applicable)",
157
+ multiline: true,
158
+ name: "message",
159
+ result(input) {
160
+ return input === "\n" ? "" : input;
161
+ },
162
+ type: "input",
163
+ },
164
+ ];
165
+
166
+ export default questions;
@@ -0,0 +1,33 @@
1
+ import process from "node:process";
2
+
3
+ import { execa } from "execa";
4
+
5
+ import { LOGS } from "../../lib/index.ts";
6
+ import { generateLog, printDryRun } from "../../utils/index.ts";
7
+
8
+ const withClient = async (answers, options) => {
9
+ try {
10
+ const title = answers?.subject;
11
+ const message = answers?.message;
12
+ const messageBreaking = answers?.messageBreaking;
13
+
14
+ const commitArray = ["commit", "-m", title];
15
+ if (message) commitArray.push("-m", message);
16
+ if (messageBreaking) commitArray.push("-m", messageBreaking);
17
+
18
+ if (options?.dryrun) {
19
+ printDryRun(["git", ...commitArray].join(" "));
20
+ } else {
21
+ await execa("git", commitArray, {
22
+ buffer: false,
23
+ // env: { HUSKY: '0' },
24
+ stdio: "inherit",
25
+ });
26
+ }
27
+ } catch (error: any) {
28
+ console.error(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.COMMIT_FAIL, error.escapedCommand));
29
+ process.exit(1);
30
+ }
31
+ };
32
+
33
+ export default withClient;