Skip to content

Commit 5684f45

Browse files
committed
fix(enjoyBy): rework semantics for enjoyBy
1 parent 3ed20c0 commit 5684f45

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

index.js

+14-11
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ function pickManifest (packument, wanted, opts) {
2121
}
2222
const distTags = packument['dist-tags'] || {}
2323
const versions = Object.keys(packument.versions || {}).filter(v => {
24-
return semver.valid(v, true) && (
25-
!time || (
26-
packument.time[v] &&
27-
time >= +(new Date(packument.time[v]))
28-
)
29-
)
24+
return semver.valid(v, true)
3025
})
31-
const undeprecated = versions.filter(v => !packument.versions[v].deprecated)
26+
27+
function enjoyableBy (v) {
28+
return !time || (
29+
packument.time[v] && time >= +(new Date(packument.time[v]))
30+
)
31+
}
32+
3233
let err
3334

3435
if (!versions.length) {
@@ -56,20 +57,23 @@ function pickManifest (packument, wanted, opts) {
5657
!target &&
5758
tagVersion &&
5859
packument.versions[tagVersion] &&
59-
(!time || versions.indexOf(tagVersion) !== -1) &&
60+
enjoyableBy(tagVersion) &&
6061
semver.satisfies(tagVersion, wanted, true)
6162
) {
6263
target = tagVersion
6364
}
6465

6566
if (!target && !opts.includeDeprecated) {
67+
const undeprecated = versions.filter(v => !packument.versions[v].deprecated && enjoyableBy(v)
68+
)
6669
target = semver.maxSatisfying(undeprecated, wanted, true)
6770
}
6871
if (!target) {
69-
target = semver.maxSatisfying(versions, wanted, true)
72+
const stillFresh = versions.filter(enjoyableBy)
73+
target = semver.maxSatisfying(stillFresh, wanted, true)
7074
}
7175

72-
if (!target && wanted === '*') {
76+
if (!target && wanted === '*' && enjoyableBy(tagVersion)) {
7377
// This specific corner is meant for the case where
7478
// someone is using `*` as a selector, but all versions
7579
// are pre-releases, which don't match ranges at all.
@@ -78,7 +82,6 @@ function pickManifest (packument, wanted, opts) {
7882

7983
const manifest = (
8084
target &&
81-
(!time || versions.indexOf(target) !== -1) &&
8285
packument.versions[target]
8386
)
8487
if (!manifest) {

test/index.js

+23-9
Original file line numberDiff line numberDiff line change
@@ -277,27 +277,41 @@ test('accepts opts.enjoyBy option to do date-based cutoffs', t => {
277277
created: '2018-01-01T00:00:00.000Z',
278278
'1.0.0': '2018-01-01T00:00:00.000Z',
279279
'2.0.0': '2018-01-02T00:00:00.000Z',
280-
'3.0.0': '2018-01-03T00:00:00.000Z'
280+
'2.0.1': '2018-01-03T00:00:00.000Z',
281+
'3.0.0': '2018-01-04T00:00:00.000Z'
281282
},
282283
versions: {
283284
'1.0.0': { version: '1.0.0' },
284285
'2.0.0': { version: '2.0.0' },
286+
'2.0.1': { version: '2.0.1' },
285287
'3.0.0': { version: '3.0.0' }
286288
}
287289
}
288-
const manifest = pickManifest(metadata, '*', {
290+
291+
let manifest = pickManifest(metadata, '*', {
289292
enjoyBy: '2018-01-02'
290293
})
291294
t.equal(manifest.version, '2.0.0', 'filtered out 3.0.0 because of dates')
295+
296+
manifest = pickManifest(metadata, 'latest', {
297+
enjoyBy: '2018-01-02'
298+
})
299+
t.equal(manifest.version, '3.0.0', 'tag specs use tagVersion if nothing else works')
300+
301+
manifest = pickManifest(metadata, '3.0.0', {
302+
enjoyBy: '2018-01-02'
303+
})
304+
t.equal(manifest.version, '3.0.0', 'requesting specific version overrides')
305+
306+
manifest = pickManifest(metadata, '^2', {
307+
enjoyBy: '2018-01-02'
308+
})
309+
t.equal(manifest.version, '2.0.0', 'non-tag ranges filtered')
310+
292311
t.throws(() => {
293-
pickManifest(metadata, '3.0.0', {
294-
enjoyBy: '2018-01-02'
295-
})
296-
}, /Enjoy By date of/, 'trying to find by out-of-range version breaks')
297-
t.throws(() => {
298-
pickManifest(metadata, 'latest', {
312+
pickManifest(metadata, '^3', {
299313
enjoyBy: '2018-01-02'
300314
})
301-
}, /Enjoy By date of/, 'trying to find by tag breaks if date is out of range')
315+
}, /Enjoy By/, 'range for out-of-range spec fails even if defaultTag avail')
302316
t.done()
303317
})

0 commit comments

Comments
 (0)