-
-
Notifications
You must be signed in to change notification settings - Fork 105
/
Option.ts
61 lines (51 loc) · 1.5 KB
/
Option.ts
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
53
54
55
56
57
58
59
60
61
import { removeBrackets, camelcaseOptionName } from './utils'
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 }