From 1aa035a6d46f205ab88bdce832b8356eac6a2f1c Mon Sep 17 00:00:00 2001 From: void_malex Date: Sat, 1 Apr 2023 20:50:46 +0100 Subject: [PATCH 1/2] only rehome a request if it would resolve in a different package this stops infinite loops from v2 addons that misdeclare exports fields reports correct misconfigured export from within stage3 bundler --- packages/core/src/module-resolver.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/src/module-resolver.ts b/packages/core/src/module-resolver.ts index 7cacab99e..0271e7b34 100644 --- a/packages/core/src/module-resolver.ts +++ b/packages/core/src/module-resolver.ts @@ -710,7 +710,12 @@ export class Resolver { // this is the easy case -- a package that uses exports can safely resolve // its own name, so it's enough to let it resolve the (self-targeting) // specifier from its own package root. - return request.rehome(resolve(pkg.root, 'package.json')); + const resolvedPkgJson = resolve(pkg.root, 'package.json'); + if (request.fromFile === resolvedPkgJson) { + return request; + } else { + return request.rehome(resolvedPkgJson); + } } else { // otherwise we need to just assume that internal naming is simple return request.alias(request.specifier.replace(pkg.name, '.')).rehome(resolve(pkg.root, 'package.json')); From 340ef7dbad2c83e2a18a8e630a06148b7f77de06 Mon Sep 17 00:00:00 2001 From: void_malex Date: Wed, 12 Apr 2023 23:41:27 +0100 Subject: [PATCH 2/2] guard against infinte loops at rehome implementation --- packages/core/src/module-resolver.ts | 13 ++++++------- packages/webpack/src/webpack-resolver-plugin.ts | 10 +++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/core/src/module-resolver.ts b/packages/core/src/module-resolver.ts index 0271e7b34..08e0fa645 100644 --- a/packages/core/src/module-resolver.ts +++ b/packages/core/src/module-resolver.ts @@ -119,7 +119,11 @@ class NodeModuleRequest implements ModuleRequest { return new NodeModuleRequest(specifier, this.fromFile) as this; } rehome(fromFile: string): this { - return new NodeModuleRequest(this.specifier, fromFile) as this; + if (this.fromFile === fromFile) { + return this; + } else { + return new NodeModuleRequest(this.specifier, fromFile) as this; + } } virtualize(filename: string) { return new NodeModuleRequest(filename, this.fromFile, true) as this; @@ -710,12 +714,7 @@ export class Resolver { // this is the easy case -- a package that uses exports can safely resolve // its own name, so it's enough to let it resolve the (self-targeting) // specifier from its own package root. - const resolvedPkgJson = resolve(pkg.root, 'package.json'); - if (request.fromFile === resolvedPkgJson) { - return request; - } else { - return request.rehome(resolvedPkgJson); - } + return request.rehome(resolve(pkg.root, 'package.json')); } else { // otherwise we need to just assume that internal naming is simple return request.alias(request.specifier.replace(pkg.name, '.')).rehome(resolve(pkg.root, 'package.json')); diff --git a/packages/webpack/src/webpack-resolver-plugin.ts b/packages/webpack/src/webpack-resolver-plugin.ts index bde43ecda..20db3e276 100644 --- a/packages/webpack/src/webpack-resolver-plugin.ts +++ b/packages/webpack/src/webpack-resolver-plugin.ts @@ -161,9 +161,13 @@ class WebpackModuleRequest implements ModuleRequest { return new WebpackModuleRequest(this.babelLoaderPrefix, this.state) as this; } rehome(newFromFile: string) { - this.state.contextInfo.issuer = newFromFile; - this.state.context = dirname(newFromFile); - return new WebpackModuleRequest(this.babelLoaderPrefix, this.state) as this; + if (this.fromFile === newFromFile) { + return this; + } else { + this.state.contextInfo.issuer = newFromFile; + this.state.context = dirname(newFromFile); + return new WebpackModuleRequest(this.babelLoaderPrefix, this.state) as this; + } } virtualize(filename: string) { let next = this.alias(`${this.babelLoaderPrefix}${virtualLoaderName}?${filename}!`);