123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- const options_1 = require("./options");
- /**
- * A program has a command, a description, options, and a run method
- */
- class Program {
- constructor() {
- this.options = {};
- }
- /**
- * Register a command and the description.
- * @param cmd The command.
- * @param cmdDescription The description of the command.
- * @returns The program for method chaining.
- */
- command(cmd, cmdDescription) {
- this.cmd = cmd;
- this.cmdDescription = cmdDescription;
- return this;
- }
- /**
- * Register a new option.
- * @param opt The option.
- * @param description The description of the option.
- * @param type The type of value expected: boolean, number, or string
- * @param defaultValue The option's default value.
- * @returns The program for method chaining.
- */
- option(opt, description, type, opt_defaultValue) {
- this.options[opt] = new options_1.Option(opt, description, type, opt_defaultValue);
- return this;
- }
- /**
- * Adds an option to the program.
- * @param option The option.
- * @returns The program for method chaining.
- */
- addOption(option) {
- this.options[option.opt] = option;
- return this;
- }
- /**
- * Registers a method that will be used to run the program.
- * @param runMethod The method that will be used to run the program.
- * @returns The program for method chaining.
- */
- action(runMethod) {
- this.runMethod = runMethod;
- return this;
- }
- /**
- * Adds the value to the options and passes the updated options to the run
- * method.
- * @param args The arguments that will be parsed to run the method.
- */
- run(json) {
- for (let opt in this.options) {
- this.options[opt].value = this.getValue_(opt, json);
- }
- return Promise.resolve(this.runMethod(this.options));
- }
- getValue_(key, json) {
- let keyList = key.split('.');
- let tempJson = json;
- while (keyList.length > 0) {
- let keyItem = keyList[0];
- if (tempJson[keyItem] != null) {
- tempJson = tempJson[keyItem];
- keyList = keyList.slice(1);
- }
- else {
- return undefined;
- }
- }
- return tempJson;
- }
- /**
- * Prints the command with the description. The description will have spaces
- * between the cmd so that the starting position is "posDescription". If the
- * gap between the cmd and the description is less than MIN_SPACING or
- * posDescription is undefined, the spacing will be MIN_SPACING.
- *
- * @param opt_postDescription Starting position of the description.
- */
- printCmd(opt_posDescription) {
- let log = ' ' + this.cmd;
- let spacing = Program.MIN_SPACING;
- if (opt_posDescription) {
- let diff = opt_posDescription - log.length;
- if (diff < Program.MIN_SPACING) {
- spacing = Program.MIN_SPACING;
- }
- else {
- spacing = diff;
- }
- }
- log += Array(spacing).join(' ') + this.cmdDescription;
- console.log(log);
- }
- /**
- * Prints the options with the option descriptions and default values.
- * The posDescription and posDefault is the starting position for the option
- * description. If extOptions are provided, check to see if we have already
- * printed those options. Also, once we print the option, add them to the extOptions.
- *
- * @param posDescription Position to start logging the description.
- * @param posDefault Position to start logging the default value.
- * @param opt_extOptions A collection of options that will be updated.
- */
- printOptions(posDescription, posDefault, opt_extOptions) {
- for (let opt in this.options) {
- // we have already logged it
- if (opt_extOptions && opt_extOptions[opt]) {
- continue;
- }
- let option = this.options[opt];
- let log = ' --' + option.opt;
- let spacing = Program.MIN_SPACING;
- // description
- let diff = posDescription - log.length;
- if (diff < Program.MIN_SPACING) {
- spacing = Program.MIN_SPACING;
- }
- else {
- spacing = diff;
- }
- log += Array(spacing).join(' ') + option.description;
- // default value
- if (option.defaultValue) {
- spacing = Program.MIN_SPACING;
- let diff = posDefault - log.length - 1;
- if (diff <= Program.MIN_SPACING) {
- spacing = Program.MIN_SPACING;
- }
- else {
- spacing = diff;
- }
- log += Array(spacing).join(' ');
- log += '[default: ' + option.defaultValue + ']';
- }
- console.log(log);
- if (opt_extOptions) {
- opt_extOptions[option.opt] = option;
- }
- }
- }
- /**
- * Assuming that the this program can run by itself, to print out the program's
- * help. Also assuming that the commands are called cmd-run and cmd-help.
- */
- printHelp() {
- console.log('\n' +
- 'Usage: ' + this.cmd + ' [options]\n' +
- ' ' + this.cmd + ' help\n' +
- 'Description: ' + this.cmdDescription + '\n');
- console.log('Options:');
- this.printOptions(this.posDescription(), this.posDefault());
- }
- posDescription() {
- return this.lengthOf_('opt') + 2 * Program.MIN_SPACING;
- }
- posDefault() {
- return this.posDescription() + this.lengthOf_('description') + Program.MIN_SPACING;
- }
- lengthOf_(param) {
- let maxLength = -1;
- for (let opt in this.options) {
- let option = this.options[opt];
- if (param === 'description') {
- maxLength = Math.max(maxLength, option.description.length);
- }
- else if (param === 'opt') {
- maxLength = Math.max(maxLength, option.opt.length);
- }
- }
- return maxLength;
- }
- /**
- * Create a collection of options used by this program.
- * @returns The options used in the programs.
- */
- getOptions_(allOptions) {
- for (let opt in this.options) {
- allOptions[opt] = this.options[opt];
- }
- return allOptions;
- }
- /**
- * Get the options used by the program and create the minimist options
- * to ensure that minimist parses the values properly.
- * @returns The options for minimist.
- */
- getMinimistOptions() {
- let allOptions = {};
- allOptions = this.getOptions_(allOptions);
- let minimistOptions = {};
- let minimistBoolean = [];
- let minimistString = [];
- let minimistNumber = [];
- let minimistDefault = {};
- for (let opt in allOptions) {
- let option = allOptions[opt];
- if (option.type === 'boolean') {
- minimistBoolean.push(option.opt);
- }
- else if (option.type === 'string') {
- minimistString.push(option.opt);
- }
- else if (option.type === 'number') {
- minimistNumber.push(option.opt);
- }
- if (typeof option.defaultValue !== 'undefined') {
- minimistDefault[option.opt] = option.defaultValue;
- }
- }
- minimistOptions['boolean'] = minimistBoolean;
- minimistOptions['string'] = minimistString;
- minimistOptions['number'] = minimistNumber;
- minimistOptions['default'] = minimistDefault;
- return minimistOptions;
- }
- }
- Program.MIN_SPACING = 4;
- exports.Program = Program;
- //# sourceMappingURL=programs.js.map
|