Пример #1
0
  this.cancelCommands = function () {
    var callCancel = function callCancel(commandInstance) {
      if (_.isFunction(commandInstance.commandObject._cancel)) {
        commandInstance.commandObject._cancel.call(commandInstance);
      }

      if (commandInstance.downstream) {
        callCancel(commandInstance.downstream);
      }
    };

    callCancel(wrapper.commandInstance);

    // Check if there is a cancel method on the promise
    if (res && _.isFunction(res.cancel)) {
      res.cancel(wrapper.commandInstance);
    }

    self.removeListener('vorpal_command_cancel', self.cancelCommands);
    self.cancelCommands = undefined;
    self._commandSetCallback = undefined;
    self._registeredCommands = 0;
    self._completedCommands = 0;
    self.parent.emit('client_command_cancelled', { command: wrapper.command });

    cbk(wrapper);
  };
Пример #2
0
    var callCancel = function callCancel(commandInstance) {
      if (_.isFunction(commandInstance.commandObject._cancel)) {
        commandInstance.commandObject._cancel.call(commandInstance);
      }

      if (commandInstance.downstream) {
        callCancel(commandInstance.downstream);
      }
    };
Пример #3
0
 function handleDataFormat(str, config, callback) {
   var data = [];
   if (_.isArray(config)) {
     data = config;
   } else if (_.isFunction(config)) {
     var cbk = config.length < 2 ? function () {} : function (res) {
       callback(res || []);
     };
     var res = config(str, cbk);
     if (res && _.isFunction(res.then)) {
       res.then(function (resp) {
         callback(resp);
       }).catch(function (err) {
         callback(err);
       });
     } else if (config.length < 2) {
       callback(res);
     }
     return;
   }
   callback(data);
   return;
 }
Пример #4
0
    value: function log() {
      var _this = this;

      var args = util.fixArgsForApply(arguments);
      if (this.downstream) {
        var fn = this.downstream.commandObject._fn || function () {};
        this.session.registerCommand();
        this.downstream.args.stdin = args;
        var onComplete = function onComplete(err) {
          if (_this.session.isLocal() && err) {
            _this.session.log(err.stack || err);
            _this.session.parent.emit('client_command_error', { command: _this.downstream.command, error: err });
          }
          _this.session.completeCommand();
        };

        var validate = this.downstream.commandObject._validate;
        if (_.isFunction(validate)) {
          try {
            validate.call(this.downstream, this.downstream.args);
          } catch (e) {
            // Log error without piping to downstream on validation error.
            this.session.log(e.toString());
            onComplete();
            return;
          }
        }

        var res = fn.call(this.downstream, this.downstream.args, onComplete);
        if (res && _.isFunction(res.then)) {
          res.then(onComplete, onComplete);
        }
      } else {
        this.session.log.apply(this.session, args);
      }
    }
