@@ -6,19 +6,28 @@ const semver = require('semver')
6
6
7
7
const PickerOpts = figgyPudding ( {
8
8
defaultTag : { default : 'latest' } ,
9
+ enjoyBy : { } ,
9
10
includeDeprecated : { default : false }
10
11
} )
11
12
12
13
module . exports = pickManifest
13
14
function pickManifest ( packument , wanted , opts ) {
14
15
opts = PickerOpts ( opts )
16
+ const time = opts . enjoyBy && packument . time && + ( new Date ( opts . enjoyBy ) )
15
17
const spec = npa . resolve ( packument . name , wanted )
16
18
const type = spec . type
17
19
if ( type === 'version' || type === 'range' ) {
18
20
wanted = semver . clean ( wanted , true ) || wanted
19
21
}
20
22
const distTags = packument [ 'dist-tags' ] || { }
21
- const versions = Object . keys ( packument . versions || { } ) . filter ( v => semver . valid ( v , true ) )
23
+ 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
+ )
30
+ } )
22
31
const undeprecated = versions . filter ( v => ! packument . versions [ v ] . deprecated )
23
32
let err
24
33
@@ -47,6 +56,7 @@ function pickManifest (packument, wanted, opts) {
47
56
! target &&
48
57
tagVersion &&
49
58
packument . versions [ tagVersion ] &&
59
+ ( ! time || versions . indexOf ( tagVersion ) !== - 1 ) &&
50
60
semver . satisfies ( tagVersion , wanted , true )
51
61
) {
52
62
target = tagVersion
@@ -66,7 +76,11 @@ function pickManifest (packument, wanted, opts) {
66
76
target = tagVersion
67
77
}
68
78
69
- const manifest = target && packument . versions [ target ]
79
+ const manifest = (
80
+ target &&
81
+ ( ! time || versions . indexOf ( target ) !== - 1 ) &&
82
+ packument . versions [ target ]
83
+ )
70
84
if ( ! manifest ) {
71
85
err = new Error (
72
86
`No matching version found for ${ packument . name } @${ wanted } `
0 commit comments