| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 'use strict';var assert = require('assert');var _ = require('lodash');var Separator = require('./separator');var Choice = require('./choice');/** * Choices collection * Collection of multiple `choice` object * @constructor * @param {Array} choices  All `choice` to keep in the collection */var Choices = module.exports = function (choices, answers) {  this.choices = choices.map(function (val) {    if (val.type === 'separator') {      if (!(val instanceof Separator)) {        val = new Separator(val.line);      }      return val;    }    return new Choice(val, answers);  });  this.realChoices = this.choices    .filter(Separator.exclude)    .filter(function (item) {      return !item.disabled;    });  Object.defineProperty(this, 'length', {    get: function () {      return this.choices.length;    },    set: function (val) {      this.choices.length = val;    }  });  Object.defineProperty(this, 'realLength', {    get: function () {      return this.realChoices.length;    },    set: function () {      throw new Error('Cannot set `realLength` of a Choices collection');    }  });};/** * Get a valid choice from the collection * @param  {Number} selector  The selected choice index * @return {Choice|Undefined} Return the matched choice or undefined */Choices.prototype.getChoice = function (selector) {  assert(_.isNumber(selector));  return this.realChoices[selector];};/** * Get a raw element from the collection * @param  {Number} selector  The selected index value * @return {Choice|Undefined} Return the matched choice or undefined */Choices.prototype.get = function (selector) {  assert(_.isNumber(selector));  return this.choices[selector];};/** * Match the valid choices against a where clause * @param  {Object} whereClause Lodash `where` clause * @return {Array}              Matching choices or empty array */Choices.prototype.where = function (whereClause) {  return _.filter(this.realChoices, whereClause);};/** * Pluck a particular key from the choices * @param  {String} propertyName Property name to select * @return {Array}               Selected properties */Choices.prototype.pluck = function (propertyName) {  return _.map(this.realChoices, propertyName);};// Expose usual Array methodsChoices.prototype.indexOf = function () {  return this.choices.indexOf.apply(this.choices, arguments);};Choices.prototype.forEach = function () {  return this.choices.forEach.apply(this.choices, arguments);};Choices.prototype.filter = function () {  return this.choices.filter.apply(this.choices, arguments);};Choices.prototype.find = function (func) {  return _.find(this.choices, func);};Choices.prototype.push = function () {  var objs = _.map(arguments, function (val) {    return new Choice(val);  });  this.choices.push.apply(this.choices, objs);  this.realChoices = this.choices.filter(Separator.exclude);  return this.choices;};
 |