{"version":3,"sources":["jsdelivr-header.js","/npm/dmg-builder@26.8.1/src/dmgUtil.ts"],"names":[],"mappings":"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","file":"/npm/dmg-builder@26.8.1/out/dmgUtil.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/dmg-builder@26.8.1/out/dmgUtil.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","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"]}