cli_command_project_lib_build-package-json.js

import { input } from '@inquirer/prompts'
import semver from 'semver'
import { get, without, trim, map } from 'lodash-es'
import { __ } from '../../../lib/translate.js'
import boxen from 'boxen'

/**
 * Build the package.json file for a new project.
 *
 * @async
 * @memberof module:CLI/Command/Project
 * @param {object} options - Parameters
 * @param {object} options.argv - Command line arguments
 * @param {object} options.session - Session data
 * @param {string} options.type - Project type
 * @returns {Promise<object>} - The generated package.json object
 */
async function buildPackageJson (options) {
  const { argv, session, type } = options
  const pkg = { name: argv.name, type: 'module', main: 'index.js', bajo: { type } }
  pkg.version = await input({
    message: __('Version'),
    default: get(session, 'pkg.version', '0.0.1'),
    validate (text) {
      return semver.clean(text) ? true : __('Invalid version')
    }
  })
  pkg.description = await input({
    message: __('Description'),
    default: get(session, 'pkg.description')
  })
  const repo = await input({
    message: __('Git Repository'),
    default: get(session, 'pkg.repository.url')
  })
  const keywords = await input({
    message: __('Keywords'),
    default: get(session, 'pkg.keywords', []).join(' ')
  })
  pkg.author = await input({
    message: __('Author'),
    default: get(session, 'pkg.author')
  })
  pkg.license = await input({
    message: __('License'),
    default: get(session, 'pkg.license', 'MIT')
  })
  pkg.repository = {
    type: 'git',
    url: repo
  }
  pkg.keywords = without(map((keywords ?? '').replaceAll(',', ' ').split(' '), k => trim(k)), '', undefined, null)
  console.log(boxen(JSON.stringify(pkg, null, 2), { title: 'package.json', padding: 1, borderStyle: 'round' }))
  return pkg
}

export default buildPackageJson