Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cz commitlint CLI question customization for custom rules. #2684

Open
2 tasks done
gsmith-mythical opened this issue Jul 21, 2021 · 8 comments
Open
2 tasks done

cz commitlint CLI question customization for custom rules. #2684

gsmith-mythical opened this issue Jul 21, 2021 · 8 comments
Labels

Comments

@gsmith-mythical
Copy link

I would like to add the ability to add a CLI prompt for a custom rule. (e.g. ticket number included in commit message)

Expected Behavior

Would like for a way to add new custom option to add ticket number to the CLI prompt.
feat(button): added theme settings [TICKET-123]
commitlint.config.js

module.exports = {
    extends: ['@commitlint/config-conventional'],
    plugins: [
        {
          rules: {
            ticket: ({ subject }) => {
              const ticketRegex = /(\w+-{1}\d+)/;
              return [
                ticketRegex.test(subject),
                "Your subject should include the ticket, for example PRJ-300.",
              ];
            },
          },
        },
      ],
    rules: {
      ticket: [2, "always"],
    },
    parserPreset: './parser-presets.js',
    prompt: {
        questions: {
          // ...
          subject: {
            description: 'Write a short, imperative tense description of the change',
          },
          ticket: {
            description: 'Provide a Ticket Number',
          },
          body: {
            description: 'Provide a longer description of the change',
          },
          // ...
        },
      }
}

parser-preset.js

module.exports = {
    parserOpts: {
      headerPattern: /^(\w+)\(\w+\):[ ]{1}(\w{1}.+\w{1})[ ]{1}\[(\w+-{1}\d+)\]$/,
      headerCorrespondence: ['type', 'scope', 'subject', 'ticket'],
    },
  };

Current Behavior

Currently ignores my new rule / custom CLI prompt. I can't find any documentation that directly walks through this process of making a custom prompt with a custom rule. You can override current rules and change language. But unable to have question use new custom made rules. If this isn't something that can be / is supported that's perfectly fine! I'm just curious if it's currently possible, and if it is where I may be tripping up.

Affected packages

  • cli
  • cz-commitlint
Executable Version
commitlint --version 12.1.4
git --version 2.32.0
node --version 14.17.1
@chrwlk
Copy link

chrwlk commented Oct 13, 2021

I had the same issue. With the help of this comment I was able to fix it by adding a rule for each header correspondence. Otherwise it was just being ignored.

So I ended up with something similar to this:

rules: {
  "type-empty": [2, "never"],
  "scope-empty": [2, "never"],
  "subject-empty": [2, "never"],
  "ticket": [2, "always"],
}

Hope it helps!

@antonpatsev
Copy link

antonpatsev commented Jun 8, 2022

Could you share full commitlint.config.js ? Thanks!

@tomavic
Copy link

tomavic commented Jun 18, 2022

I searched and found this nice tutorial. I believe this may work with some tweaks

@antonpatsev @gsmith-mythical

@escapedcat
Copy link
Member

I searched and found this nice tutorial

Which tutorial?

@tomavic
Copy link

tomavic commented Jun 18, 2022

@escapedcat 😂 I forgot to paste it . Here it is

I find it too much configurations which didn't work for me

The second one here seems a bit interesting as it uses emojis too with no problems.

@tomavic
Copy link

tomavic commented Jun 18, 2022

I also added a pre-comit-msg hook which was not mentioned in the above tutorial but was mentioned in other tutuorials. The hook itself has some issues if it's used in a wrong way. But luckily it works for me now.

"husky": "^8.0.0",
"@commitlint/cli": "^17.0.2",
"commitizen": "^4.2.4",
"commitlint-config-gitmoji": "^2.2.5",
"cz-customizable": "^6.3.0",

My prepare-commit-msg hook

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

exec < /dev/tty && node_modules/.bin/cz --hook || true

🛠⚒ WARNING 🛠⚒

This will work just fine on linux based systems. For Windows there will be a hateful behaviour you will experience. for more information please check commitizen/cz-cli#627 (comment)
Here I had to include node_modules/.bin/cz instead of npx cz. I didn't like the idea of adding extra npm script like this

"cm": "cz"
// or
"commit": "cz"

My pre-commit hook

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx --no-install commitlint --edit "$1"

My cz-config.js

module.exports = {
  types: [
    { value: ':sparkles: feat', name: '✨ feat:\tAdding a new feature' },
    { value: ':bug: fix', name: '🐛 fix:\tFixing a bug' },
    { value: ':memo: docs', name: '📝 docs:\tAdd or update documentation' },
    {
      value: ':lipstick: style',
      name: '💄 style:\tAdd or update styles, ui or ux',
    },
    {
      value: ':recycle: refactor',
      name: '♻️  refactor:\tCode change that neither fixes a bug nor adds a feature',
    },
    {
      value: ':zap: perf',
      name: '⚡️ perf:\tCode change that improves performance',
    },
    {
      value: ':white_check_mark: test',
      name: '✅ test:\tAdding tests cases',
    },
    {
      value: ':truck: chore',
      name: '🚚 chore:\tChanges to the build process or auxiliary tools\n\t\tand libraries such as documentation generation',
    },
    { value: ':rewind: revert', name: '⏪️ revert:\tRevert to a commit' },
    { value: ':construction: wip', name: '🚧 wip:\tWork in progress' },
    {
      value: ':construction_worker: build',
      name: '👷 build:\tAdd or update regards to build process',
    },
    {
      value: ':green_heart: ci',
      name: '💚 ci:\tAdd or update regards to build process',
    },
  ],

  scopes: [
    { name: 'ui' },
    { name: 'android' },
    { name: 'ios' },
    { name: 'home' },
    { name: 'planner' },
    { name: 'settings' },
  ],

  scopeOverrides: {
    fix: [{ name: 'merge' }, { name: 'style' }, { name: 'test' }, { name: 'hotfix' }],
  },

  allowCustomScopes: true,
  allowBreakingChanges: ['feat', 'fix'],
  // skip any questions you want
  skipQuestions: ['body'],
  subjectLimit: 100,
};

My commitlint.config.js

module.exports = {
  extends: ['gitmoji'],
  rules: {
    'header-max-length': [0, 'always', 100],
  },
};

My Package.json config part

  "config": {
    "commitizen": {
      "path": "cz-customizable"
    }
  },

@stevenKirill
Copy link

stevenKirill commented Dec 15, 2023

I wanna make something similar like this feat: TEAMCVSPB-(any number) - (message). I created regexp like this /^(\w*): (TEAMCVSPB-\d+) ([a-zA-Z])+$/g, but it can't parse it I got this in my log

{
  type: null,
  ticket: null,
  subject: null,
  merge: null,
  header: 'test: TEAMCVSPB-6972 - test',
  body: null,
  footer: null,
  notes: [],
  references: [],
  mentions: [],
  revert: null,
  raw: 'test: TEAMCVSPB-6972 - test\n\n'
} 

my config looks like this

  parserPreset: {
    parserOpts: {
      headerPattern: /^(\w*): (TEAMCVSPB-\d+) ([a-zA-Z])+$/g,
      headerCorrespondence: ["type", "ticket", "subject"],
    },
  },
  rules: {
    "type-empty": [2, "never"],
    "ticket": [2, "always"],
    "subject-empty": [2, "never"],
  },

What I'm doing wrong guys please help me ? @chrwlk @tomavic @gsmith-mythical

@webmatrixxxl
Copy link

I'm not able to have a prompt for a custom rule. (e.g. ticket number included in commit message).

commitlint-cli: 18.4.3
git --version 2.39.3
node --version 18

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

7 participants