-
Notifications
You must be signed in to change notification settings - Fork 69
/
format-command-with-options.test.ts
400 lines (315 loc) · 11.7 KB
/
format-command-with-options.test.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
import {expect, test as base} from '@oclif/test'
import {Command as Base, Flags as flags} from '../../src'
import {commandHelp, TestHelpWithOptions as TestHelp} from './help-test-utils'
const g: any = global
g.oclif.columns = 80
class Command extends Base {
static disableJsonFlag = true
async run() {
return null
}
}
const test = base
.loadConfig()
.add('help', ctx => new TestHelp(ctx.config as any))
.register('commandHelp', commandHelp)
describe('formatCommand', () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static aliases = ['app:init', 'create']
static description = `first line
multiline help`
static args = [{name: 'app_name', description: 'app to use'}]
static flags = {
app: flags.string({char: 'a', hidden: true}),
foo: flags.string({char: 'f', description: 'foobar'.repeat(18)}),
force: flags.boolean({description: 'force it '.repeat(15)}),
ss: flags.boolean({description: 'newliney\n'.repeat(4)}),
remote: flags.string({char: 'r'}),
label: flags.string({char: 'l', helpLabel: '-l'}),
}
})
.it('handles multi-line help output', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [APP_NAME] [-f <value>] [--force] [--ss] [-r
<value>] [-l <value>]
ARGUMENTS
APP_NAME app to use
OPTIONS
-f, --foo=foo foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoo
barfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar
-l=label
-r, --remote=remote
--force force it force it force it force it force it force
it force it force it force it force it force it
force it force it force it force it
--ss newliney
newliney
newliney
newliney
DESCRIPTION
multiline help
ALIASES
$ oclif app:init
$ oclif create`))
describe('arg and flag multiline handling', () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static description = 'description of apps:create'
static aliases = ['app:init', 'create']
static args = [{name: 'app_name', description: 'app to use'.repeat(35)}]
static flags = {
app: flags.string({char: 'a', hidden: true}),
foo: flags.string({char: 'f', description: 'foobar'.repeat(15)}),
force: flags.boolean({description: 'force it '.repeat(15)}),
ss: flags.boolean({description: 'newliney\n'.repeat(4)}),
remote: flags.string({char: 'r'}),
}
})
.it('show args and flags side by side when their output do not exceed 4 lines ', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [APP_NAME] [-f <value>] [--force] [--ss] [-r
<value>]
ARGUMENTS
APP_NAME
app to useapp to useapp to useapp to useapp to useapp to useapp to useapp to
useapp to useapp to useapp to useapp to useapp to useapp to useapp to useapp
to useapp to useapp to useapp to useapp to useapp to useapp to useapp to
useapp to useapp to useapp to useapp to useapp to useapp to useapp to useapp
to useapp to useapp to useapp to useapp to use
OPTIONS
-f, --foo=foo foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoo
barfoobarfoobarfoobarfoobarfoobar
-r, --remote=remote
--force force it force it force it force it force it force
it force it force it force it force it force it
force it force it force it force it
--ss newliney
newliney
newliney
newliney
ALIASES
$ oclif app:init
$ oclif create`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static description = 'description of apps:create'
static aliases = ['app:init', 'create']
static args = [{name: 'app_name', description: 'app to use'.repeat(35)}]
static flags = {
app: flags.string({char: 'a', hidden: true}),
foo: flags.string({char: 'f', description: 'foobar'.repeat(20)}),
force: flags.boolean({description: 'force it '.repeat(29)}),
ss: flags.boolean({description: 'newliney\n'.repeat(5)}),
remote: flags.string({char: 'r'}),
}
})
.it('shows stacked args and flags when the lines exceed 4', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [APP_NAME] [-f <value>] [--force] [--ss] [-r
<value>]
ARGUMENTS
APP_NAME
app to useapp to useapp to useapp to useapp to useapp to useapp to useapp to
useapp to useapp to useapp to useapp to useapp to useapp to useapp to useapp
to useapp to useapp to useapp to useapp to useapp to useapp to useapp to
useapp to useapp to useapp to useapp to useapp to useapp to useapp to useapp
to useapp to useapp to useapp to useapp to use
OPTIONS
-f, --foo=foo
foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoob
arfoobarfoobarfoobarfoobarfoobarfoobarfoobar
-r, --remote=remote
--force
force it force it force it force it force it force it force it force
it force it force it force it force it force it force it force it
force it force it force it force it force it force it force it force
it force it force it force it force it force it force it
--ss
newliney
newliney
newliney
newliney
newliney
ALIASES
$ oclif app:init
$ oclif create`))
})
describe('description', () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static description = 'description of apps:create\nthese values are after and will show up in the command description'
static aliases = ['app:init', 'create']
static args = [{name: 'app_name', description: 'app to use'}]
static flags = {
force: flags.boolean({description: 'forces'}),
}
})
.it('outputs command description with values after a \\n newline character', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [APP_NAME] [--force]
ARGUMENTS
APP_NAME app to use
OPTIONS
--force forces
DESCRIPTION
these values are after and will show up in the command description
ALIASES
$ oclif app:init
$ oclif create`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static description = 'root part of the description\nThe <%= config.bin %> CLI has <%= command.id %>'
})
.it('renders template string from description', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create
DESCRIPTION
The oclif CLI has apps:create`))
})
describe(('flags'), () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static flags = {
myenum: flags.string({
options: ['a', 'b', 'c'],
}),
}
})
.it('outputs flag enum', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [--myenum a|b|c]
OPTIONS
--myenum=a|b|c`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static args = [
{name: 'arg1', default: '.'},
{name: 'arg2', default: '.', description: 'arg2 desc'},
{name: 'arg3', description: 'arg3 desc'},
]
static flags = {
flag1: flags.string({default: '.'}),
flag2: flags.string({default: '.', description: 'flag2 desc'}),
flag3: flags.string({description: 'flag3 desc'}),
}
}).it('outputs with default flag options', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [ARG1] [ARG2] [ARG3] [--flag1 <value>] [--flag2
<value>] [--flag3 <value>]
ARGUMENTS
ARG1 [default: .]
ARG2 [default: .] arg2 desc
ARG3 arg3 desc
OPTIONS
--flag1=flag1 [default: .]
--flag2=flag2 [default: .] flag2 desc
--flag3=flag3 flag3 desc`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static flags = {
opt: flags.boolean({allowNo: true}),
}
})
.it('outputs with with no options', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [--opt]
OPTIONS
--[no-]opt`))
})
describe('args', () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static args = [
{name: 'arg1', description: 'Show the options', options: ['option1', 'option2']},
]
})
.it('outputs with arg options', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create [ARG1]
ARGUMENTS
ARG1 (option1|option2) Show the options`))
})
describe('usage', () => {
test
.commandHelp(class extends Command {
static id = 'apps:create'
static usage = '<%= config.bin %> <%= command.id %> usage'
})
.it('outputs usage with templates', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif apps:create usage`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static usage = ['<%= config.bin %>', '<%= command.id %> usage']
})
.it('outputs usage arrays with templates', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif
$ oclif apps:create usage`))
test
.commandHelp(class extends Command {
static id = 'apps:create'
static usage = undefined
})
.it('defaults usage when not specified', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif apps:create`))
})
describe('examples', () => {
test
.commandHelp(class extends Command {
static examples = ['it handles a list of examples', 'more example text']
})
.it('outputs multiple examples', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif
EXAMPLES
it handles a list of examples
more example text`))
test
.commandHelp(class extends Command {
static examples = ['it handles a single example']
})
.it('outputs a single example', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif
EXAMPLES
it handles a single example`))
test
.commandHelp(class extends Command {
static id = 'oclif:command'
static examples = ['the bin is <%= config.bin %>', 'the command id is <%= command.id %>']
})
.it('outputs examples using templates', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif:command
EXAMPLES
the bin is oclif
the command id is oclif:command`))
test
.commandHelp(class extends Command {
static id = 'oclif:command'
static examples = ['<%= config.bin %> <%= command.id %> --help']
})
.it('formats if command', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif:command
EXAMPLES
$ oclif oclif:command --help`))
test
.commandHelp(class extends Command {
static id = 'oclif:command'
static examples = ['Prints out help.\n<%= config.bin %> <%= command.id %> --help']
})
.it('formats if command with description', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif:command
EXAMPLES
Prints out help.
$ oclif oclif:command --help`))
test
.commandHelp(class extends Command {
static id = 'oclif:command'
static examples = [{description: 'Prints out help.', command: '<%= config.bin %> <%= command.id %> --help'}]
})
.it('formats example object', (ctx: any) => expect(ctx.commandHelp).to.equal(`USAGE
$ oclif oclif:command
EXAMPLES
Prints out help.
$ oclif oclif:command --help`))
})
})