Skip to content

Commit 753bcac

Browse files
panrafalarcanis
authored andcommitted
Fix performance of PackageHoister.seed (#6251)
For big repositories with thousands of packages splicing queue array can take upwards of 60s to complete. Changing the algorithm to filter the queue only once solves this.
1 parent 0155739 commit 753bcac

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/package-hoister.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,23 +163,27 @@ export default class PackageHoister {
163163
while (queue.length > 0 && hasChanged) {
164164
hasChanged = false;
165165

166-
for (let t = 0; t < queue.length; ++t) {
167-
const pattern = queue[t][0];
166+
const queueCopy = queue;
167+
queue = [];
168+
for (let t = 0; t < queueCopy.length; ++t) {
169+
const queueItem = queueCopy[t];
170+
const pattern = queueItem[0];
168171
const pkg = this.resolver.getStrictResolvedPattern(pattern);
169172

170173
const peerDependencies = Object.keys(pkg.peerDependencies || {});
171174
const areDependenciesFulfilled = peerDependencies.every(peerDependency => availableSet.has(peerDependency));
172175

173176
if (areDependenciesFulfilled) {
174177
// Move the package inside our sorted queue
175-
sortedQueue.push(queue[t]);
176-
queue.splice(t--, 1);
178+
sortedQueue.push(queueItem);
177179

178180
// Add it to our set, so that we know it is available
179181
availableSet.add(pattern);
180182

181183
// Schedule a next pass, in case other packages had peer dependencies on this one
182184
hasChanged = true;
185+
} else {
186+
queue.push(queueItem);
183187
}
184188
}
185189
}

0 commit comments

Comments
 (0)