carloscuesta/gitmoji-cli

View on GitHub
src/commands/commit/prompts.js

Summary

Maintainability
A
1 hr
Test Coverage
// @flow
import inquirer from 'inquirer'
import inquirerAutocompletePrompt from 'inquirer-autocomplete-prompt'

import configurationVault from '@utils/configurationVault'
import filterGitmojis from '@utils/filterGitmojis'
import getDefaultCommitContent from '@utils/getDefaultCommitContent'
import { type CommitOptions, capitalizeTitle } from '.'
import guard from './guard'

const TITLE_MAX_LENGTH_COUNT: number = 48

inquirer.registerPrompt('autocomplete', inquirerAutocompletePrompt)

export type Gitmoji = {
  code: string,
  description: string,
  emoji: string,
  name: string
}

export type Answers = {
  gitmoji: string,
  scope: ?string,
  title: string,
  message: ?string
}

export default (
  gitmojis: Array<Gitmoji>,
  options: CommitOptions
): Array<Object> => {
  const { title, message, scope } = getDefaultCommitContent(options)

  return [
    {
      name: 'gitmoji',
      message: 'Choose a gitmoji:',
      type: 'autocomplete',
      source: (answersSoFor: any, input: string) => {
        return Promise.resolve(
          filterGitmojis(input, gitmojis).map((gitmoji) => ({
            name: `${gitmoji.emoji}  - ${gitmoji.description}`,
            value: gitmoji[configurationVault.getEmojiFormat()]
          }))
        )
      }
    },
    ...(configurationVault.getScopePrompt()
      ? [
          {
            name: 'scope',
            message: 'Enter the scope of current changes:',
            ...(scope ? { default: scope } : {})
          }
        ]
      : []),
    {
      name: 'title',
      message: 'Enter the commit title',
      validate: guard.title,
      transformer: (input: string) => {
        const length = (title || input).length.toString().padStart(2, '0');
        
        return `[${length}/${TITLE_MAX_LENGTH_COUNT}]: ${
          configurationVault.getCapitalizeTitle()
            ? capitalizeTitle(input)
            : input
        }`
      },
      ...(title ? { default: title } : {})
    },
    ...(configurationVault.getMessagePrompt()
      ? [
          {
            name: 'message',
            message: 'Enter the commit message:',
            ...(message ? { default: message } : {})
          }
        ]
      : [])
  ]
}