diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..6313b56c57 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..7639191417 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @electron/wg-ecosystem diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71f87fde40..e322c9ce31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,7 @@ on: tags: - v[0-9]+.[0-9]+.[0-9]+* pull_request: + merge_group: jobs: fast-tests: @@ -23,13 +24,10 @@ jobs: with: node-version: 14.x cache: yarn - - name: Install latest NPM on Windows + - name: Install npm 8 on Windows if: matrix.os == 'windows-latest' - # See https://github.com/actions/virtual-environments/issues/4856#issuecomment-1043256330 - # and https://github.com/actions/setup-node/issues/411#issuecomment-1051084491 run: | - npm install -g npm@8.3.1 - npm install -g npm@latest + npm install -g npm@8 - name: Install run: yarn install - name: Lint @@ -54,6 +52,7 @@ jobs: if: matrix.os == 'windows-latest' shell: bash run: | + npm install -g npm@8 echo 'C:\Program Files (x86)\WiX Toolset v3.11\bin' >> $GITHUB_PATH npm config set node-gyp "$GITHUB_WORKSPACE\node_modules\node-gyp\bin\node-gyp.js" - name: Linux specific setup @@ -72,10 +71,10 @@ jobs: node-version: 14.x cache: yarn - name: Install - run: yarn install + run: yarn install --frozen-lockfile - name: Build run: yarn build - name: Test - run: yarn test + run: yarn test:slow env: DEBUG: electron-installer-snap:snapcraft diff --git a/.github/workflows/semantic.yml b/.github/workflows/semantic.yml new file mode 100644 index 0000000000..c00f797d3d --- /dev/null +++ b/.github/workflows/semantic.yml @@ -0,0 +1,26 @@ +name: 'Check Semantic Commit' + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +permissions: + contents: read + +jobs: + main: + permissions: + pull-requests: read # for amannn/action-semantic-pull-request to analyze PRs + statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR + name: Validate PR Title + runs-on: ubuntu-latest + steps: + - name: semantic-pull-request + uses: amannn/action-semantic-pull-request@01d5fd8a8ebb9aafe902c40c53f0f4744f7381eb # tag: v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + validateSingleCommit: false diff --git a/.gitignore b/.gitignore index 0787b4801c..29705ec8e8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ dist docs doc node_modules +lerna-debug.log yarn-error.log packages/**/.npmignore packages/**/tsconfig.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 09c30b9fd7..ebd99742f0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -125,23 +125,38 @@ Here are some things to keep in mind as you file pull requests to fix bugs, add - If you are continuing the work of another person's PR and need to rebase/squash, please retain the attribution of the original author(s) and continue the work in subsequent commits. -### Release process - -- Make sure the tests pass with `yarn test` -- Run `git clean -fdx` - this will ensure unneeded build files (and potentially sensitive files) are not included in the npm package. -- Ensure that you are logged into npm via command line (`npm login`) -- Run `yarn lerna:publish`, which will run the `lerna publish` command with a necessary set of flags. - - The script will then ask you for your `npm` OTP password. - - The script will commit the changes automatically. Run `git log` to confirm that the changes have been - committed. -- The command will have published your packages to `npm`, and pushed an appropriate tag to github. -- After running the command, you should have a commit which: - - Updates the version field in the package.json file - - Updates the version fields in each of the submodule package.json files -- Push your commit upstream to the main/default branch. -- Create a new github release - - Go to releases tab - - Draft a new release and choose the appropriate tag - - Target default branch - - Generate release notes by copying in CHANGELOG.md contents into the release description or use - GitHub's [automatically generated release notes](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes) +## Release process + +This guide is for maintainers who have: + +- Push access to the `electron/forge` repository. +- Collaborator access to the `@electron-forge` packages on npm. + +### 1. Prepare your local code checkout + +- Switch to the tip of the `main` branch with `git switch main && git pull`. +- Run tests locally with `yarn test`. +- Check that the latest CI run passed on `main` on [GitHub](https://github.com/electron/forge/actions?query=workflow:CI). +- Remove all untracked files and directories from your checkout with `git clean -fdx`. +- Install dependencies with `yarn install`. + +### 2. Publish all npm packages + +- Log into npm with `npm login`. +- Run the `yarn lerna:publish` command. +- Enter your npm account's time-based one-time password (TOTP). + +The `lerna:publish` script will automatically increment the next package version based on the +[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard. From there, it does two things: + +1. It creates a tagged commit that bumps the version number in `package.json` at the root and package levels + and pushes the commit and tag to GitHub. +1. It publishes every `@electron-forge/` package to npm. + +### 3. Publish release to GitHub + +- Go to the repo's [New Release](https://github.com/electron/forge/releases/new) page. +- Select tag you just published. +- Target the `main` branch. +- [Automatically generated release notes](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes) + against the previous Forge release. diff --git a/lerna.json b/lerna.json index 25bbdd4add..b585cb83c0 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "6.0.4", + "version": "6.0.5", "npmClient": "yarn" } diff --git a/package.json b/package.json index c253264328..94a5a489af 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,13 @@ "docs": "yarn build && yarn docs:generate", "docs:generate": "yarn docs:plugin && node --max-old-space-size=8192 -r ts-node/register ./tools/gen-docs.ts", "docs:plugin": "cd ./tools/doc-plugin && yarn build", - "lerna:publish": "lerna publish --force-publish --conventional-commits --no-changelog", + "lerna:publish": "lerna publish --force-publish --conventional-commits --no-changelog --exact", "lint": "prettier --check . && eslint .", "lint:fix": "prettier --write .", "link:prepare": "lerna exec -- node ../../../tools/silent.js yarn link --link-folder ../../../.links --silent --no-bin-links", "test": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TS_NODE_FILES=1 mocha './tools/test-globber.ts'", "test:fast": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_FAST_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", + "test:slow": "xvfb-maybe cross-env LINK_FORGE_DEPENDENCIES_ON_INIT=1 TS_NODE_PROJECT='./tsconfig.test.json' TEST_SLOW_ONLY=1 TS_NODE_FILES=1 mocha './tools/test-globber.ts'", "postinstall": "rimraf node_modules/.bin/*.ps1 && ts-node ./tools/gen-tsconfigs.ts && ts-node ./tools/gen-ts-glue.ts", "prepare": "husky install", "preversion": "yarn build" @@ -78,6 +79,7 @@ "yarn-or-npm": "^3.0.1" }, "devDependencies": { + "@electron/fuses": ">=1.0.0", "@knodes/typedoc-plugin-monorepo-readmes": "0.22.5", "@malept/eslint-config": "^2.0.0", "@types/chai": "^4.2.12", @@ -151,6 +153,9 @@ "electron-wix-msi": "^5.0.0", "macos-alias": "^0.2.11" }, + "peerDependencies": { + "@electron/fuses": ">=1.0.0" + }, "lint-staged": { "*.{html,json,md,yml}": "prettier --write", "*.{js,ts}": [ diff --git a/packages/api/cli/package.json b/packages/api/cli/package.json index 6a45017afc..9ef86b9bba 100644 --- a/packages/api/cli/package.json +++ b/packages/api/cli/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/cli", - "version": "6.0.4", + "version": "6.0.5", "description": "A complete tool for building modern Electron applications", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -17,8 +17,8 @@ "mocha": "^9.0.1" }, "dependencies": { - "@electron-forge/core": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/core": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "@electron/get": "^2.0.0", "chalk": "^4.0.0", "commander": "^4.1.1", diff --git a/packages/api/core/package.json b/packages/api/core/package.json index b4f6e5e0b9..dccbebeddd 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/core", - "version": "6.0.4", + "version": "6.0.5", "description": "A complete tool for building modern Electron applications", "repository": "https://github.com/electron/forge", "main": "dist/api/index.js", @@ -15,16 +15,16 @@ "test:slow": "yarn test:base test/slow/**/*_spec_slow.ts" }, "devDependencies": { - "@electron-forge/maker-appx": "6.0.4", - "@electron-forge/maker-deb": "6.0.4", - "@electron-forge/maker-dmg": "6.0.4", - "@electron-forge/maker-flatpak": "6.0.4", - "@electron-forge/maker-rpm": "6.0.4", - "@electron-forge/maker-snap": "6.0.4", - "@electron-forge/maker-squirrel": "6.0.4", - "@electron-forge/maker-wix": "6.0.4", - "@electron-forge/maker-zip": "6.0.4", - "@electron-forge/test-utils": "6.0.4", + "@electron-forge/maker-appx": "6.0.5", + "@electron-forge/maker-deb": "6.0.5", + "@electron-forge/maker-dmg": "6.0.5", + "@electron-forge/maker-flatpak": "6.0.5", + "@electron-forge/maker-rpm": "6.0.5", + "@electron-forge/maker-snap": "6.0.5", + "@electron-forge/maker-squirrel": "6.0.5", + "@electron-forge/maker-wix": "6.0.5", + "@electron-forge/maker-zip": "6.0.5", + "@electron-forge/test-utils": "6.0.5", "@types/interpret": "^1.1.1", "@types/progress": "^2.0.5", "@types/rechoir": "^0.6.1", @@ -40,14 +40,14 @@ "yaml-hook": "^1.0.0" }, "dependencies": { - "@electron-forge/core-utils": "6.0.4", - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/publisher-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/template-base": "6.0.4", - "@electron-forge/template-webpack": "6.0.4", - "@electron-forge/template-webpack-typescript": "6.0.4", + "@electron-forge/core-utils": "6.0.5", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/publisher-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/template-base": "6.0.5", + "@electron-forge/template-webpack": "6.0.5", + "@electron-forge/template-webpack-typescript": "6.0.5", "@electron/get": "^2.0.0", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", diff --git a/packages/api/core/src/api/import.ts b/packages/api/core/src/api/import.ts index d1db4e98b3..70bce074eb 100644 --- a/packages/api/core/src/api/import.ts +++ b/packages/api/core/src/api/import.ts @@ -66,7 +66,7 @@ export default async ({ collapseErrors: false, }, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), }; const runner = new Listr( diff --git a/packages/api/core/src/api/init.ts b/packages/api/core/src/api/init.ts index 2a44df4b9e..8e913ef9c2 100644 --- a/packages/api/core/src/api/init.ts +++ b/packages/api/core/src/api/init.ts @@ -137,7 +137,7 @@ export default async ({ dir = process.cwd(), interactive = false, copyCIFiles = { concurrent: false, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), } ); diff --git a/packages/api/core/src/api/make.ts b/packages/api/core/src/api/make.ts index f8415f1ee9..6a2844d473 100644 --- a/packages/api/core/src/api/make.ts +++ b/packages/api/core/src/api/make.ts @@ -106,7 +106,7 @@ export const listrMake = ( collapseErrors: false, }, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), }; const runner = new Listr( diff --git a/packages/api/core/src/api/package.ts b/packages/api/core/src/api/package.ts index 6b704a3e7a..b58e34f2b3 100644 --- a/packages/api/core/src/api/package.ts +++ b/packages/api/core/src/api/package.ts @@ -165,11 +165,6 @@ export const listrPackage = ({ task.output = 'Determining targets...'; - let provideTargets: (targets: TargetDefinition[]) => void; - const targetsPromise = new Promise((resolve) => { - provideTargets = resolve; - }); - type StepDoneSignalMap = Map void)[]>; const signalCopyDone: StepDoneSignalMap = new Map(); const signalRebuildDone: StepDoneSignalMap = new Map(); @@ -186,6 +181,12 @@ export const listrPackage = ({ }); }; + let provideTargets: (targets: TargetDefinition[]) => void; + const targetsPromise = new Promise((resolve, reject) => { + provideTargets = resolve; + rejects.push(reject); + }); + const rebuildTasks = new Map>[]>(); const signalRebuildStart = new Map) => void)[]>(); @@ -309,7 +310,9 @@ export const listrPackage = ({ // rejects is populated by the reject handlers for every // signal based promise in every subtask ctx.packagerPromise.catch((err) => { - for (const reject of rejects) reject(err); + for (const reject of rejects) { + reject(err); + } }); const targets = await targetsPromise; @@ -430,7 +433,7 @@ export const listrPackage = ({ { concurrent: false, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), rendererOptions: { collapse: false, collapseErrors: false, diff --git a/packages/api/core/src/api/publish.ts b/packages/api/core/src/api/publish.ts index 6ffda99c0c..ca1e6d57eb 100644 --- a/packages/api/core/src/api/publish.ts +++ b/packages/api/core/src/api/publish.ts @@ -85,7 +85,7 @@ const publish = async ({ collapseErrors: false, }, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), }; const publishDistributablesTasks = [ diff --git a/packages/api/core/src/api/start.ts b/packages/api/core/src/api/start.ts index 6c5482e8b5..673ffc5e9e 100644 --- a/packages/api/core/src/api/start.ts +++ b/packages/api/core/src/api/start.ts @@ -41,7 +41,7 @@ export default async ({ collapseErrors: false, }, rendererSilent: !interactive, - rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), + rendererFallback: Boolean(process.env.DEBUG), }; const runner = new Listr( diff --git a/packages/api/core/src/util/plugin-interface.ts b/packages/api/core/src/util/plugin-interface.ts index edd9bfeabe..cfb75532d8 100644 --- a/packages/api/core/src/util/plugin-interface.ts +++ b/packages/api/core/src/util/plugin-interface.ts @@ -98,7 +98,7 @@ export default class PluginInterface implements IForgePluginInterface { task: async (_, task) => { if ((hook as any).__hookName) { // Also give it the task - await (hook as any).call(task, ...(hookArgs as any[])); + await (hook as any).call(task, this.config, ...(hookArgs as any[])); } else { await hook(this.config, ...hookArgs); } diff --git a/packages/external/create-electron-app/package.json b/packages/external/create-electron-app/package.json index 0cbe8eb374..a0e9c34239 100644 --- a/packages/external/create-electron-app/package.json +++ b/packages/external/create-electron-app/package.json @@ -1,13 +1,13 @@ { "name": "create-electron-app", - "version": "6.0.4", + "version": "6.0.5", "description": "Create Electron App", "main": "dist/index.js", "typings": "dist/index.d.ts", "author": "Samuel Attard", "license": "MIT", "dependencies": { - "@electron-forge/cli": "6.0.4" + "@electron-forge/cli": "6.0.5" }, "bin": { "create-electron-app": "dist/index.js" diff --git a/packages/maker/appx/package.json b/packages/maker/appx/package.json index bbf1aa6ce1..49f15ab04f 100644 --- a/packages/maker/appx/package.json +++ b/packages/maker/appx/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-appx", - "version": "6.0.4", + "version": "6.0.5", "description": "AppX maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "cross-spawn": "^7.0.3", "fs-extra": "^10.0.0", "parse-author": "^2.0.0" diff --git a/packages/maker/base/package.json b/packages/maker/base/package.json index 51b43b87e5..660e9b280c 100644 --- a/packages/maker/base/package.json +++ b/packages/maker/base/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-base", - "version": "6.0.4", + "version": "6.0.5", "description": "Base maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -16,7 +16,7 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0", "which": "^2.0.2" }, diff --git a/packages/maker/deb/package.json b/packages/maker/deb/package.json index 498570cdfe..b2402a95b8 100644 --- a/packages/maker/deb/package.json +++ b/packages/maker/deb/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-deb", - "version": "6.0.4", + "version": "6.0.5", "description": "Deb maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -18,8 +18,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" }, "optionalDependencies": { "electron-installer-debian": "^3.0.0" diff --git a/packages/maker/dmg/package.json b/packages/maker/dmg/package.json index f2cd4437ba..cd7503c08c 100644 --- a/packages/maker/dmg/package.json +++ b/packages/maker/dmg/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-dmg", - "version": "6.0.4", + "version": "6.0.5", "description": "DMG maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -22,8 +22,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0" }, "optionalDependencies": { diff --git a/packages/maker/flatpak/package.json b/packages/maker/flatpak/package.json index 7247d5b2b0..76e7b99bc5 100644 --- a/packages/maker/flatpak/package.json +++ b/packages/maker/flatpak/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-flatpak", - "version": "6.0.4", + "version": "6.0.5", "description": "Flatpak maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -22,8 +22,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0" }, "optionalDependencies": { diff --git a/packages/maker/pkg/package.json b/packages/maker/pkg/package.json index ccb94b0bb3..5874ac7475 100644 --- a/packages/maker/pkg/package.json +++ b/packages/maker/pkg/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-pkg", - "version": "6.0.4", + "version": "6.0.5", "description": "PKG maker for Electron Forge", "repository": "https://github.com/electron/forge", "license": "MIT", @@ -17,8 +17,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "@electron/osx-sign": "^1.0.1" }, "publishConfig": { diff --git a/packages/maker/rpm/package.json b/packages/maker/rpm/package.json index 7696342d29..9006f97f39 100644 --- a/packages/maker/rpm/package.json +++ b/packages/maker/rpm/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-rpm", - "version": "6.0.4", + "version": "6.0.5", "description": "Rpm maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -22,8 +22,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" }, "optionalDependencies": { "electron-installer-redhat": "^3.2.0" diff --git a/packages/maker/rpm/src/MakerRpm.ts b/packages/maker/rpm/src/MakerRpm.ts index c5d9328bac..47bb2f4774 100644 --- a/packages/maker/rpm/src/MakerRpm.ts +++ b/packages/maker/rpm/src/MakerRpm.ts @@ -5,12 +5,18 @@ import { ForgeArch, ForgePlatform } from '@electron-forge/shared-types'; import { MakerRpmConfig } from './Config'; +function renameRpm(dest: string, _src: string): string { + return path.join(dest, '<%= name %>-<%= version %>-<%= revision %>.<%= arch === "aarch64" ? "arm64" : arch %>.rpm'); +} + export function rpmArch(nodeArch: ForgeArch): string { switch (nodeArch) { case 'ia32': return 'i386'; case 'x64': return 'x86_64'; + case 'arm64': + return 'aarch64'; case 'armv7l': return 'armv7hl'; case 'arm': @@ -43,7 +49,7 @@ export default class MakerRpm extends MakerBase { arch: rpmArch(targetArch), src: dir, dest: outDir, - rename: undefined, + rename: renameRpm, }); return packagePaths; } diff --git a/packages/maker/rpm/test/MakerRpm_spec.ts b/packages/maker/rpm/test/MakerRpm_spec.ts index 3c237a6c6c..d2998ececb 100644 --- a/packages/maker/rpm/test/MakerRpm_spec.ts +++ b/packages/maker/rpm/test/MakerRpm_spec.ts @@ -56,11 +56,11 @@ describe('MakerRpm', () => { packageJSON, }); const opts = eirStub.firstCall.args[0]; + delete opts.rename; expect(opts).to.deep.equal({ arch: rpmArch(process.arch as ForgeArch), src: dir, dest: path.join(makeDir, 'rpm', process.arch), - rename: undefined, }); }); @@ -81,6 +81,7 @@ describe('MakerRpm', () => { packageJSON, }); const opts = eirStub.firstCall.args[0]; + delete opts.rename; expect(opts).to.deep.equal({ arch: rpmArch(process.arch as ForgeArch), options: { @@ -88,7 +89,6 @@ describe('MakerRpm', () => { }, src: dir, dest: path.join(makeDir, 'rpm', process.arch), - rename: undefined, }); }); @@ -101,6 +101,10 @@ describe('MakerRpm', () => { expect(rpmArch('x64')).to.equal('x86_64'); }); + it('should convert arm64 to aarch64', () => { + expect(rpmArch('arm64')).to.equal('aarch64'); + }); + it('should convert arm to armv6hl', () => { expect(rpmArch('arm')).to.equal('armv6hl'); }); diff --git a/packages/maker/snap/package.json b/packages/maker/snap/package.json index f5664e356e..0fb0062ac5 100644 --- a/packages/maker/snap/package.json +++ b/packages/maker/snap/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-snap", - "version": "6.0.4", + "version": "6.0.5", "description": "Snap maker for Electron Forge", "repository": "https://github.com/electron/forge", "license": "MIT", @@ -21,8 +21,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" }, "optionalDependencies": { "electron-installer-snap": "^5.1.0" diff --git a/packages/maker/squirrel/package.json b/packages/maker/squirrel/package.json index f7fb1f05e8..982fbdbc74 100644 --- a/packages/maker/squirrel/package.json +++ b/packages/maker/squirrel/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-squirrel", - "version": "6.0.4", + "version": "6.0.5", "description": "Squirrel maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0" }, "optionalDependencies": { diff --git a/packages/maker/wix/package.json b/packages/maker/wix/package.json index 3693a74fd9..80c5a724d6 100644 --- a/packages/maker/wix/package.json +++ b/packages/maker/wix/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-wix", - "version": "6.0.4", + "version": "6.0.5", "description": "Wix maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "chalk": "^4.0.0", "electron-wix-msi": "^5.0.0", "log-symbols": "^4.0.0", diff --git a/packages/maker/zip/package.json b/packages/maker/zip/package.json index 00ce10179d..7f1b526507 100644 --- a/packages/maker/zip/package.json +++ b/packages/maker/zip/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/maker-zip", - "version": "6.0.4", + "version": "6.0.5", "description": "ZIP maker for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/maker-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/maker-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "cross-zip": "^4.0.0", "fs-extra": "^10.0.0" }, diff --git a/packages/plugin/auto-unpack-natives/package.json b/packages/plugin/auto-unpack-natives/package.json index be6439d1c8..32a4c2a2eb 100644 --- a/packages/plugin/auto-unpack-natives/package.json +++ b/packages/plugin/auto-unpack-natives/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-auto-unpack-natives", - "version": "6.0.4", + "version": "6.0.5", "description": "Auto Unpack Natives plugin for Electron Forge, automatically adds native node modules to asar.unpacked", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -11,8 +11,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" }, "publishConfig": { "access": "public" diff --git a/packages/plugin/base/package.json b/packages/plugin/base/package.json index f2d9d5eb59..ef4524e179 100644 --- a/packages/plugin/base/package.json +++ b/packages/plugin/base/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-base", - "version": "6.0.4", + "version": "6.0.5", "description": "Base plugin for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,7 +15,7 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/shared-types": "6.0.5" }, "publishConfig": { "access": "public" diff --git a/packages/plugin/compile/package.json b/packages/plugin/compile/package.json index c80ed2b90f..5fd2d68125 100644 --- a/packages/plugin/compile/package.json +++ b/packages/plugin/compile/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-compile", - "version": "6.0.4", + "version": "6.0.5", "description": "Electron Compile plugin for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0" }, "publishConfig": { diff --git a/packages/plugin/electronegativity/package.json b/packages/plugin/electronegativity/package.json index baf4989320..16e7f2e4cb 100644 --- a/packages/plugin/electronegativity/package.json +++ b/packages/plugin/electronegativity/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-electronegativity", - "version": "6.0.4", + "version": "6.0.5", "description": "Integrate Electronegativity into the Electron Forge workflow", "repository": { "type": "git", @@ -16,8 +16,8 @@ }, "dependencies": { "@doyensec/electronegativity": "^1.9.1", - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" }, "publishConfig": { "access": "public" diff --git a/packages/plugin/fuses/README.md b/packages/plugin/fuses/README.md new file mode 100644 index 0000000000..3d93ab4d57 --- /dev/null +++ b/packages/plugin/fuses/README.md @@ -0,0 +1,34 @@ +@electron-forge/plugin-fuses +===== + +This plugin allows flipping [Electron Fuses](https://github.com/electron/fuses) when packaging your app with Electron Forge. + +## Usage + +Install `@electron-forge/plugin-fuses` and `@electron/fuses` as dev dependencies and add this plugin to the `plugins` array in your Forge configuration:: +```shell +# Yarn +yarn add --dev @electron-forge/plugin-fuses @electron/fuses + +# npm +npm i -D @electron-forge/plugin-fuses @electron/fuses +``` + +```js +// forge.config.js + +const { FusesPlugin } = require('@electron-forge/plugin-fuses'); +const { FuseV1Options, FuseVersion } = require('@electron/fuses'); + +const forgeConfig = { + plugins: [ + new FusesPlugin({ + version: FuseVersion.V1, + [FuseV1Options.RunAsNode]: false, + // ...any other options supported by @electron/fuses + }), + ], +}; + +module.exports = forgeConfig; +``` diff --git a/packages/plugin/fuses/package.json b/packages/plugin/fuses/package.json new file mode 100644 index 0000000000..6cdbf7c8bd --- /dev/null +++ b/packages/plugin/fuses/package.json @@ -0,0 +1,39 @@ +{ + "name": "@electron-forge/plugin-fuses", + "version": "6.0.5", + "description": "A plugin for flipping Electron Fuses in Electron Forge", + "repository": "https://github.com/electron/forge", + "author": "Erik Moura ", + "license": "MIT", + "main": "dist/FusesPlugin.js", + "files": [ + "dist", + "package.json", + "README.md" + ], + "typings": "dist/FusesPlugin.d.ts", + "scripts": { + "test": "xvfb-maybe mocha --config ../../../.mocharc.js test/**/*_spec*.ts" + }, + "devDependencies": { + "@electron/fuses": ">=1.0.0", + "@malept/cross-spawn-promise": "^2.0.0", + "chai": "^4.3.3", + "fs-extra": "^10.0.0", + "mocha": "^9.0.1", + "xvfb-maybe": "^0.2.1" + }, + "peerDependencies": { + "@electron/fuses": ">=1.0.0" + }, + "engines": { + "node": ">= 14.17.5" + }, + "dependencies": { + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/plugin/fuses/src/FusesPlugin.ts b/packages/plugin/fuses/src/FusesPlugin.ts new file mode 100644 index 0000000000..392ccdac80 --- /dev/null +++ b/packages/plugin/fuses/src/FusesPlugin.ts @@ -0,0 +1,45 @@ +import path from 'path'; + +import { namedHookWithTaskFn, PluginBase } from '@electron-forge/plugin-base'; +import { ForgeMultiHookMap } from '@electron-forge/shared-types'; +import { flipFuses, FuseConfig } from '@electron/fuses'; + +import { getElectronExecutablePath } from './util/getElectronExecutablePath'; + +export default class FusesPlugin extends PluginBase { + name = 'fuses'; + + fusesConfig = {} as FuseConfig; + + constructor(fusesConfig: FuseConfig) { + super(fusesConfig); + + this.fusesConfig = fusesConfig; + } + + getHooks(): ForgeMultiHookMap { + return { + packageAfterCopy: namedHookWithTaskFn<'packageAfterCopy'>(async (listrTask, resolvedForgeConfig, resourcesPath, electronVersion, platform, arch) => { + const { fusesConfig } = this; + + if (Object.keys(fusesConfig).length) { + const pathToElectronExecutable = getElectronExecutablePath({ + appName: ['darwin', 'mas'].includes(platform) ? 'Electron' : 'electron', + basePath: path.resolve(resourcesPath, '../..'), + platform, + }); + + const osxSignConfig = resolvedForgeConfig.packagerConfig.osxSign; + const hasOSXSignConfig = (typeof osxSignConfig === 'object' && Boolean(Object.keys(osxSignConfig).length)) || Boolean(osxSignConfig); + + await flipFuses(pathToElectronExecutable, { + resetAdHocDarwinSignature: !hasOSXSignConfig && platform === 'darwin' && arch === 'arm64', + ...this.fusesConfig, + }); + } + }, 'Flipping Fuses'), + }; + } +} + +export { FusesPlugin }; diff --git a/packages/plugin/fuses/src/util/getElectronExecutablePath.ts b/packages/plugin/fuses/src/util/getElectronExecutablePath.ts new file mode 100644 index 0000000000..003a542b85 --- /dev/null +++ b/packages/plugin/fuses/src/util/getElectronExecutablePath.ts @@ -0,0 +1,16 @@ +import path from 'path'; + +import { ForgePlatform } from '@electron-forge/shared-types'; + +type GetElectronExecutablePathParams = { + appName: string; + basePath: string; + platform: ForgePlatform; +}; + +export function getElectronExecutablePath({ appName, basePath, platform }: GetElectronExecutablePathParams): string { + return path.join( + basePath, + ['darwin', 'mas'].includes(platform) ? path.join('MacOS', appName) : [appName, process.platform === 'win32' ? '.exe' : ''].join('') + ); +} diff --git a/packages/plugin/fuses/test/FusesPlugin_spec_slow.ts b/packages/plugin/fuses/test/FusesPlugin_spec_slow.ts new file mode 100644 index 0000000000..713d91161f --- /dev/null +++ b/packages/plugin/fuses/test/FusesPlugin_spec_slow.ts @@ -0,0 +1,67 @@ +import fs from 'fs'; +import path from 'path'; + +import { CrossSpawnOptions, spawn } from '@malept/cross-spawn-promise'; +import { expect } from 'chai'; +import fsExtra from 'fs-extra'; + +import { getElectronExecutablePath } from '../src/util/getElectronExecutablePath'; + +describe('FusesPlugin', () => { + const appPath = path.join(__dirname, 'fixture', 'app'); + + const spawnOptions: CrossSpawnOptions = { + cwd: appPath, + shell: true, + }; + + const packageJSON = JSON.parse( + fs.readFileSync(path.join(appPath, 'package.json'), { + encoding: 'utf-8', + }) + ); + + const { name: appName } = packageJSON; + + // @TODO get rid of this once https://github.com/electron/forge/pull/3123 lands + const platformArchSuffix = `${process.platform}-x64`; + + const outDir = path.join(appPath, 'out', `${appName}-${platformArchSuffix}`); + + before(async () => { + delete process.env.TS_NODE_PROJECT; + await spawn('yarn', ['install'], spawnOptions); + }); + + after(async () => { + await fsExtra.remove(path.resolve(outDir, '../')); + + // @TODO this can be removed once the mock app installs a published version of @electron-forge/plugin-fuses instead of a local package + await fsExtra.remove(path.join(__dirname, './fixture/app/node_modules')); + }); + + it('should flip Fuses', async () => { + await spawn('yarn', ['package'], spawnOptions); + + const electronExecutablePath = getElectronExecutablePath({ + appName, + basePath: path.join(outDir, ...(process.platform === 'darwin' ? [`${appName}.app`, 'Contents'] : [])), + platform: process.platform, + }); + + /** + * If the `RunAsNode` fuse had not been flipped, + * this would return the Node.js version (e.g. `v14.16.0`) + * instead of the `console.log` from `main.js`. + */ + const output = ( + await spawn(electronExecutablePath, ['-v'], { + env: { + ELECTRON_RUN_AS_NODE: '1', + }, + }) + ).trim(); + + expect(output).to.equals('The Fuses plugin is working'); + }); +}); diff --git a/packages/plugin/fuses/test/fixture/app/forge.config.ts b/packages/plugin/fuses/test/fixture/app/forge.config.ts new file mode 100644 index 0000000000..cbdc03c5ef --- /dev/null +++ b/packages/plugin/fuses/test/fixture/app/forge.config.ts @@ -0,0 +1,31 @@ +import path from 'path'; + +import { FusesPlugin } from '@electron-forge/plugin-fuses'; +import { ForgeConfig } from '@electron-forge/shared-types'; +import { FuseV1Options, FuseVersion } from '@electron/fuses'; +import fsExtra from 'fs-extra'; + +const forgeConfig: ForgeConfig = { + packagerConfig: { + afterComplete: [ + // makes tests a bit simpler by having a single output directory in every platform/arch + async (packagedAppLocation, _electronVersion, _targetPlatform, _targetArch, done) => { + const parentDir = path.resolve(packagedAppLocation, '..'); + await fsExtra.move(packagedAppLocation, path.join(parentDir, 'fuses-test-app'), { + overwrite: true, + }); + + done(); + }, + ], + }, + + plugins: [ + new FusesPlugin({ + version: FuseVersion.V1, + [FuseV1Options.RunAsNode]: false, + }), + ], +}; + +export default forgeConfig; diff --git a/packages/plugin/fuses/test/fixture/app/package.json b/packages/plugin/fuses/test/fixture/app/package.json new file mode 100644 index 0000000000..bc29e4bae8 --- /dev/null +++ b/packages/plugin/fuses/test/fixture/app/package.json @@ -0,0 +1,18 @@ +{ + "name": "fuses-test-app", + "version": "1.0.0", + "main": "./src/main.js", + "scripts": { + "package": "electron-forge package" + }, + "dependencies": { + "@electron/fuses": "^1.6.1", + "fs-extra": "^10.0.0" + }, + "devDependencies": { + "@electron-forge/cli": "6.0.5", + "@electron-forge/plugin-fuses": "file:./../../../../fuses", + "@electron-forge/shared-types": "6.0.5", + "electron": "12.0.0" + } +} diff --git a/packages/plugin/fuses/test/fixture/app/src/main.js b/packages/plugin/fuses/test/fixture/app/src/main.js new file mode 100644 index 0000000000..3ef07df595 --- /dev/null +++ b/packages/plugin/fuses/test/fixture/app/src/main.js @@ -0,0 +1,5 @@ +const { app } = require('electron'); + +console.log('The Fuses plugin is working'); + +app.exit(0); diff --git a/packages/plugin/local-electron/package.json b/packages/plugin/local-electron/package.json index 69ec7abdf3..dda51aa90b 100644 --- a/packages/plugin/local-electron/package.json +++ b/packages/plugin/local-electron/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-local-electron", - "version": "6.0.4", + "version": "6.0.5", "description": "Local Electron plugin for Electron Forge, let's you use a local build of Electron", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -11,8 +11,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "fs-extra": "^10.0.0" }, "devDependencies": { diff --git a/packages/plugin/vite/package.json b/packages/plugin/vite/package.json index 22029d1b6a..7b8d294709 100644 --- a/packages/plugin/vite/package.json +++ b/packages/plugin/vite/package.json @@ -27,10 +27,10 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/core-utils": "6.0.4", - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/web-multi-logger": "6.0.4", + "@electron-forge/core-utils": "6.0.5", + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/web-multi-logger": "6.0.5", "chalk": "^4.0.0", "debug": "^4.3.1", "vite": "^4.1.1" diff --git a/packages/plugin/webpack/package.json b/packages/plugin/webpack/package.json index 26ae1d34dd..ab61516a23 100644 --- a/packages/plugin/webpack/package.json +++ b/packages/plugin/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/plugin-webpack", - "version": "6.0.4", + "version": "6.0.5", "description": "Webpack plugin for Electron Forge, lets you use Webpack directly in your tooling", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -24,10 +24,10 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/core-utils": "6.0.4", - "@electron-forge/plugin-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/web-multi-logger": "6.0.4", + "@electron-forge/core-utils": "6.0.5", + "@electron-forge/plugin-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/web-multi-logger": "6.0.5", "chalk": "^4.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", diff --git a/packages/publisher/base/package.json b/packages/publisher/base/package.json index 19e99fca3e..56e42003b3 100644 --- a/packages/publisher/base/package.json +++ b/packages/publisher/base/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-base", - "version": "6.0.4", + "version": "6.0.5", "description": "Base publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -12,7 +12,7 @@ "test:base": "cross-env TS_NODE_FILES=1 mocha --config ../../../.mocharc.js" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4" + "@electron-forge/shared-types": "6.0.5" }, "devDependencies": { "chai": "^4.3.3", diff --git a/packages/publisher/bitbucket/package.json b/packages/publisher/bitbucket/package.json index f0d2cf1b95..88b4999440 100644 --- a/packages/publisher/bitbucket/package.json +++ b/packages/publisher/bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-bitbucket", - "version": "6.0.4", + "version": "6.0.5", "description": "Bitbucket publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Luke Batchelor", @@ -15,7 +15,7 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/publisher-base": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", "form-data": "^4.0.0", "fs-extra": "^10.0.0", "node-fetch": "^2.6.7" diff --git a/packages/publisher/electron-release-server/package.json b/packages/publisher/electron-release-server/package.json index 2f2429cfc4..e381ac8da3 100644 --- a/packages/publisher/electron-release-server/package.json +++ b/packages/publisher/electron-release-server/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-electron-release-server", - "version": "6.0.4", + "version": "6.0.5", "description": "Electron release server publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -18,8 +18,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/publisher-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "debug": "^4.3.1", "form-data": "^4.0.0", "fs-extra": "^10.0.0", diff --git a/packages/publisher/electron-release-server/src/PublisherERS.ts b/packages/publisher/electron-release-server/src/PublisherERS.ts index fd46396542..891801e11d 100644 --- a/packages/publisher/electron-release-server/src/PublisherERS.ts +++ b/packages/publisher/electron-release-server/src/PublisherERS.ts @@ -11,10 +11,19 @@ import { PublisherERSConfig } from './Config'; const d = debug('electron-forge:publish:ers'); +interface ERSAsset { + name: string; + platform: string; +} + +interface ERSFlavor { + name: string; +} + interface ERSVersion { name: string; - assets: { name: string }[]; - flavor?: string; + assets: ERSAsset[]; + flavor: ERSFlavor; } const fetchAndCheckStatus = async (url: RequestInfo, init?: RequestInit): Promise => { @@ -71,16 +80,15 @@ export default class PublisherERS extends PublisherBase { const authFetch = (apiPath: string, options?: RequestInit) => fetchAndCheckStatus(api(apiPath), { ...(options || {}), headers: { ...(options || {}).headers, Authorization: `Bearer ${token}` } }); - const versions: ERSVersion[] = await (await authFetch('api/version')).json(); const flavor = config.flavor || 'default'; for (const makeResult of makeResults) { const { packageJSON } = makeResult; const artifacts = makeResult.artifacts.filter((artifactPath) => path.basename(artifactPath).toLowerCase() !== 'releases'); - const existingVersion = versions.find((version) => { - return version.name === packageJSON.version && (!version.flavor || version.flavor === flavor); - }); + const versions: ERSVersion[] = await (await authFetch('api/version')).json(); + // Find the version with the same name and flavor + const existingVersion = versions.find((version) => version.name === packageJSON.version && version.flavor.name === flavor); let channel = 'stable'; if (config.channel) { @@ -97,12 +105,11 @@ export default class PublisherERS extends PublisherBase { await authFetch('api/version', { method: 'POST', body: JSON.stringify({ - channel: { - name: channel, - }, - flavor: config.flavor, + channel: channel, + flavor: flavor, name: packageJSON.version, notes: '', + id: packageJSON.version + '_' + channel, }), headers: { 'Content-Type': 'application/json', @@ -115,10 +122,10 @@ export default class PublisherERS extends PublisherBase { updateStatusLine(); await Promise.all( - artifacts.map(async (artifactPath) => { + artifacts.map(async (artifactPath: string) => { + const platform = ersPlatform(makeResult.platform, makeResult.arch); if (existingVersion) { - const existingAsset = existingVersion.assets.find((asset) => asset.name === path.basename(artifactPath)); - + const existingAsset = existingVersion.assets.find((asset) => asset.name === path.basename(artifactPath) && asset.platform === platform); if (existingAsset) { d('asset at path:', artifactPath, 'already exists on server'); uploaded += 1; @@ -130,8 +137,7 @@ export default class PublisherERS extends PublisherBase { const artifactForm = new FormData(); artifactForm.append('token', token); artifactForm.append('version', `${packageJSON.version}_${flavor}`); - artifactForm.append('platform', ersPlatform(makeResult.platform, makeResult.arch)); - + artifactForm.append('platform', platform); // see https://github.com/form-data/form-data/issues/426 const fileOptions = { knownLength: fs.statSync(artifactPath).size, diff --git a/packages/publisher/electron-release-server/test/PublisherERS_spec.ts b/packages/publisher/electron-release-server/test/PublisherERS_spec.ts index ccc36d3f5e..52a79d4c2c 100644 --- a/packages/publisher/electron-release-server/test/PublisherERS_spec.ts +++ b/packages/publisher/electron-release-server/test/PublisherERS_spec.ts @@ -35,7 +35,7 @@ describe('PublisherERS', () => { // mock login fetch.postOnce('path:/api/auth/login', { body: { token }, status: 200 }); // mock fetch all existing versions - fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [], flavor: 'default' }], status: 200 }); + fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [], flavor: { name: 'default' } }], status: 200 }); // mock creating a new version fetch.postOnce('path:/api/version', { status: 200 }); // mock asset upload @@ -65,7 +65,7 @@ describe('PublisherERS', () => { // creates a new version with the correct flavor, name, and channel expect(calls[2][0]).to.equal(`${baseUrl}/api/version`); - expect(calls[2][1]?.body).to.equal(`{"channel":{"name":"stable"},"flavor":"${flavor}","name":"${version}","notes":""}`); + expect(calls[2][1]?.body).to.equal(`{"channel":"stable","flavor":"${flavor}","name":"${version}","notes":"","id":"${version}_stable"}`); // uploads asset successfully expect(calls[3][0]).to.equal(`${baseUrl}/api/asset`); @@ -83,7 +83,7 @@ describe('PublisherERS', () => { // mock login fetch.postOnce('path:/api/auth/login', { body: { token }, status: 200 }); // mock fetch all existing versions - fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [], flavor: 'lite' }], status: 200 }); + fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [], flavor: { name: 'lite' } }], status: 200 }); // mock asset upload fetch.post('path:/api/asset', { status: 200 }); @@ -123,7 +123,10 @@ describe('PublisherERS', () => { // mock login fetch.postOnce('path:/api/auth/login', { body: { token }, status: 200 }); // mock fetch all existing versions - fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [{ name: 'existing-artifact' }], flavor: 'default' }], status: 200 }); + fetch.getOnce('path:/api/version', { + body: [{ name: '2.0.0', assets: [{ name: 'existing-artifact', platform: 'linux_64' }], flavor: { name: 'default' } }], + status: 200, + }); const publisher = new PublisherERS({ baseUrl, @@ -158,7 +161,7 @@ describe('PublisherERS', () => { // mock login fetch.postOnce('path:/api/auth/login', { body: { token }, status: 200 }); // mock fetch all existing versions - fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [{ name: 'existing-artifact' }], flavor: 'default' }], status: 200 }); + fetch.getOnce('path:/api/version', { body: [{ name: '2.0.0', assets: [{ name: 'existing-artifact' }], flavor: { name: 'default' } }], status: 200 }); // mock creating a new version fetch.postOnce('path:/api/version', { status: 200 }); // mock asset upload @@ -188,7 +191,7 @@ describe('PublisherERS', () => { // creates a new version with the correct flavor, name, and channel expect(calls[2][0]).to.equal(`${baseUrl}/api/version`); - expect(calls[2][1]?.body).to.equal(`{"channel":{"name":"stable"},"flavor":"${flavor}","name":"${version}","notes":""}`); + expect(calls[2][1]?.body).to.equal(`{"channel":"stable","flavor":"${flavor}","name":"${version}","notes":"","id":"${version}_stable"}`); // uploads asset successfully expect(calls[3][0]).to.equal(`${baseUrl}/api/asset`); diff --git a/packages/publisher/github/package.json b/packages/publisher/github/package.json index 926e977315..cccf2fa06f 100644 --- a/packages/publisher/github/package.json +++ b/packages/publisher/github/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-github", - "version": "6.0.4", + "version": "6.0.5", "description": "Github publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -21,8 +21,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/publisher-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "@octokit/core": "^3.2.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/rest": "^18.0.11", diff --git a/packages/publisher/nucleus/package.json b/packages/publisher/nucleus/package.json index 6eeb8fbc4e..9be4818cd7 100644 --- a/packages/publisher/nucleus/package.json +++ b/packages/publisher/nucleus/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-nucleus", - "version": "6.0.4", + "version": "6.0.5", "description": "Nucleus publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,8 +15,8 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/publisher-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "debug": "^4.3.1", "form-data": "^4.0.0", "node-fetch": "^2.6.7" diff --git a/packages/publisher/s3/package.json b/packages/publisher/s3/package.json index cc5c784a8e..10c104a579 100644 --- a/packages/publisher/s3/package.json +++ b/packages/publisher/s3/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-s3", - "version": "6.0.4", + "version": "6.0.5", "description": "S3 publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -19,8 +19,8 @@ "@aws-sdk/client-s3": "^3.28.0", "@aws-sdk/lib-storage": "^3.28.0", "@aws-sdk/types": "^3.25.0", - "@electron-forge/publisher-base": "6.0.4", - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", + "@electron-forge/shared-types": "6.0.5", "debug": "^4.3.1" }, "publishConfig": { diff --git a/packages/publisher/snapcraft/package.json b/packages/publisher/snapcraft/package.json index 5e2916920b..cfc36bc806 100644 --- a/packages/publisher/snapcraft/package.json +++ b/packages/publisher/snapcraft/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/publisher-snapcraft", - "version": "6.0.4", + "version": "6.0.5", "description": "Snapcraft publisher for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -15,7 +15,7 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/publisher-base": "6.0.4", + "@electron-forge/publisher-base": "6.0.5", "fs-extra": "^10.0.0" }, "optionalDependencies": { diff --git a/packages/template/base/package.json b/packages/template/base/package.json index ba73c2d819..5f8585b220 100644 --- a/packages/template/base/package.json +++ b/packages/template/base/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-base", - "version": "6.0.4", + "version": "6.0.5", "description": "Base template for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -14,14 +14,14 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/shared-types": "6.0.5", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", "username": "^5.1.0" }, "devDependencies": { - "@electron-forge/test-utils": "6.0.4", + "@electron-forge/test-utils": "6.0.5", "chai": "^4.3.3", "mocha": "^9.0.1", "proxyquire": "^2.1.3", diff --git a/packages/template/vite/package.json b/packages/template/vite/package.json index 34843645cb..f8826eb4f7 100644 --- a/packages/template/vite/package.json +++ b/packages/template/vite/package.json @@ -18,12 +18,12 @@ "node": "^14.18.0 || >=16.0.0" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/template-base": "6.0.4", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/template-base": "6.0.5", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/test-utils": "6.0.4", + "@electron-forge/test-utils": "6.0.5", "chai": "^4.3.3", "listr2": "^5.0.3" } diff --git a/packages/template/webpack-typescript/package.json b/packages/template/webpack-typescript/package.json index d2e7d9e28a..40cd73a6d2 100644 --- a/packages/template/webpack-typescript/package.json +++ b/packages/template/webpack-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-webpack-typescript", - "version": "6.0.4", + "version": "6.0.5", "description": "Webpack-TypeScript template for Electron Forge", "repository": "https://github.com/electron/forge", "author": "Shelley Vohr ", @@ -14,18 +14,18 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/template-base": "6.0.4", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/template-base": "6.0.5", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/core-utils": "6.0.4", - "@electron-forge/maker-deb": "6.0.4", - "@electron-forge/maker-rpm": "6.0.4", - "@electron-forge/maker-squirrel": "6.0.4", - "@electron-forge/maker-zip": "6.0.4", - "@electron-forge/plugin-webpack": "6.0.4", - "@electron-forge/test-utils": "6.0.4", + "@electron-forge/core-utils": "6.0.5", + "@electron-forge/maker-deb": "6.0.5", + "@electron-forge/maker-rpm": "6.0.5", + "@electron-forge/maker-squirrel": "6.0.5", + "@electron-forge/maker-zip": "6.0.5", + "@electron-forge/plugin-webpack": "6.0.5", + "@electron-forge/test-utils": "6.0.5", "chai": "^4.3.3", "fast-glob": "^3.2.7", "fork-ts-checker-webpack-plugin": "^7.2.13", diff --git a/packages/template/webpack/package.json b/packages/template/webpack/package.json index 90a6bf70b1..ce6a3506f7 100644 --- a/packages/template/webpack/package.json +++ b/packages/template/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/template-webpack", - "version": "6.0.4", + "version": "6.0.5", "description": "Webpack template for Electron Forge, gets you started with Webpack really quickly", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", @@ -14,12 +14,12 @@ "node": ">= 14.17.5" }, "dependencies": { - "@electron-forge/shared-types": "6.0.4", - "@electron-forge/template-base": "6.0.4", + "@electron-forge/shared-types": "6.0.5", + "@electron-forge/template-base": "6.0.5", "fs-extra": "^10.0.0" }, "devDependencies": { - "@electron-forge/test-utils": "6.0.4", + "@electron-forge/test-utils": "6.0.5", "chai": "^4.3.3", "listr2": "^5.0.3" }, diff --git a/packages/utils/core-utils/package.json b/packages/utils/core-utils/package.json index 8cda0a7037..c7494886c1 100644 --- a/packages/utils/core-utils/package.json +++ b/packages/utils/core-utils/package.json @@ -1,14 +1,14 @@ { "name": "@electron-forge/core-utils", - "version": "6.0.4", + "version": "6.0.5", "description": "Core utilities for the Electron Forge packages", - "repository": "https://github.com/electron-userland/electron-forge", + "repository": "https://github.com/electron/forge", "author": "Samuel Attard", "license": "MIT", "main": "dist/index.js", "typings": "dist/index.d.ts", "dependencies": { - "@electron-forge/shared-types": "6.0.4", + "@electron-forge/shared-types": "6.0.5", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", diff --git a/packages/utils/test-utils/package.json b/packages/utils/test-utils/package.json index 43159e95d5..43294175f9 100644 --- a/packages/utils/test-utils/package.json +++ b/packages/utils/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/test-utils", - "version": "6.0.4", + "version": "6.0.5", "description": "Helper utilities for the Electron Forge testsuite", "repository": "https://github.com/electron/forge", "author": "Mark Lee", diff --git a/packages/utils/types/package.json b/packages/utils/types/package.json index d2cd12184d..8fc78047dc 100644 --- a/packages/utils/types/package.json +++ b/packages/utils/types/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/shared-types", - "version": "6.0.4", + "version": "6.0.5", "description": "Shared types across Electron Forge", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", diff --git a/packages/utils/web-multi-logger/package.json b/packages/utils/web-multi-logger/package.json index 315db40c52..f1fb17a500 100644 --- a/packages/utils/web-multi-logger/package.json +++ b/packages/utils/web-multi-logger/package.json @@ -1,6 +1,6 @@ { "name": "@electron-forge/web-multi-logger", - "version": "6.0.4", + "version": "6.0.5", "description": "Display multiple streams of logs in one window", "repository": "https://github.com/electron/forge", "author": "Samuel Attard", diff --git a/tools/test-globber.ts b/tools/test-globber.ts index 8a3076b547..c1a2ee1019 100644 --- a/tools/test-globber.ts +++ b/tools/test-globber.ts @@ -7,6 +7,7 @@ import { getPackageInfoSync } from './utils'; const argv = minimist(process.argv.slice(process.argv.findIndex((arg) => arg === 'mocha.opts'))); +const isSlow = argv.slow || process.env.TEST_SLOW_ONLY; const isFast = argv.fast || process.env.TEST_FAST_ONLY; const packages = getPackageInfoSync(); @@ -22,7 +23,7 @@ for (const p of packages) { if (argv.glob) { specGlob.push(path.posix.join(packagePath, argv.glob)); } else { - specGlob.push(path.posix.join(packagePath, 'test', '**', `*_spec${isFast ? '' : '*'}.ts`)); + specGlob.push(path.posix.join(packagePath, 'test', '**', `*_spec${isFast ? '' : isSlow ? '_slow' : '*'}.ts`)); } testFiles.push(...glob.sync(specGlob)); } diff --git a/yarn.lock b/yarn.lock index d6651a29ff..7038abe008 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1137,6 +1137,15 @@ optionalDependencies: "@types/glob" "^7.1.1" +"@electron/fuses@>=1.0.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.6.1.tgz#c639e018202a59e3cd8911fa943e22c63dd3e6fc" + integrity sha512-J7kRMlc0vP03uzUuhHNEqffqZMZ6FRe0YGMOJO4kJObmYkOg38mMTvbbktEj+oteH5nfyhbQUkHIYnMSh7T/CQ== + dependencies: + chalk "^4.1.1" + fs-extra "^9.0.1" + minimist "^1.2.5" + "@electron/get@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.0.tgz#d991e68dc089fc66b521ec3ca4021515482bef91" @@ -6688,9 +6697,9 @@ htmlparser2@^8.0.1: entities "^4.3.0" http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" @@ -7363,18 +7372,16 @@ json-stringify-safe@^5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@3.2.0: version "3.2.0"