Skip to content

Commit 4695de8

Browse files
committed
install: improve isOnly(Dev,Optional)
Instead of creating a new set each time a new node gets visited, so that its siblings do not have it in `seen`, just remove the node from the original set right after all child nodes are visited. See npm#76
1 parent eee0bcd commit 4695de8

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

lib/install/is-only-dev.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ function andIsOnlyDev (name, seen) {
2828
return isDev && !isProd
2929
} else {
3030
if (seen.has(req)) return true
31-
seen = new Set(seen)
3231
seen.add(req)
33-
return isOnlyDev(req, seen)
32+
const result = isOnlyDev(req, seen)
33+
seen.delete(req)
34+
return result
3435
}
3536
}
3637
}

lib/install/is-only-optional.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ function isOptional (node, seen) {
1111
if (seen.has(node) || node.requiredBy.length === 0) {
1212
return false
1313
}
14-
seen = new Set(seen)
1514
seen.add(node)
1615
const swOptional = node.fromShrinkwrap && node.package._optional
17-
return node.requiredBy.every(function (req) {
16+
const result = node.requiredBy.every(function (req) {
1817
if (req.fakeChild && swOptional) return true
1918
return isOptDep(req, moduleName(node)) || isOptional(req, seen)
2019
})
20+
seen.delete(node)
21+
return result
2122
}

0 commit comments

Comments
 (0)