Пример #5
0
session.execCommandSet = function (wrapper, callback) {
  var self = this;
  var response = {};
  var res;
  var cbk = callback;
  this._registeredCommands = 1;
  this._completedCommands = 0;

  // Create the command instance for the first
  // command and hook it up to the pipe chain.
  var commandInstance = new CommandInstance({
    downstream: wrapper.pipes[0],
    commandObject: wrapper.commandObject,
    commandWrapper: wrapper
  });

  wrapper.commandInstance = commandInstance;

  function sendDones(itm) {
    if (itm.commandObject && itm.commandObject._done) {
      itm.commandObject._done.call(itm);
    }
    if (itm.downstream) {
      sendDones(itm.downstream);
    }
  }

  // Called when command is cancelled
  this.cancelCommands = function () {
    var callCancel = function callCancel(commandInstance) {
      if (_.isFunction(commandInstance.commandObject._cancel)) {
        commandInstance.commandObject._cancel.call(commandInstance);
      }

      if (commandInstance.downstream) {
        callCancel(commandInstance.downstream);
      }
    };

    callCancel(wrapper.commandInstance);

    // Check if there is a cancel method on the promise
    if (res && _.isFunction(res.cancel)) {
      res.cancel(wrapper.commandInstance);
    }

    self.removeListener('vorpal_command_cancel', self.cancelCommands);
    self.cancelCommands = undefined;
    self._commandSetCallback = undefined;
    self._registeredCommands = 0;
    self._completedCommands = 0;
    self.parent.emit('client_command_cancelled', { command: wrapper.command });

    cbk(wrapper);
  };

  this.on('vorpal_command_cancel', self.cancelCommands);

  // Gracefully handles all instances of the command completing.
  this._commandSetCallback = function () {
    var err = response.error;
    var data = response.data;
    var argus = response.args;
    if (self.isLocal() && err) {
      var stack;
      if (data && data.stack) {
        stack = data.stack;
      } else if (err && err.stack) {
        stack = err.stack;
      } else {
        stack = err;
      }
      self.log(stack);
      self.parent.emit('client_command_error', { command: wrapper.command, error: err });
    } else if (self.isLocal()) {
      self.parent.emit('client_command_executed', { command: wrapper.command });
    }

    self.removeListener('vorpal_command_cancel', self.cancelCommands);
    self.cancelCommands = undefined;
    cbk(wrapper, err, data, argus);
    sendDones(commandInstance);
  };

  function onCompletion(wrapper, err, data, argus) {
    response = {
      error: err,
      data: data,
      args: argus
    };
    self.completeCommand();
  }

  var valid;
  if (_.isFunction(wrapper.validate)) {
    try {
      valid = wrapper.validate.call(commandInstance, wrapper.args);
    } catch (e) {
      // Complete with error on validation error
      onCompletion(wrapper, e);
      return this;
    }
  }

  if (valid !== true && valid !== undefined) {
    onCompletion(wrapper, valid || null);
    return this;
  }

  // Call the root command.
  res = wrapper.fn.call(commandInstance, wrapper.args, function () {
    var argus = util.fixArgsForApply(arguments);
    onCompletion(wrapper, argus[0], argus[1], argus);
  });

  // If the command as declared by the user
  // returns a promise, handle accordingly.
  if (res && _.isFunction(res.then)) {
    res.then(function (data) {
      onCompletion(wrapper, undefined, data);
    }).catch(function (err) {
      onCompletion(wrapper, true, err);
    });
  }

  return this;
};
Пример #6
0
session.getAutocompleteDeprecated = function (str, cb) {
  cb = cb || function () {};

  // Entire command string
  var cursor = this.parent.ui._activePrompt.screen.rl.cursor;
  var trimmed = String(str).trim();
  var cut = String(trimmed).slice(0, cursor);
  var remainder = String(trimmed).slice(cursor, trimmed.length).replace(/ +$/, '');
  trimmed = cut;

  // Set "trimmed" to command string after pipe
  // Set "pre" to command string, pipe, and a space
  var pre = '';
  var lastPipeIndex = trimmed.lastIndexOf('|');
  if (lastPipeIndex !== -1) {
    pre = trimmed.substr(0, lastPipeIndex + 1) + ' ';
    trimmed = trimmed.substr(lastPipeIndex + 1).trim();
  }

  // Complete command
  var names = _.map(this.parent.commands, '_name');
  names = names.concat.apply(names, _.map(this.parent.commands, '_aliases'));
  var result = this._autocomplete(trimmed, names);
  if (result && trimmed.length < String(result).trim().length) {
    cb(undefined, pre + result + remainder);
    return;
  }

  // Find custom autocompletion
  var match;
  var extra;

  names.forEach(function (name) {
    if (trimmed.substr(0, name.length) === name && String(name).trim() !== '') {
      match = name;
      extra = trimmed.substr(name.length).trim();
    }
  });

  var command = match ? _.find(this.parent.commands, { _name: match }) : undefined;

  if (!command) {
    command = _.find(this.parent.commands, { _catch: true });
    if (command) {
      extra = trimmed;
    }
  }

  if (command && _.isFunction(command._autocompletion)) {
    this._tabCtr++;
    command._autocompletion.call(this, extra, this._tabCtr, function (err, autocomplete) {
      if (err) {
        return cb(err);
      }
      if (_.isArray(autocomplete)) {
        return cb(undefined, autocomplete);
      } else if (autocomplete === undefined) {
        return cb(undefined, undefined);
      }
      return cb(undefined, pre + autocomplete + remainder);
    });
  } else {
    cb(undefined, undefined);
  }
};