Skip to main content
Deno 2 is finally here 🎉️
Learn more

hoipoi capsule

What is this?

Create a commit message in an interactive format.

Try

# Go to git directory
brew install deno

deno run --allow-net --allow-write --allow-run "https://deno.land/x/hoipoi_capsule/demo/fill_in_commit_message/conventionalcommits_style.ts?source"
cat .git/COMMIT_EDITMSG

Use

Run with Git hook.

It works without gh. gh is used to obtain github issues.Please complete the gh setup in advance.

brew install deno gh

Prepare Git hook.

mkdir .githooks

cat <<EOF > .githooks/prepare-commit-msg
#!/bin/sh

exec < /dev/tty deno run --allow-net --allow-write --allow-run "https://deno.land/x/hoipoi_capsule/demo/fill_in_commit_message/conventionalcommits_style.ts?source"

EOF

git config --local core.hooksPath .githooks
chmod +x .githooks/prepare-commit-msg

Execution.

touch myFile.txt
git add myFile.txt
git commit

Customize

Here is a reference.

import * as hoipoiCapsule from "https://deno.land/x/hoipoi_capsule/mod.ts";

const commitMessageTemplate = `{{type}}({{scope}}): {{summary}}

{{body}}

BREAKING CHANGE: {{breakingChange}}`;

hoipoiCapsule.useCase.fillInCommitMessage.run({
  commitMessageTemplate,
  questionList: [
    {
      /**
       * The answer applies to the {{type}} part of commitMessageTemplate.
       */
      target: "type",
      /**
       * Pre-prepared questions.
       */
      q: hoipoiCapsule.preset.fillInCommitMessage.conventionalcommits.qMap.type,

      /**
       * Thus, you can also create your own questions.
       */
      //   q: typeQ,

      /**
       * Modify the commit message.
       * Use this function when a message is unanswered, for example.
       */
      fixCommitMessage: (p) => {
        if (p.answerMap["type"] === "???") {
          return p.commitMessage.replace(/\r?\n{2,}/, "\n").trim();
        }
        return p.commitMessage;
      },
    },
  ],
});

/**
 * Please check here.
 * https://github.com/c4spar/deno-cliffy
 */
const typeQ = () =>
  hoipoiCapsule.userInterface.prompt.Select.prompt({
    message: "Select type.",
    search: true,
    options: [
      {
        name:
          "Build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)",
        value: "Build",
      },
      {
        name:
          "CI: Changes to our CI configuration files and scripts (examples: CircleCi, SauceLabs)",
        value: "CI",
      },
      { name: "Docs: Documentation only changes", value: "Docs" },
      { name: "Feat: A new feature", value: "Feat" },
      { name: "Fix: A bug fix", value: "Fix:" },
      { name: "Perf: A code change that improves performance", value: "Perf" },
      {
        name:
          "Refactor: A code change that neither fixes a bug nor adds a feature",
        value: "Refactor",
      },
      {
        name: "Test: Adding missing tests or correcting existing tests",
        value: "Test",
      },
    ],
  });

Convenient Use

Grammar Check

Create commit-msg. It works well with this system.