Skip to content

Commit a4df2b9

Browse files
isaacswraithgar
authored andcommitted
config: Restore --dev flag, unify --omit flatteners
This consolidates all the various --include and --omit configuration flatteners into a single function, since they have to be interdependent in order to function properly. Fix: #2936 PR-URL: #2942 Credit: @isaacs Close: #2942 Reviewed-by: @wraithgar
1 parent 62b783a commit a4df2b9

File tree

5 files changed

+115
-45
lines changed

5 files changed

+115
-45
lines changed

docs/content/using-npm/config.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,14 @@ What authentication strategy to use with `adduser`/`login`.
13821382

13831383
`--cache-min=9999 (or bigger)` is an alias for `--prefer-offline`.
13841384

1385+
#### `dev`
1386+
1387+
* Default: false
1388+
* Type: Boolean
1389+
* DEPRECATED: Please use --include=dev instead.
1390+
1391+
Alias for `--include=dev`.
1392+
13851393
#### `init.author.email`
13861394

13871395
* Default: ""

lib/utils/config/definitions.js

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,34 @@ const maybeReadFile = file => {
2222
}
2323
}
2424

25+
const buildOmitList = obj => {
26+
const include = obj.include || []
27+
const omit = obj.omit || []
28+
29+
const only = obj.only
30+
if (/^prod(uction)?$/.test(only) || obj.production)
31+
omit.push('dev')
32+
33+
if (/^dev/.test(obj.also))
34+
include.push('dev')
35+
36+
if (obj.dev)
37+
include.push('dev')
38+
39+
if (obj.optional === false)
40+
omit.push('optional')
41+
else if (obj.optional === true)
42+
include.push('optional')
43+
44+
obj.omit = [...new Set(omit)].filter(type => !include.includes(type))
45+
obj.include = [...new Set(include)]
46+
47+
if (obj.omit.includes('dev'))
48+
process.env.NODE_ENV = 'production'
49+
50+
return obj.omit
51+
}
52+
2553
const editor = process.env.EDITOR ||
2654
process.env.VISUAL ||
2755
(isWindows ? 'notepad.exe' : 'vi')
@@ -164,12 +192,6 @@ define('also', {
164192
`,
165193
deprecated: 'Please use --include=dev instead.',
166194
flatten (key, obj, flatOptions) {
167-
if (!/^dev(elopment)?$/.test(obj.also))
168-
return
169-
170-
// add to include, and call the omit flattener
171-
obj.include = obj.include || []
172-
obj.include.push('dev')
173195
definitions.omit.flatten('omit', obj, flatOptions)
174196
},
175197
})
@@ -477,6 +499,18 @@ define('description', {
477499
},
478500
})
479501

502+
define('dev', {
503+
default: false,
504+
type: Boolean,
505+
description: `
506+
Alias for \`--include=dev\`.
507+
`,
508+
deprecated: 'Please use --include=dev instead.',
509+
flatten (key, obj, flatOptions) {
510+
definitions.omit.flatten('omit', obj, flatOptions)
511+
},
512+
})
513+
480514
define('diff', {
481515
default: [],
482516
type: [String, Array],
@@ -1218,10 +1252,7 @@ define('omit', {
12181252
scripts.
12191253
`,
12201254
flatten (key, obj, flatOptions) {
1221-
const include = obj.include || []
1222-
const omit = flatOptions.omit || []
1223-
flatOptions.omit = omit.concat(obj[key])
1224-
.filter(type => type && !include.includes(type))
1255+
flatOptions.omit = buildOmitList(obj)
12251256
},
12261257
})
12271258

@@ -1236,12 +1267,6 @@ define('only', {
12361267
\`--omit=dev\`.
12371268
`,
12381269
flatten (key, obj, flatOptions) {
1239-
const value = obj[key]
1240-
if (!/^prod(uction)?$/.test(value))
1241-
return
1242-
1243-
obj.omit = obj.omit || []
1244-
obj.omit.push('dev')
12451270
definitions.omit.flatten('omit', obj, flatOptions)
12461271
},
12471272
})
@@ -1259,16 +1284,6 @@ define('optional', {
12591284
Alias for --include=optional or --omit=optional
12601285
`,
12611286
flatten (key, obj, flatOptions) {
1262-
const value = obj[key]
1263-
if (value === null)
1264-
return
1265-
else if (value === true) {
1266-
obj.include = obj.include || []
1267-
obj.include.push('optional')
1268-
} else {
1269-
obj.omit = obj.omit || []
1270-
obj.omit.push('optional')
1271-
}
12721287
definitions.omit.flatten('omit', obj, flatOptions)
12731288
},
12741289
})
@@ -1385,12 +1400,6 @@ define('production', {
13851400
deprecated: 'Use `--omit=dev` instead.',
13861401
description: 'Alias for `--omit=dev`',
13871402
flatten (key, obj, flatOptions) {
1388-
const value = obj[key]
1389-
if (!value)
1390-
return
1391-
1392-
obj.omit = obj.omit || []
1393-
obj.omit.push('dev')
13941403
definitions.omit.flatten('omit', obj, flatOptions)
13951404
},
13961405
})

tap-snapshots/test-lib-utils-config-definitions.js-TAP.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Array [
3232
"commit-hooks",
3333
"depth",
3434
"description",
35+
"dev",
3536
"diff",
3637
"diff-ignore-all-space",
3738
"diff-name-only",

tap-snapshots/test-lib-utils-config-describe-all.js-TAP.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,14 @@ What authentication strategy to use with \`adduser\`/\`login\`.
12611261
12621262
\`--cache-min=9999 (or bigger)\` is an alias for \`--prefer-offline\`.
12631263
1264+
#### \`dev\`
1265+
1266+
* Default: false
1267+
* Type: Boolean
1268+
* DEPRECATED: Please use --include=dev instead.
1269+
1270+
Alias for \`--include=dev\`.
1271+
12641272
#### \`init.author.email\`
12651273
12661274
* Default: ""

test/lib/utils/config/definitions.js

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -194,18 +194,26 @@ t.test('flatteners that populate flat.omit array', t => {
194194
// ignored if setting is not dev or development
195195
obj.also = 'ignored'
196196
definitions.also.flatten('also', obj, flat)
197-
t.strictSame(obj, {also: 'ignored'}, 'nothing done')
198-
t.strictSame(flat, {}, 'nothing done')
197+
t.strictSame(obj, {also: 'ignored', omit: [], include: []}, 'nothing done')
198+
t.strictSame(flat, {omit: []}, 'nothing done')
199199

200200
obj.also = 'development'
201201
definitions.also.flatten('also', obj, flat)
202-
t.strictSame(obj, { also: 'development', include: ['dev'] }, 'marked dev as included')
202+
t.strictSame(obj, {
203+
also: 'development',
204+
omit: [],
205+
include: ['dev'],
206+
}, 'marked dev as included')
203207
t.strictSame(flat, { omit: [] }, 'nothing omitted, so nothing changed')
204208

205209
obj.omit = ['dev', 'optional']
206210
obj.include = []
207211
definitions.also.flatten('also', obj, flat)
208-
t.strictSame(obj, { also: 'development', omit: ['dev', 'optional'], include: ['dev'] }, 'marked dev as included')
212+
t.strictSame(obj, {
213+
also: 'development',
214+
omit: ['optional'],
215+
include: ['dev'],
216+
}, 'marked dev as included')
209217
t.strictSame(flat, { omit: ['optional'] }, 'removed dev from omit')
210218
t.end()
211219
})
@@ -237,7 +245,7 @@ t.test('flatteners that populate flat.omit array', t => {
237245
const flat = {}
238246
const obj = { only: 'asdf' }
239247
definitions.only.flatten('only', obj, flat)
240-
t.strictSame(flat, {}, 'ignored if value is not production')
248+
t.strictSame(flat, { omit: [] }, 'ignored if value is not production')
241249

242250
obj.only = 'prod'
243251
definitions.only.flatten('only', obj, flat)
@@ -256,18 +264,30 @@ t.test('flatteners that populate flat.omit array', t => {
256264
const obj = { optional: null }
257265

258266
definitions.optional.flatten('optional', obj, flat)
259-
t.strictSame(obj, { optional: null }, 'do nothing by default')
260-
t.strictSame(flat, {}, 'do nothing by default')
267+
t.strictSame(obj, {
268+
optional: null,
269+
omit: [],
270+
include: [],
271+
}, 'do nothing by default')
272+
t.strictSame(flat, { omit: [] }, 'do nothing by default')
261273

262274
obj.optional = true
263275
definitions.optional.flatten('optional', obj, flat)
264-
t.strictSame(obj, {include: ['optional'], optional: true}, 'include optional when set')
276+
t.strictSame(obj, {
277+
omit: [],
278+
optional: true,
279+
include: ['optional'],
280+
}, 'include optional when set')
265281
t.strictSame(flat, {omit: []}, 'nothing to omit in flatOptions')
266282

267283
delete obj.include
268284
obj.optional = false
269285
definitions.optional.flatten('optional', obj, flat)
270-
t.strictSame(obj, {omit: ['optional'], optional: false}, 'omit optional when set false')
286+
t.strictSame(obj, {
287+
omit: ['optional'],
288+
optional: false,
289+
include: [],
290+
}, 'omit optional when set false')
271291
t.strictSame(flat, {omit: ['optional']}, 'omit optional when set false')
272292

273293
t.end()
@@ -277,25 +297,49 @@ t.test('flatteners that populate flat.omit array', t => {
277297
const flat = {}
278298
const obj = {production: true}
279299
definitions.production.flatten('production', obj, flat)
280-
t.strictSame(obj, {production: true, omit: ['dev']}, '--production sets --omit=dev')
300+
t.strictSame(obj, {
301+
production: true,
302+
omit: ['dev'],
303+
include: [],
304+
}, '--production sets --omit=dev')
281305
t.strictSame(flat, {omit: ['dev']}, '--production sets --omit=dev')
282306

283307
delete obj.omit
284308
obj.production = false
285309
delete flat.omit
286310
definitions.production.flatten('production', obj, flat)
287-
t.strictSame(obj, {production: false}, '--no-production has no effect')
288-
t.strictSame(flat, {}, '--no-production has no effect')
311+
t.strictSame(obj, {
312+
production: false,
313+
include: [],
314+
omit: [],
315+
}, '--no-production has no effect')
316+
t.strictSame(flat, { omit: [] }, '--no-production has no effect')
289317

290318
obj.production = true
291319
obj.include = ['dev']
292320
definitions.production.flatten('production', obj, flat)
293-
t.strictSame(obj, {production: true, include: ['dev'], omit: ['dev']}, 'omit and include dev')
321+
t.strictSame(obj, {
322+
production: true,
323+
include: ['dev'],
324+
omit: [],
325+
}, 'omit and include dev')
294326
t.strictSame(flat, {omit: []}, 'do not omit dev when included')
295327

296328
t.end()
297329
})
298330

331+
t.test('dev', t => {
332+
const flat = {}
333+
const obj = {dev: true}
334+
definitions.dev.flatten('dev', obj, flat)
335+
t.strictSame(obj, {
336+
dev: true,
337+
omit: [],
338+
include: ['dev'],
339+
})
340+
t.end()
341+
})
342+
299343
t.end()
300344
})
301345

0 commit comments

Comments
 (0)