@@ -3,13 +3,13 @@ const { defaults, types } = require('./utils/config.js')
3
3
const usageUtil = require ( './utils/usage.js' )
4
4
const output = require ( './utils/output.js' )
5
5
6
- const editor = require ( 'editor' )
7
6
const mkdirp = require ( 'mkdirp-infer-owner' )
8
7
const { dirname } = require ( 'path' )
9
8
const { promisify } = require ( 'util' )
10
9
const fs = require ( 'fs' )
11
10
const readFile = promisify ( fs . readFile )
12
11
const writeFile = promisify ( fs . writeFile )
12
+ const editor = promisify ( require ( 'editor' ) )
13
13
const { EOL } = require ( 'os' )
14
14
const ini = require ( 'ini' )
15
15
@@ -28,18 +28,25 @@ const cmd = (args, cb) => config(args).then(() => cb()).catch(cb)
28
28
29
29
const completion = ( opts , cb ) => {
30
30
const argv = opts . conf . argv . remain
31
- if ( argv [ 1 ] !== 'config' ) argv . unshift ( 'config' )
31
+ if ( argv [ 1 ] !== 'config' ) {
32
+ argv . unshift ( 'config' )
33
+ }
34
+
32
35
if ( argv . length === 2 ) {
33
36
const cmds = [ 'get' , 'set' , 'delete' , 'ls' , 'rm' , 'edit' ]
34
- if ( opts . partialWord !== 'l' ) cmds . push ( 'list' )
37
+ if ( opts . partialWord !== 'l' ) {
38
+ cmds . push ( 'list' )
39
+ }
35
40
return cb ( null , cmds )
36
41
}
37
42
38
43
const action = argv [ 2 ]
39
44
switch ( action ) {
40
45
case 'set' :
41
46
// todo: complete with valid values, if possible.
42
- if ( argv . length > 3 ) return cb ( null , [ ] )
47
+ if ( argv . length > 3 ) {
48
+ return cb ( null , [ ] )
49
+ }
43
50
// fallthrough
44
51
/* eslint no-fallthrough:0 */
45
52
case 'get' :
@@ -49,12 +56,14 @@ const completion = (opts, cb) => {
49
56
case 'edit' :
50
57
case 'list' :
51
58
case 'ls' :
52
- return cb ( null , [ ] )
53
59
default :
54
60
return cb ( null , [ ] )
55
61
}
56
62
}
57
63
64
+ const UsageError = ( ) =>
65
+ Object . assign ( new Error ( usage ) , { code : 'EUSAGE' } )
66
+
58
67
const config = async ( [ action , key , val ] ) => {
59
68
npm . log . disableProgress ( )
60
69
try {
@@ -72,13 +81,13 @@ const config = async ([action, key, val]) => {
72
81
break
73
82
case 'list' :
74
83
case 'ls' :
75
- await ( npm . config . get ( ' json' ) ? listJson ( ) : list ( ) )
84
+ await ( npm . flatOptions . json ? listJson ( ) : list ( ) )
76
85
break
77
86
case 'edit' :
78
87
await edit ( )
79
88
break
80
89
default :
81
- throw usage
90
+ throw UsageError ( )
82
91
}
83
92
} finally {
84
93
npm . log . enableProgress ( )
@@ -87,7 +96,7 @@ const config = async ([action, key, val]) => {
87
96
88
97
const set = async ( key , val ) => {
89
98
if ( key === undefined ) {
90
- throw usage
99
+ throw UsageError ( )
91
100
}
92
101
93
102
if ( val === undefined ) {
@@ -103,9 +112,7 @@ const set = async (key, val) => {
103
112
key = key . trim ( )
104
113
val = val . trim ( )
105
114
npm . log . info ( 'config' , 'set %j %j' , key , val )
106
- const where = npm . config . get ( 'global' ) ? 'global' : 'user'
107
- const validBefore = npm . config . data . get ( where ) . valid
108
- console . error ( 'validBefore?' , validBefore )
115
+ const where = npm . flatOptions . global ? 'global' : 'user'
109
116
npm . config . set ( key , val , where )
110
117
if ( ! npm . config . validate ( where ) ) {
111
118
npm . log . warn ( 'config' , 'omitting invalid config values' )
@@ -127,18 +134,18 @@ const get = async key => {
127
134
128
135
const del = async key => {
129
136
if ( ! key ) {
130
- throw usage
137
+ throw UsageError ( )
131
138
}
132
139
133
- const where = npm . config . get ( ' global' ) ? 'global' : 'user'
140
+ const where = npm . flatOptions . global ? 'global' : 'user'
134
141
npm . config . delete ( key , where )
135
142
await npm . config . save ( where )
136
143
}
137
144
138
145
const edit = async ( ) => {
139
146
const { editor : e , global } = npm . flatOptions
140
147
if ( ! e ) {
141
- throw new Error ( 'No `editor` config or EDITOR envionment variable set' )
148
+ throw new Error ( 'No `editor` config or EDITOR environment variable set' )
142
149
}
143
150
144
151
const where = global ? 'global' : 'user'
@@ -147,10 +154,14 @@ const edit = async () => {
147
154
// save first, just to make sure it's synced up
148
155
// this also removes all the comments from the last time we edited it.
149
156
await npm . config . save ( where )
150
- const data = ( await readFile ( file , 'utf8' ) . catch ( ( ) => '' ) ) . replace ( / \r \n / g, '\n' )
157
+
158
+ const data = (
159
+ await readFile ( file , 'utf8' ) . catch ( ( ) => '' )
160
+ ) . replace ( / \r \n / g, '\n' )
151
161
const defData = Object . entries ( defaults ) . reduce ( ( str , [ key , val ] ) => {
152
162
const obj = { [ key ] : val }
153
163
const i = ini . stringify ( obj )
164
+ . replace ( / \r \n / g, '\n' ) // normalizes output from ini.stringify
154
165
. replace ( / \n $ / m, '' )
155
166
. replace ( / ^ / g, '; ' )
156
167
. replace ( / \n / g, '\n; ' )
@@ -179,9 +190,7 @@ ${defData}
179
190
` . split ( '\n' ) . join ( EOL )
180
191
await mkdirp ( dirname ( file ) )
181
192
await writeFile ( file , tmpData , 'utf8' )
182
- await new Promise ( ( res , rej ) => {
183
- editor ( file , { editor : e } , ( er ) => er ? rej ( er ) : res ( ) )
184
- } )
193
+ await editor ( file , { editor : e } )
185
194
}
186
195
187
196
const publicVar = k => ! / ^ ( \/ \/ [ ^ : ] + : ) ? _ / . test ( k )
0 commit comments