dmg-builder 26.5.0 → 26.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/out/dmg.d.ts CHANGED
@@ -20,6 +20,8 @@ export interface DmgBuildConfig {
20
20
  };
21
21
  };
22
22
  format?: string;
23
+ size?: string | null;
24
+ shrink?: boolean;
23
25
  filesystem?: string;
24
26
  "compression-level"?: number | null;
25
27
  license?: string | null;
package/out/dmg.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dmg.js","sourceRoot":"","sources":["../src/dmg.ts"],"names":[],"mappings":"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","sourcesContent":["import { DmgOptions, Target } from \"app-builder-lib\"\nimport { findIdentity, isSignAllowed } from \"app-builder-lib/out/codeSign/macCodeSign\"\nimport { MacPackager } from \"app-builder-lib/out/macPackager\"\nimport { createBlockmap } from \"app-builder-lib/out/targets/differentialUpdateInfoBuilder\"\nimport { Arch, exec, getArchSuffix, InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport { sanitizeFileName } from \"builder-util/out/filename\"\nimport { release as getOsRelease } from \"os\"\nimport * as path from \"path\"\nimport { addLicenseToDmg } from \"./dmgLicense\"\nimport { computeBackground, customizeDmg } from \"./dmgUtil\"\nimport { hdiUtil } from \"./hdiuil\"\n\nexport interface DmgBuildConfig {\n title: string\n icon?: string | null\n \"badge-icon\"?: string | null\n background?: string | null\n \"background-color\"?: string | null\n \"icon-size\"?: number | null\n \"text-size\"?: number | null\n window?: {\n position?: {\n x?: number\n y?: number\n }\n size?: {\n width?: number\n height?: number\n }\n }\n format?: string\n filesystem?: string\n \"compression-level\"?: number | null\n license?: string | null\n contents?: Array<{\n path: string\n x: number\n y: number\n name?: string\n type?: \"file\" | \"link\" | \"position\"\n hide_extension?: boolean\n hidden?: boolean\n }>\n}\nexport class DmgTarget extends Target {\n readonly options: DmgOptions = this.packager.config.dmg || Object.create(null)\n\n isAsyncSupported = false\n\n constructor(\n private readonly packager: MacPackager,\n readonly outDir: string\n ) {\n super(\"dmg\")\n }\n\n async build(appPath: string, arch: Arch) {\n const packager = this.packager\n // tslint:disable-next-line:no-invalid-template-strings\n const artifactName = packager.expandArtifactNamePattern(\n this.options,\n \"dmg\",\n arch,\n \"${productName}-\" + (packager.platformSpecificBuildOptions.bundleShortVersion || \"${version}\") + \"-${arch}.${ext}\",\n true,\n packager.platformSpecificBuildOptions.defaultArch\n )\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.info.emitArtifactBuildStarted({\n targetPresentableName: \"DMG\",\n file: artifactPath,\n arch,\n })\n\n const volumeName = sanitizeFileName(this.computeVolumeName(arch, this.options.title))\n\n const specification = await this.computeDmgOptions(appPath)\n\n if (!(await customizeDmg({ appPath, artifactPath, volumeName, specification, packager }))) {\n return\n }\n\n if (this.options.internetEnabled && parseInt(getOsRelease().split(\".\")[0], 10) < 19) {\n await hdiUtil(addLogLevel([\"internet-enable\"]).concat(artifactPath))\n }\n\n const licenseData = await addLicenseToDmg(packager, artifactPath)\n if (packager.packagerOptions.effectiveOptionComputed != null) {\n await packager.packagerOptions.effectiveOptionComputed({ licenseData })\n }\n\n if (this.options.sign === true) {\n await this.signDmg(artifactPath)\n }\n\n const safeArtifactName = packager.computeSafeArtifactName(artifactName, \"dmg\")\n const updateInfo = this.options.writeUpdateInfo === false ? null : await createBlockmap(artifactPath, this, packager, safeArtifactName)\n await packager.info.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName,\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: updateInfo != null,\n updateInfo,\n })\n }\n\n private async signDmg(artifactPath: string) {\n if (!isSignAllowed(false)) {\n return\n }\n\n const packager = this.packager\n const qualifier = packager.platformSpecificBuildOptions.identity\n // explicitly disabled if set to null\n if (qualifier === null) {\n // macPackager already somehow handle this situation, so, here just return\n return\n }\n\n const keychainFile = (await packager.codeSigningInfo.value).keychainFile\n const certificateType = \"Developer ID Application\"\n let identity = await findIdentity(certificateType, qualifier, keychainFile)\n if (identity == null) {\n identity = await findIdentity(\"Mac Developer\", qualifier, keychainFile)\n if (identity == null) {\n return\n }\n }\n\n const args = [\"--sign\", identity.hash!]\n if (keychainFile != null) {\n args.push(\"--keychain\", keychainFile)\n }\n args.push(artifactPath)\n await exec(\"codesign\", args)\n }\n\n computeVolumeName(arch: Arch, custom?: string | null): string {\n const appInfo = this.packager.appInfo\n const shortVersion = this.packager.platformSpecificBuildOptions.bundleShortVersion || appInfo.version\n const archString = getArchSuffix(arch, this.packager.platformSpecificBuildOptions.defaultArch)\n\n if (custom == null) {\n return `${appInfo.productFilename} ${shortVersion}${archString}`\n }\n\n return custom\n .replace(/\\${arch}/g, archString)\n .replace(/\\${shortVersion}/g, shortVersion)\n .replace(/\\${version}/g, appInfo.version)\n .replace(/\\${name}/g, appInfo.name)\n .replace(/\\${productName}/g, appInfo.productName)\n }\n\n // public to test\n async computeDmgOptions(appPath: string): Promise<DmgOptions> {\n const packager = this.packager\n const specification: DmgOptions = { ...this.options }\n if (specification.icon == null && specification.icon !== null) {\n specification.icon = await packager.getIconPath()\n }\n\n if (specification.icon != null && isEmptyOrSpaces(specification.icon)) {\n throw new InvalidConfigurationError(\"dmg.icon cannot be specified as empty string\")\n }\n\n const background = specification.background\n if (specification.backgroundColor != null) {\n if (background != null) {\n throw new InvalidConfigurationError(\"Both dmg.backgroundColor and dmg.background are specified — please set the only one\")\n }\n } else if (background == null) {\n specification.background = await computeBackground(packager)\n } else {\n specification.background = await packager.getResource(background)\n }\n\n if (specification.format == null) {\n if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {\n specification.format = \"UDZO\"\n } else if (packager.compression === \"store\") {\n specification.format = \"UDRO\"\n } else {\n specification.format = packager.compression === \"maximum\" ? \"UDBZ\" : \"UDZO\"\n }\n }\n\n if (specification.contents == null) {\n specification.contents = [\n {\n x: 130,\n y: 220,\n path: appPath,\n type: \"file\",\n name: `${packager.appInfo.productFilename}.app`,\n },\n {\n x: 410,\n y: 220,\n type: \"link\",\n path: \"/Applications\",\n },\n ]\n }\n return specification\n }\n}\n\nfunction addLogLevel(args: Array<string>, isVerbose = process.env.DEBUG_DMG === \"true\"): Array<string> {\n args.push(isVerbose ? \"-verbose\" : \"-quiet\")\n return args\n}\n"]}
1
+ {"version":3,"file":"dmg.js","sourceRoot":"","sources":["../src/dmg.ts"],"names":[],"mappings":"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","sourcesContent":["import { DmgOptions, Target } from \"app-builder-lib\"\nimport { findIdentity, isSignAllowed } from \"app-builder-lib/out/codeSign/macCodeSign\"\nimport { MacPackager } from \"app-builder-lib/out/macPackager\"\nimport { createBlockmap } from \"app-builder-lib/out/targets/differentialUpdateInfoBuilder\"\nimport { Arch, exec, getArchSuffix, InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport { sanitizeFileName } from \"builder-util/out/filename\"\nimport { release as getOsRelease } from \"os\"\nimport * as path from \"path\"\nimport { addLicenseToDmg } from \"./dmgLicense\"\nimport { computeBackground, customizeDmg } from \"./dmgUtil\"\nimport { hdiUtil } from \"./hdiuil\"\n\nexport interface DmgBuildConfig {\n title: string\n icon?: string | null\n \"badge-icon\"?: string | null\n background?: string | null\n \"background-color\"?: string | null\n \"icon-size\"?: number | null\n \"text-size\"?: number | null\n window?: {\n position?: {\n x?: number\n y?: number\n }\n size?: {\n width?: number\n height?: number\n }\n }\n format?: string\n size?: string | null\n shrink?: boolean\n filesystem?: string\n \"compression-level\"?: number | null\n license?: string | null\n contents?: Array<{\n path: string\n x: number\n y: number\n name?: string\n type?: \"file\" | \"link\" | \"position\"\n hide_extension?: boolean\n hidden?: boolean\n }>\n}\nexport class DmgTarget extends Target {\n readonly options: DmgOptions = this.packager.config.dmg || Object.create(null)\n\n isAsyncSupported = false\n\n constructor(\n private readonly packager: MacPackager,\n readonly outDir: string\n ) {\n super(\"dmg\")\n }\n\n async build(appPath: string, arch: Arch) {\n const packager = this.packager\n // tslint:disable-next-line:no-invalid-template-strings\n const artifactName = packager.expandArtifactNamePattern(\n this.options,\n \"dmg\",\n arch,\n \"${productName}-\" + (packager.platformSpecificBuildOptions.bundleShortVersion || \"${version}\") + \"-${arch}.${ext}\",\n true,\n packager.platformSpecificBuildOptions.defaultArch\n )\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.info.emitArtifactBuildStarted({\n targetPresentableName: \"DMG\",\n file: artifactPath,\n arch,\n })\n\n const volumeName = sanitizeFileName(this.computeVolumeName(arch, this.options.title))\n\n const specification = await this.computeDmgOptions(appPath)\n\n if (!(await customizeDmg({ appPath, artifactPath, volumeName, specification, packager }))) {\n return\n }\n\n if (this.options.internetEnabled && parseInt(getOsRelease().split(\".\")[0], 10) < 19) {\n await hdiUtil(addLogLevel([\"internet-enable\"]).concat(artifactPath))\n }\n\n const licenseData = await addLicenseToDmg(packager, artifactPath)\n if (packager.packagerOptions.effectiveOptionComputed != null) {\n await packager.packagerOptions.effectiveOptionComputed({ licenseData })\n }\n\n if (this.options.sign === true) {\n await this.signDmg(artifactPath)\n }\n\n const safeArtifactName = packager.computeSafeArtifactName(artifactName, \"dmg\")\n const updateInfo = this.options.writeUpdateInfo === false ? null : await createBlockmap(artifactPath, this, packager, safeArtifactName)\n await packager.info.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName,\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: updateInfo != null,\n updateInfo,\n })\n }\n\n private async signDmg(artifactPath: string) {\n if (!isSignAllowed(false)) {\n return\n }\n\n const packager = this.packager\n const qualifier = packager.platformSpecificBuildOptions.identity\n // explicitly disabled if set to null\n if (qualifier === null) {\n // macPackager already somehow handle this situation, so, here just return\n return\n }\n\n const keychainFile = (await packager.codeSigningInfo.value).keychainFile\n const certificateType = \"Developer ID Application\"\n let identity = await findIdentity(certificateType, qualifier, keychainFile)\n if (identity == null) {\n identity = await findIdentity(\"Mac Developer\", qualifier, keychainFile)\n if (identity == null) {\n return\n }\n }\n\n const args = [\"--sign\", identity.hash!]\n if (keychainFile != null) {\n args.push(\"--keychain\", keychainFile)\n }\n args.push(artifactPath)\n await exec(\"codesign\", args)\n }\n\n computeVolumeName(arch: Arch, custom?: string | null): string {\n const appInfo = this.packager.appInfo\n const shortVersion = this.packager.platformSpecificBuildOptions.bundleShortVersion || appInfo.version\n const archString = getArchSuffix(arch, this.packager.platformSpecificBuildOptions.defaultArch)\n\n if (custom == null) {\n return `${appInfo.productFilename} ${shortVersion}${archString}`\n }\n\n return custom\n .replace(/\\${arch}/g, archString)\n .replace(/\\${shortVersion}/g, shortVersion)\n .replace(/\\${version}/g, appInfo.version)\n .replace(/\\${name}/g, appInfo.name)\n .replace(/\\${productName}/g, appInfo.productName)\n }\n\n // public to test\n async computeDmgOptions(appPath: string): Promise<DmgOptions> {\n const packager = this.packager\n const specification: DmgOptions = { ...this.options }\n if (specification.icon == null && specification.icon !== null) {\n specification.icon = await packager.getIconPath()\n }\n\n if (specification.icon != null && isEmptyOrSpaces(specification.icon)) {\n throw new InvalidConfigurationError(\"dmg.icon cannot be specified as empty string\")\n }\n\n const background = specification.background\n if (specification.backgroundColor != null) {\n if (background != null) {\n throw new InvalidConfigurationError(\"Both dmg.backgroundColor and dmg.background are specified — please set the only one\")\n }\n } else if (background == null) {\n specification.background = await computeBackground(packager)\n } else {\n specification.background = await packager.getResource(background)\n }\n\n if (specification.format == null) {\n if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {\n specification.format = \"UDZO\"\n } else if (packager.compression === \"store\") {\n specification.format = \"UDRO\"\n } else {\n specification.format = packager.compression === \"maximum\" ? \"UDBZ\" : \"UDZO\"\n }\n }\n\n if (specification.contents == null) {\n specification.contents = [\n {\n x: 130,\n y: 220,\n path: appPath,\n type: \"file\",\n name: `${packager.appInfo.productFilename}.app`,\n },\n {\n x: 410,\n y: 220,\n type: \"link\",\n path: \"/Applications\",\n },\n ]\n }\n return specification\n }\n}\n\nfunction addLogLevel(args: Array<string>, isVerbose = process.env.DEBUG_DMG === \"true\"): Array<string> {\n args.push(isVerbose ? \"-verbose\" : \"-quiet\")\n return args\n}\n"]}
package/out/dmgUtil.d.ts CHANGED
@@ -2,9 +2,8 @@ import { DmgOptions, MacPackager, PlatformPackager } from "app-builder-lib";
2
2
  import { TmpDir } from "builder-util";
