cli.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict'

var path = require('path')
var fs = require('fs')
var cwd = process.cwd()
var Pkg = require('./lib/pkg')
var extend = require('extend')
var minimist = require('minimist')

var napa = module.exports = {}

napa.cli = function (args, done) {
  var parsedArgs = minimist(args)
  args = parsedArgs['_']
  var total = 0
  var pkg = napa.readpkg()
  var opts = napa._loadFromPkg('napa-config', {})

  // Add flags to opts
  var flags = parsedArgs
  delete flags['_']
  opts = extend(opts, flags)

  if (pkg) {
    args = args.map(napa.args).concat(pkg)
  } else {
    args = args.map(napa.args)
  }

  args.forEach(function (cmd) {
    total++
    opts.ref = cmd[2]

    var pkg = new Pkg(cmd[0], cmd[1], opts)
    pkg.install(close)
  })

  function close () {
    total--
    if (total < 1 && typeof done === 'function') {
      return done()
    }
  }
}

napa.args = function (str) {
  var url, name
  var split = str.split(':')

  if (split.length === 3) {
    name = split[2]
    url = split.slice(0, 2).join(':')
  } else if (split.length === 2) {
    if (split[1].slice(0, 2) === '//') {
      url = split.join(':')
    } else {
      url = split[0]
      name = split[1]
    }
  } else {
    url = split.join(':')
  }

  if (!name) {
    name = url.slice(url.lastIndexOf('/') + 1)
  }

  return [napa.url(url), name, napa.getref(str)]
}

napa.url = function (url) {
  if (typeof url !== 'string') {
    if (url.url) url = url.url
    else return false
  }

  if (url.indexOf('#') !== -1) {
    if (url.indexOf('://') === -1) {
      var s = url.split('#')
      url = 'https://github.com/' + s[0] + '/archive/' + s[1]
      if (process.platform === 'win32') url += '.zip'
      else url += '.tar.gz'
    } else {
      url = url.replace(/#.*?$/, '')
    }
  }

  if (url.slice(0, 1) === '/') {
    url = url.slice(1)
  }

  if (url.indexOf('://') === -1) {
    url = 'git://github.com/' + url
  }

  return url
}

napa.readpkg = function () {
  var repos = napa._loadFromPkg('napa') || {}

  return Object.keys(repos).map(function (repo) {
    var repoLocation = repos[repo]
    return [napa.url(repoLocation), repo, napa.getref(repoLocation)]
  })
}

napa._loadFromPkg = function (property, defaults) {
  if (typeof defaults === 'undefined') {
    defaults = false
  }

  var pkgPath = path.join(cwd, 'package.json')

  if (!fs.existsSync(pkgPath)) {
    return defaults
  }

  var pkg = require(pkgPath)

  return pkg.hasOwnProperty(property) ? pkg[property] : defaults
}

napa.getref = function (url) {
  return url.replace(/^[^#]*#?/, '')
}