File size: 1,497 Bytes
			
			| 369fac9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import { removeBrackets, camelcaseOptionName } from "./utils.ts";
interface OptionConfig {
  default?: any;
  type?: any[];
}
export default class Option {
  /** Option name */
  name: string;
  /** Option name and aliases */
  names: string[];
  isBoolean?: boolean; // `required` will be a boolean for options with brackets
  required?: boolean;
  config: OptionConfig;
  negated: boolean;
  constructor(public rawName: string, public description: string, config?: OptionConfig) {
    this.config = Object.assign({}, config); // You may use cli.option('--env.* [value]', 'desc') to denote a dot-nested option
    rawName = rawName.replace(/\.\*/g, '');
    this.negated = false;
    this.names = removeBrackets(rawName).split(',').map((v: string) => {
      let name = v.trim().replace(/^-{1,2}/, '');
      if (name.startsWith('no-')) {
        this.negated = true;
        name = name.replace(/^no-/, '');
      }
      return camelcaseOptionName(name);
    }).sort((a, b) => a.length > b.length ? 1 : -1); // Sort names
    // Use the longest name (last one) as actual option name
    this.name = this.names[this.names.length - 1];
    if (this.negated && this.config.default == null) {
      this.config.default = true;
    }
    if (rawName.includes('<')) {
      this.required = true;
    } else if (rawName.includes('[')) {
      this.required = false;
    } else {
      // No arg needed, it's boolean flag
      this.isBoolean = true;
    }
  }
}
export type { OptionConfig }; |