src/utils.js
function parseArgs(...args) {
  const l = args.length
  const last = args[l - 1]
  let cb, opts, paths
  if (_.isFunction(last)) {
    cb = last
    args.pop(); // don't remove this semicolon
    [paths, opts] = parseArgs(...args)
  } else if (_.isObject(last) && !Array.isArray(last)) {
    opts = last
    args.pop()
    paths = args
  } else if (!last && l > 0) {
    args.pop()
    return parseArgs(...args)
  } else {
    paths = args
  }
  return [_.compact(_.flatten(paths, true)), opts || {}, cb]
}
function parseArgs(...args) {
  const l = args.length
  const last = args[l - 1]
  let cb, opts, paths
  if (_.isFunction(last)) {
    cb = last
    args.pop(); // don't remove this semicolon
    [paths, opts] = parseArgs(...args)
  } else if (_.isObject(last) && !Array.isArray(last)) {
    opts = last
    args.pop()
    paths = args
  } else if (!last && l > 0) {
    args.pop()
    return parseArgs(...args)
  } else {
    paths = args
  }
  return [_.compact(_.flatten(paths, true)), opts || {}, cb]
}
Parse the arguments and return an special array.

@example
parseArgs(path)
// => [[path], {}, undefined]
parseArgs(path, cb)
// => [[path], {}, cb]
parseArgs(path, options)
// => [[path], options, undefined]
parseArgs(options)
// => [[], options, undefined]

@param {Array|ArrayLike} args
@return {Array} [ [path, path], {}, function ]