mirror of https://github.com/electron/electron
123 lines
5.3 KiB
Diff
123 lines
5.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samuel Attard <sattard@salesforce.com>
|
|
Date: Thu, 6 Oct 2022 04:09:16 -0700
|
|
Subject: fix: expose the built-in electron module via the ESM loader
|
|
|
|
This allows usage of `import { app } from 'electron'` and `import('electron')` natively in the browser + non-sandboxed renderer
|
|
|
|
diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js
|
|
index 1931688e85d05ee2da4f88efb05d635cb43be233..afccc24392abff9eef2b9953fcffeb79ee71ad15 100644
|
|
--- a/lib/internal/modules/esm/get_format.js
|
|
+++ b/lib/internal/modules/esm/get_format.js
|
|
@@ -30,6 +30,7 @@ const protocolHandlers = {
|
|
'http:': getHttpProtocolModuleFormat,
|
|
'https:': getHttpProtocolModuleFormat,
|
|
'node:'() { return 'builtin'; },
|
|
+ 'electron:'() { return 'electron'; },
|
|
};
|
|
|
|
/**
|
|
diff --git a/lib/internal/modules/esm/load.js b/lib/internal/modules/esm/load.js
|
|
index 5239bc8ed883a54df206d73c5dc0b70942c4f3df..6a15fcae677b3bda58fc85f705862bbcd9feec9d 100644
|
|
--- a/lib/internal/modules/esm/load.js
|
|
+++ b/lib/internal/modules/esm/load.js
|
|
@@ -142,7 +142,7 @@ async function defaultLoad(url, context = kEmptyObject) {
|
|
// Now that we have the source for the module, run `defaultGetFormat` to detect its format.
|
|
format = await defaultGetFormat(urlInstance, context);
|
|
|
|
- if (format === 'commonjs') {
|
|
+ if (format === 'electron' || format === 'commonjs') {
|
|
// For backward compatibility reasons, we need to discard the source in
|
|
// order for the CJS loader to re-fetch it.
|
|
source = null;
|
|
@@ -224,6 +224,7 @@ function throwIfUnsupportedURLScheme(parsed, experimentalNetworkImports) {
|
|
protocol !== 'file:' &&
|
|
protocol !== 'data:' &&
|
|
protocol !== 'node:' &&
|
|
+ protocol !== 'electron:' &&
|
|
(
|
|
!experimentalNetworkImports ||
|
|
(
|
|
@@ -232,7 +233,7 @@ function throwIfUnsupportedURLScheme(parsed, experimentalNetworkImports) {
|
|
)
|
|
)
|
|
) {
|
|
- const schemes = ['file', 'data', 'node'];
|
|
+ const schemes = ['file', 'data', 'node', 'electron'];
|
|
if (experimentalNetworkImports) {
|
|
ArrayPrototypePush(schemes, 'https', 'http');
|
|
}
|
|
diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js
|
|
index b56ad6cc833f00f58bf3925e9fd82a8f5b7b9bd7..8c9e8bfb4e828d044b236a11c0890cb4f0161050 100644
|
|
--- a/lib/internal/modules/esm/resolve.js
|
|
+++ b/lib/internal/modules/esm/resolve.js
|
|
@@ -741,6 +741,8 @@ function packageImportsResolve(name, base, conditions) {
|
|
throw importNotDefined(name, packageJSONUrl, base);
|
|
}
|
|
|
|
+const electronTypes = ['electron', 'electron/main', 'electron/common', 'electron/renderer'];
|
|
+
|
|
/**
|
|
* Returns the package type for a given URL.
|
|
* @param {URL} url - The URL to get the package type for.
|
|
@@ -801,6 +803,11 @@ function packageResolve(specifier, base, conditions) {
|
|
return new URL('node:' + specifier);
|
|
}
|
|
|
|
+ const electronSpecifiers = new SafeSet(electronTypes);
|
|
+ if (electronSpecifiers.has(specifier)) {
|
|
+ return new URL('electron:electron');
|
|
+ }
|
|
+
|
|
const { packageName, packageSubpath, isScoped } =
|
|
parsePackageName(specifier, base);
|
|
|
|
diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js
|
|
index ca547699d00ed125fd3b9d383d67b9606f89d199..11d64bfd66259a5c5cf089de713af35ec9cde2aa 100644
|
|
--- a/lib/internal/modules/esm/translators.js
|
|
+++ b/lib/internal/modules/esm/translators.js
|
|
@@ -301,7 +301,7 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) {
|
|
|
|
const { exportNames, module } = cjsPreparseModuleExports(filename, source);
|
|
cjsCache.set(url, module);
|
|
- const namesWithDefault = exportNames.has('default') ?
|
|
+ const namesWithDefault = filename === 'electron' ? ['default', ...Object.keys(module.exports)] : exportNames.has('default') ?
|
|
[...exportNames] : ['default', ...exportNames];
|
|
|
|
if (isMain) {
|
|
@@ -323,8 +323,8 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) {
|
|
({ exports } = module);
|
|
}
|
|
for (const exportName of exportNames) {
|
|
- if (!ObjectPrototypeHasOwnProperty(exports, exportName) ||
|
|
- exportName === 'default') {
|
|
+ if (exportName === 'default' ||
|
|
+ !ObjectPrototypeHasOwnProperty(exports, exportName)) {
|
|
continue;
|
|
}
|
|
// We might trigger a getter -> dont fail.
|
|
@@ -349,6 +349,10 @@ translators.set('require-commonjs', (url, source, isMain) => {
|
|
return createCJSModuleWrap(url, source);
|
|
});
|
|
|
|
+translators.set('electron', () => {
|
|
+ return createCJSModuleWrap('electron', '');
|
|
+});
|
|
+
|
|
// Handle CommonJS modules referenced by `import` statements or expressions,
|
|
// or as the initial entry point when the ESM loader handles a CommonJS entry.
|
|
translators.set('commonjs', async function commonjsStrategy(url, source,
|
|
diff --git a/lib/internal/url.js b/lib/internal/url.js
|
|
index 428c2f1bec4a8e149b8058406d1393a6690ff31a..979455cb44f5edba6d178a6c36a330d707a2395e 100644
|
|
--- a/lib/internal/url.js
|
|
+++ b/lib/internal/url.js
|
|
@@ -1457,6 +1457,8 @@ function fileURLToPath(path) {
|
|
path = new URL(path);
|
|
else if (!isURL(path))
|
|
throw new ERR_INVALID_ARG_TYPE('path', ['string', 'URL'], path);
|
|
+ if (path.protocol === 'electron:')
|
|
+ return 'electron';
|
|
if (path.protocol !== 'file:')
|
|
throw new ERR_INVALID_URL_SCHEME('file');
|
|
return isWindows ? getPathFromURLWin32(path) : getPathFromURLPosix(path);
|