Skip to content
This repository was archived by the owner on Aug 11, 2022. It is now read-only.

Commit 42d71be

Browse files
committed
ls: fix filter when prerelease version present
If `ls` for a package without using a semver filter, for example, `npm ls foo` vs `[email protected]`, `ls` was using semver ranges based on `*`, which doesn't match prerelease versions. So, if you had installed a prerelease version (`[email protected]`), the `npm ls` will return no results for `foo`, at all. This patch bypasses the semver check entirely when there's no semver filter for the search. Fixes: #9436 Credit: @zkat PR-URL: #12685 Reviewed-By: @othiym23
1 parent c698ae6 commit 42d71be

2 files changed

Lines changed: 46 additions & 2 deletions

File tree

lib/ls.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ var lsFromTree = ls.fromTree = function (dir, physicalTree, args, silent, cb) {
6262
args = args.map(function (a) {
6363
var p = npa(a)
6464
var name = p.name
65-
var ver = semver.validRange(p.rawSpec) || ''
65+
// When version spec is missing, we'll skip using it when filtering.
66+
// Otherwise, `semver.validRange` would return '*', which won't
67+
// match prerelease versions.
68+
var ver = (p.rawSpec &&
69+
(semver.validRange(p.rawSpec) || ''))
6670
return [ name, ver, a ]
6771
})
6872
}
@@ -292,8 +296,11 @@ function filterFound (root, args) {
292296
var argName = args[ii][0]
293297
var argVersion = args[ii][1]
294298
var argRaw = args[ii][2]
295-
if (depName === argName) {
299+
if (depName === argName && argVersion) {
296300
found = semver.satisfies(dep.version, argVersion, true)
301+
} else if (depName === argName) {
302+
// If version is missing from arg, just do a name match.
303+
found = true
297304
} else if (dep.path === argRaw) {
298305
found = true
299306
}

test/tap/ls.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,43 @@ test('ls with missing filtered arg', function (t) {
127127
})
128128
})
129129

130+
test('ls with prerelease pkg', function (t) {
131+
var fixture = new Tacks(
132+
Dir({
133+
'npm-test-ls': Dir({
134+
'package.json': File({
135+
name: 'npm-test-ls',
136+
version: '1.0.0',
137+
dependencies: {
138+
'dep': 'file:../dep'
139+
}
140+
})
141+
}),
142+
'dep': Dir({
143+
'package.json': File({
144+
name: 'dep',
145+
version: '1.0.0-pre'
146+
})
147+
})
148+
})
149+
)
150+
withFixture(t, fixture, function (done) {
151+
common.npm([
152+
'ls', 'dep',
153+
'--json'
154+
], {
155+
cwd: path.join(fixturepath, 'npm-test-ls')
156+
}, function (err, code, stdout, stderr) {
157+
t.ifErr(err, 'ls succeeded')
158+
t.equal(0, code, 'exit 0 on ls')
159+
var pkg = JSON.parse(stdout)
160+
var deps = pkg.dependencies
161+
t.ok(deps.dep, 'dep present')
162+
t.done()
163+
})
164+
})
165+
})
166+
130167
test('cleanup', function (t) {
131168
rimraf.sync(basepath)
132169
t.done()

0 commit comments

Comments
 (0)