Skip to content

Commit

Permalink
Fix undefined boolean options - Fix #988
Browse files Browse the repository at this point in the history
  • Loading branch information
SBoudrias committed Dec 19, 2016
1 parent 138ed98 commit 8e7048e
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions lib/index.js
Expand Up @@ -20,6 +20,8 @@ var Storage = require('./util/storage');
var promptSuggestion = require('./util/prompt-suggestion');
var debug = require('debug')('yeoman:generator');

var EMPTY = '@@_YEOMAN_EMPTY_MARKER_@@';

/**
* The `Base` class provides the common API shared by all generators.
* It define options, arguments, file, prompt, log, API, etc.
Expand Down Expand Up @@ -65,6 +67,7 @@ var Base = module.exports = function Base(args, options) {
}

this.options = options || {};
this._initOptions = _.clone(options);
this._args = args || [];
this._options = {};
this._arguments = [];
Expand Down Expand Up @@ -193,7 +196,9 @@ Base.prototype.option = function option(name, config) {
config = config || {};

// alias default to defaults for backward compatibility.
config.default = config.default != null ? config.default : config.defaults;
if ('defaults' in config) {
config.default = config.defaults;
}
config.description = config.description || config.desc;

_.defaults(config, {
Expand Down Expand Up @@ -237,7 +242,9 @@ Base.prototype.argument = function argument(name, config) {
config = config || {};

// alias default to defaults for backward compatibility.
config.default = config.default != null ? config.default : config.defaults;
if ('defaults' in config) {
config.default = config.defaults;
}
config.description = config.description || config.desc;

_.defaults(config, {
Expand All @@ -263,6 +270,9 @@ Base.prototype.parseOptions = function () {
_.each(this._options, function (option) {
if (option.type === Boolean) {
minimistDef.boolean.push(option.name);
if (!('default' in option) && !option.required) {
minimistDef.default[option.name] = EMPTY;
}
} else {
minimistDef.string.push(option.name);
}
Expand All @@ -273,10 +283,10 @@ Base.prototype.parseOptions = function () {

// Only apply default values if we don't already have a value injected from
// the runner
if (option.name in this.options) {
minimistDef.default[option.name] = this.options[option.name];
} else if (option.alias && option.alias in this.options) {
minimistDef.default[option.alias] = this.options[option.alias];
if (option.name in this._initOptions) {
minimistDef.default[option.name] = this._initOptions[option.name];
} else if (option.alias && option.alias in this._initOptions) {
minimistDef.default[option.name] = this._initOptions[option.alias];
} else if ('default' in option) {
minimistDef.default[option.name] = option.default;
}
Expand All @@ -286,6 +296,11 @@ Base.prototype.parseOptions = function () {

// Parse options to the desired type
_.each(parsedOpts, function (option, name) {
// Manually set value as undefined if it should be.
if (option === EMPTY) {
parsedOpts[name] = undefined;
return;
}
if (this._options[name] && option !== undefined) {
parsedOpts[name] = this._options[name].type(option);
}
Expand All @@ -295,8 +310,8 @@ Base.prototype.parseOptions = function () {
this._arguments.forEach(function (config, index) {
var value;
if (index >= parsedOpts._.length) {
if (config.name in this.options) {
value = this.options[config.name];
if (config.name in this._initOptions) {
value = this._initOptions[config.name];
} else if ('default' in config) {
value = config.default;
} else {
Expand Down

0 comments on commit 8e7048e

Please sign in to comment.