22
33const { relative } = require ( 'path' )
44
5- const ConfigDefinitions = require ( './utils/config/definitions.js' )
5+ const definitions = require ( './utils/config/definitions.js' )
66const getWorkspaces = require ( './workspaces/get-workspaces.js' )
7-
8- const cmdAliases = require ( './utils/cmd-list' ) . aliases
7+ const { aliases : cmdAliases } = require ( './utils/cmd-list' )
98
109class BaseCommand {
1110 static workspaces = false
1211 static ignoreImplicitWorkspace = true
1312
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+
1463 constructor ( npm ) {
15- this . wrapWidth = 80
1664 this . npm = npm
1765
1866 const { config } = this . npm
@@ -39,59 +87,7 @@ class BaseCommand {
3987 }
4088
4189 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
9591 }
9692
9793 usageError ( prefix = '' ) {
0 commit comments