From e93ecb47e673135b0cf18ceaa9f6823ed3764ef0 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 8 Sep 2021 14:15:57 -0700 Subject: [PATCH 1/5] module: fix $ pattern replacements --- lib/internal/modules/esm/resolve.js | 4 ++-- test/es-module/test-esm-exports.mjs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index ca0e1b316fc5b6..98634ed9de1185 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -461,7 +461,7 @@ function resolvePackageTargetString( } catch {} if (!isURL) { const exportTarget = pattern ? - StringPrototypeReplace(target, patternRegEx, subpath) : + StringPrototypeReplace(target, patternRegEx, () => subpath) : target + subpath; return packageResolve(exportTarget, packageJSONUrl, conditions); } @@ -486,7 +486,7 @@ function resolvePackageTargetString( if (pattern) return new URL(StringPrototypeReplace(resolved.href, patternRegEx, - subpath)); + () => subpath)); return new URL(subpath, resolved); } diff --git a/test/es-module/test-esm-exports.mjs b/test/es-module/test-esm-exports.mjs index a99814b0950d10..0bf361d4863fff 100644 --- a/test/es-module/test-esm-exports.mjs +++ b/test/es-module/test-esm-exports.mjs @@ -156,6 +156,8 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; ['pkgexports/no-ext', `pkgexports${sep}asdf`], // Pattern specificity ['pkgexports/dir2/trailer', `subpath${sep}dir2.js`], + // Pattern double $$ escaping! + ['pkgexports/a/$$', `subpath${sep}$$.js`], ]); if (!isRequire) { From 485b7abf085e47e84504216c569f43333d1c7953 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 8 Sep 2021 14:49:53 -0700 Subject: [PATCH 2/5] fixup: RegExpPrototypeSymbolReplace --- lib/internal/modules/esm/resolve.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index 98634ed9de1185..9fa432b5572cfc 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -10,6 +10,7 @@ const { ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, RegExp, + RegExpPrototypeSymbolReplace, RegExpPrototypeTest, SafeMap, SafeSet, @@ -18,7 +19,6 @@ const { StringPrototypeIncludes, StringPrototypeIndexOf, StringPrototypeLastIndexOf, - StringPrototypeReplace, StringPrototypeSlice, StringPrototypeSplit, StringPrototypeStartsWith, @@ -461,7 +461,7 @@ function resolvePackageTargetString( } catch {} if (!isURL) { const exportTarget = pattern ? - StringPrototypeReplace(target, patternRegEx, () => subpath) : + RegExpPrototypeSymbolReplace(target, patternRegEx, () => subpath) : target + subpath; return packageResolve(exportTarget, packageJSONUrl, conditions); } @@ -485,8 +485,8 @@ function resolvePackageTargetString( throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); if (pattern) - return new URL(StringPrototypeReplace(resolved.href, patternRegEx, - () => subpath)); + return new URL(RegExpPrototypeSymbolReplace(resolved.href, patternRegEx, + () => subpath)); return new URL(subpath, resolved); } @@ -930,7 +930,8 @@ function resolveAsCommonJS(specifier, parentURL) { // Normalize the path separator to give a valid suggestion // on Windows if (process.platform === 'win32') { - found = StringPrototypeReplace(found, new RegExp(`\\${sep}`, 'g'), '/'); + found = RegExpPrototypeSymbolReplace(found, + new RegExp(`\\${sep}`, 'g'), '/'); } return found; } catch { From 952db55f2a67f2d44d65761a0dcbf1b56209317c Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 8 Sep 2021 15:02:36 -0700 Subject: [PATCH 3/5] fixup: regex fix Co-authored-by: Antoine du Hamel --- lib/internal/modules/esm/resolve.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index 9fa432b5572cfc..2cd6744eacc177 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -930,8 +930,8 @@ function resolveAsCommonJS(specifier, parentURL) { // Normalize the path separator to give a valid suggestion // on Windows if (process.platform === 'win32') { - found = RegExpPrototypeSymbolReplace(found, - new RegExp(`\\${sep}`, 'g'), '/'); + found = RegExpPrototypeSymbolReplace(new RegExp(`\\${sep}`, 'g'), + found,'/'); } return found; } catch { From 273b61b657cf10f36a115b3c0ac92134044d2aa6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 8 Sep 2021 15:03:57 -0700 Subject: [PATCH 4/5] fixup: regexp fixes --- lib/internal/modules/esm/resolve.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index 2cd6744eacc177..fe0022f8cfa8de 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -461,7 +461,7 @@ function resolvePackageTargetString( } catch {} if (!isURL) { const exportTarget = pattern ? - RegExpPrototypeSymbolReplace(target, patternRegEx, () => subpath) : + RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; return packageResolve(exportTarget, packageJSONUrl, conditions); } @@ -485,7 +485,7 @@ function resolvePackageTargetString( throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); if (pattern) - return new URL(RegExpPrototypeSymbolReplace(resolved.href, patternRegEx, + return new URL(RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath)); return new URL(subpath, resolved); } From 0545626c7ede032d78caf1d584749e9880bea96d Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 8 Sep 2021 15:08:40 -0700 Subject: [PATCH 5/5] fixup: lint --- lib/internal/modules/esm/resolve.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index fe0022f8cfa8de..efafefe46906cf 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -931,7 +931,7 @@ function resolveAsCommonJS(specifier, parentURL) { // on Windows if (process.platform === 'win32') { found = RegExpPrototypeSymbolReplace(new RegExp(`\\${sep}`, 'g'), - found,'/'); + found, '/'); } return found; } catch {