Spaces:
Sleeping
Sleeping
| const Section = require('./section') | |
| const Table = require('table-layout') | |
| const chalkFormat = require('./chalk-format') | |
| const t = require('typical') | |
| const arrayify = require('array-back') | |
| class OptionList extends Section { | |
| constructor (data) { | |
| super() | |
| let definitions = arrayify(data.optionList) | |
| const hide = arrayify(data.hide) | |
| const groups = arrayify(data.group) | |
| /* filter out hidden definitions */ | |
| if (hide.length) { | |
| definitions = definitions.filter(definition => { | |
| return hide.indexOf(definition.name) === -1 | |
| }) | |
| } | |
| /* All definitions must have a name */ | |
| const validNames = definitions.every(d => d.name) | |
| if (!validNames) { | |
| throw new Error('Every definition in the optionList must have a `name` property') | |
| } | |
| if (data.header) this.header(data.header) | |
| if (groups.length) { | |
| definitions = definitions.filter(def => { | |
| const noGroupMatch = groups.indexOf('_none') > -1 && !t.isDefined(def.group) | |
| const groupMatch = intersect(arrayify(def.group), groups) | |
| if (noGroupMatch || groupMatch) return def | |
| }) | |
| } | |
| const rows = definitions.map(def => { | |
| return { | |
| option: getOptionNames(def, data.reverseNameOrder), | |
| description: chalkFormat(def.description) | |
| } | |
| }) | |
| const tableOptions = data.tableOptions || { | |
| padding: { left: ' ', right: ' ' }, | |
| columns: [ | |
| { name: 'option', noWrap: true }, | |
| { name: 'description', maxWidth: 80 } | |
| ] | |
| } | |
| const table = new Table(rows, tableOptions) | |
| this.add(table.renderLines()) | |
| this.emptyLine() | |
| } | |
| } | |
| function getOptionNames (definition, reverseNameOrder) { | |
| let type = definition.type ? definition.type.name.toLowerCase() : '' | |
| const multiple = definition.multiple ? '[]' : '' | |
| if (type) { | |
| type = type === 'boolean' ? '' : `{underline ${type}${multiple}}` | |
| } | |
| // console.error(require('util').inspect(definition.typeLabel || type, { depth: 6, colors: true })) | |
| type = chalkFormat(definition.typeLabel || type) | |
| let result = '' | |
| if (definition.alias) { | |
| if (reverseNameOrder) { | |
| result = `${chalkFormat(`{bold --${definition.name}}`)}, ${chalkFormat(`{bold -${definition.alias}}`)} ${type}` | |
| } else { | |
| result = `${chalkFormat(`{bold -${definition.alias}}`)}, ${chalkFormat(`{bold --${definition.name}} ${type}`)}` | |
| } | |
| } else { | |
| result = `${chalkFormat(`{bold --${definition.name}}`)} ${type}` | |
| } | |
| return result | |
| } | |
| function intersect (arr1, arr2) { | |
| return arr1.some(function (item1) { | |
| return arr2.some(function (item2) { | |
| return item1 === item2 | |
| }) | |
| }) | |
| } | |
| module.exports = OptionList | |