Skip to content

Commit

Permalink
feat(enjoyBy): add opts.enjoyBy option to filter versions by date
Browse files Browse the repository at this point in the history
  • Loading branch information
zkat committed Oct 30, 2018
1 parent 6effde4 commit 0b8a790
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
8 changes: 8 additions & 0 deletions README.md
Expand Up @@ -74,3 +74,11 @@ The function will throw `ETARGET` if there was no matching manifest, and
If `opts.defaultTag` is provided, it will be used instead of `latest`. That is,
if that tag matches the selector, it will be used, even if a higher available
version matches the range.

If `opts.enjoyBy` is provided, it should be something that can be passed to `new
Date(x)`, such as a `Date` object or a timestamp string. It will be used to
filter the selected versions such that only versions less than or equal to
`enjoyBy` are considered.

If `opts.includeDeprecated` passed in as true, deprecated versions will be
selected. By default, deprecated versions other than `defaultTag` are ignored.
18 changes: 16 additions & 2 deletions index.js
Expand Up @@ -6,19 +6,28 @@ const semver = require('semver')

const PickerOpts = figgyPudding({
defaultTag: { default: 'latest' },
enjoyBy: {},
includeDeprecated: { default: false }
})

module.exports = pickManifest
function pickManifest (packument, wanted, opts) {
opts = PickerOpts(opts)
const time = opts.enjoyBy && packument.time && +(new Date(opts.enjoyBy))
const spec = npa.resolve(packument.name, wanted)
const type = spec.type
if (type === 'version' || type === 'range') {
wanted = semver.clean(wanted, true) || wanted
}
const distTags = packument['dist-tags'] || {}
const versions = Object.keys(packument.versions || {}).filter(v => semver.valid(v, true))
const versions = Object.keys(packument.versions || {}).filter(v => {
return semver.valid(v, true) && (
!time || (
packument.time[v] &&
time >= +(new Date(packument.time[v]))
)
)
})
const undeprecated = versions.filter(v => !packument.versions[v].deprecated)
let err

Expand Down Expand Up @@ -47,6 +56,7 @@ function pickManifest (packument, wanted, opts) {
!target &&
tagVersion &&
packument.versions[tagVersion] &&
(!time || versions.indexOf(tagVersion) !== -1) &&
semver.satisfies(tagVersion, wanted, true)
) {
target = tagVersion
Expand All @@ -66,7 +76,11 @@ function pickManifest (packument, wanted, opts) {
target = tagVersion
}

const manifest = target && packument.versions[target]
const manifest = (
target &&
(!time || versions.indexOf(target) !== -1) &&
packument.versions[target]
)
if (!manifest) {
err = new Error(
`No matching version found for ${packument.name}@${wanted}`
Expand Down
25 changes: 25 additions & 0 deletions test/index.js
Expand Up @@ -266,3 +266,28 @@ test('accepts opts.includeDeprecated option to disable skipping', t => {
t.equal(manifest.version, '1.1.0', 'picked the right manifest')
t.done()
})

test('accepts opts.enjoyBy option to do date-based cutoffs', t => {
const metadata = {
'dist-tags': {
latest: '3.0.0'
},
time: {
modified: '2018-01-03T00:00:00.000Z',
created: '2018-01-01T00:00:00.000Z',
'1.0.0': '2018-01-01T00:00:00.000Z',
'2.0.0': '2018-01-02T00:00:00.000Z',
'3.0.0': '2018-01-03T00:00:00.000Z'
},
versions: {
'1.0.0': { version: '1.0.0' },
'2.0.0': { version: '2.0.0' },
'3.0.0': { version: '3.0.0' }
}
}
const manifest = pickManifest(metadata, '*', {
enjoyBy: '2018-01-02'
})
t.equal(manifest.version, '2.0.0', 'filtered out 3.0.0 because of dates')
t.done()
})

0 comments on commit 0b8a790

Please sign in to comment.