| 'use strict'; |
| |
| var grunt = require('../grunt'); |
| |
| // External libs. |
| var nopt = require('nopt'); |
| var gruntOptions = require('grunt-known-options'); |
| |
| // This is only executed when run via command line. |
| var cli = module.exports = function(options, done) { |
| // CLI-parsed options override any passed-in "default" options. |
| if (options) { |
| // For each default option... |
| Object.keys(options).forEach(function(key) { |
| if (!(key in cli.options)) { |
| // If this option doesn't exist in the parsed cli.options, add it in. |
| cli.options[key] = options[key]; |
| } else if (cli.optlist[key].type === Array) { |
| // If this option's type is Array, append it to any existing array |
| // (or create a new array). |
| [].push.apply(cli.options[key], options[key]); |
| } |
| }); |
| } |
| |
| // Run tasks. |
| grunt.tasks(cli.tasks, cli.options, done); |
| }; |
| |
| // Default options. |
| var optlist = cli.optlist = gruntOptions; |
| |
| // Parse `optlist` into a form that nopt can handle. |
| var aliases = {}; |
| var known = {}; |
| |
| Object.keys(optlist).forEach(function(key) { |
| var short = optlist[key].short; |
| if (short) { |
| aliases[short] = '--' + key; |
| } |
| known[key] = optlist[key].type; |
| }); |
| |
| var parsed = nopt(known, aliases, process.argv, 2); |
| cli.tasks = parsed.argv.remain; |
| cli.options = parsed; |
| delete parsed.argv; |
| |
| // Initialize any Array options that weren't initialized. |
| Object.keys(optlist).forEach(function(key) { |
| if (optlist[key].type === Array && !(key in cli.options)) { |
| cli.options[key] = []; |
| } |
| }); |