From af289a8c375415dfee07f1cad0223b8a77cf8cfa Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 10:51:55 -0800 Subject: [PATCH 01/17] save fixture --- .eslintignore | 1 + .../spec/fixture/default-app/forge.config.js | 18 ++++++++ .../spec/fixture/default-app/package.json | 46 +++++++++++++++++++ .../spec/fixture/default-app/src/index.css | 8 ++++ .../spec/fixture/default-app/src/index.html | 12 +++++ .../spec/fixture/default-app/src/index.js | 46 +++++++++++++++++++ .../spec/fixture/default-app/src/preload.js | 2 + .../src/AutoUnpackNativesPlugin.ts | 5 +- 8 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 packages/api/core/spec/fixture/default-app/forge.config.js create mode 100644 packages/api/core/spec/fixture/default-app/package.json create mode 100644 packages/api/core/spec/fixture/default-app/src/index.css create mode 100644 packages/api/core/spec/fixture/default-app/src/index.html create mode 100644 packages/api/core/spec/fixture/default-app/src/index.js create mode 100644 packages/api/core/spec/fixture/default-app/src/preload.js diff --git a/.eslintignore b/.eslintignore index f7b1d78263..ee00edba5a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,3 +7,4 @@ packages/*/*/index.ts packages/**/bad.js tmpl packages/api/core/helper/dynamic-import.js +packages/api/core/spec/fixture/default-app/ diff --git a/packages/api/core/spec/fixture/default-app/forge.config.js b/packages/api/core/spec/fixture/default-app/forge.config.js new file mode 100644 index 0000000000..5a2a5f4f1a --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/forge.config.js @@ -0,0 +1,18 @@ +module.exports = { + packagerConfig: { + asar: false, + }, + rebuildConfig: {}, + makers: [ + { + name: '@electron-forge/maker-zip', + platforms: ['darwin', 'linux', 'win32'], + }, + ], + plugins: [ + { + name: '@electron-forge/plugin-auto-unpack-natives', + config: {}, + }, + ], +}; diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json new file mode 100644 index 0000000000..6be98262f0 --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -0,0 +1,46 @@ +{ + "name": "default-app", + "productName": "Test-App", + "version": "1.0.0", + "description": "Test Electron application for Forge API tests", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start", + "package": "electron-forge package", + "make": "electron-forge make", + "lint": "echo \"No linting configured\"" + }, + "keywords": [], + "author": "Test Author", + "license": "MIT", + "homepage": "http://www.example.com/", + "dependencies": { + "electron-squirrel-startup": "^1.0.1" + }, + "devDependencies": { + "@electron-forge/cli": "file:../../../../../api/cli", + "@electron-forge/core": "file:../../../../../api/core", + "@electron-forge/core-utils": "file:../../../../../utils/core-utils", + "@electron-forge/maker-appx": "file:../../../../../maker/appx", + "@electron-forge/maker-base": "file:../../../../../maker/base", + "@electron-forge/maker-deb": "file:../../../../../maker/deb", + "@electron-forge/maker-dmg": "file:../../../../../maker/dmg", + "@electron-forge/maker-flatpak": "file:../../../../../maker/flatpak", + "@electron-forge/maker-msix": "file:../../../../../maker/msix", + "@electron-forge/maker-pkg": "file:../../../../../maker/pkg", + "@electron-forge/maker-rpm": "file:../../../../../maker/rpm", + "@electron-forge/maker-snap": "file:../../../../../maker/snap", + "@electron-forge/maker-squirrel": "file:../../../../../maker/squirrel", + "@electron-forge/maker-wix": "file:../../../../../maker/wix", + "@electron-forge/maker-zip": "file:../../../../../maker/zip", + "@electron-forge/plugin-auto-unpack-natives": "file:../../../../../plugin/auto-unpack-natives", + "@electron-forge/plugin-base": "file:../../../../../plugin/base", + "@electron-forge/plugin-fuses": "file:../../../../../plugin/fuses", + "@electron-forge/shared-types": "file:../../../../../utils/types", + "@electron/fuses": "^1.8.0", + "electron": "^33.0.0" + }, + "config": { + "forge": "./forge.config.js" + } +} diff --git a/packages/api/core/spec/fixture/default-app/src/index.css b/packages/api/core/spec/fixture/default-app/src/index.css new file mode 100644 index 0000000000..3a16b1c779 --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/src/index.css @@ -0,0 +1,8 @@ +body { + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, + sans-serif; + margin: auto; + max-width: 38rem; + padding: 2rem; +} diff --git a/packages/api/core/spec/fixture/default-app/src/index.html b/packages/api/core/spec/fixture/default-app/src/index.html new file mode 100644 index 0000000000..f197f06546 --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/src/index.html @@ -0,0 +1,12 @@ + + + + + Hello World! + + + +

Hello World!

+

Welcome to your Electron application.

