From cce3cabc58e9deb368ae8c8a5f3e56e43f436542 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 18 Mar 2026 16:02:33 -0700 Subject: [PATCH 1/2] fix(cli): avoid calling `require.main` in `make` command --- packages/api/cli/src/electron-forge-make.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/api/cli/src/electron-forge-make.ts b/packages/api/cli/src/electron-forge-make.ts index 1c3cf55923..050a7767f2 100644 --- a/packages/api/cli/src/electron-forge-make.ts +++ b/packages/api/cli/src/electron-forge-make.ts @@ -1,3 +1,5 @@ +import url from 'node:url'; + import { initializeProxy } from '@electron/get'; import { api, MakeOptions } from '@electron-forge/core'; import { resolveWorkingDir } from '@electron-forge/core-utils'; @@ -54,12 +56,19 @@ export async function getMakeOptions(): Promise { return makeOpts; } -if (require.main === module) { - (async () => { - const makeOpts = await getMakeOptions(); +// NOTE: this is a hack that exists because Node.js didn't add import.meta.main +// support until 22.18.0. We should bump up the engines and get that fix before +// we go to stable. +// ref https://2ality.com/2022/07/nodejs-esm-main.html +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + (async () => { + const makeOpts = await getMakeOptions(); - initializeProxy(); + initializeProxy(); - await api.make(makeOpts); - })(); + await api.make(makeOpts); + })(); + } } From 19673c8f21bcdd3cfe2048962b9b2b3bf36e7072 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 18 Mar 2026 16:55:09 -0700 Subject: [PATCH 2/2] require -> import.meta.resolve --- .oxlintrc.json | 9 ---- packages/api/core/spec/slow/make.slow.spec.ts | 46 +++++++++++-------- packages/maker/base/src/Maker.ts | 2 +- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 68ce0d88df..bb5ca7625e 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -40,15 +40,6 @@ "typescript/no-require-imports": "off" } }, - { - "files": [ - "packages/api/core/spec/**/*.ts", - "packages/maker/*/src/Maker*.ts" - ], - "rules": { - "typescript/no-require-imports": "off" - } - }, { "files": ["packages/plugin/webpack/spec/fixtures/**/*.js"], "rules": { diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 23c9ad91f2..de21ae9867 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -119,8 +119,8 @@ describe('Make', () => { dir, outDir, overrideTargets: [ - require.resolve('@electron-forge/maker-zip'), - require.resolve('@electron-forge/maker-dmg'), + import.meta.resolve('@electron-forge/maker-zip'), + import.meta.resolve('@electron-forge/maker-dmg'), ], platform: 'mas', }), @@ -128,35 +128,41 @@ describe('Make', () => { }, ); - describe('with Makers', () => { + describe('with Makers', async () => { if (process.platform !== 'win32') { process.env.DISABLE_SQUIRREL_TEST = 'true'; } + const allMakerNames = [ + '@electron-forge/maker-appx', + '@electron-forge/maker-deb', + '@electron-forge/maker-dmg', + '@electron-forge/maker-flatpak', + '@electron-forge/maker-msix', + '@electron-forge/maker-rpm', + '@electron-forge/maker-snap', + '@electron-forge/maker-squirrel', + '@electron-forge/maker-wix', + '@electron-forge/maker-zip', + ]; + + const allMakers = await Promise.all( + allMakerNames.map(async (name) => ({ + path: import.meta.resolve(name), + module: await import(name), + })), + ); + function getMakers(good: boolean) { - const allMakers = [ - '@electron-forge/maker-appx', - '@electron-forge/maker-deb', - '@electron-forge/maker-dmg', - '@electron-forge/maker-flatpak', - '@electron-forge/maker-msix', - '@electron-forge/maker-rpm', - '@electron-forge/maker-snap', - '@electron-forge/maker-squirrel', - '@electron-forge/maker-wix', - '@electron-forge/maker-zip', - ]; return allMakers - .map((maker) => require.resolve(maker)) - .filter((makerPath) => { - const MakerClass = require(makerPath).default; - const maker = new MakerClass(); + .filter(({ module }) => { + const maker = new module.default(); return ( maker.isSupportedOnCurrentPlatform() === good && maker.externalBinariesExist() === good ); }) - .map((makerPath) => () => { + .map(({ path: makerPath }) => () => { const makerDefinition = { name: makerPath, platforms: [process.platform], diff --git a/packages/maker/base/src/Maker.ts b/packages/maker/base/src/Maker.ts index efb97fd8b3..962d17c1b7 100644 --- a/packages/maker/base/src/Maker.ts +++ b/packages/maker/base/src/Maker.ts @@ -180,7 +180,7 @@ export default abstract class Maker implements IForgeMaker { */ isInstalled(module: string): boolean { try { - require(module); + import.meta.resolve(module); return true; } catch { // Package doesn't exist -- must not be installable on this platform