|
@@ -1,155 +0,0 @@
|
|
|
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
-From: VerteDinde <[email protected]>
|
|
|
-Date: Sat, 17 Feb 2024 22:17:13 -0800
|
|
|
-Subject: fix: revert "src,lb: reducing C++ calls of esm legacy main resolve"
|
|
|
-
|
|
|
-This switch to native legacyMainResolve doesn't take asar into account, and can
|
|
|
-cause errors when a project using ESM and asar tries to load a dependency which
|
|
|
-uses commonJS. This will need to be fixed forward, but revert for Electron 29's
|
|
|
-stable release to avoid potentially breaking apps with a riskier fix.
|
|
|
-
|
|
|
-This patch can be removed when node's
|
|
|
-native implementation has been patched
|
|
|
-to recognize asar files.
|
|
|
-
|
|
|
-This reverts commit 9cf2e1f55b8446a7cde23699d00a3be73aa0c8f1.
|
|
|
-
|
|
|
-diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js
|
|
|
-index 2879e5cf541fb4d226cfd7cc0fe367ca448fb926..8bd68839878427d58d4c61e19c8ec339df4911cd 100644
|
|
|
---- a/lib/internal/modules/esm/resolve.js
|
|
|
-+++ b/lib/internal/modules/esm/resolve.js
|
|
|
-@@ -28,14 +28,13 @@ const { BuiltinModule } = require('internal/bootstrap/realm');
|
|
|
- const fs = require('fs');
|
|
|
- const { getOptionValue } = require('internal/options');
|
|
|
- // Do not eagerly grab .manifest, it may be in TDZ
|
|
|
--const { sep, posix: { relative: relativePosixPath }, resolve } = require('path');
|
|
|
-+const { sep, posix: { relative: relativePosixPath }, toNamespacedPath, resolve } = require('path');
|
|
|
- const preserveSymlinks = getOptionValue('--preserve-symlinks');
|
|
|
- const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
|
|
|
- const inputTypeFlag = getOptionValue('--input-type');
|
|
|
--const { URL, pathToFileURL, fileURLToPath, isURL, URLParse } = require('internal/url');
|
|
|
-+const { URL, pathToFileURL, fileURLToPath, isURL, URLParse, toPathIfFileURL } = require('internal/url');
|
|
|
- const { getCWDURL, setOwnProperty } = require('internal/util');
|
|
|
- const { canParse: URLCanParse } = internalBinding('url');
|
|
|
--const { legacyMainResolve: FSLegacyMainResolve } = internalBinding('fs');
|
|
|
- const {
|
|
|
- ERR_INPUT_TYPE_NOT_ALLOWED,
|
|
|
- ERR_INVALID_ARG_TYPE,
|
|
|
-@@ -183,6 +182,15 @@ const legacyMainResolveExtensionsIndexes = {
|
|
|
- kResolvedByPackageAndNode: 9,
|
|
|
- };
|
|
|
-
|
|
|
-+/**
|
|
|
-+ * @param {string | URL} url
|
|
|
-+ * @returns {boolean}
|
|
|
-+ */
|
|
|
-+function fileExists(url) {
|
|
|
-+ const namespaced = toNamespacedPath(toPathIfFileURL(url));
|
|
|
-+ return internalFsBinding.internalModuleStat(internalFsBinding, namespaced) === 0;
|
|
|
-+}
|
|
|
-+
|
|
|
- /**
|
|
|
- * Legacy CommonJS main resolution:
|
|
|
- * 1. let M = pkg_url + (json main field)
|
|
|
-@@ -199,18 +207,45 @@ function legacyMainResolve(packageJSONUrl, packageConfig, base) {
|
|
|
- assert(isURL(packageJSONUrl));
|
|
|
- const pkgPath = fileURLToPath(new URL('.', packageJSONUrl));
|
|
|
-
|
|
|
-- const baseStringified = isURL(base) ? base.href : base;
|
|
|
--
|
|
|
-- const resolvedOption = FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified);
|
|
|
--
|
|
|
-- const maybeMain = resolvedOption <= legacyMainResolveExtensionsIndexes.kResolvedByMainIndexNode ?
|
|
|
-- packageConfig.main || './' : '';
|
|
|
-- const resolvedPath = resolve(pkgPath, maybeMain + legacyMainResolveExtensions[resolvedOption]);
|
|
|
-- const resolvedUrl = pathToFileURL(resolvedPath);
|
|
|
--
|
|
|
-- emitLegacyIndexDeprecation(resolvedUrl, resolvedPath, pkgPath, base, packageConfig.main);
|
|
|
-+ let guess;
|
|
|
-+ if (packageConfig.main !== undefined) {
|
|
|
-+ // Note: fs check redundances will be handled by Descriptor cache here.
|
|
|
-+ if (fileExists(guess = new URL(`./${packageConfig.main}`,
|
|
|
-+ packageJSONUrl))) {
|
|
|
-+ return guess;
|
|
|
-+ } else if (fileExists(guess = new URL(`./${packageConfig.main}.js`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL(`./${packageConfig.main}.json`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL(`./${packageConfig.main}.node`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`,
|
|
|
-+ packageJSONUrl)));
|
|
|
-+ else guess = undefined;
|
|
|
-+ if (guess) {
|
|
|
-+ emitLegacyIndexDeprecation(guess, fileURLToPath(guess), pkgPath,
|
|
|
-+ base, packageConfig.main);
|
|
|
-+ return guess;
|
|
|
-+ }
|
|
|
-+ }
|
|
|
-
|
|
|
-- return resolvedUrl;
|
|
|
-+ // Fallthrough.
|
|
|
-+ if (fileExists(guess = new URL('./index.js', packageJSONUrl)));
|
|
|
-+ // So fs.
|
|
|
-+ else if (fileExists(guess = new URL('./index.json', packageJSONUrl)));
|
|
|
-+ else if (fileExists(guess = new URL('./index.node', packageJSONUrl)));
|
|
|
-+ else guess = undefined;
|
|
|
-+ if (guess) {
|
|
|
-+ emitLegacyIndexDeprecation(guess, fileURLToPath(guess), pkgPath,
|
|
|
-+ base, packageConfig.main);
|
|
|
-+ return guess;
|
|
|
-+ }
|
|
|
-+ // Not found.
|
|
|
-+ throw new ERR_MODULE_NOT_FOUND(pkgPath, fileURLToPath(base), null);
|
|
|
- }
|
|
|
-
|
|
|
- const encodedSepRegEx = /%2F|%5C/i;
|
|
|
-diff --git a/test/es-module/test-cjs-legacyMainResolve.js b/test/es-module/test-cjs-legacyMainResolve.js
|
|
|
-index edb567bce403f2d4df482c2549c6f7cec78c3588..4567ddc3715ac0d11facb0b567c5f5763699f4c9 100644
|
|
|
---- a/test/es-module/test-cjs-legacyMainResolve.js
|
|
|
-+++ b/test/es-module/test-cjs-legacyMainResolve.js
|
|
|
-@@ -129,7 +129,7 @@ describe('legacyMainResolve', () => {
|
|
|
- );
|
|
|
- assert.throws(
|
|
|
- () => legacyMainResolve(packageJsonUrl, { main: null }, packageJsonUrl),
|
|
|
-- { message: /index\.js/, code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
-+ { code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
- );
|
|
|
- });
|
|
|
-
|
|
|
-@@ -137,7 +137,7 @@ describe('legacyMainResolve', () => {
|
|
|
- const packageJsonUrl = pathToFileURL('/c/file%20with%20percents/package.json');
|
|
|
- assert.throws(
|
|
|
- () => legacyMainResolve(packageJsonUrl, { main: null }, packageJsonUrl),
|
|
|
-- { message: /index\.js/, code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
-+ { code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
- );
|
|
|
- });
|
|
|
-
|
|
|
-@@ -150,7 +150,7 @@ describe('legacyMainResolve', () => {
|
|
|
- );
|
|
|
- assert.throws(
|
|
|
- () => legacyMainResolve(packageJsonUrl, { main: './index.node' }, packageJsonUrl),
|
|
|
-- { message: /index\.node/, code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
-+ { code: 'ERR_MODULE_NOT_FOUND' },
|
|
|
- );
|
|
|
- });
|
|
|
-
|
|
|
-@@ -163,11 +163,11 @@ describe('legacyMainResolve', () => {
|
|
|
- );
|
|
|
- assert.throws(
|
|
|
- () => legacyMainResolve(packageJsonUrl, { main: null }, undefined),
|
|
|
-- { message: /"base" argument must be/, code: 'ERR_INVALID_ARG_TYPE' },
|
|
|
-+ { message: 'The "path" argument must be of type string or an instance of URL. Received undefined', code: 'ERR_INVALID_ARG_TYPE' },
|
|
|
- );
|
|
|
- });
|
|
|
-
|
|
|
-- it('should interpret main as a path, not a URL', () => {
|
|
|
-+ it.skip('should interpret main as a path, not a URL', () => {
|
|
|
- const packageJsonUrl = fixtures.fileURL('/es-modules/legacy-main-resolver/package.json');
|
|
|
- assert.deepStrictEqual(
|
|
|
- legacyMainResolve(packageJsonUrl, { main: '../folder%25with percentage#/' }, packageJsonUrl),
|