dmg-builder 26.5.0 → 26.6.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/dmgUtil.d.ts +2 -3
- package/out/dmgUtil.js +41 -23
- package/out/dmgUtil.js.map +1 -1
- package/package.json +3 -4
- package/vendor/biplist/__init__.py +0 -977
- package/vendor/dmgbuild/__init__.py +0 -5
- package/vendor/dmgbuild/__main__.py +0 -70
- package/vendor/dmgbuild/badge.py +0 -169
- package/vendor/dmgbuild/colors.py +0 -504
- package/vendor/dmgbuild/core.py +0 -963
- package/vendor/dmgbuild/licensing.py +0 -331
- package/vendor/dmgbuild/resources/builtin-arrow.tiff +0 -0
- package/vendor/ds_store/__init__.py +0 -5
- package/vendor/ds_store/__main__.py +0 -102
- package/vendor/ds_store/buddy.py +0 -486
- package/vendor/ds_store/store.py +0 -1262
- package/vendor/mac_alias/__init__.py +0 -47
- package/vendor/mac_alias/alias.py +0 -772
- package/vendor/mac_alias/bookmark.py +0 -677
- package/vendor/mac_alias/osx.py +0 -1074
- package/vendor/mac_alias/utils.py +0 -20
- package/vendor/run_dmgbuild.py +0 -14
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
|
|
6
|
-
export declare function
|
|
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
|
-
|
|
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.1.0
|
|
30
|
+
const releaseVersion = "9614277";
|
|
31
|
+
const arch = process.arch === "arm64" ? "arm64" : "x86_64";
|
|
32
|
+
const config = {
|
|
33
|
+
"dmgbuild-bundle-arm64-9614277.tar.gz": "28e11550cf990f78180a2d82090f35a24588beda3d9165098837714f90ee47ce",
|
|
34
|
+
"dmgbuild-bundle-x86_64-9614277.tar.gz": "4dbf1cc186af62921f8b6f4a5956b28d8622d211797a8b05eb75a260ee9c3fdb",
|
|
35
|
+
};
|
|
36
|
+
const filename = `dmgbuild-bundle-${arch}-${releaseVersion}.tar.gz`;
|
|
37
|
+
const file = await (0, binDownload_1.downloadArtifact)({
|
|
38
|
+
releaseName: "dmg-builder@1.1.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,11 +114,8 @@ 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"),
|
|
@@ -114,6 +130,16 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
|
|
|
114
130
|
// hide_extension: c.hideExtension,
|
|
115
131
|
}))) || [],
|
|
116
132
|
};
|
|
133
|
+
if (specification.badgeIcon) {
|
|
134
|
+
let badgeIcon = await packager.getResource(specification.badgeIcon);
|
|
135
|
+
if (badgeIcon && badgeIcon.toLowerCase().endsWith(".icon")) {
|
|
136
|
+
badgeIcon = await packager.generateIcnsFromIcon(badgeIcon);
|
|
137
|
+
}
|
|
138
|
+
settings["badge-icon"] = badgeIcon;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
settings.icon = await packager.getResource(specification.icon);
|
|
142
|
+
}
|
|
117
143
|
if (specification.backgroundColor != null || specification.background == null) {
|
|
118
144
|
settings["background-color"] = specification.backgroundColor || "#ffffff";
|
|
119
145
|
const window = specification.window;
|
|
@@ -131,8 +157,7 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
|
|
|
131
157
|
}
|
|
132
158
|
}
|
|
133
159
|
else {
|
|
134
|
-
settings.background =
|
|
135
|
-
delete settings["background-color"];
|
|
160
|
+
settings.background = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager);
|
|
136
161
|
}
|
|
137
162
|
if (!(0, builder_util_1.isEmptyOrSpaces)(settings.background)) {
|
|
138
163
|
const size = await getImageSizeUsingSips(settings.background);
|
|
@@ -140,15 +165,8 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
|
|
|
140
165
|
}
|
|
141
166
|
const settingsFile = await packager.getTempFile(".json");
|
|
142
167
|
await (0, fs_extra_1.writeFile)(settingsFile, JSON.stringify(settings, null, 2));
|
|
143
|
-
const
|
|
144
|
-
|
|
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,
|
|
168
|
+
const dmgbuild = await getDmgVendorPath();
|
|
169
|
+
await (0, builder_util_1.exec)(dmgbuild, ["-s", settingsFile, path.basename(volumePath), artifactPath], {
|
|
152
170
|
env: {
|
|
153
171
|
...process.env,
|
|
154
172
|
PYTHONIOENCODING: "utf8",
|
|
@@ -156,7 +174,7 @@ async function customizeDmg({ appPath, artifactPath, volumeName, specification,
|
|
|
156
174
|
});
|
|
157
175
|
// effectiveOptionComputed, when present, is purely for verifying result during test execution
|
|
158
176
|
return (packager.packagerOptions.effectiveOptionComputed == null ||
|
|
159
|
-
(await attachAndExecute(artifactPath, false, async (volumePath) => {
|
|
177
|
+
(await attachAndExecute(artifactPath, false, true, async (volumePath) => {
|
|
160
178
|
var _a;
|
|
161
179
|
return !(await packager.packagerOptions.effectiveOptionComputed({
|
|
162
180
|
volumePath,
|
package/out/dmgUtil.js.map
CHANGED
|
@@ -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.1.0\n const releaseVersion = \"9614277\"\n const arch = process.arch === \"arm64\" ? \"arm64\" : \"x86_64\"\n const config = {\n \"dmgbuild-bundle-arm64-9614277.tar.gz\": \"28e11550cf990f78180a2d82090f35a24588beda3d9165098837714f90ee47ce\",\n \"dmgbuild-bundle-x86_64-9614277.tar.gz\": \"4dbf1cc186af62921f8b6f4a5956b28d8622d211797a8b05eb75a260ee9c3fdb\",\n }\n const filename: keyof typeof config = `dmgbuild-bundle-${arch}-${releaseVersion}.tar.gz`\n const file = await downloadArtifact({\n releaseName: \"dmg-builder@1.1.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 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.
|
|
3
|
+
"version": "26.6.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.
|
|
22
|
+
"app-builder-lib": "26.6.0",
|
|
24
23
|
"builder-util": "26.4.1"
|
|
25
24
|
},
|
|
26
25
|
"optionalDependencies": {
|