+ + diff --git a/packages/api/core/spec/fixture/default-app/src/index.js b/packages/api/core/spec/fixture/default-app/src/index.js new file mode 100644 index 0000000000..146cf18e16 --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/src/index.js @@ -0,0 +1,46 @@ +const path = require('node:path'); + +const { app, BrowserWindow } = require('electron'); + +// Handle creating/removing shortcuts on Windows when installing/uninstalling. +if (require('electron-squirrel-startup')) { + app.quit(); +} + +const createWindow = () => { + // Create the browser window. + const mainWindow = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + }, + }); + + // and load the index.html of the app. + mainWindow.loadFile(path.join(__dirname, 'index.html')); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.whenReady().then(() => { + createWindow(); + + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); +}); + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); diff --git a/packages/api/core/spec/fixture/default-app/src/preload.js b/packages/api/core/spec/fixture/default-app/src/preload.js new file mode 100644 index 0000000000..5e9d369cc9 --- /dev/null +++ b/packages/api/core/spec/fixture/default-app/src/preload.js @@ -0,0 +1,2 @@ +// See the Electron documentation for details on how to use preload scripts: +// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts b/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts index aed54e54b5..358628122f 100644 --- a/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts +++ b/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts @@ -15,10 +15,7 @@ export default class AutoUnpackNativesPlugin extends PluginBase = async ( forgeConfig, ) => { - if (!forgeConfig.packagerConfig) { - forgeConfig.packagerConfig = {}; - } - if (!forgeConfig.packagerConfig.asar) { + if (forgeConfig.packagerConfig.asar === false) { throw new Error( 'The AutoUnpackNatives plugin requires asar to be truthy or an object', ); From df19a06fc135a746ab2efa835971d486ba7388df Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 16:14:49 -0800 Subject: [PATCH 02/17] test: use predictable fixtures for `package` tests --- package.json | 6 + .../spec/fixture/default-app/forge.config.js | 2 +- .../spec/fixture/default-app/package.json | 6 +- packages/api/core/spec/slow/api.slow.spec.ts | 73 ---------- .../api/core/spec/slow/package.slow.spec.ts | 136 ++++++++++++++++++ yarn.lock | 97 ++++++++++++- 6 files changed, 242 insertions(+), 78 deletions(-) create mode 100644 packages/api/core/spec/slow/package.slow.spec.ts diff --git a/package.json b/package.json index f5295a2b55..80ec794149 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,9 @@ "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", "@yarnpkg/types": "^4.0.1", + "electron": "^39.2.6", "electron-installer-common": "^0.10.2", + "electron-squirrel-startup": "^1.0.1", "eslint": "^8.56.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", @@ -117,6 +119,7 @@ "minimist": "^1.2.6", "msw": "^2.7.0", "prettier": "^3.6.2", + "ref-napi": "^3.0.3", "typedoc": "0.25.13", "typescript": "~5.4.5", "vitest": "^4.0.14", @@ -152,6 +155,9 @@ "@bitdisaster/exe-icon-extractor": { "built": true }, + "electron": { + "built": true + }, "electron-winstaller": { "built": true }, diff --git a/packages/api/core/spec/fixture/default-app/forge.config.js b/packages/api/core/spec/fixture/default-app/forge.config.js index 5a2a5f4f1a..71b001e601 100644 --- a/packages/api/core/spec/fixture/default-app/forge.config.js +++ b/packages/api/core/spec/fixture/default-app/forge.config.js @@ -1,6 +1,6 @@ module.exports = { packagerConfig: { - asar: false, + asar: true, }, rebuildConfig: {}, makers: [ diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index 6be98262f0..94b8ff2a91 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -15,7 +15,7 @@ "license": "MIT", "homepage": "http://www.example.com/", "dependencies": { - "electron-squirrel-startup": "^1.0.1" + "electron-squirrel-startup": "file:../../../../../../node_modules/electron-squirrel-startup" }, "devDependencies": { "@electron-forge/cli": "file:../../../../../api/cli", @@ -37,8 +37,8 @@ "@electron-forge/plugin-base": "file:../../../../../plugin/base", "@electron-forge/plugin-fuses": "file:../../../../../plugin/fuses", "@electron-forge/shared-types": "file:../../../../../utils/types", - "@electron/fuses": "^1.8.0", - "electron": "^33.0.0" + "@electron/fuses": "file:../../../../../../node_modules/@electron/fuses", + "electron": "file:../../../../../../node_modules/electron" }, "config": { "forge": "./forge.config.js" diff --git a/packages/api/core/spec/slow/api.slow.spec.ts b/packages/api/core/spec/slow/api.slow.spec.ts index 352882e436..0c05bf0b73 100644 --- a/packages/api/core/spec/slow/api.slow.spec.ts +++ b/packages/api/core/spec/slow/api.slow.spec.ts @@ -1,4 +1,3 @@ -import assert from 'node:assert'; import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; @@ -16,12 +15,10 @@ import { ensureTestDirIsNonexistent, expectLintToPass, } from '@electron-forge/test-utils'; -import { readMetadata } from 'electron-installer-common'; import semver from 'semver'; import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { api, InitOptions } from '../../src/api/index'; -import { installDependencies } from '../../src/util/install-dependencies'; import { readRawPackageJson } from '../../src/util/read-package-json'; type BeforeInitFunction = () => void; @@ -417,30 +414,6 @@ describe.each([ }; }); - it('throws an error when all is set', async () => { - await updatePackageJSON(dir, async (packageJSON) => { - assert(packageJSON.config.forge.packagerConfig); - packageJSON.config.forge.packagerConfig.all = true; - }); - await expect(api.package({ dir })).rejects.toThrow( - /packagerConfig\.all is not supported by Electron Forge/, - ); - await updatePackageJSON(dir, async (packageJSON) => { - assert(packageJSON.config.forge.packagerConfig); - delete packageJSON.config.forge.packagerConfig.all; - }); - }); - - it('can package to outDir without errors', async () => { - const outDir = `${dir}/foo`; - - expect(fs.existsSync(outDir)).toEqual(false); - - await api.package({ dir, outDir }); - - expect(fs.existsSync(outDir)).toEqual(true); - }); - it('can make from custom outDir without errors', async () => { await updatePackageJSON(dir, async (packageJSON) => { // eslint-disable-next-line n/no-missing-require @@ -460,53 +433,7 @@ describe.each([ }); }); - describe('with prebuilt native module deps installed', () => { - beforeAll(async () => { - await installDependencies(pm, dir, ['ref-napi']); - - return async () => { - await fs.promises.rm(path.resolve(dir, 'node_modules/ref-napi'), { - recursive: true, - force: true, - }); - await updatePackageJSON(dir, async (packageJSON) => { - delete packageJSON.dependencies['ref-napi']; - }); - }; - }); - - it('can package without errors', async () => { - await api.package({ dir }); - }); - }); - - it('can package without errors', async () => { - await updatePackageJSON(dir, async (packageJSON) => { - assert(packageJSON.config.forge.packagerConfig); - packageJSON.config.forge.packagerConfig.asar = true; - }); - - await api.package({ dir }); - }); - describe('after package', () => { - it('should have deleted the forge config from the packaged app', async () => { - const cleanPackageJSON = await readMetadata({ - src: path.resolve( - dir, - 'out', - `Test-App-${process.platform}-${process.arch}`, - ), - logger: console.error, - }); - expect(cleanPackageJSON).not.toHaveProperty('config.forge'); - }); - - it('should not affect the actual forge config', async () => { - const normalPackageJSON = await readRawPackageJson(dir); - expect(normalPackageJSON).toHaveProperty('config.forge'); - }); - if (process.platform !== 'win32') { process.env.DISABLE_SQUIRREL_TEST = 'true'; } diff --git a/packages/api/core/spec/slow/package.slow.spec.ts b/packages/api/core/spec/slow/package.slow.spec.ts new file mode 100644 index 0000000000..1740bad7d5 --- /dev/null +++ b/packages/api/core/spec/slow/package.slow.spec.ts @@ -0,0 +1,136 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { ensureTestDirIsNonexistent } from '@electron-forge/test-utils'; +import { readMetadata } from 'electron-installer-common'; +import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; + +import { api } from '../../src/api/index'; +import { readRawPackageJson } from '../../src/util/read-package-json'; + +type PackageJSON = Record & { + config?: { + forge?: Record; + }; + dependencies?: Record; + devDependencies?: Record; +}; + +/** + * Mutates the `package.json` file in a directory. + * Use the return value to later restore the original `package.json` value + * in a subsequent call of this function. + * + * @param dir - The target directory containing the `package.json` file + * @param callback - A callback function that returns the value of the new `package.json` to be applied + * @returns The original `package.json` prior to mutation + */ +async function updatePackageJSON( + dir: string, + callback: (packageJSON: PackageJSON) => Promise, +) { + const packageJSON = await readRawPackageJson(dir); + const mutated = await callback(JSON.parse(JSON.stringify(packageJSON))); + await fs.promises.writeFile( + path.resolve(dir, 'package.json'), + JSON.stringify(mutated, null, 2), + 'utf-8', + ); + return packageJSON; +} + +describe('Package', () => { + let outDir: string; + beforeEach(async () => { + outDir = await ensureTestDirIsNonexistent(); + + return async () => { + await fs.promises.rm(outDir, { recursive: true, force: true }); + }; + }); + + it('can package an Electron app', async () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + + expect(fs.existsSync(outDir)).toEqual(false); + + await api.package({ dir, outDir }); + + // should respect outDir + expect(fs.existsSync(outDir)).toEqual(true); + + // should remove Forge config from packaged app's package.json + const cleanPackageJSON = await readMetadata({ + src: path.resolve(outDir, `Test-App-${process.platform}-${process.arch}`), + logger: console.error, + }); + expect(cleanPackageJSON).not.toHaveProperty('config.forge'); + + // should leave the original Forge config intact + const normalPackageJSON = await readRawPackageJson(dir); + expect(normalPackageJSON).toHaveProperty('config.forge'); + }); + + describe('with packagerConfig.all', () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + + beforeAll(async () => { + const original = await updatePackageJSON(dir, async (packageJSON) => { + packageJSON.config = { + forge: { + packagerConfig: { + all: true, + }, + }, + }; + return packageJSON; + }); + + return async () => { + await updatePackageJSON(dir, async (_packageJSON) => { + return original; + }); + }; + }); + + it('throws an error when packagerConfig.all is set', async () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + await expect(api.package({ dir })).rejects.toThrow( + /packagerConfig\.all is not supported by Electron Forge/, + ); + }); + }); + + describe('with prebuilt native module dependencies', () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + + beforeAll(async () => { + const original = await updatePackageJSON(dir, async (packageJSON) => { + // add ref-napi from root workspace + packageJSON.dependencies = { + ...packageJSON.dependencies, + 'ref-napi': 'file:../../../../../../node_modules/ref-napi', + }; + return packageJSON; + }); + + return async () => { + await updatePackageJSON(dir, async (_packageJSON) => { + return original; + }); + }; + }); + + beforeEach(async () => { + outDir = await ensureTestDirIsNonexistent(); + + return async () => { + await fs.promises.rm(outDir, { recursive: true, force: true }); + }; + }); + + it('can package without errors', async () => { + await api.package({ dir, outDir }); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index a272ffa77a..1fff2751b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1411,6 +1411,25 @@ __metadata: languageName: node linkType: hard +"@electron/get@npm:^2.0.0": + version: 2.0.3 + resolution: "@electron/get@npm:2.0.3" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e + languageName: node + linkType: hard + "@electron/get@npm:^3.0.0": version: 3.0.0 resolution: "@electron/get@npm:3.0.0" @@ -5097,6 +5116,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.7.7": + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -8110,11 +8138,13 @@ __metadata: cross-spawn: "npm:^7.0.3" cross-zip: "npm:^4.0.0" debug: "npm:^4.3.1" + electron: "npm:^39.2.6" electron-installer-common: "npm:^0.10.2" electron-installer-debian: "npm:^3.2.0" electron-installer-dmg: "npm:^5.0.1" electron-installer-redhat: "npm:^3.2.0" electron-installer-snap: "npm:^5.2.0" + electron-squirrel-startup: "npm:^1.0.1" electron-windows-msix: "npm:^2.0.4" electron-windows-store: "npm:^2.1.0" electron-winstaller: "npm:^5.3.0" @@ -8151,6 +8181,7 @@ __metadata: parse-author: "npm:^2.0.0" prettier: "npm:^3.6.2" rechoir: "npm:^0.8.0" + ref-napi: "npm:^3.0.3" semver: "npm:^7.2.1" source-map-support: "npm:^0.5.13" tsx: "npm:^4.21.0" @@ -8175,6 +8206,8 @@ __metadata: built: true "@malept/electron-installer-flatpak": optional: true + electron: + built: true electron-installer-debian: optional: true electron-installer-dmg: @@ -8292,6 +8325,15 @@ __metadata: languageName: node linkType: hard +"electron-squirrel-startup@npm:^1.0.1": + version: 1.0.1 + resolution: "electron-squirrel-startup@npm:1.0.1" + dependencies: + debug: "npm:^2.2.0" + checksum: 10c0/eaff42844702321237b23f68ae2bff2eae17cb1251189e9a5397d94d1598a607e3cbedc60e130a0641798739019db44c37b2a8801e7a60f9261810bb8d07e9bf + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.4": version: 1.5.25 resolution: "electron-to-chromium@npm:1.5.25" @@ -8369,6 +8411,19 @@ __metadata: languageName: node linkType: hard +"electron@npm:^39.2.6": + version: 39.2.6 + resolution: "electron@npm:39.2.6" + dependencies: + "@electron/get": "npm:^2.0.0" + "@types/node": "npm:^22.7.7" + extract-zip: "npm:^2.0.1" + bin: + electron: cli.js + checksum: 10c0/d3a0f219eb4077e1a76aa6215202d3a22c1026497d79226e244fa3299a17ba0e62b97c2ddf40dfb9225cc089f5beb681dde9e5db3da3ab8f5686334e4b6888f4 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -9717,7 +9772,7 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:^2.0.0": +"extract-zip@npm:^2.0.0, extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -10593,6 +10648,13 @@ __metadata: languageName: node linkType: hard +"get-symbol-from-current-process-h@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-from-current-process-h@npm:1.0.2" + checksum: 10c0/f33109e08aef7029b16f18032dce669e92efb21992946d7b575e494f32907c3d2c353685e00398b9202c332aab140e444e9333c93f2b81aa662bde3f59e3a25a + languageName: node + linkType: hard + "get-tsconfig@npm:^4.7.5": version: 4.13.0 resolution: "get-tsconfig@npm:4.13.0" @@ -14149,6 +14211,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^3.0.0": + version: 3.2.1 + resolution: "node-addon-api@npm:3.2.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/41f21c9d12318875a2c429befd06070ce367065a3ef02952cfd4ea17ef69fa14012732f510b82b226e99c254da8d671847ea018cad785f839a5366e02dd56302 + languageName: node + linkType: hard + "node-api-version@npm:^0.2.0": version: 0.2.0 resolution: "node-api-version@npm:0.2.0" @@ -14193,6 +14264,17 @@ __metadata: languageName: node linkType: hard +"node-gyp-build@npm:^4.2.1": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + "node-gyp@npm:^11.0.0, node-gyp@npm:latest": version: 11.4.2 resolution: "node-gyp@npm:11.4.2" @@ -15905,6 +15987,19 @@ __metadata: languageName: node linkType: hard +"ref-napi@npm:^3.0.3": + version: 3.0.3 + resolution: "ref-napi@npm:3.0.3" + dependencies: + debug: "npm:^4.1.1" + get-symbol-from-current-process-h: "npm:^1.0.2" + node-addon-api: "npm:^3.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.1" + checksum: 10c0/03768cfe6134061c4afe8c5da6cc03ced9763ad1b8401895df2c5f6b10211dfd2bbcf31cca256e2abe9f2d4ddf08333590a6589b2ec5e68efacf70de2c0e2d7b + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.9 resolution: "reflect.getprototypeof@npm:1.0.9" From da04b9719bea20826cb58ecdb16a41eabbed5b02 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 16:16:24 -0800 Subject: [PATCH 03/17] revert unnecessary diff --- .../auto-unpack-natives/src/AutoUnpackNativesPlugin.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts b/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts index 358628122f..aed54e54b5 100644 --- a/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts +++ b/packages/plugin/auto-unpack-natives/src/AutoUnpackNativesPlugin.ts @@ -15,7 +15,10 @@ export default class AutoUnpackNativesPlugin extends PluginBase = async ( forgeConfig, ) => { - if (forgeConfig.packagerConfig.asar === false) { + if (!forgeConfig.packagerConfig) { + forgeConfig.packagerConfig = {}; + } + if (!forgeConfig.packagerConfig.asar) { throw new Error( 'The AutoUnpackNatives plugin requires asar to be truthy or an object', ); From 2fba7f471b7e68853c78ef634b220e1bea60d390 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 17:01:36 -0800 Subject: [PATCH 04/17] isolate fast test a bit more --- .../core-utils/spec/electron-version.spec.ts | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/utils/core-utils/spec/electron-version.spec.ts b/packages/utils/core-utils/spec/electron-version.spec.ts index 0d3edc79e6..c164814bc2 100644 --- a/packages/utils/core-utils/spec/electron-version.spec.ts +++ b/packages/utils/core-utils/spec/electron-version.spec.ts @@ -2,7 +2,8 @@ import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; -import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { ensureTestDirIsNonexistent } from '@electron-forge/test-utils'; +import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { devDeps, @@ -58,21 +59,30 @@ describe('updateElectronDependency', () => { }); describe('getElectronVersion', () => { + let dir: string; + beforeEach(async () => { + dir = await ensureTestDirIsNonexistent(); + + return async () => { + await fs.rm(dir, { recursive: true, force: true }); + }; + }); it('fails without devDependencies', async () => { - await expect(getElectronVersion('', {})).rejects.toThrow( + await expect(getElectronVersion(dir, {})).rejects.toThrow( 'does not have any devDependencies', ); }); it('fails without electron devDependencies', async () => - expect(getElectronVersion('', { devDependencies: {} })).rejects.toThrow( + expect(getElectronVersion(dir, { devDependencies: {} })).rejects.toThrow( 'Electron packages in devDependencies', )); it('fails with a non-exact version and no electron installed', async () => { const fixtureDir = path.resolve(fixturePath, 'dummy_app'); + await fs.cp(fixtureDir, dir, { recursive: true }); await expect( - getElectronVersion(fixtureDir, { + getElectronVersion(dir, { devDependencies: { electron: '^4.0.2' }, }), ).rejects.toThrow('Cannot find the package'); @@ -80,6 +90,7 @@ describe('getElectronVersion', () => { it('works with a non-exact version with electron installed', async () => { const fixtureDir = path.resolve(fixturePath, 'non-exact'); + await fs.cp(fixtureDir, dir, { recursive: true }); await expect( getElectronVersion(fixtureDir, { devDependencies: { electron: '^4.0.2' }, @@ -91,7 +102,7 @@ describe('getElectronVersion', () => { const packageJSON = { devDependencies: { 'electron-nightly': '5.0.0-nightly.20190107' }, }; - await expect(getElectronVersion('', packageJSON)).resolves.toEqual( + await expect(getElectronVersion(dir, packageJSON)).resolves.toEqual( '5.0.0-nightly.20190107', ); }); @@ -100,7 +111,9 @@ describe('getElectronVersion', () => { const packageJSON = { devDependencies: { electron: '1.0.0' }, }; - await expect(getElectronVersion('', packageJSON)).resolves.toEqual('1.0.0'); + await expect(getElectronVersion(dir, packageJSON)).resolves.toEqual( + '1.0.0', + ); }); describe('with yarn workspaces', () => { @@ -115,6 +128,7 @@ describe('getElectronVersion', () => { 'packages', 'subpackage', ); + await fs.cp(fixtureDir, dir, { recursive: true }); const packageJSON = { devDependencies: { electron: '^4.0.4' }, }; From bc40bfe1bb728ca0991107ea79f33a5fe47ed6da Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 18:12:43 -0800 Subject: [PATCH 05/17] add make tests too, i suppose --- ....slow.spec.ts => init-import.slow.spec.ts} | 256 +----------------- packages/api/core/spec/slow/make.slow.spec.ts | 48 ++++ .../api/core/spec/slow/package.slow.spec.ts | 36 +-- packages/utils/test-utils/package.json | 3 +- packages/utils/test-utils/src/index.ts | 33 ++- 5 files changed, 88 insertions(+), 288 deletions(-) rename packages/api/core/spec/slow/{api.slow.spec.ts => init-import.slow.spec.ts} (55%) create mode 100644 packages/api/core/spec/slow/make.slow.spec.ts diff --git a/packages/api/core/spec/slow/api.slow.spec.ts b/packages/api/core/spec/slow/init-import.slow.spec.ts similarity index 55% rename from packages/api/core/spec/slow/api.slow.spec.ts rename to packages/api/core/spec/slow/init-import.slow.spec.ts index 0c05bf0b73..4f3913df5a 100644 --- a/packages/api/core/spec/slow/api.slow.spec.ts +++ b/packages/api/core/spec/slow/init-import.slow.spec.ts @@ -6,11 +6,7 @@ import { PACKAGE_MANAGERS, spawnPackageManager, } from '@electron-forge/core-utils'; -import { createDefaultCertificate } from '@electron-forge/maker-appx'; -import { - ForgeConfig, - IForgeResolvableMaker, -} from '@electron-forge/shared-types'; +import { ForgeConfig } from '@electron-forge/shared-types'; import { ensureTestDirIsNonexistent, expectLintToPass, @@ -109,8 +105,6 @@ describe.each([ PACKAGE_MANAGERS['yarn'], PACKAGE_MANAGERS['pnpm'], ])(`init (with $executable)`, (pm) => { - let dir: string; - beforeAll(async () => { const originalCorepackStrict = process.env.COREPACK_ENABLE_STRICT; if (pm.executable === 'pnpm') { @@ -366,251 +360,5 @@ describe.each([ ); }); }); - - describe('Electron Forge API', () => { - let dir: string; - - describe('after init', () => { - let devCert: string; - - beforeAll(async () => { - dir = path.join( - await ensureTestDirIsNonexistent(), - 'electron-forge-test', - ); - await api.init({ dir }); - - await updatePackageJSON(dir, async (packageJSON) => { - packageJSON.name = 'testapp'; - packageJSON.version = '1.0.0-beta.1'; - packageJSON.productName = 'Test-App'; - packageJSON.config = packageJSON.config || {}; - packageJSON.config.forge = { - ...packageJSON.config.forge, - packagerConfig: { - asar: false, - }, - }; - if (process.platform === 'win32') { - await fs.promises.copyFile( - path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), - path.join(dir, 'default.pvk'), - ); - devCert = await createDefaultCertificate('CN=Test Author', { - certFilePath: dir, - }); - } else if (process.platform === 'linux') { - packageJSON.config.forge.packagerConfig = { - ...packageJSON.config.forge.packagerConfig, - executableName: 'testapp', - }; - } - packageJSON.homepage = 'http://www.example.com/'; - packageJSON.author = 'Test Author'; - }); - - return async () => { - await fs.promises.rm(dir, { recursive: true, force: true }); - }; - }); - - it('can make from custom outDir without errors', async () => { - await updatePackageJSON(dir, async (packageJSON) => { - // eslint-disable-next-line n/no-missing-require - packageJSON.config.forge.makers = [ - { - name: require.resolve('@electron-forge/maker-zip'), - } as IForgeResolvableMaker, - ]; - }); - - await api.make({ dir, skipPackage: true, outDir: `${dir}/foo` }); - - // Cleanup the custom outDir - await fs.promises.rm(path.resolve(dir, 'foo'), { - recursive: true, - force: true, - }); - }); - - describe('after package', () => { - if (process.platform !== 'win32') { - process.env.DISABLE_SQUIRREL_TEST = 'true'; - } - - 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) => { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const MakerClass = require(makerPath).default; - const maker = new MakerClass(); - return ( - maker.isSupportedOnCurrentPlatform() === good && - maker.externalBinariesExist() === good - ); - }) - .map((makerPath) => () => { - const makerDefinition = { - name: makerPath, - platforms: [process.platform], - config: { - devCert, - }, - }; - - if (process.platform === 'win32') { - ( - makerDefinition.config as Record - ).makeVersionWinStoreCompatible = true; - } - - return makerDefinition; - }); - } - - const goodMakers = getMakers(true); - const badMakers = getMakers(false); - - const testMakeTarget = function testMakeTarget( - target: () => { name: string }, - shouldPass: boolean, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...options: any[] - ) { - describe(`make (with target=${target().name})`, async () => { - beforeAll(async () => { - await updatePackageJSON(dir, async (packageJSON) => { - packageJSON.config.forge.makers = [ - target() as IForgeResolvableMaker, - ]; - }); - }); - - for (const optionsFetcher of options) { - if (shouldPass) { - it(`successfully makes for config: ${JSON.stringify(optionsFetcher())}`, async () => { - const outputs = await api.make(optionsFetcher()); - for (const outputResult of outputs) { - for (const output of outputResult.artifacts) { - expect(fs.existsSync(output)).toEqual(true); - expect( - output.startsWith(path.resolve(dir, 'out', 'make')), - ).toEqual(true); - } - } - }); - } else { - it(`fails for config: ${JSON.stringify(optionsFetcher())}`, async () => { - await expect(api.make(optionsFetcher())).rejects.toThrow(); - }); - } - } - }); - }; - - const targetOptionFetcher = () => ({ dir, skipPackage: true }); - for (const maker of goodMakers) { - testMakeTarget(maker, true, targetOptionFetcher); - } - - for (const maker of badMakers) { - testMakeTarget(maker, false, targetOptionFetcher); - } - - describe('make', () => { - it('throws an error when given an unrecognized platform', async () => { - await expect(api.make({ dir, platform: 'dos' })).rejects.toThrow( - /invalid platform/, - ); - }); - - it("throws an error when the specified maker doesn't support the current platform", async () => { - const makerPath = path.resolve( - __dirname, - '../fixture/maker-unsupported', - ); - await expect( - api.make({ - dir, - overrideTargets: [ - { - name: makerPath, - } as IForgeResolvableMaker, - ], - skipPackage: true, - }), - ).rejects.toThrow(/the maker declared that it cannot run/); - }); - - it("throws an error when the specified maker doesn't implement isSupportedOnCurrentPlatform()", async () => { - const makerPath = path.resolve( - __dirname, - '../fixture/maker-incompatible', - ); - await expect( - api.make({ - dir, - overrideTargets: [ - { - name: makerPath, - } as IForgeResolvableMaker, - ], - skipPackage: true, - }), - ).rejects.toThrow(/incompatible with this version/); - }); - - it('throws an error when no makers are configured for the given platform', async () => { - await expect( - api.make({ - dir, - overrideTargets: [ - { - name: path.resolve( - __dirname, - '../fixture/maker-wrong-platform', - ), - } as IForgeResolvableMaker, - ], - platform: 'linux', - skipPackage: true, - }), - ).rejects.toThrow( - 'Could not find any make targets configured for the "linux" platform.', - ); - }); - - it.runIf(process.platform === 'darwin')( - 'can make for the MAS platform successfully', - async () => { - await expect( - api.make({ - dir, - // eslint-disable-next-line n/no-missing-require - overrideTargets: [ - require.resolve('@electron-forge/maker-zip'), - require.resolve('@electron-forge/maker-dmg'), - ], - platform: 'mas', - }), - ).resolves.toHaveLength(2); - }, - ); - }); - }); - }); - }); + let dir: string; }); diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts new file mode 100644 index 0000000000..30262dbda6 --- /dev/null +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -0,0 +1,48 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { ensureTestDirIsNonexistent } from '@electron-forge/test-utils'; +import { afterEach, beforeAll, describe, expect, it } from 'vitest'; + +import { api } from '../../src/api/index'; + +describe('Make', () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + let outDir: string; + let makeDir: string; + beforeAll(async () => { + outDir = await ensureTestDirIsNonexistent(); + makeDir = path.join(outDir, 'make'); + await api.package({ dir, outDir }); + + return async () => { + await fs.promises.rm(outDir, { recursive: true, force: true }); + }; + }); + + afterEach(async () => { + await fs.promises.rm(makeDir, { recursive: true, force: true }); + }); + + it('can make from custom outDir without errors', async () => { + await api.make({ dir, skipPackage: true, outDir }); + + // out/make/zip/darwin/arm64/Test-App-darwin-arm64-1.0.0.zip + const artifactPath = path.join( + outDir, + 'make', + 'zip', + process.platform, + process.arch, + `Test-App-${process.platform}-${process.arch}-1.0.0.zip`, + ); + + expect(fs.existsSync(artifactPath)).toBe(true); + + // spot check that the zip archive is greater than 50MB + const { size } = await fs.promises.stat(artifactPath); + expect(size).toBeGreaterThan(50 * 1024 * 1024); + }); + + describe.todo('make with different targets'); +}); diff --git a/packages/api/core/spec/slow/package.slow.spec.ts b/packages/api/core/spec/slow/package.slow.spec.ts index 1740bad7d5..d18887d081 100644 --- a/packages/api/core/spec/slow/package.slow.spec.ts +++ b/packages/api/core/spec/slow/package.slow.spec.ts @@ -1,44 +1,16 @@ import fs from 'node:fs'; import path from 'node:path'; -import { ensureTestDirIsNonexistent } from '@electron-forge/test-utils'; +import { + ensureTestDirIsNonexistent, + updatePackageJSON, +} from '@electron-forge/test-utils'; import { readMetadata } from 'electron-installer-common'; import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { api } from '../../src/api/index'; import { readRawPackageJson } from '../../src/util/read-package-json'; -type PackageJSON = Record & { - config?: { - forge?: Record; - }; - dependencies?: Record; - devDependencies?: Record; -}; - -/** - * Mutates the `package.json` file in a directory. - * Use the return value to later restore the original `package.json` value - * in a subsequent call of this function. - * - * @param dir - The target directory containing the `package.json` file - * @param callback - A callback function that returns the value of the new `package.json` to be applied - * @returns The original `package.json` prior to mutation - */ -async function updatePackageJSON( - dir: string, - callback: (packageJSON: PackageJSON) => Promise, -) { - const packageJSON = await readRawPackageJson(dir); - const mutated = await callback(JSON.parse(JSON.stringify(packageJSON))); - await fs.promises.writeFile( - path.resolve(dir, 'package.json'), - JSON.stringify(mutated, null, 2), - 'utf-8', - ); - return packageJSON; -} - describe('Package', () => { let outDir: string; beforeEach(async () => { diff --git a/packages/utils/test-utils/package.json b/packages/utils/test-utils/package.json index 72210258fd..99a1886b3c 100644 --- a/packages/utils/test-utils/package.json +++ b/packages/utils/test-utils/package.json @@ -8,7 +8,8 @@ "main": "dist/index.js", "typings": "dist/index.d.ts", "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0" + "@malept/cross-spawn-promise": "^2.0.0", + "fs-extra": "^10.0.0" }, "engines": { "node": ">= 16.4.0" diff --git a/packages/utils/test-utils/src/index.ts b/packages/utils/test-utils/src/index.ts index 85f894d0e0..66a627f2c5 100644 --- a/packages/utils/test-utils/src/index.ts +++ b/packages/utils/test-utils/src/index.ts @@ -1,8 +1,16 @@ -import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import { ExitError, spawn } from '@malept/cross-spawn-promise'; +import fs from 'fs-extra'; + +export type PackageJSON = Record & { + config?: { + forge?: Record; + }; + dependencies?: Record; + devDependencies?: Record; +}; async function runNPM(dir: string, ...args: string[]) { await spawn('npm', args, { cwd: dir }); @@ -63,3 +71,26 @@ export async function mockRequire(mockedUri: string, stub: any) { return Module._load_original(uri, parent); }; } + +/** + * Mutates the `package.json` file in a directory. + * Use the return value to later restore the original `package.json` value + * in a subsequent call of this function. + * + * @param dir - The target directory containing the `package.json` file + * @param callback - A callback function that returns the value of the new `package.json` to be applied + * @returns The original `package.json` prior to mutation + */ +export async function updatePackageJSON( + dir: string, + callback: (packageJSON: PackageJSON) => Promise, +) { + const packageJSON = await fs.readJson(path.resolve(dir, 'package.json')); + const mutated = await callback(JSON.parse(JSON.stringify(packageJSON))); + await fs.promises.writeFile( + path.resolve(dir, 'package.json'), + JSON.stringify(mutated, null, 2), + 'utf-8', + ); + return packageJSON; +} From 98c96349595e8e009e787514b25a6f035b255eb4 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 18:13:57 -0800 Subject: [PATCH 06/17] update lockfile --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 1fff2751b0..047d8248f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1362,6 +1362,7 @@ __metadata: resolution: "@electron-forge/test-utils@workspace:packages/utils/test-utils" dependencies: "@malept/cross-spawn-promise": "npm:^2.0.0" + fs-extra: "npm:^10.0.0" languageName: unknown linkType: soft From 850aa76c09d83a13b4e2442a257d5831a93ef57c Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 22:55:46 -0800 Subject: [PATCH 07/17] this works --- .../spec/fixture/default-app/package.json | 12 +- packages/api/core/spec/slow/make.slow.spec.ts | 178 +++++++++++++++++- 2 files changed, 186 insertions(+), 4 deletions(-) diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index 94b8ff2a91..70bfb09a9a 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -41,6 +41,16 @@ "electron": "file:../../../../../../node_modules/electron" }, "config": { - "forge": "./forge.config.js" + "forge": { + "makers": [ + { + "name": "/Users/erick.zhao/Developer/electron/forge/packages/maker/snap/dist/MakerSnap.js", + "platforms": [ + "darwin" + ], + "config": {} + } + ] + } } } diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 30262dbda6..2d146b319c 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -1,7 +1,12 @@ import fs from 'node:fs'; import path from 'node:path'; -import { ensureTestDirIsNonexistent } from '@electron-forge/test-utils'; +import { createDefaultCertificate } from '@electron-forge/maker-appx'; +import { IForgeResolvableMaker } from '@electron-forge/shared-types'; +import { + ensureTestDirIsNonexistent, + updatePackageJSON, +} from '@electron-forge/test-utils'; import { afterEach, beforeAll, describe, expect, it } from 'vitest'; import { api } from '../../src/api/index'; @@ -10,11 +15,19 @@ describe('Make', () => { const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); let outDir: string; let makeDir: string; + let devCert: string; + beforeAll(async () => { outDir = await ensureTestDirIsNonexistent(); makeDir = path.join(outDir, 'make'); await api.package({ dir, outDir }); + if (process.platform === 'win32') { + devCert = await createDefaultCertificate('CN=Test Author', { + certFilePath: dir, + }); + } + return async () => { await fs.promises.rm(outDir, { recursive: true, force: true }); }; @@ -24,7 +37,7 @@ describe('Make', () => { await fs.promises.rm(makeDir, { recursive: true, force: true }); }); - it('can make from custom outDir without errors', async () => { + it('makes from a custom outDir without errors', async () => { await api.make({ dir, skipPackage: true, outDir }); // out/make/zip/darwin/arm64/Test-App-darwin-arm64-1.0.0.zip @@ -44,5 +57,164 @@ describe('Make', () => { expect(size).toBeGreaterThan(50 * 1024 * 1024); }); - describe.todo('make with different targets'); + it('throws an error when given an unrecognized platform', async () => { + await expect(api.make({ dir, platform: 'dos' })).rejects.toThrow( + /invalid platform/, + ); + }); + + it("throws an error when the specified maker doesn't implement isSupportedOnCurrentPlatform()", async () => { + const makerPath = path.resolve(__dirname, '../fixture/maker-incompatible'); + await expect( + api.make({ + dir, + overrideTargets: [ + { + name: makerPath, + } as IForgeResolvableMaker, + ], + skipPackage: true, + }), + ).rejects.toThrow(/incompatible with this version/); + }); + + it('throws an error when no makers are configured for the given platform', async () => { + await expect( + api.make({ + dir, + overrideTargets: [ + { + name: path.resolve(__dirname, '../fixture/maker-wrong-platform'), + } as IForgeResolvableMaker, + ], + platform: 'linux', + skipPackage: true, + }), + ).rejects.toThrow( + 'Could not find any make targets configured for the "linux" platform.', + ); + }); + + it.runIf(process.platform === 'darwin')( + 'makes Mac App Store targets', + async () => { + await expect( + api.make({ + dir, + outDir, + overrideTargets: [ + require.resolve('@electron-forge/maker-zip'), + require.resolve('@electron-forge/maker-dmg'), + ], + platform: 'mas', + }), + ).resolves.toHaveLength(2); + }, + ); + + describe('targets', () => { + if (process.platform !== 'win32') { + process.env.DISABLE_SQUIRREL_TEST = 'true'; + } + + 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(); + return ( + maker.isSupportedOnCurrentPlatform() === good && + maker.externalBinariesExist() === good + ); + }) + .map((makerPath) => () => { + const makerDefinition = { + name: makerPath, + platforms: [process.platform], + config: { + devCert, + }, + }; + + if (process.platform === 'win32') { + ( + makerDefinition.config as Record + ).makeVersionWinStoreCompatible = true; + } + + return makerDefinition; + }); + } + + const goodMakers = getMakers(true); + const badMakers = getMakers(false); + + const testMakeTarget = function ( + target: () => { name: string }, + shouldPass: boolean, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...options: any[] + ) { + describe(`${target().name}`, async () => { + beforeAll(async () => { + const original = await updatePackageJSON(dir, async (packageJSON) => { + return { + ...packageJSON, + config: { + forge: { + makers: [target() as IForgeResolvableMaker], + }, + }, + }; + }); + + return async () => { + await updatePackageJSON(dir, original); + }; + }); + + for (const optionsFetcher of options) { + if (shouldPass) { + it(`makes for config: ${JSON.stringify(optionsFetcher())}`, async () => { + const outputs = await api.make(optionsFetcher()); + for (const outputResult of outputs) { + for (const output of outputResult.artifacts) { + expect(fs.existsSync(output)).toEqual(true); + expect( + output.startsWith(path.resolve(outDir, 'make')), + ).toEqual(true); + } + } + }); + } else { + it(`fails for config: ${JSON.stringify(optionsFetcher())}`, async () => { + await expect(api.make(optionsFetcher())).rejects.toThrow(); + }); + } + } + }); + }; + + const targetOptionFetcher = () => ({ dir, outDir, skipPackage: true }); + for (const maker of goodMakers) { + testMakeTarget(maker, true, targetOptionFetcher); + } + + for (const maker of badMakers) { + testMakeTarget(maker, false, targetOptionFetcher); + } + }); }); From 29300079713e5e028fe57367fa9fcf7c68d68855 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 23:21:40 -0800 Subject: [PATCH 08/17] zzz --- .../spec/fixture/default-app/package.json | 13 ----- packages/api/core/spec/slow/make.slow.spec.ts | 49 +++++++++---------- 2 files changed, 23 insertions(+), 39 deletions(-) diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index 70bfb09a9a..1ed9cee573 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -39,18 +39,5 @@ "@electron-forge/shared-types": "file:../../../../../utils/types", "@electron/fuses": "file:../../../../../../node_modules/@electron/fuses", "electron": "file:../../../../../../node_modules/electron" - }, - "config": { - "forge": { - "makers": [ - { - "name": "/Users/erick.zhao/Developer/electron/forge/packages/maker/snap/dist/MakerSnap.js", - "platforms": [ - "darwin" - ], - "config": {} - } - ] - } } } diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 2d146b319c..82fabd343a 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -7,7 +7,7 @@ import { ensureTestDirIsNonexistent, updatePackageJSON, } from '@electron-forge/test-utils'; -import { afterEach, beforeAll, describe, expect, it } from 'vitest'; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { api } from '../../src/api/index'; @@ -165,11 +165,9 @@ describe('Make', () => { const testMakeTarget = function ( target: () => { name: string }, shouldPass: boolean, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...options: any[] ) { - describe(`${target().name}`, async () => { - beforeAll(async () => { + describe(`${path.basename(target().name)}`, async () => { + beforeEach(async () => { const original = await updatePackageJSON(dir, async (packageJSON) => { return { ...packageJSON, @@ -182,39 +180,38 @@ describe('Make', () => { }); return async () => { - await updatePackageJSON(dir, original); + await updatePackageJSON(dir, (_packageJSON) => { + return original; + }); }; }); - for (const optionsFetcher of options) { - if (shouldPass) { - it(`makes for config: ${JSON.stringify(optionsFetcher())}`, async () => { - const outputs = await api.make(optionsFetcher()); - for (const outputResult of outputs) { - for (const output of outputResult.artifacts) { - expect(fs.existsSync(output)).toEqual(true); - expect( - output.startsWith(path.resolve(outDir, 'make')), - ).toEqual(true); - } + if (shouldPass) { + it(`makes`, async () => { + const outputs = await api.make({ dir, outDir, skipPackage: true }); + for (const outputResult of outputs) { + for (const output of outputResult.artifacts) { + expect(fs.existsSync(output)).toEqual(true); + expect(output).toContain(path.resolve(outDir, 'make')); } - }); - } else { - it(`fails for config: ${JSON.stringify(optionsFetcher())}`, async () => { - await expect(api.make(optionsFetcher())).rejects.toThrow(); - }); - } + } + }); + } else { + it(`fails`, async () => { + await expect( + api.make({ dir, outDir, skipPackage: true }), + ).rejects.toThrow(); + }); } }); }; - const targetOptionFetcher = () => ({ dir, outDir, skipPackage: true }); for (const maker of goodMakers) { - testMakeTarget(maker, true, targetOptionFetcher); + testMakeTarget(maker, true); } for (const maker of badMakers) { - testMakeTarget(maker, false, targetOptionFetcher); + testMakeTarget(maker, false); } }); }); From be600c6cf73cfee5cdf958cb853b8bb7595c39ab Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Tue, 9 Dec 2025 23:32:54 -0800 Subject: [PATCH 09/17] kk --- packages/api/core/spec/fixture/default-app/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index 1ed9cee573..94b8ff2a91 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -39,5 +39,8 @@ "@electron-forge/shared-types": "file:../../../../../utils/types", "@electron/fuses": "file:../../../../../../node_modules/@electron/fuses", "electron": "file:../../../../../../node_modules/electron" + }, + "config": { + "forge": "./forge.config.js" } } From ba871c67850e3bd776f7a2c002834b4d1e59da2c Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 09:36:22 -0800 Subject: [PATCH 10/17] switch a few things around --- packages/api/core/spec/slow/make.slow.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 82fabd343a..54ef39496b 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -7,7 +7,7 @@ import { ensureTestDirIsNonexistent, updatePackageJSON, } from '@electron-forge/test-utils'; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest'; +import { afterEach, beforeAll, describe, expect, it } from 'vitest'; import { api } from '../../src/api/index'; @@ -112,7 +112,7 @@ describe('Make', () => { }, ); - describe('targets', () => { + describe('with Makers', () => { if (process.platform !== 'win32') { process.env.DISABLE_SQUIRREL_TEST = 'true'; } @@ -167,7 +167,7 @@ describe('Make', () => { shouldPass: boolean, ) { describe(`${path.basename(target().name)}`, async () => { - beforeEach(async () => { + beforeAll(async () => { const original = await updatePackageJSON(dir, async (packageJSON) => { return { ...packageJSON, @@ -187,7 +187,7 @@ describe('Make', () => { }); if (shouldPass) { - it(`makes`, async () => { + it(`makes the correct artifact`, async () => { const outputs = await api.make({ dir, outDir, skipPackage: true }); for (const outputResult of outputs) { for (const output of outputResult.artifacts) { From 136a9ec105113a7fbe665f46af916c0c5aa9c55b Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 10:12:26 -0800 Subject: [PATCH 11/17] ??? --- packages/api/core/spec/fixture/default-app/package.json | 2 +- packages/api/core/spec/slow/make.slow.spec.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index 94b8ff2a91..ec58b169f9 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -1,6 +1,6 @@ { "name": "default-app", - "productName": "Test-App", + "productName": "default-app", "version": "1.0.0", "description": "Test Electron application for Forge API tests", "main": "src/index.js", diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 54ef39496b..34663e6194 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -173,6 +173,9 @@ describe('Make', () => { ...packageJSON, config: { forge: { + packagerConfig: { + executableName: 'default-app', + }, makers: [target() as IForgeResolvableMaker], }, }, From 3fbe9f02e00b7fd06ce5d85f419d42e2f8eefccb Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 10:15:40 -0800 Subject: [PATCH 12/17] bump up test timeouts --- vitest.config.mts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.config.mts b/vitest.config.mts index 9e1fa0116f..b18abb5811 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -20,8 +20,8 @@ export default defineConfig({ test: { include: ['**/spec/**/*.slow.spec.ts'], name: 'slow', - hookTimeout: 160000, - testTimeout: 160000, + hookTimeout: 240000, + testTimeout: 240000, }, }, ], From 8a1135e0027ca2cf9f8a581c66fa2a9676b898e6 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 10:32:25 -0800 Subject: [PATCH 13/17] zzz --- packages/api/core/spec/slow/make.slow.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 34663e6194..73827d0deb 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -40,14 +40,14 @@ describe('Make', () => { it('makes from a custom outDir without errors', async () => { await api.make({ dir, skipPackage: true, outDir }); - // out/make/zip/darwin/arm64/Test-App-darwin-arm64-1.0.0.zip + // out/make/zip/darwin/arm64/default-app-darwin-arm64-1.0.0.zip const artifactPath = path.join( outDir, 'make', 'zip', process.platform, process.arch, - `Test-App-${process.platform}-${process.arch}-1.0.0.zip`, + `default-app-${process.platform}-${process.arch}-1.0.0.zip`, ); expect(fs.existsSync(artifactPath)).toBe(true); From 215241ea269d469726aee88d8849b9b7230a91e2 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 10:35:08 -0800 Subject: [PATCH 14/17] add misisng code oops --- packages/api/core/spec/slow/make.slow.spec.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 73827d0deb..7594fb6795 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -23,8 +23,12 @@ describe('Make', () => { await api.package({ dir, outDir }); if (process.platform === 'win32') { + await fs.promises.copyFile( + path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), + path.join(outDir, 'default.pvk'), + ); devCert = await createDefaultCertificate('CN=Test Author', { - certFilePath: dir, + certFilePath: outDir, }); } From fed3f84c2cb9a0b569002cec262e6638d37e151f Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 10:59:40 -0800 Subject: [PATCH 15/17] zzz --- packages/api/core/spec/slow/package.slow.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/api/core/spec/slow/package.slow.spec.ts b/packages/api/core/spec/slow/package.slow.spec.ts index d18887d081..14f9843a2e 100644 --- a/packages/api/core/spec/slow/package.slow.spec.ts +++ b/packages/api/core/spec/slow/package.slow.spec.ts @@ -33,7 +33,10 @@ describe('Package', () => { // should remove Forge config from packaged app's package.json const cleanPackageJSON = await readMetadata({ - src: path.resolve(outDir, `Test-App-${process.platform}-${process.arch}`), + src: path.resolve( + outDir, + `default-app-${process.platform}-${process.arch}`, + ), logger: console.error, }); expect(cleanPackageJSON).not.toHaveProperty('config.forge'); From f187815e6f445de5f20c0688d12d360fe6ceffe5 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 11:21:37 -0800 Subject: [PATCH 16/17] minimize fixture --- package.json | 1 - .../spec/fixture/default-app/package.json | 8 ++---- .../spec/fixture/default-app/src/index.css | 8 ------ .../spec/fixture/default-app/src/index.html | 12 --------- .../spec/fixture/default-app/src/index.js | 26 ++----------------- .../spec/fixture/default-app/src/preload.js | 2 -- yarn.lock | 10 ------- 7 files changed, 4 insertions(+), 63 deletions(-) delete mode 100644 packages/api/core/spec/fixture/default-app/src/index.css delete mode 100644 packages/api/core/spec/fixture/default-app/src/index.html delete mode 100644 packages/api/core/spec/fixture/default-app/src/preload.js diff --git a/package.json b/package.json index 80ec794149..2a45ee8288 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,6 @@ "@yarnpkg/types": "^4.0.1", "electron": "^39.2.6", "electron-installer-common": "^0.10.2", - "electron-squirrel-startup": "^1.0.1", "eslint": "^8.56.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/default-app/package.json index ec58b169f9..a854e0f908 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/default-app/package.json @@ -7,16 +7,12 @@ "scripts": { "start": "electron-forge start", "package": "electron-forge package", - "make": "electron-forge make", - "lint": "echo \"No linting configured\"" + "make": "electron-forge make" }, "keywords": [], "author": "Test Author", "license": "MIT", - "homepage": "http://www.example.com/", - "dependencies": { - "electron-squirrel-startup": "file:../../../../../../node_modules/electron-squirrel-startup" - }, + "homepage": "http://www.electronjs.org/", "devDependencies": { "@electron-forge/cli": "file:../../../../../api/cli", "@electron-forge/core": "file:../../../../../api/core", diff --git a/packages/api/core/spec/fixture/default-app/src/index.css b/packages/api/core/spec/fixture/default-app/src/index.css deleted file mode 100644 index 3a16b1c779..0000000000 --- a/packages/api/core/spec/fixture/default-app/src/index.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - font-family: - -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, - sans-serif; - margin: auto; - max-width: 38rem; - padding: 2rem; -} diff --git a/packages/api/core/spec/fixture/default-app/src/index.html b/packages/api/core/spec/fixture/default-app/src/index.html deleted file mode 100644 index f197f06546..0000000000 --- a/packages/api/core/spec/fixture/default-app/src/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Hello World! - - - -

