12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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 };
|