diff --git a/.changeset/eager-mugs-smash.md b/.changeset/eager-mugs-smash.md new file mode 100644 index 00000000000..d90763ee1e2 --- /dev/null +++ b/.changeset/eager-mugs-smash.md @@ -0,0 +1,5 @@ +--- +"app-builder-lib": patch +--- + +feat: add writeUpdateInfo option for zip builds diff --git a/packages/app-builder-lib/scheme.json b/packages/app-builder-lib/scheme.json index cfd4404b396..11c541129c2 100644 --- a/packages/app-builder-lib/scheme.json +++ b/packages/app-builder-lib/scheme.json @@ -6982,6 +6982,66 @@ } }, "type": "object" + }, + "ZipOptions": { + "additionalProperties": false, + "properties": { + "artifactName": { + "description": "The [artifact file name template](./configuration.md#artifact-file-name-template).", + "type": [ + "null", + "string" + ] + }, + "publish": { + "anyOf": [ + { + "$ref": "#/definitions/GithubOptions" + }, + { + "$ref": "#/definitions/GitlabOptions" + }, + { + "$ref": "#/definitions/S3Options" + }, + { + "$ref": "#/definitions/SpacesOptions" + }, + { + "$ref": "#/definitions/GenericServerOptions" + }, + { + "$ref": "#/definitions/CustomPublishOptions" + }, + { + "$ref": "#/definitions/KeygenOptions" + }, + { + "$ref": "#/definitions/SnapStoreOptions" + }, + { + "$ref": "#/definitions/BitbucketOptions" + }, + { + "items": { + "$ref": "#/definitions/AllPublishOptions" + }, + "type": "array" + }, + { + "type": [ + "null", + "string" + ] + } + ] + }, + "writeUpdateInfo": { + "default": true, + "type": "boolean" + } + }, + "type": "object" } }, "properties": { @@ -7909,6 +7969,17 @@ ], "description": "Options related to how build Windows targets." }, + "zip": { + "anyOf": [ + { + "$ref": "#/definitions/ZipOptions" + }, + { + "type": "null" + } + ], + "description": "macOS zip options." + }, "$schema": { "description": "JSON Schema for this document.", "type": [ diff --git a/packages/app-builder-lib/src/configuration.ts b/packages/app-builder-lib/src/configuration.ts index 1d7283e3ff5..648e5c00569 100644 --- a/packages/app-builder-lib/src/configuration.ts +++ b/packages/app-builder-lib/src/configuration.ts @@ -4,7 +4,7 @@ import { ElectronBrandingOptions, ElectronDownloadOptions } from "./electron/Ele import { PrepareApplicationStageDirectoryOptions } from "./Framework" import { AppXOptions } from "./options/AppXOptions" import { AppImageOptions, DebOptions, FlatpakOptions, LinuxConfiguration, LinuxTargetSpecificOptions } from "./options/linuxOptions" -import { DmgOptions, MacConfiguration, MasConfiguration } from "./options/macOptions" +import { DmgOptions, MacConfiguration, MasConfiguration, ZipOptions } from "./options/macOptions" import { MsiOptions } from "./options/MsiOptions" import { MsiWrappedOptions } from "./options/MsiWrappedOptions" import { PkgOptions } from "./options/pkgOptions" @@ -66,6 +66,10 @@ export interface CommonConfiguration { * macOS PKG options. */ readonly pkg?: PkgOptions | null + /** + * macOS zip options. + */ + readonly zip?: ZipOptions | null /** * Options related to how build Windows targets. diff --git a/packages/app-builder-lib/src/macPackager.ts b/packages/app-builder-lib/src/macPackager.ts index 844fcab6cba..8c396b3fa28 100644 --- a/packages/app-builder-lib/src/macPackager.ts +++ b/packages/app-builder-lib/src/macPackager.ts @@ -118,7 +118,7 @@ export class MacPackager extends PlatformPackager { case "zip": // https://github.com/electron-userland/electron-builder/issues/2313 - mapper(name, outDir => new ArchiveTarget(name, outDir, this, true)) + mapper(name, outDir => new ArchiveTarget(name, outDir, this)) break case "pkg": diff --git a/packages/app-builder-lib/src/options/macOptions.ts b/packages/app-builder-lib/src/options/macOptions.ts index 3fd756bd8e1..06cbaaec104 100644 --- a/packages/app-builder-lib/src/options/macOptions.ts +++ b/packages/app-builder-lib/src/options/macOptions.ts @@ -381,3 +381,11 @@ export interface MasConfiguration extends MacConfiguration { */ readonly binaries?: Array | null } + +export interface ZipOptions extends TargetSpecificOptions { + /** + * @private + * @default true + */ + writeUpdateInfo?: boolean +} diff --git a/packages/app-builder-lib/src/targets/ArchiveTarget.ts b/packages/app-builder-lib/src/targets/ArchiveTarget.ts index 272c25fc76d..a5ce9768047 100644 --- a/packages/app-builder-lib/src/targets/ArchiveTarget.ts +++ b/packages/app-builder-lib/src/targets/ArchiveTarget.ts @@ -2,22 +2,32 @@ import { Arch, defaultArchFromString } from "builder-util" import * as path from "path" import { Platform, Target, TargetSpecificOptions } from "../core" import { copyFiles, getFileMatchers } from "../fileMatcher" +import { ZipOptions } from "../options/macOptions" import { PlatformPackager } from "../platformPackager" import { archive, tar } from "./archive" import { appendBlockmap, createBlockmap } from "./differentialUpdateInfoBuilder" export class ArchiveTarget extends Target { - readonly options: TargetSpecificOptions = (this.packager.config as any)[this.name] + readonly options: TargetSpecificOptions = (this.packager.config as any)[this.name] ?? {} constructor( name: string, readonly outDir: string, private readonly packager: PlatformPackager, - private readonly isWriteUpdateInfo = false + private readonly isWriteUpdateInfo: boolean | null = null ) { super(name) } + private shouldWriteUpdateInfo(): boolean { + // Constructor parameter takes precedence (for backward compatibility) + if (this.isWriteUpdateInfo !== null) { + return this.isWriteUpdateInfo + } + // Otherwise read from options, default to true + return (this.options as ZipOptions).writeUpdateInfo !== false + } + async build(appOutDir: string, arch: Arch): Promise { const packager = this.packager const isMac = packager.platform === Platform.MAC @@ -70,7 +80,7 @@ export class ArchiveTarget extends Target { } await archive(format, artifactPath, dirToArchive, archiveOptions) - if (this.isWriteUpdateInfo && format === "zip") { + if (this.shouldWriteUpdateInfo() && format === "zip") { if (isMac) { updateInfo = await createBlockmap(artifactPath, this, packager, artifactName) } else { @@ -94,7 +104,7 @@ export class ArchiveTarget extends Target { target: this, arch, packager, - isWriteUpdateInfo: this.isWriteUpdateInfo, + isWriteUpdateInfo: this.shouldWriteUpdateInfo(), }) }) return Promise.resolve()