| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | /* * grunt * http://gruntjs.com/ * * Copyright (c) 2014 "Cowboy" Ben Alman * Licensed under the MIT license. * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT */'use strict';// Nodejs libs.var path = require('path');// This allows grunt to require() .coffee files.require('coffee-script');// The module to be exported.var grunt = module.exports = {};// Expose internal grunt libs.function gRequire(name) {  return grunt[name] = require('./grunt/' + name);}var util = require('grunt-legacy-util');grunt.util = util;grunt.util.task = require('./util/task');var Log = require('grunt-legacy-log').Log;var log = new Log({grunt: grunt});grunt.log = log;gRequire('template');gRequire('event');var fail = gRequire('fail');gRequire('file');var option = gRequire('option');var config = gRequire('config');var task = gRequire('task');var help = gRequire('help');gRequire('cli');var verbose = grunt.verbose = log.verbose;// Expose some grunt metadata.grunt.package = require('../package.json');grunt.version = grunt.package.version;// Expose specific grunt lib methods on grunt.function gExpose(obj, methodName, newMethodName) {  grunt[newMethodName || methodName] = obj[methodName].bind(obj);}gExpose(task, 'registerTask');gExpose(task, 'registerMultiTask');gExpose(task, 'registerInitTask');gExpose(task, 'renameTask');gExpose(task, 'loadTasks');gExpose(task, 'loadNpmTasks');gExpose(config, 'init', 'initConfig');gExpose(fail, 'warn');gExpose(fail, 'fatal');// Expose the task interface. I've never called this manually, and have no idea// how it will work. But it might.grunt.tasks = function(tasks, options, done) {  // Update options with passed-in options.  option.init(options);  // Display the grunt version and quit if the user did --version.  var _tasks, _options;  if (option('version')) {    // Not --verbose.    log.writeln('grunt v' + grunt.version);    if (option('verbose')) {      // --verbose      verbose.writeln('Install path: ' + path.resolve(__dirname, '..'));      // Yes, this is a total hack, but we don't want to log all that verbose      // task initialization stuff here.      grunt.log.muted = true;      // Initialize task system so that available tasks can be listed.      grunt.task.init([], {help: true});      // Re-enable logging.      grunt.log.muted = false;      // Display available tasks (for shell completion, etc).      _tasks = Object.keys(grunt.task._tasks).sort();      verbose.writeln('Available tasks: ' + _tasks.join(' '));      // Display available options (for shell completion, etc).      _options = [];      Object.keys(grunt.cli.optlist).forEach(function(long) {        var o = grunt.cli.optlist[long];        _options.push('--' + (o.negate ? 'no-' : '') + long);        if (o.short) { _options.push('-' + o.short); }      });      verbose.writeln('Available options: ' + _options.join(' '));    }    return;  }  // Init colors.  log.initColors();  // Display help and quit if the user did --help.  if (option('help')) {    help.display();    return;  }  // A little header stuff.  verbose.header('Initializing').writeflags(option.flags(), 'Command-line options');  // Determine and output which tasks will be run.  var tasksSpecified = tasks && tasks.length > 0;  tasks = task.parseArgs([tasksSpecified ? tasks : 'default']);  // Initialize tasks.  task.init(tasks);  verbose.writeln();  if (!tasksSpecified) {    verbose.writeln('No tasks specified, running default tasks.');  }  verbose.writeflags(tasks, 'Running tasks');  // Handle otherwise unhandleable (probably asynchronous) exceptions.  var uncaughtHandler = function(e) {    fail.fatal(e, fail.code.TASK_FAILURE);  };  process.on('uncaughtException', uncaughtHandler);  // Report, etc when all tasks have completed.  task.options({    error: function(e) {      fail.warn(e, fail.code.TASK_FAILURE);    },    done: function() {      // Stop handling uncaught exceptions so that we don't leave any      // unwanted process-level side effects behind. There is no need to do      // this in the error callback, because fail.warn() will either kill      // the process, or with --force keep on going all the way here.      process.removeListener('uncaughtException', uncaughtHandler);      // Output a final fail / success report.      fail.report();      if (done) {        // Execute "done" function when done (only if passed, of course).        done();      } else {        // Otherwise, explicitly exit.        util.exit(0);      }    }  });  // Execute all tasks, in order. Passing each task individually in a forEach  // allows the error callback to execute multiple times.  tasks.forEach(function(name) { task.run(name); });  // Run tasks async internally to reduce call-stack, per:  // https://github.com/gruntjs/grunt/pull/1026  task.start({asyncDone:true});};
 |