parseArgs(commandArgs) {
    let knownOpts = {}; // Parse options
    let commandOptions = {};
    let parsedOptions;

    this.registerOptions();

    let assembleAndValidateOption = function (option) {
      return this.assignOption(option, parsedOptions, commandOptions);
    };

    let validateParsed = function (key) {
      // ignore 'argv', 'h', and 'help'
      if (!(key in commandOptions) && key !== 'argv' && key !== 'h' && key !== 'help') {
        this.ui.writeLine(
          chalk.yellow(
            `The option '--${key}' is not registered with the '${this.name}' command. ` +
              `Run \`ember ${this.name} --help\` for a list of supported options.`
          )
        );
      }
      if (typeof parsedOptions[key] !== 'object') {
        commandOptions[camelize(key)] = parsedOptions[key];
      }
    };

    this.availableOptions.forEach((option) => {
      if (typeof option.type !== 'string') {
        knownOpts[option.name] = option.type;
      } else if (option.type === 'Path') {
        knownOpts[option.name] = path;
      } else {
        knownOpts[option.name] = String;
      }
    });

    parsedOptions = nopt(knownOpts, this.optionsAliases, commandArgs, 0);

    if (!this.availableOptions.every(assembleAndValidateOption.bind(this))) {
      return null;
    }

    Object.keys(parsedOptions).map(validateParsed.bind(this));

    return {
      options: defaults(commandOptions, this.settings),
      args: parsedOptions.argv.remain,
    };
  }
Parses command arguments and processes
    @method parseArgs
    @param {Object} commandArgs
    @return {Object|null}