Hello World!

-

Welcome to your Electron application.

- - diff --git a/packages/api/core/spec/fixture/default-app/src/index.js b/packages/api/core/spec/fixture/default-app/src/index.js index 146cf18e16..bac729e29d 100644 --- a/packages/api/core/spec/fixture/default-app/src/index.js +++ b/packages/api/core/spec/fixture/default-app/src/index.js @@ -1,34 +1,15 @@ -const path = require('node:path'); - const { app, BrowserWindow } = require('electron'); -// Handle creating/removing shortcuts on Windows when installing/uninstalling. -if (require('electron-squirrel-startup')) { - app.quit(); -} - const createWindow = () => { - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 800, - height: 600, - webPreferences: { - preload: path.join(__dirname, 'preload.js'), - }, - }); + const mainWindow = new BrowserWindow(); // and load the index.html of the app. - mainWindow.loadFile(path.join(__dirname, 'index.html')); + mainWindow.loadURL('https://electronjs.org'); }; -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. app.whenReady().then(() => { createWindow(); - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); @@ -36,9 +17,6 @@ app.whenReady().then(() => { }); }); -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); diff --git a/packages/api/core/spec/fixture/default-app/src/preload.js b/packages/api/core/spec/fixture/default-app/src/preload.js deleted file mode 100644 index 5e9d369cc9..0000000000 --- a/packages/api/core/spec/fixture/default-app/src/preload.js +++ /dev/null @@ -1,2 +0,0 @@ -// See the Electron documentation for details on how to use preload scripts: -// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/yarn.lock b/yarn.lock index 047d8248f2..b9215b7c5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8145,7 +8145,6 @@ __metadata: electron-installer-dmg: "npm:^5.0.1" electron-installer-redhat: "npm:^3.2.0" electron-installer-snap: "npm:^5.2.0" - electron-squirrel-startup: "npm:^1.0.1" electron-windows-msix: "npm:^2.0.4" electron-windows-store: "npm:^2.1.0" electron-winstaller: "npm:^5.3.0" @@ -8326,15 +8325,6 @@ __metadata: languageName: node linkType: hard -"electron-squirrel-startup@npm:^1.0.1": - version: 1.0.1 - resolution: "electron-squirrel-startup@npm:1.0.1" - dependencies: - debug: "npm:^2.2.0" - checksum: 10c0/eaff42844702321237b23f68ae2bff2eae17cb1251189e9a5397d94d1598a607e3cbedc60e130a0641798739019db44c37b2a8801e7a60f9261810bb8d07e9bf - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.4": version: 1.5.25 resolution: "electron-to-chromium@npm:1.5.25" From 7f534298f2e1936ac0cb35e5898e1695321bc60c Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Wed, 10 Dec 2025 11:23:29 -0800 Subject: [PATCH 17/17] cleanup! --- .eslintignore | 2 +- .../{default-app => api-tester}/forge.config.js | 0 .../fixture/{default-app => api-tester}/package.json | 4 ++-- .../fixture/{default-app => api-tester}/src/index.js | 0 packages/api/core/spec/slow/make.slow.spec.ts | 8 ++++---- packages/api/core/spec/slow/package.slow.spec.ts | 10 ++-------- 6 files changed, 9 insertions(+), 15 deletions(-) rename packages/api/core/spec/fixture/{default-app => api-tester}/forge.config.js (100%) rename packages/api/core/spec/fixture/{default-app => api-tester}/package.json (97%) rename packages/api/core/spec/fixture/{default-app => api-tester}/src/index.js (100%) diff --git a/.eslintignore b/.eslintignore index ee00edba5a..ac8c1e5dca 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,4 +7,4 @@ packages/*/*/index.ts packages/**/bad.js tmpl packages/api/core/helper/dynamic-import.js -packages/api/core/spec/fixture/default-app/ +packages/api/core/spec/fixture/api-tester/ diff --git a/packages/api/core/spec/fixture/default-app/forge.config.js b/packages/api/core/spec/fixture/api-tester/forge.config.js similarity index 100% rename from packages/api/core/spec/fixture/default-app/forge.config.js rename to packages/api/core/spec/fixture/api-tester/forge.config.js diff --git a/packages/api/core/spec/fixture/default-app/package.json b/packages/api/core/spec/fixture/api-tester/package.json similarity index 97% rename from packages/api/core/spec/fixture/default-app/package.json rename to packages/api/core/spec/fixture/api-tester/package.json index a854e0f908..e5a871d55f 100644 --- a/packages/api/core/spec/fixture/default-app/package.json +++ b/packages/api/core/spec/fixture/api-tester/package.json @@ -1,6 +1,6 @@ { - "name": "default-app", - "productName": "default-app", + "name": "api-tester", + "productName": "api-tester", "version": "1.0.0", "description": "Test Electron application for Forge API tests", "main": "src/index.js", diff --git a/packages/api/core/spec/fixture/default-app/src/index.js b/packages/api/core/spec/fixture/api-tester/src/index.js similarity index 100% rename from packages/api/core/spec/fixture/default-app/src/index.js rename to packages/api/core/spec/fixture/api-tester/src/index.js diff --git a/packages/api/core/spec/slow/make.slow.spec.ts b/packages/api/core/spec/slow/make.slow.spec.ts index 7594fb6795..5b24f077ac 100644 --- a/packages/api/core/spec/slow/make.slow.spec.ts +++ b/packages/api/core/spec/slow/make.slow.spec.ts @@ -12,7 +12,7 @@ import { afterEach, beforeAll, describe, expect, it } from 'vitest'; import { api } from '../../src/api/index'; describe('Make', () => { - const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); + const dir = path.resolve(__dirname, '..', 'fixture', 'api-tester'); let outDir: string; let makeDir: string; let devCert: string; @@ -44,14 +44,14 @@ describe('Make', () => { it('makes from a custom outDir without errors', async () => { await api.make({ dir, skipPackage: true, outDir }); - // out/make/zip/darwin/arm64/default-app-darwin-arm64-1.0.0.zip + // out/make/zip/darwin/arm64/api-tester-darwin-arm64-1.0.0.zip const artifactPath = path.join( outDir, 'make', 'zip', process.platform, process.arch, - `default-app-${process.platform}-${process.arch}-1.0.0.zip`, + `api-tester-${process.platform}-${process.arch}-1.0.0.zip`, ); expect(fs.existsSync(artifactPath)).toBe(true); @@ -178,7 +178,7 @@ describe('Make', () => { config: { forge: { packagerConfig: { - executableName: 'default-app', + executableName: 'api-tester', }, makers: [target() as IForgeResolvableMaker], }, diff --git a/packages/api/core/spec/slow/package.slow.spec.ts b/packages/api/core/spec/slow/package.slow.spec.ts index 14f9843a2e..48b7bfbe8b 100644 --- a/packages/api/core/spec/slow/package.slow.spec.ts +++ b/packages/api/core/spec/slow/package.slow.spec.ts @@ -12,6 +12,7 @@ import { api } from '../../src/api/index'; import { readRawPackageJson } from '../../src/util/read-package-json'; describe('Package', () => { + const dir = path.resolve(__dirname, '..', 'fixture', 'api-tester'); let outDir: string; beforeEach(async () => { outDir = await ensureTestDirIsNonexistent(); @@ -22,8 +23,6 @@ describe('Package', () => { }); it('can package an Electron app', async () => { - const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); - expect(fs.existsSync(outDir)).toEqual(false); await api.package({ dir, outDir }); @@ -35,7 +34,7 @@ describe('Package', () => { const cleanPackageJSON = await readMetadata({ src: path.resolve( outDir, - `default-app-${process.platform}-${process.arch}`, + `api-tester-${process.platform}-${process.arch}`, ), logger: console.error, }); @@ -47,8 +46,6 @@ describe('Package', () => { }); describe('with packagerConfig.all', () => { - const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); - beforeAll(async () => { const original = await updatePackageJSON(dir, async (packageJSON) => { packageJSON.config = { @@ -69,7 +66,6 @@ describe('Package', () => { }); it('throws an error when packagerConfig.all is set', async () => { - const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); await expect(api.package({ dir })).rejects.toThrow( /packagerConfig\.all is not supported by Electron Forge/, ); @@ -77,8 +73,6 @@ describe('Package', () => { }); describe('with prebuilt native module dependencies', () => { - const dir = path.resolve(__dirname, '..', 'fixture', 'default-app'); - beforeAll(async () => { const original = await updatePackageJSON(dir, async (packageJSON) => { // add ref-napi from root workspace