2
2
3
3
const { relative } = require ( 'path' )
4
4
5
- const ConfigDefinitions = require ( './utils/config/definitions.js' )
5
+ const definitions = require ( './utils/config/definitions.js' )
6
6
const getWorkspaces = require ( './workspaces/get-workspaces.js' )
7
-
8
- const cmdAliases = require ( './utils/cmd-list' ) . aliases
7
+ const { aliases : cmdAliases } = require ( './utils/cmd-list' )
9
8
10
9
class BaseCommand {
11
10
static workspaces = false
12
11
static ignoreImplicitWorkspace = true
13
12
13
+ // these are all overridden by individual commands
14
+ static name = null
15
+ static description = null
16
+ static params = null
17
+
18
+ // this is a static so that we can read from it without instantiating a command
19
+ // which would require loading the config
20
+ static get describeUsage ( ) {
21
+ const wrapWidth = 80
22
+ const { description, usage = [ '' ] , name, params } = this
23
+
24
+ const fullUsage = [
25
+ `${ description } ` ,
26
+ '' ,
27
+ 'Usage:' ,
28
+ ...usage . map ( u => `npm ${ name } ${ u } ` . trim ( ) ) ,
29
+ ]
30
+
31
+ if ( params ) {
32
+ let results = ''
33
+ let line = ''
34
+ for ( const param of params ) {
35
+ const paramUsage = `[${ definitions [ param ] . usage } ]`
36
+ if ( line . length + paramUsage . length > wrapWidth ) {
37
+ results = [ results , line ] . filter ( Boolean ) . join ( '\n' )
38
+ line = ''
39
+ }
40
+ line = [ line , paramUsage ] . filter ( Boolean ) . join ( ' ' )
41
+ }
42
+ fullUsage . push ( '' )
43
+ fullUsage . push ( 'Options:' )
44
+ fullUsage . push ( [ results , line ] . filter ( Boolean ) . join ( '\n' ) )
45
+ }
46
+
47
+ const aliases = Object . entries ( cmdAliases ) . reduce ( ( p , [ k , v ] ) => {
48
+ return p . concat ( v === name ? k : [ ] )
49
+ } , [ ] )
50
+
51
+ if ( aliases . length ) {
52
+ const plural = aliases . length === 1 ? '' : 'es'
53
+ fullUsage . push ( '' )
54
+ fullUsage . push ( `alias${ plural } : ${ aliases . join ( ', ' ) } ` )
55
+ }
56
+
57
+ fullUsage . push ( '' )
58
+ fullUsage . push ( `Run "npm help ${ name } " for more info` )
59
+
60
+ return fullUsage . join ( '\n' )
61
+ }
62
+
14
63
constructor ( npm ) {
15
- this . wrapWidth = 80
16
64
this . npm = npm
17
65
18
66
const { config } = this . npm
@@ -39,59 +87,7 @@ class BaseCommand {
39
87
}
40
88
41
89
get usage ( ) {
42
- const usage = [
43
- `${ this . description } ` ,
44
- '' ,
45
- 'Usage:' ,
46
- ]
47
-
48
- if ( ! this . constructor . usage ) {
49
- usage . push ( `npm ${ this . name } ` )
50
- } else {
51
- usage . push ( ...this . constructor . usage . map ( u => `npm ${ this . name } ${ u } ` ) )
52
- }
53
-
54
- if ( this . params ) {
55
- usage . push ( '' )
56
- usage . push ( 'Options:' )
57
- usage . push ( this . wrappedParams )
58
- }
59
-
60
- const aliases = Object . keys ( cmdAliases ) . reduce ( ( p , c ) => {
61
- if ( cmdAliases [ c ] === this . name ) {
62
- p . push ( c )
63
- }
64
- return p
65
- } , [ ] )
66
-
67
- if ( aliases . length === 1 ) {
68
- usage . push ( '' )
69
- usage . push ( `alias: ${ aliases . join ( ', ' ) } ` )
70
- } else if ( aliases . length > 1 ) {
71
- usage . push ( '' )
72
- usage . push ( `aliases: ${ aliases . join ( ', ' ) } ` )
73
- }
74
-
75
- usage . push ( '' )
76
- usage . push ( `Run "npm help ${ this . name } " for more info` )
77
-
78
- return usage . join ( '\n' )
79
- }
80
-
81
- get wrappedParams ( ) {
82
- let results = ''
83
- let line = ''
84
-
85
- for ( const param of this . params ) {
86
- const usage = `[${ ConfigDefinitions [ param ] . usage } ]`
87
- if ( line . length && line . length + usage . length > this . wrapWidth ) {
88
- results = [ results , line ] . filter ( Boolean ) . join ( '\n' )
89
- line = ''
90
- }
91
- line = [ line , usage ] . filter ( Boolean ) . join ( ' ' )
92
- }
93
- results = [ results , line ] . filter ( Boolean ) . join ( '\n' )
94
- return results
90
+ return this . constructor . describeUsage
95
91
}
96
92
97
93
usageError ( prefix = '' ) {
0 commit comments