3
3
  export { DmgTarget } from "./dmg";
4
4
  export declare function getDmgTemplatePath(): string;
5
- export declare function getDmgVendorPath(): string;
6
- export declare function attachAndExecute(dmgPath: string, readWrite: boolean, task: (devicePath: string) => Promise<any>): Promise<any>;
7
- export declare function detach(name: string): Promise<string | null>;
5
+ export declare function attachAndExecute(dmgPath: string, readWrite: boolean, forceDetach: boolean, task: (devicePath: string) => Promise<any>): Promise<any>;
6
+ export declare function detach(name: string, alwaysForce: boolean): Promise<string | null>;
8
7
  export declare function computeBackground(packager: PlatformPackager<any>): Promise<string>;
9
8
  type DmgBuilderConfig = {
10
9
  appPath: string;
package/out/dmgUtil.js CHANGED
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DmgTarget = void 0;
4
4
  exports.getDmgTemplatePath = getDmgTemplatePath;
5
- exports.getDmgVendorPath = getDmgVendorPath;
6
5
  exports.attachAndExecute = attachAndExecute;
7
6
  exports.detach = detach;
8
7
  exports.computeBackground = computeBackground;
@@ -10,20 +9,40 @@ exports.serializeString = serializeString;
10
9
  exports.customizeDmg = customizeDmg;
11
10
  exports.transformBackgroundFileIfNeed = transformBackgroundFileIfNeed;
12
11
  exports.getImageSizeUsingSips = getImageSizeUsingSips;
12
+ const binDownload_1 = require("app-builder-lib/out/binDownload");
13
13
  const builder_util_1 = require("builder-util");
14
+ const fs_extra_1 = require("fs-extra");
14
15
  const path = require("path");
15
16
  const hdiuil_1 = require("./hdiuil");
16
- const fs_extra_1 = require("fs-extra");
17
17
  var dmg_1 = require("./dmg");
18
18
  Object.defineProperty(exports, "DmgTarget", { enumerable: true, get: function () { return dmg_1.DmgTarget; } });
19
19
  const root = path.join(__dirname, "..");
20
20
  function getDmgTemplatePath() {
21
21
  return path.join(root, "templates");
22
22
  }
23
- function getDmgVendorPath() {
24
- return path.join(root, "vendor");
23
+ async function getDmgVendorPath() {
24
+ var _a;
25
+ const customDmgbuildPath = (_a = process.env.CUSTOM_DMGBUILD_PATH) === null || _a === void 0 ? void 0 : _a.trim();
26
+ if (customDmgbuildPath) {
27
+ return path.resolve(customDmgbuildPath);
28
+ }
29
+ // https://github.com/electron-userland/electron-builder-binaries/releases/tag/dmg-builder%401.2.0
30
+ const releaseVersion = "75c8a6c";
31
+ const arch = process.arch === "arm64" ? "arm64" : "x86_64";
32
+ const config = {
33
+ "dmgbuild-bundle-arm64-75c8a6c.tar.gz": "a785f2a385c8c31996a089ef8e26361904b40c772d5ea65a36001212f1fc25e0",
34
+ "dmgbuild-bundle-x86_64-75c8a6c.tar.gz": "87b3bb72148b11451ee90ede79cc8d59305c9173b68b0f2b50a3bea51fc4a4e2",
35
+ };
36
+ const filename = `dmgbuild-bundle-${arch}-${releaseVersion}.tar.gz`;
37
+ const file = await (0, binDownload_1.downloadArtifact)({
38
+ releaseName: "dmg-builder@1.2.0",
39
+ filenameWithExt: filename,
40
+ checksums: config,
41
+ githubOrgRepo: "electron-userland/electron-builder-binaries",
42
+ });
43
+ return path.resolve(file, "dmgbuild");
25
44
  }
26
- async function attachAndExecute(dmgPath, readWrite, task) {
45
+ async function attachAndExecute(dmgPath, readWrite, forceDetach, task) {
27
46
  //noinspection SpellCheckingInspection
28
47
  const args = ["attach", "-noverify", "-noautoopen"];
29
48
  if (readWrite) {
@@ -40,7 +59,7 @@ async function attachAndExecute(dmgPath, readWrite, task) {
40
59
  if (volumePath == null) {
41
60
  throw new Error(`Cannot find volume mount path for device: ${device}`);
42
61
  }
43
- return await (0, builder_util_1.executeFinally)(task(volumePath), () => detach(device));
62
+ return await (0, builder_util_1.executeFinally)(task(volumePath), () => detach(device, forceDetach));
44
63
  }
45
64
  /**
46
65
  * Find the mount path for a specific device from `hdiutil info`.
@@ -58,9 +77,9 @@ async function findMountPath(devName, index = 1) {
58
77
  }
59
78
  return matches.length >= index ? matches[index - 1] : null;
60
79
  }
61
- async function detach(name) {
80
+ async function detach(name, alwaysForce) {
62
81
  return (0, hdiuil_1.hdiUtil)(["detach", "-quiet", name]).catch(async (e) => {
63
- if (hdiuil_1.hdiutilTransientExitCodes.has(e.code)) {
82
+ if (hdiuil_1.hdiutilTransientExitCodes.has(e.code) || alwaysForce) {
64
83
  // Delay then force unmount with verbose output
65
84
  await new Promise(resolve => setTimeout(resolve, 3000));
66
85
  return (0, hdiuil_1.hdiUtil)(["detach", "-force", name]);
@@ -95,16 +114,15 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
95
114
  const iconTextSize = isValidIconTextSize ? specification.iconTextSize : 12;
96
115
  const volumePath = path.join("/Volumes", volumeName);
97
116
  // https://github.com/electron-userland/electron-builder/issues/2115
98
- const backgroundFile = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager);
99
117
  const settings = {
100
118
  title: path.basename(volumePath),
101
- icon: await packager.getResource(specification.icon),
102
- "badge-icon": await packager.getResource(specification.badgeIcon),
103
119
  "icon-size": specification.iconSize,
104
120
  "text-size": iconTextSize,
105
121
  "compression-level": Number(process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || "9"),
106
122
  // filesystem: specification.filesystem || "HFS+",
107
123
  format: specification.format,
124
+ size: specification.size,
125
+ shrink: specification.shrink,
108
126
  contents: ((_a = specification.contents) === null || _a === void 0 ? void 0 : _a.map(c => ({
109
127
  path: c.path || appPath, // path is required, when ommitted, appPath is used (backward compatibility
110
128
  x: c.x,
@@ -114,6 +132,16 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
114
132
  // hide_extension: c.hideExtension,
115
133
  }))) || [],
116
134
  };
135
+ if (specification.badgeIcon) {
136
+ let badgeIcon = await packager.getResource(specification.badgeIcon);
137
+ if (badgeIcon && badgeIcon.toLowerCase().endsWith(".icon")) {
138
+ badgeIcon = await packager.generateIcnsFromIcon(badgeIcon);
139
+ }
140
+ settings["badge-icon"] = badgeIcon;
141
+ }
142
+ else {
143
+ settings.icon = await packager.getResource(specification.icon);
144
+ }
117
145
  if (specification.backgroundColor != null || specification.background == null) {
118
146
  settings["background-color"] = specification.backgroundColor || "#ffffff";
119
147
  const window = specification.window;
@@ -131,8 +159,7 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
131
159
  }
132
160
  }
133
161
  else {
134
- settings.background = backgroundFile;
135
- delete settings["background-color"];
162
+ settings.background = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager);
136
163
  }
137
164
  if (!(0, builder_util_1.isEmptyOrSpaces)(settings.background)) {
138
165
  const size = await getImageSizeUsingSips(settings.background);
@@ -140,15 +167,8 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
140
167
  }
141
168
  const settingsFile = await packager.getTempFile(".json");
142
169
  await (0, fs_extra_1.writeFile)(settingsFile, JSON.stringify(settings, null, 2));
143
- const python3Check = () => (0, builder_util_1.exec)("command", ["-v", "python3"]);
144
- const pythonCheck = () => (0, builder_util_1.exec)("command", ["-v", "python"]);
145
- const pythonPath = process.env.PYTHON_PATH || (await python3Check().catch(pythonCheck)) || (await pythonCheck());
146
- if (pythonPath == null || (0, builder_util_1.isEmptyOrSpaces)(pythonPath.trim())) {
147
- throw new Error("Cannot find 'python' or 'python3' executable, please ensure Python is installed and available in PATH or set PYTHON_PATH environment variable");
148
- }
149
- const vendorDir = getDmgVendorPath();
150
- await (0, builder_util_1.exec)(pythonPath.trim(), [path.join(vendorDir, "run_dmgbuild.py"), "-s", settingsFile, path.basename(volumePath), artifactPath], {
151
- cwd: vendorDir,
170
+ const dmgbuild = await getDmgVendorPath();
171
+ await (0, builder_util_1.exec)(dmgbuild, ["-s", settingsFile, path.basename(volumePath), artifactPath], {
152
172
  env: {
153
173
  ...process.env,
154
174
  PYTHONIOENCODING: "utf8",
@@ -156,7 +176,7 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
156
176
  });
157
177
  // effectiveOptionComputed, when present, is purely for verifying result during test execution
158
178
  return (packager.packagerOptions.effectiveOptionComputed == null ||
159
- (await attachAndExecute(artifactPath, false, async (volumePath) => {
179
+ (await attachAndExecute(artifactPath, false, true, async (volumePath) => {
160
180
  var _a;
161
181
  return !(await packager.packagerOptions.effectiveOptionComputed({
162
182
  volumePath,
@@ -1 +1 @@
1
- {"version":3,"file":"dmgUtil.js","sourceRoot":"","sources":["../src/dmgUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { DmgOptions, MacPackager, PlatformPackager } from \"app-builder-lib\"\nimport { exec, executeFinally, exists, isEmptyOrSpaces, TmpDir } from \"builder-util\"\nimport * as path from \"path\"\nimport { hdiUtil, hdiutilTransientExitCodes } from \"./hdiuil\"\nimport { writeFile } from \"fs-extra\"\nimport { DmgBuildConfig } from \"./dmg\"\n\nexport { DmgTarget } from \"./dmg\"\n\nconst root = path.join(__dirname, \"..\")\n\nexport function getDmgTemplatePath() {\n return path.join(root, \"templates\")\n}\n\nexport function getDmgVendorPath() {\n return path.join(root, \"vendor\")\n}\n\nexport async function attachAndExecute(dmgPath: string, readWrite: boolean, task: (devicePath: string) => Promise<any>) {\n //noinspection SpellCheckingInspection\n const args = [\"attach\", \"-noverify\", \"-noautoopen\"]\n if (readWrite) {\n args.push(\"-readwrite\")\n }\n\n args.push(dmgPath)\n const attachResult = await hdiUtil(args)\n const deviceResult = attachResult == null ? null : /^(\\/dev\\/\\w+)/.exec(attachResult)\n const device = deviceResult == null || deviceResult.length !== 2 ? null : deviceResult[1]\n if (device == null) {\n throw new Error(`Cannot mount: ${attachResult}`)\n }\n const volumePath = await findMountPath(path.basename(device))\n if (volumePath == null) {\n throw new Error(`Cannot find volume mount path for device: ${device}`)\n }\n\n return await executeFinally(task(volumePath), () => detach(device))\n}\n\n/**\n * Find the mount path for a specific device from `hdiutil info`.\n */\nasync function findMountPath(devName: string, index: number = 1): Promise<string | null> {\n const info = await hdiUtil([\"info\"])\n const lines = info!.split(\"\\n\")\n const regex = new RegExp(`^/dev/${devName}(s\\\\d+)?\\\\s+\\\\S+\\\\s+(/Volumes/.+)$`)\n const matches: string[] = []\n\n for (const line of lines) {\n const result = regex.exec(line)\n if (result && result.length >= 3) {\n matches.push(result[2])\n }\n }\n\n return matches.length >= index ? matches[index - 1] : null\n}\n\nexport async function detach(name: string) {\n return hdiUtil([\"detach\", \"-quiet\", name]).catch(async e => {\n if (hdiutilTransientExitCodes.has(e.code)) {\n // Delay then force unmount with verbose output\n await new Promise(resolve => setTimeout(resolve, 3000))\n return hdiUtil([\"detach\", \"-force\", name])\n }\n throw e\n })\n}\n\nexport async function computeBackground(packager: PlatformPackager<any>): Promise<string> {\n const resourceList = await packager.resourceList\n if (resourceList.includes(\"background.tiff\")) {\n return path.join(packager.buildResourcesDir, \"background.tiff\")\n } else if (resourceList.includes(\"background.png\")) {\n return path.join(packager.buildResourcesDir, \"background.png\")\n } else {\n return path.join(getDmgTemplatePath(), \"background.tiff\")\n }\n}\n\n/** @internal */\nexport function serializeString(data: string) {\n return (\n ' $\"' +\n data\n .match(/.{1,32}/g)!\n .map(it => it.match(/.{1,4}/g)!.join(\" \"))\n .join('\"\\n $\"') +\n '\"'\n )\n}\n\ntype DmgBuilderConfig = {\n appPath: string\n artifactPath: string\n volumeName: string\n specification: DmgOptions\n packager: MacPackager\n}\n\nexport async function customizeDmg({ appPath, artifactPath, volumeName, specification, packager }: DmgBuilderConfig): Promise<boolean> {\n const isValidIconTextSize = !!specification.iconTextSize && specification.iconTextSize >= 10 && specification.iconTextSize <= 16\n const iconTextSize = isValidIconTextSize ? specification.iconTextSize : 12\n const volumePath = path.join(\"/Volumes\", volumeName)\n // https://github.com/electron-userland/electron-builder/issues/2115\n const backgroundFile = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager)\n\n const settings: DmgBuildConfig = {\n title: path.basename(volumePath),\n icon: await packager.getResource(specification.icon),\n \"badge-icon\": await packager.getResource(specification.badgeIcon),\n \"icon-size\": specification.iconSize,\n \"text-size\": iconTextSize,\n\n \"compression-level\": Number(process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || \"9\"),\n // filesystem: specification.filesystem || \"HFS+\",\n format: specification.format,\n contents:\n specification.contents?.map(c => ({\n path: c.path || appPath, // path is required, when ommitted, appPath is used (backward compatibility\n x: c.x,\n y: c.y,\n name: c.name,\n type: c.type === \"dir\" ? \"file\" : c.type, // appdmg expects \"file\" for directories\n // hide_extension: c.hideExtension,\n })) || [],\n }\n\n if (specification.backgroundColor != null || specification.background == null) {\n settings[\"background-color\"] = specification.backgroundColor || \"#ffffff\"\n\n const window = specification.window\n if (window != null) {\n settings.window = {\n position: {\n x: window.x ?? 100,\n y: window.y ?? 400,\n },\n size: {\n width: window.width ?? 540,\n height: window.height ?? 300,\n },\n }\n }\n } else {\n settings.background = backgroundFile\n delete settings[\"background-color\"]\n }\n\n if (!isEmptyOrSpaces(settings.background)) {\n const size = await getImageSizeUsingSips(settings.background)\n settings.window = { position: { x: 400, y: Math.round((1440 - size.height) / 2) }, size, ...settings.window }\n }\n\n const settingsFile = await packager.getTempFile(\".json\")\n await writeFile(settingsFile, JSON.stringify(settings, null, 2))\n\n const python3Check = () => exec(\"command\", [\"-v\", \"python3\"])\n const pythonCheck = () => exec(\"command\", [\"-v\", \"python\"])\n const pythonPath = process.env.PYTHON_PATH || (await python3Check().catch(pythonCheck)) || (await pythonCheck())\n if (pythonPath == null || isEmptyOrSpaces(pythonPath.trim())) {\n throw new Error(\"Cannot find 'python' or 'python3' executable, please ensure Python is installed and available in PATH or set PYTHON_PATH environment variable\")\n }\n const vendorDir = getDmgVendorPath()\n await exec(pythonPath.trim(), [path.join(vendorDir, \"run_dmgbuild.py\"), \"-s\", settingsFile, path.basename(volumePath), artifactPath], {\n cwd: vendorDir,\n env: {\n ...process.env,\n PYTHONIOENCODING: \"utf8\",\n },\n })\n\n // effectiveOptionComputed, when present, is purely for verifying result during test execution\n return (\n packager.packagerOptions.effectiveOptionComputed == null ||\n (await attachAndExecute(artifactPath, false, async volumePath => {\n return !(await packager.packagerOptions.effectiveOptionComputed!({\n volumePath,\n specification: {\n ...specification,\n // clean up `contents` for test snapshot verification since app path is absolute to a unique tmp dir\n contents: specification.contents?.map((c: any) => ({\n ...c,\n path: path.extname(c.path ?? \"\") === \".app\" ? path.relative(packager.projectDir, c.path) : c.path,\n })),\n },\n packager,\n }))\n }))\n )\n}\n\nexport async function transformBackgroundFileIfNeed(file: string, tmpDir: TmpDir): Promise<string> {\n if (path.extname(file.toLowerCase()) === \".tiff\") {\n return file\n }\n\n const retinaFile = file.replace(/\\.([a-z]+)$/, \"@2x.$1\")\n if (await exists(retinaFile)) {\n const tiffFile = await tmpDir.getTempFile({ suffix: \".tiff\" })\n await exec(\"tiffutil\", [\"-cathidpicheck\", file, retinaFile, \"-out\", tiffFile])\n return tiffFile\n }\n\n return file\n}\n\nexport async function getImageSizeUsingSips(background: string) {\n const stdout = await exec(\"sips\", [\"-g\", \"pixelHeight\", \"-g\", \"pixelWidth\", background])\n\n let width = 0\n let height = 0\n\n const re = /([a-zA-Z]+):\\s*(\\d+)/\n const lines = stdout.split(\"\\n\")\n\n for (const line of lines) {\n const match = re.exec(line)\n if (!match) {\n continue\n }\n\n const key = match[1]\n const value = parseInt(match[2], 10)\n\n if (isNaN(value)) {\n throw new Error(`Failed to parse number from line: \"${line}\"`)\n }\n\n if (key === \"pixelWidth\") {\n width = value\n } else if (key === \"pixelHeight\") {\n height = value\n }\n }\n\n return { width, height }\n}\n"]}
1
+ {"version":3,"file":"dmgUtil.js","sourceRoot":"","sources":["../src/dmgUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { DmgOptions, MacPackager, PlatformPackager } from \"app-builder-lib\"\nimport { downloadArtifact } from \"app-builder-lib/out/binDownload\"\nimport { exec, executeFinally, exists, isEmptyOrSpaces, TmpDir } from \"builder-util\"\nimport { writeFile } from \"fs-extra\"\nimport * as path from \"path\"\nimport { DmgBuildConfig } from \"./dmg\"\nimport { hdiUtil, hdiutilTransientExitCodes } from \"./hdiuil\"\n\nexport { DmgTarget } from \"./dmg\"\n\nconst root = path.join(__dirname, \"..\")\n\nexport function getDmgTemplatePath() {\n return path.join(root, \"templates\")\n}\n\nasync function getDmgVendorPath(): Promise<string> {\n const customDmgbuildPath = process.env.CUSTOM_DMGBUILD_PATH?.trim()\n if (customDmgbuildPath) {\n return path.resolve(customDmgbuildPath)\n }\n\n // https://github.com/electron-userland/electron-builder-binaries/releases/tag/dmg-builder%401.2.0\n const releaseVersion = \"75c8a6c\"\n const arch = process.arch === \"arm64\" ? \"arm64\" : \"x86_64\"\n const config = {\n \"dmgbuild-bundle-arm64-75c8a6c.tar.gz\": \"a785f2a385c8c31996a089ef8e26361904b40c772d5ea65a36001212f1fc25e0\",\n \"dmgbuild-bundle-x86_64-75c8a6c.tar.gz\": \"87b3bb72148b11451ee90ede79cc8d59305c9173b68b0f2b50a3bea51fc4a4e2\",\n }\n const filename: keyof typeof config = `dmgbuild-bundle-${arch}-${releaseVersion}.tar.gz`\n const file = await downloadArtifact({\n releaseName: \"dmg-builder@1.2.0\",\n filenameWithExt: filename,\n checksums: config,\n githubOrgRepo: \"electron-userland/electron-builder-binaries\",\n })\n return path.resolve(file, \"dmgbuild\")\n}\n\nexport async function attachAndExecute(dmgPath: string, readWrite: boolean, forceDetach: boolean, task: (devicePath: string) => Promise<any>) {\n //noinspection SpellCheckingInspection\n const args = [\"attach\", \"-noverify\", \"-noautoopen\"]\n if (readWrite) {\n args.push(\"-readwrite\")\n }\n\n args.push(dmgPath)\n const attachResult = await hdiUtil(args)\n const deviceResult = attachResult == null ? null : /^(\\/dev\\/\\w+)/.exec(attachResult)\n const device = deviceResult == null || deviceResult.length !== 2 ? null : deviceResult[1]\n if (device == null) {\n throw new Error(`Cannot mount: ${attachResult}`)\n }\n const volumePath = await findMountPath(path.basename(device))\n if (volumePath == null) {\n throw new Error(`Cannot find volume mount path for device: ${device}`)\n }\n\n return await executeFinally(task(volumePath), () => detach(device, forceDetach))\n}\n\n/**\n * Find the mount path for a specific device from `hdiutil info`.\n */\nasync function findMountPath(devName: string, index: number = 1): Promise<string | null> {\n const info = await hdiUtil([\"info\"])\n const lines = info!.split(\"\\n\")\n const regex = new RegExp(`^/dev/${devName}(s\\\\d+)?\\\\s+\\\\S+\\\\s+(/Volumes/.+)$`)\n const matches: string[] = []\n\n for (const line of lines) {\n const result = regex.exec(line)\n if (result && result.length >= 3) {\n matches.push(result[2])\n }\n }\n\n return matches.length >= index ? matches[index - 1] : null\n}\n\nexport async function detach(name: string, alwaysForce: boolean) {\n return hdiUtil([\"detach\", \"-quiet\", name]).catch(async e => {\n if (hdiutilTransientExitCodes.has(e.code) || alwaysForce) {\n // Delay then force unmount with verbose output\n await new Promise(resolve => setTimeout(resolve, 3000))\n return hdiUtil([\"detach\", \"-force\", name])\n }\n throw e\n })\n}\n\nexport async function computeBackground(packager: PlatformPackager<any>): Promise<string> {\n const resourceList = await packager.resourceList\n if (resourceList.includes(\"background.tiff\")) {\n return path.join(packager.buildResourcesDir, \"background.tiff\")\n } else if (resourceList.includes(\"background.png\")) {\n return path.join(packager.buildResourcesDir, \"background.png\")\n } else {\n return path.join(getDmgTemplatePath(), \"background.tiff\")\n }\n}\n\n/** @internal */\nexport function serializeString(data: string) {\n return (\n ' $\"' +\n data\n .match(/.{1,32}/g)!\n .map(it => it.match(/.{1,4}/g)!.join(\" \"))\n .join('\"\\n $\"') +\n '\"'\n )\n}\n\ntype DmgBuilderConfig = {\n appPath: string\n artifactPath: string\n volumeName: string\n specification: DmgOptions\n packager: MacPackager\n}\n\nexport async function customizeDmg({ appPath, artifactPath, volumeName, specification, packager }: DmgBuilderConfig): Promise<boolean> {\n const isValidIconTextSize = !!specification.iconTextSize && specification.iconTextSize >= 10 && specification.iconTextSize <= 16\n const iconTextSize = isValidIconTextSize ? specification.iconTextSize : 12\n const volumePath = path.join(\"/Volumes\", volumeName)\n // https://github.com/electron-userland/electron-builder/issues/2115\n\n const settings: DmgBuildConfig = {\n title: path.basename(volumePath),\n \"icon-size\": specification.iconSize,\n \"text-size\": iconTextSize,\n\n \"compression-level\": Number(process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || \"9\"),\n // filesystem: specification.filesystem || \"HFS+\",\n format: specification.format,\n size: specification.size,\n shrink: specification.shrink,\n contents:\n specification.contents?.map(c => ({\n path: c.path || appPath, // path is required, when ommitted, appPath is used (backward compatibility\n x: c.x,\n y: c.y,\n name: c.name,\n type: c.type === \"dir\" ? \"file\" : c.type, // appdmg expects \"file\" for directories\n // hide_extension: c.hideExtension,\n })) || [],\n }\n\n if (specification.badgeIcon) {\n let badgeIcon = await packager.getResource(specification.badgeIcon)\n if (badgeIcon && badgeIcon.toLowerCase().endsWith(\".icon\")) {\n badgeIcon = await packager.generateIcnsFromIcon(badgeIcon)\n }\n settings[\"badge-icon\"] = badgeIcon\n } else {\n settings.icon = await packager.getResource(specification.icon)\n }\n\n if (specification.backgroundColor != null || specification.background == null) {\n settings[\"background-color\"] = specification.backgroundColor || \"#ffffff\"\n\n const window = specification.window\n if (window != null) {\n settings.window = {\n position: {\n x: window.x ?? 100,\n y: window.y ?? 400,\n },\n size: {\n width: window.width ?? 540,\n height: window.height ?? 300,\n },\n }\n }\n } else {\n settings.background = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager)\n }\n\n if (!isEmptyOrSpaces(settings.background)) {\n const size = await getImageSizeUsingSips(settings.background)\n settings.window = { position: { x: 400, y: Math.round((1440 - size.height) / 2) }, size, ...settings.window }\n }\n\n const settingsFile = await packager.getTempFile(\".json\")\n await writeFile(settingsFile, JSON.stringify(settings, null, 2))\n\n const dmgbuild = await getDmgVendorPath()\n await exec(dmgbuild, [\"-s\", settingsFile, path.basename(volumePath), artifactPath], {\n env: {\n ...process.env,\n PYTHONIOENCODING: \"utf8\",\n },\n })\n\n // effectiveOptionComputed, when present, is purely for verifying result during test execution\n return (\n packager.packagerOptions.effectiveOptionComputed == null ||\n (await attachAndExecute(artifactPath, false, true, async volumePath => {\n return !(await packager.packagerOptions.effectiveOptionComputed!({\n volumePath,\n specification: {\n ...specification,\n // clean up `contents` for test snapshot verification since app path is absolute to a unique tmp dir\n contents: specification.contents?.map((c: any) => ({\n ...c,\n path: path.extname(c.path ?? \"\") === \".app\" ? path.relative(packager.projectDir, c.path) : c.path,\n })),\n },\n packager,\n }))\n }))\n )\n}\n\nexport async function transformBackgroundFileIfNeed(file: string, tmpDir: TmpDir): Promise<string> {\n if (path.extname(file.toLowerCase()) === \".tiff\") {\n return file\n }\n\n const retinaFile = file.replace(/\\.([a-z]+)$/, \"@2x.$1\")\n if (await exists(retinaFile)) {\n const tiffFile = await tmpDir.getTempFile({ suffix: \".tiff\" })\n await exec(\"tiffutil\", [\"-cathidpicheck\", file, retinaFile, \"-out\", tiffFile])\n return tiffFile\n }\n\n return file\n}\n\nexport async function getImageSizeUsingSips(background: string) {\n const stdout = await exec(\"sips\", [\"-g\", \"pixelHeight\", \"-g\", \"pixelWidth\", background])\n\n let width = 0\n let height = 0\n\n const re = /([a-zA-Z]+):\\s*(\\d+)/\n const lines = stdout.split(\"\\n\")\n\n for (const line of lines) {\n const match = re.exec(line)\n if (!match) {\n continue\n }\n\n const key = match[1]\n const value = parseInt(match[2], 10)\n\n if (isNaN(value)) {\n throw new Error(`Failed to parse number from line: \"${line}\"`)\n }\n\n if (key === \"pixelWidth\") {\n width = value\n } else if (key === \"pixelHeight\") {\n height = value\n }\n }\n\n return { width, height }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dmg-builder",
3
- "version": "26.5.0",
3
+ "version": "26.7.0",
4
4
  "main": "out/dmgUtil.js",
5
5
  "author": "Vladimir Krivosheev",
6
6
  "license": "MIT",
@@ -13,14 +13,13 @@
13
13
  "homepage": "https://github.com/electron-userland/electron-builder",
14
14
  "files": [
15
15
  "out",
16
- "templates",
17
- "vendor"
16
+ "templates"
18
17
  ],
19
18
  "dependencies": {
20
19
  "fs-extra": "^10.1.0",
21
20
  "iconv-lite": "^0.6.2",
22
21
  "js-yaml": "^4.1.0",
23
- "app-builder-lib": "26.5.0",
22
+ "app-builder-lib": "26.7.0",
24
23
  "builder-util": "26.4.1"
25
24
  },
26
25
  "optionalDependencies": {