From bab212a634dce3d7fef7a661feeecf54003b1ae7 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Thu, 11 Feb 2021 20:02:31 +0000 Subject: [PATCH] prevent infinite loops --- packages/node-resolve/src/index.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 8ab282a91..ea0c34165 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -54,6 +54,7 @@ export function nodeResolve(opts = {}) { const rootDir = options.rootDir || process.cwd(); let { dedupe } = options; let rollupOptions; + let inNestedResolve = false; if (typeof dedupe !== 'function') { dedupe = (importee) => @@ -270,10 +271,17 @@ export function nodeResolve(opts = {}) { } const resolved = await doResolveId(this, importee, importer, opts); - if (resolved) { - const resolvedResolved = await this.resolve(resolved.id, importer, { skipSelf: true }); - if (resolvedResolved && resolvedResolved.external) { - return false; + if (resolved && !inNestedResolve) { + // if a plugin invoked by `this.resolve` also does `this.resolve` + // we need to break the loop + inNestedResolve = true; + try { + const resolvedResolved = await this.resolve(resolved.id, importer, { skipSelf: true }); + if (resolvedResolved && resolvedResolved.external) { + return false; + } + } finally { + inNestedResolve = false; } }