cli_command_project_lib_dir-name-check.js

import validate from 'validate-npm-package-name'
import resolvePath from 'aneka/src/resolve-path.js'
import isEmptyDir from '../../../lib/is-empty-dir.js'
import path from 'path'
import ora from 'ora'
import delay from 'delay'
import fs from 'fs-extra'
import { __ } from '../../../lib/translate.js'
import getNpmPkgInfo from '../../../lib/get-npm-pkg-info.js'

/**
 * Check the validity of the directory name and npm package name.
 *
 * @async
 * @memberof module:CLI/Command/Project
 * @param {object} argv - Command line arguments
 * @param {string} cwd - Current working directory
 * @returns {Promise<string>} - Validated directory path
 */
async function dirNameCheck (argv, cwd) {
  // check name
  const spinner = ora(__('Checking name')).start()
  await delay(1000)
  const nameCheck = validate(argv.name)
  if (!nameCheck.validForNewPackages) {
    spinner.fail(__('Package name \'%s\' is not a valid npm package name. Aborted!', argv.name))
    process.kill(process.pid, 'SIGINT')
    return
  }
  if (argv.registry) argv.checkNpm = true
  if (argv.checkNpm) {
    try {
      const resp = await getNpmPkgInfo(argv.name, argv.registry)
      if (resp && resp.status !== 404) {
        spinner.fail(__('Package name \'%s\' is already taken on npm registry. Aborted!', argv.name))
        process.kill(process.pid, 'SIGINT')
        return
      }
    } catch (err) {
      spinner.fail(__('Can\'t check \'%s\' against npm registry: %s. Aborted!', argv.name, err.message))
      process.kill(process.pid, 'SIGINT')
      return
    }
  }
  // check dir
  if (!cwd) cwd = resolvePath(process.cwd())
  const parts = argv.name.split('/')
  cwd = parts.length === 1 ? `${cwd}/${argv.name}` : `${cwd}/${parts[0].replace('@', '')}-${parts[1]}`
  if (argv.useCwd) cwd = resolvePath(process.cwd())
  if (fs.existsSync(cwd) && !(await isEmptyDir(cwd))) {
    spinner.fail(__('Directory \'%s\' is NOT empty. Aborted!', path.resolve(cwd)))
    process.kill(process.pid, 'SIGINT')
    return
  }
  spinner.succeed(__('Package name: %s', argv.name))
  return cwd
}

export default dirNameCheck