app-builder-lib 26.10.0 → 26.11.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.
Files changed (90) hide show
  1. package/out/ProtonFramework.d.ts +1 -1
  2. package/out/ProtonFramework.js +2 -2
  3. package/out/ProtonFramework.js.map +1 -1
  4. package/out/configuration.d.ts +95 -65
  5. package/out/configuration.js.map +1 -1
  6. package/out/core.d.ts +2 -2
  7. package/out/core.js.map +1 -1
  8. package/out/electron/ElectronFramework.js +6 -3
  9. package/out/electron/ElectronFramework.js.map +1 -1
  10. package/out/frameworks/LibUiFramework.d.ts +3 -2
  11. package/out/frameworks/LibUiFramework.js +5 -2
  12. package/out/frameworks/LibUiFramework.js.map +1 -1
  13. package/out/index.d.ts +1 -1
  14. package/out/index.js.map +1 -1
  15. package/out/macPackager.js +12 -0
  16. package/out/macPackager.js.map +1 -1
  17. package/out/node-module-collector/moduleManager.d.ts +7 -1
  18. package/out/node-module-collector/moduleManager.js +9 -2
  19. package/out/node-module-collector/moduleManager.js.map +1 -1
  20. package/out/node-module-collector/nodeModulesCollector.js +3 -2
  21. package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
  22. package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +13 -0
  23. package/out/node-module-collector/pnpmNodeModulesCollector.js +54 -12
  24. package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  25. package/out/options/AppXOptions.d.ts +1 -1
  26. package/out/options/AppXOptions.js.map +1 -1
  27. package/out/options/PlatformSpecificBuildOptions.d.ts +31 -11
  28. package/out/options/PlatformSpecificBuildOptions.js.map +1 -1
  29. package/out/options/SnapOptions.d.ts +1 -1
  30. package/out/options/SnapOptions.js.map +1 -1
  31. package/out/options/linuxOptions.d.ts +38 -12
  32. package/out/options/linuxOptions.js.map +1 -1
  33. package/out/options/macOptions.d.ts +10 -7
  34. package/out/options/macOptions.js.map +1 -1
  35. package/out/options/metadata.d.ts +1 -2
  36. package/out/options/metadata.js.map +1 -1
  37. package/out/options/pkgOptions.d.ts +1 -1
  38. package/out/options/pkgOptions.js.map +1 -1
  39. package/out/options/winOptions.d.ts +15 -5
  40. package/out/options/winOptions.js.map +1 -1
  41. package/out/packager.js +2 -3
  42. package/out/packager.js.map +1 -1
  43. package/out/platformPackager.js +1 -1
  44. package/out/platformPackager.js.map +1 -1
  45. package/out/targets/FpmTarget.js +3 -2
  46. package/out/targets/FpmTarget.js.map +1 -1
  47. package/out/targets/LinuxTargetHelper.d.ts +4 -4
  48. package/out/targets/LinuxTargetHelper.js.map +1 -1
  49. package/out/targets/appimage/AppImageTarget.d.ts +1 -0
  50. package/out/targets/appimage/AppImageTarget.js +30 -10
  51. package/out/targets/appimage/AppImageTarget.js.map +1 -1
  52. package/out/targets/appimage/appImageUtil.d.ts +10 -2
  53. package/out/targets/appimage/appImageUtil.js +2 -5
  54. package/out/targets/appimage/appImageUtil.js.map +1 -1
  55. package/out/targets/archive.js +20 -6
  56. package/out/targets/archive.js.map +1 -1
  57. package/out/targets/nsis/NsisTarget.js +11 -11
  58. package/out/targets/nsis/NsisTarget.js.map +1 -1
  59. package/out/targets/nsis/nsisOptions.d.ts +20 -16
  60. package/out/targets/nsis/nsisOptions.js.map +1 -1
  61. package/out/targets/nsis/nsisScriptGenerator.d.ts +1 -0
  62. package/out/targets/nsis/nsisScriptGenerator.js +14 -1
  63. package/out/targets/nsis/nsisScriptGenerator.js.map +1 -1
  64. package/out/targets/nsis/nsisUtil.js +2 -1
  65. package/out/targets/nsis/nsisUtil.js.map +1 -1
  66. package/out/util/appBuilder.js +1 -1
  67. package/out/util/appBuilder.js.map +1 -1
  68. package/out/util/cacheState.d.ts +28 -0
  69. package/out/util/cacheState.js +143 -0
  70. package/out/util/cacheState.js.map +1 -0
  71. package/out/util/electronGet.d.ts +1 -1
  72. package/out/util/electronGet.js +81 -23
  73. package/out/util/electronGet.js.map +1 -1
  74. package/out/util/macroExpander.js +3 -0
  75. package/out/util/macroExpander.js.map +1 -1
  76. package/out/util/resEdit.d.ts +10 -0
  77. package/out/util/resEdit.js +48 -0
  78. package/out/util/resEdit.js.map +1 -0
  79. package/out/util/resolve.js +11 -1
  80. package/out/util/resolve.js.map +1 -1
  81. package/out/version.d.ts +1 -1
  82. package/out/version.js +1 -1
  83. package/out/version.js.map +1 -1
  84. package/out/vm/ParallelsVm.d.ts +16 -0
  85. package/out/vm/ParallelsVm.js +0 -1
  86. package/out/vm/ParallelsVm.js.map +1 -1
  87. package/out/winPackager.js +44 -42
  88. package/out/winPackager.js.map +1 -1
  89. package/package.json +8 -8
  90. package/scheme.json +611 -133
@@ -1 +1 @@
1
- {"version":3,"file":"nsisUtil.js","sourceRoot":"","sources":["../../../src/targets/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyFile, dirSize, isEmptyOrSpaces, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport * as zlib from \"zlib\"\nimport { getBinFromCustomLoc, getBinFromUrl } from \"../../binDownload\"\nimport { getTemplatePath } from \"../../util/pathManager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisTarget } from \"./NsisTarget\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport const NsisTargetOptions = (() => {\n let _resolve: (options: NsisOptions) => any\n const promise = new Promise<NsisOptions>(resolve => (_resolve = resolve))\n return {\n then: (callback: (options: NsisOptions) => any): Promise<string> => promise.then(callback),\n resolve: (options: NsisOptions): any => _resolve(options),\n }\n})()\n\nexport const NSIS_PATH = () => {\n const custom = process.env.ELECTRON_BUILDER_NSIS_DIR?.trim()\n if (!isEmptyOrSpaces(custom)) {\n log.info({ path: custom }, \"using local nsis\")\n return Promise.resolve(custom)\n }\n return NsisTargetOptions.then((options: NsisOptions) => {\n if (options.customNsisBinary) {\n const { checksum, url, version } = options.customNsisBinary\n if (checksum && url) {\n const binaryVersion = version || checksum.substr(0, 8)\n return getBinFromCustomLoc(\"nsis\", binaryVersion, url, checksum)\n }\n }\n // Warning: Don't use v3.0.4.2 - https://github.com/electron-userland/electron-builder/issues/6334\n return getBinFromUrl(\"nsis-3.0.4.1\", \"nsis-3.0.4.1.7z\", \"9877df902530f96357d13a7a31ae2b9df67f48b11ffc9a1700a7c961574ec5fa\")\n })\n}\n\nexport const NSIS_RESOURCES_PATH = () => {\n const custom = process.env.ELECTRON_BUILDER_NSIS_RESOURCES_DIR?.trim()\n if (!isEmptyOrSpaces(custom)) {\n log.info({ path: custom }, \"using local nsis-resources\")\n return Promise.resolve(custom)\n }\n return NsisTargetOptions.then((options: NsisOptions) => {\n if (options.customNsisResources) {\n const { checksum, url, version } = options.customNsisResources\n return getBinFromCustomLoc(\"nsis-resources\", version, url, checksum)\n }\n return getBinFromUrl(\"nsis-resources-3.4.1\", \"nsis-resources-3.4.1.7z\", \"593a9a92ef958321293ac6a2ee61e64bf1bd543142a5bd6b3d310709cc924103\")\n })\n}\n\nexport interface PackArchResult {\n fileInfo: PackageFileInfo\n unpackedSize: number\n}\n\nexport class AppPackageHelper {\n private readonly archToResult = new Map<Arch, Promise<PackArchResult>>()\n private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n /** @private */\n refCount = 0\n\n constructor(private readonly elevateHelper: CopyElevateHelper) {}\n\n async packArch(arch: Arch, target: NsisTarget): Promise<PackArchResult> {\n let resultPromise = this.archToResult.get(arch)\n if (resultPromise == null) {\n const appOutDir = target.archs.get(arch)!\n resultPromise = this.elevateHelper\n .copy(appOutDir, target)\n .then(() => target.buildAppPackage(appOutDir, arch))\n .then(async fileInfo => ({\n fileInfo,\n unpackedSize: await dirSize(appOutDir),\n }))\n this.archToResult.set(arch, resultPromise)\n }\n\n const result = await resultPromise\n const { fileInfo: info } = result\n if (target.isWebInstaller) {\n this.infoToIsDelete.set(info, false)\n } else if (!this.infoToIsDelete.has(info)) {\n this.infoToIsDelete.set(info, true)\n }\n return result\n }\n\n async finishBuild(): Promise<any> {\n if (--this.refCount > 0) {\n return\n }\n\n const filesToDelete: Array<string> = []\n for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n if (isDelete) {\n filesToDelete.push(info.path)\n }\n }\n\n await Promise.all(filesToDelete.map(it => fs.unlink(it)))\n }\n}\n\nexport class CopyElevateHelper {\n private readonly copied = new Map<string, Promise<any>>()\n\n copy(appOutDir: string, target: NsisTarget): Promise<any> {\n if (!target.packager.info.framework.isCopyElevateHelper) {\n return Promise.resolve()\n }\n\n let isPackElevateHelper = target.options.packElevateHelper\n if (isPackElevateHelper === false && target.options.perMachine === true) {\n isPackElevateHelper = true\n log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n }\n\n if (isPackElevateHelper === false) {\n return Promise.resolve()\n }\n\n let promise = this.copied.get(appOutDir)\n if (promise != null) {\n return promise\n }\n\n promise = NSIS_PATH().then(it => {\n const outFile = path.join(appOutDir, \"resources\", \"elevate.exe\")\n const promise = copyFile(path.join(it, \"elevate.exe\"), outFile, false)\n if (target.packager.platformSpecificBuildOptions.signAndEditExecutable !== false) {\n return promise.then(() => target.packager.signIf(outFile))\n }\n return promise\n })\n this.copied.set(appOutDir, promise)\n return promise\n }\n}\n\nclass BinaryReader {\n private readonly _buffer: Buffer\n private _position: number\n\n constructor(buffer: Buffer) {\n this._buffer = buffer\n this._position = 0\n }\n\n get length(): number {\n return this._buffer.length\n }\n\n get position(): number {\n return this._position\n }\n\n match(signature: Array<number>): boolean {\n if (signature.every((v, i) => this._buffer[this._position + i] === v)) {\n this._position += signature.length\n return true\n }\n return false\n }\n\n skip(offset: number) {\n this._position += offset\n }\n\n bytes(size: number): Buffer {\n const value = this._buffer.subarray(this._position, this._position + size)\n this._position += size\n return value\n }\n\n uint16(): number {\n const value = this._buffer[this._position] | (this._buffer[this._position + 1] << 8)\n this._position += 2\n return value\n }\n\n uint32(): number {\n return this.uint16() | (this.uint16() << 16)\n }\n\n string(length: number): string {\n let value = \"\"\n for (let i = 0; i < length; i++) {\n const c = this._buffer[this._position + i]\n if (c === 0x00) {\n break\n }\n value += String.fromCharCode(c)\n }\n this._position += length\n return value\n }\n}\n\nexport class UninstallerReader {\n // noinspection SpellCheckingInspection\n static async exec(installerPath: string, uninstallerPath: string) {\n const buffer = await fs.readFile(installerPath)\n const reader = new BinaryReader(buffer)\n // IMAGE_DOS_HEADER\n if (!reader.match([0x4d, 0x5a])) {\n throw new Error(\"Invalid 'MZ' signature.\")\n }\n reader.skip(58)\n // e_lfanew\n reader.skip(reader.uint32() - reader.position)\n // IMAGE_FILE_HEADER\n if (!reader.match([0x50, 0x45, 0x00, 0x00])) {\n throw new Error(\"Invalid 'PE' signature.\")\n }\n reader.skip(2)\n const numberOfSections = reader.uint16()\n reader.skip(12)\n const sizeOfOptionalHeader = reader.uint16()\n reader.skip(2)\n reader.skip(sizeOfOptionalHeader)\n // IMAGE_SECTION_HEADER\n let nsisOffset = 0\n for (let i = 0; i < numberOfSections; i++) {\n const name = reader.string(8)\n reader.skip(8)\n const rawSize = reader.uint32()\n const rawPointer = reader.uint32()\n reader.skip(16)\n switch (name) {\n case \".text\":\n case \".rdata\":\n case \".data\":\n case \".rsrc\": {\n nsisOffset = Math.max(rawPointer + rawSize, nsisOffset)\n break\n }\n default: {\n if (rawPointer !== 0 && rawSize !== 0) {\n throw new Error(\"Unsupported section '\" + name + \"'.\")\n }\n break\n }\n }\n }\n const executable = buffer.subarray(0, nsisOffset)\n const nsisSize = buffer.length - nsisOffset\n const nsisReader = new BinaryReader(buffer.subarray(nsisOffset, nsisOffset + nsisSize))\n const nsisSignature = [0xef, 0xbe, 0xad, 0xde, 0x4e, 0x75, 0x6c, 0x6c, 0x73, 0x6f, 0x66, 0x74, 0x49, 0x6e, 0x73, 0x74]\n nsisReader.uint32() // ?\n if (!nsisReader.match(nsisSignature)) {\n throw new Error(\"Invalid signature.\")\n }\n nsisReader.uint32() // ?\n if (nsisSize !== nsisReader.uint32()) {\n throw new Error(\"Size mismatch.\")\n }\n\n let innerBuffer = null\n while (true) {\n let size = nsisReader.uint32()\n const compressed = (size & 0x80000000) !== 0\n size = size & 0x7fffffff\n if (size === 0 || nsisReader.position + size > nsisReader.length || nsisReader.position >= nsisReader.length) {\n break\n }\n let buffer = nsisReader.bytes(size)\n if (compressed) {\n buffer = zlib.inflateRawSync(buffer)\n }\n const innerReader = new BinaryReader(buffer)\n innerReader.uint32() // ?\n if (innerReader.match(nsisSignature)) {\n if (innerBuffer) {\n throw new Error(\"Multiple inner blocks.\")\n }\n innerBuffer = buffer\n }\n }\n if (!innerBuffer) {\n throw new Error(\"Inner block not found.\")\n }\n await fs.writeFile(uninstallerPath, executable)\n await fs.appendFile(uninstallerPath, innerBuffer)\n }\n}\n"]}
1
+ {"version":3,"file":"nsisUtil.js","sourceRoot":"","sources":["../../../src/targets/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyFile, dirSize, isEmptyOrSpaces, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport * as zlib from \"zlib\"\nimport { getBinFromCustomLoc, getBinFromUrl } from \"../../binDownload\"\nimport { getTemplatePath } from \"../../util/pathManager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisTarget } from \"./NsisTarget\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport const NsisTargetOptions = (() => {\n let _resolve: (options: NsisOptions) => any\n const promise = new Promise<NsisOptions>(resolve => (_resolve = resolve))\n return {\n then: (callback: (options: NsisOptions) => any): Promise<string> => promise.then(callback),\n resolve: (options: NsisOptions): any => _resolve(options),\n }\n})()\n\nexport const NSIS_PATH = () => {\n const custom = process.env.ELECTRON_BUILDER_NSIS_DIR?.trim()\n if (!isEmptyOrSpaces(custom)) {\n log.info({ path: custom }, \"using local nsis\")\n return Promise.resolve(custom)\n }\n return NsisTargetOptions.then((options: NsisOptions) => {\n if (options.customNsisBinary) {\n const { checksum, url, version } = options.customNsisBinary\n if (checksum && url) {\n const binaryVersion = version || checksum.substr(0, 8)\n return getBinFromCustomLoc(\"nsis\", binaryVersion, url, checksum)\n }\n }\n // Warning: Don't use v3.0.4.2 - https://github.com/electron-userland/electron-builder/issues/6334\n return getBinFromUrl(\"nsis-3.0.4.1\", \"nsis-3.0.4.1.7z\", \"9877df902530f96357d13a7a31ae2b9df67f48b11ffc9a1700a7c961574ec5fa\")\n })\n}\n\nexport const NSIS_RESOURCES_PATH = () => {\n const custom = process.env.ELECTRON_BUILDER_NSIS_RESOURCES_DIR?.trim()\n if (!isEmptyOrSpaces(custom)) {\n log.info({ path: custom }, \"using local nsis-resources\")\n return Promise.resolve(custom)\n }\n return NsisTargetOptions.then((options: NsisOptions) => {\n if (options.customNsisResources) {\n const { checksum, url, version } = options.customNsisResources\n return getBinFromCustomLoc(\"nsis-resources\", version, url, checksum)\n }\n return getBinFromUrl(\"nsis-resources-3.4.1\", \"nsis-resources-3.4.1.7z\", \"593a9a92ef958321293ac6a2ee61e64bf1bd543142a5bd6b3d310709cc924103\")\n })\n}\n\nexport interface PackArchResult {\n fileInfo: PackageFileInfo\n unpackedSize: number\n}\n\nexport class AppPackageHelper {\n private readonly archToResult = new Map<Arch, Promise<PackArchResult>>()\n private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n /** @private */\n refCount = 0\n\n constructor(private readonly elevateHelper: CopyElevateHelper) {}\n\n async packArch(arch: Arch, target: NsisTarget): Promise<PackArchResult> {\n let resultPromise = this.archToResult.get(arch)\n if (resultPromise == null) {\n const appOutDir = target.archs.get(arch)!\n resultPromise = this.elevateHelper\n .copy(appOutDir, target)\n .then(() => target.buildAppPackage(appOutDir, arch))\n .then(async fileInfo => ({\n fileInfo,\n unpackedSize: await dirSize(appOutDir),\n }))\n this.archToResult.set(arch, resultPromise)\n }\n\n const result = await resultPromise\n const { fileInfo: info } = result\n if (target.isWebInstaller) {\n this.infoToIsDelete.set(info, false)\n } else if (!this.infoToIsDelete.has(info)) {\n this.infoToIsDelete.set(info, true)\n }\n return result\n }\n\n async finishBuild(): Promise<any> {\n if (--this.refCount > 0) {\n return\n }\n\n const filesToDelete: Array<string> = []\n for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n if (isDelete) {\n filesToDelete.push(info.path)\n }\n }\n\n await Promise.all(filesToDelete.map(it => fs.unlink(it)))\n }\n}\n\nexport class CopyElevateHelper {\n private readonly copied = new Map<string, Promise<any>>()\n\n copy(appOutDir: string, target: NsisTarget): Promise<any> {\n if (!target.packager.info.framework.isCopyElevateHelper) {\n return Promise.resolve()\n }\n\n let isPackElevateHelper = target.options.packElevateHelper\n if (isPackElevateHelper === false && target.options.perMachine === true) {\n isPackElevateHelper = true\n log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n }\n\n if (isPackElevateHelper === false) {\n return Promise.resolve()\n }\n\n let promise = this.copied.get(appOutDir)\n if (promise != null) {\n return promise\n }\n\n promise = NSIS_PATH().then(it => {\n const outFile = path.join(appOutDir, \"resources\", \"elevate.exe\")\n const promise = copyFile(path.join(it, \"elevate.exe\"), outFile, false)\n const { signAndEditExecutable, signExecutable } = target.packager.platformSpecificBuildOptions\n if (signAndEditExecutable !== false && signExecutable !== false) {\n return promise.then(() => target.packager.signIf(outFile))\n }\n return promise\n })\n this.copied.set(appOutDir, promise)\n return promise\n }\n}\n\nclass BinaryReader {\n private readonly _buffer: Buffer\n private _position: number\n\n constructor(buffer: Buffer) {\n this._buffer = buffer\n this._position = 0\n }\n\n get length(): number {\n return this._buffer.length\n }\n\n get position(): number {\n return this._position\n }\n\n match(signature: Array<number>): boolean {\n if (signature.every((v, i) => this._buffer[this._position + i] === v)) {\n this._position += signature.length\n return true\n }\n return false\n }\n\n skip(offset: number) {\n this._position += offset\n }\n\n bytes(size: number): Buffer {\n const value = this._buffer.subarray(this._position, this._position + size)\n this._position += size\n return value\n }\n\n uint16(): number {\n const value = this._buffer[this._position] | (this._buffer[this._position + 1] << 8)\n this._position += 2\n return value\n }\n\n uint32(): number {\n return this.uint16() | (this.uint16() << 16)\n }\n\n string(length: number): string {\n let value = \"\"\n for (let i = 0; i < length; i++) {\n const c = this._buffer[this._position + i]\n if (c === 0x00) {\n break\n }\n value += String.fromCharCode(c)\n }\n this._position += length\n return value\n }\n}\n\nexport class UninstallerReader {\n // noinspection SpellCheckingInspection\n static async exec(installerPath: string, uninstallerPath: string) {\n const buffer = await fs.readFile(installerPath)\n const reader = new BinaryReader(buffer)\n // IMAGE_DOS_HEADER\n if (!reader.match([0x4d, 0x5a])) {\n throw new Error(\"Invalid 'MZ' signature.\")\n }\n reader.skip(58)\n // e_lfanew\n reader.skip(reader.uint32() - reader.position)\n // IMAGE_FILE_HEADER\n if (!reader.match([0x50, 0x45, 0x00, 0x00])) {\n throw new Error(\"Invalid 'PE' signature.\")\n }\n reader.skip(2)\n const numberOfSections = reader.uint16()\n reader.skip(12)\n const sizeOfOptionalHeader = reader.uint16()\n reader.skip(2)\n reader.skip(sizeOfOptionalHeader)\n // IMAGE_SECTION_HEADER\n let nsisOffset = 0\n for (let i = 0; i < numberOfSections; i++) {\n const name = reader.string(8)\n reader.skip(8)\n const rawSize = reader.uint32()\n const rawPointer = reader.uint32()\n reader.skip(16)\n switch (name) {\n case \".text\":\n case \".rdata\":\n case \".data\":\n case \".rsrc\": {\n nsisOffset = Math.max(rawPointer + rawSize, nsisOffset)\n break\n }\n default: {\n if (rawPointer !== 0 && rawSize !== 0) {\n throw new Error(\"Unsupported section '\" + name + \"'.\")\n }\n break\n }\n }\n }\n const executable = buffer.subarray(0, nsisOffset)\n const nsisSize = buffer.length - nsisOffset\n const nsisReader = new BinaryReader(buffer.subarray(nsisOffset, nsisOffset + nsisSize))\n const nsisSignature = [0xef, 0xbe, 0xad, 0xde, 0x4e, 0x75, 0x6c, 0x6c, 0x73, 0x6f, 0x66, 0x74, 0x49, 0x6e, 0x73, 0x74]\n nsisReader.uint32() // ?\n if (!nsisReader.match(nsisSignature)) {\n throw new Error(\"Invalid signature.\")\n }\n nsisReader.uint32() // ?\n if (nsisSize !== nsisReader.uint32()) {\n throw new Error(\"Size mismatch.\")\n }\n\n let innerBuffer = null\n while (true) {\n let size = nsisReader.uint32()\n const compressed = (size & 0x80000000) !== 0\n size = size & 0x7fffffff\n if (size === 0 || nsisReader.position + size > nsisReader.length || nsisReader.position >= nsisReader.length) {\n break\n }\n let buffer = nsisReader.bytes(size)\n if (compressed) {\n buffer = zlib.inflateRawSync(buffer)\n }\n const innerReader = new BinaryReader(buffer)\n innerReader.uint32() // ?\n if (innerReader.match(nsisSignature)) {\n if (innerBuffer) {\n throw new Error(\"Multiple inner blocks.\")\n }\n innerBuffer = buffer\n }\n }\n if (!innerBuffer) {\n throw new Error(\"Inner block not found.\")\n }\n await fs.writeFile(uninstallerPath, executable)\n await fs.appendFile(uninstallerPath, innerBuffer)\n }\n}\n"]}
@@ -22,7 +22,7 @@ function executeAppBuilderAndWriteJson(args, data, extraOptions = {}) {
22
22
  childProcess.stdin.end(JSON.stringify(data));
23
23
  }, {
24
24
  ...extraOptions,
25
- stdio: ["pipe", "pipe", process.stdout],
25
+ stdio: ["pipe", "pipe", builder_util_1.shouldDisableNonErrorLoggingVitest ? "pipe" : process.stdout],
26
26
  });
27
27
  }
28
28
  function objectToArgs(to, argNameToValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"appBuilder.js","sourceRoot":"","sources":["../../src/util/appBuilder.ts"],"names":[],"mappings":";;AAGA,0DAYC;AAED,sEAWC;AAED,oCAOC;AArCD,+CAAgD;AAGhD,SAAgB,uBAAuB,CAAI,IAAmB;IAC5D,OAAO,IAAA,gCAAiB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC9C,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAM,CAAA;QACjC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAA;QACnC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,OAAO,MAAM,SAAS,GAAG,CAAC,CAAA;QACtE,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAmB,EAAE,IAAS,EAAE,eAA6B,EAAE;IAC3G,OAAO,IAAA,gCAAiB,EACtB,IAAI,EACJ,YAAY,CAAC,EAAE;QACb,YAAY,CAAC,KAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/C,CAAC,EACD;QACE,GAAG,YAAY;QACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;KACxC,CACF,CAAA;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,EAAiB,EAAE,cAA6C;IAC3F,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { executeAppBuilder } from \"builder-util\"\nimport { SpawnOptions } from \"child_process\"\n\nexport function executeAppBuilderAsJson<T>(args: Array<string>): Promise<T> {\n return executeAppBuilder(args).then(rawResult => {\n if (rawResult === \"\") {\n return Object.create(null) as T\n }\n\n try {\n return JSON.parse(rawResult) as T\n } catch (e: any) {\n throw new Error(`Cannot parse result: ${e.message}: \"${rawResult}\"`)\n }\n })\n}\n\nexport function executeAppBuilderAndWriteJson(args: Array<string>, data: any, extraOptions: SpawnOptions = {}): Promise<string> {\n return executeAppBuilder(\n args,\n childProcess => {\n childProcess.stdin!.end(JSON.stringify(data))\n },\n {\n ...extraOptions,\n stdio: [\"pipe\", \"pipe\", process.stdout],\n }\n )\n}\n\nexport function objectToArgs(to: Array<string>, argNameToValue: Record<string, string | null>): void {\n for (const name of Object.keys(argNameToValue)) {\n const value = argNameToValue[name]\n if (value != null) {\n to.push(`--${name}`, value)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"appBuilder.js","sourceRoot":"","sources":["../../src/util/appBuilder.ts"],"names":[],"mappings":";;AAGA,0DAYC;AAED,sEAWC;AAED,oCAOC;AArCD,+CAAoF;AAGpF,SAAgB,uBAAuB,CAAI,IAAmB;IAC5D,OAAO,IAAA,gCAAiB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC9C,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAM,CAAA;QACjC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAA;QACnC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,OAAO,MAAM,SAAS,GAAG,CAAC,CAAA;QACtE,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAmB,EAAE,IAAS,EAAE,eAA6B,EAAE;IAC3G,OAAO,IAAA,gCAAiB,EACtB,IAAI,EACJ,YAAY,CAAC,EAAE;QACb,YAAY,CAAC,KAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/C,CAAC,EACD;QACE,GAAG,YAAY;QACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,iDAAkC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KACtF,CACF,CAAA;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,EAAiB,EAAE,cAA6C;IAC3F,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { executeAppBuilder, shouldDisableNonErrorLoggingVitest } from \"builder-util\"\nimport { SpawnOptions } from \"child_process\"\n\nexport function executeAppBuilderAsJson<T>(args: Array<string>): Promise<T> {\n return executeAppBuilder(args).then(rawResult => {\n if (rawResult === \"\") {\n return Object.create(null) as T\n }\n\n try {\n return JSON.parse(rawResult) as T\n } catch (e: any) {\n throw new Error(`Cannot parse result: ${e.message}: \"${rawResult}\"`)\n }\n })\n}\n\nexport function executeAppBuilderAndWriteJson(args: Array<string>, data: any, extraOptions: SpawnOptions = {}): Promise<string> {\n return executeAppBuilder(\n args,\n childProcess => {\n childProcess.stdin!.end(JSON.stringify(data))\n },\n {\n ...extraOptions,\n stdio: [\"pipe\", \"pipe\", shouldDisableNonErrorLoggingVitest ? \"pipe\" : process.stdout],\n }\n )\n}\n\nexport function objectToArgs(to: Array<string>, argNameToValue: Record<string, string | null>): void {\n for (const name of Object.keys(argNameToValue)) {\n const value = argNameToValue[name]\n if (value != null) {\n to.push(`--${name}`, value)\n }\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ export declare enum CacheState {
2
+ pending = "pending",
3
+ downloaded = "downloaded",
4
+ extracting = "extracting",
5
+ extracted = "extracted",
6
+ complete = "complete",
7
+ corrupted = "corrupted"
8
+ }
9
+ export interface CacheStateFile {
10
+ version: number;
11
+ state: CacheState;
12
+ timestamp: number;
13
+ fileCount: number;
14
+ extractedSize: number;
15
+ }
16
+ export declare function readCacheStateFile(extractDir: string): Promise<CacheStateFile | null>;
17
+ export declare function writeCacheState(extractDir: string, state: CacheState, metadata?: {
18
+ fileCount?: number;
19
+ extractedSize?: number;
20
+ }, throwOnError?: boolean): Promise<void>;
21
+ export declare function computeCacheMetadata(dir: string): Promise<{
22
+ fileCount: number;
23
+ extractedSize: number;
24
+ }>;
25
+ export declare function validateCacheDirectory(extractDir: string, expectedFileCount?: number): Promise<boolean>;
26
+ export declare function cleanupCacheDirectory(extractDir: string, { skipLockFiles }?: {
27
+ skipLockFiles?: boolean | undefined;
28
+ }): Promise<void>;
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheState = void 0;
4
+ exports.readCacheStateFile = readCacheStateFile;
5
+ exports.writeCacheState = writeCacheState;
6
+ exports.computeCacheMetadata = computeCacheMetadata;
7
+ exports.validateCacheDirectory = validateCacheDirectory;
8
+ exports.cleanupCacheDirectory = cleanupCacheDirectory;
9
+ const builder_util_1 = require("builder-util");
10
+ const fs = require("fs/promises");
11
+ const path = require("path");
12
+ var CacheState;
13
+ (function (CacheState) {
14
+ CacheState["pending"] = "pending";
15
+ CacheState["downloaded"] = "downloaded";
16
+ CacheState["extracting"] = "extracting";
17
+ CacheState["extracted"] = "extracted";
18
+ CacheState["complete"] = "complete";
19
+ CacheState["corrupted"] = "corrupted";
20
+ })(CacheState || (exports.CacheState = CacheState = {}));
21
+ const STATE_FILE_VERSION = 1;
22
+ const STALE_EXTRACTING_TIMEOUT_MS = 120000; // 120 seconds
23
+ function getStateFilePath(extractDir) {
24
+ return `${extractDir}.state`;
25
+ }
26
+ async function readCacheStateFile(extractDir) {
27
+ const stateFile = getStateFilePath(extractDir);
28
+ let content;
29
+ try {
30
+ content = await fs.readFile(stateFile, "utf-8");
31
+ }
32
+ catch (e) {
33
+ if (e.code !== "ENOENT") {
34
+ builder_util_1.log.warn({ stateFile, error: e.message }, "Failed to read cache state file");
35
+ }
36
+ return null;
37
+ }
38
+ try {
39
+ const data = JSON.parse(content);
40
+ if (data.version !== STATE_FILE_VERSION) {
41
+ builder_util_1.log.warn({ stateFile, version: data.version, expected: STATE_FILE_VERSION }, "Cache state file version mismatch, ignoring");
42
+ return null;
43
+ }
44
+ if (data.state === CacheState.extracting) {
45
+ const age = Date.now() - data.timestamp;
46
+ if (age > STALE_EXTRACTING_TIMEOUT_MS) {
47
+ builder_util_1.log.warn({ stateFile, age }, "Detected stale extracting state, marking as corrupted");
48
+ return { ...data, state: CacheState.corrupted };
49
+ }
50
+ }
51
+ return data;
52
+ }
53
+ catch (e) {
54
+ builder_util_1.log.warn({ stateFile, error: e.message }, "Failed to parse cache state file");
55
+ return null;
56
+ }
57
+ }
58
+ async function writeCacheState(extractDir, state, metadata, throwOnError = false) {
59
+ var _a, _b;
60
+ const stateFile = getStateFilePath(extractDir);
61
+ const stateData = {
62
+ version: STATE_FILE_VERSION,
63
+ state,
64
+ timestamp: Date.now(),
65
+ fileCount: (_a = metadata === null || metadata === void 0 ? void 0 : metadata.fileCount) !== null && _a !== void 0 ? _a : 0,
66
+ extractedSize: (_b = metadata === null || metadata === void 0 ? void 0 : metadata.extractedSize) !== null && _b !== void 0 ? _b : 0,
67
+ };
68
+ try {
69
+ await fs.writeFile(stateFile, JSON.stringify(stateData, null, 2), "utf-8");
70
+ }
71
+ catch (e) {
72
+ builder_util_1.log.warn({ stateFile, error: e.message }, "Failed to write cache state file");
73
+ if (throwOnError) {
74
+ throw e;
75
+ }
76
+ }
77
+ }
78
+ async function computeCacheMetadata(dir) {
79
+ let fileCount = 0;
80
+ let extractedSize = 0;
81
+ const stack = [dir];
82
+ while (stack.length > 0) {
83
+ const current = stack.pop();
84
+ let entries;
85
+ try {
86
+ entries = await fs.readdir(current, { withFileTypes: true });
87
+ }
88
+ catch {
89
+ continue;
90
+ }
91
+ for (const entry of entries) {
92
+ const fullPath = path.join(current, entry.name);
93
+ if (entry.isDirectory()) {
94
+ stack.push(fullPath);
95
+ }
96
+ else {
97
+ fileCount++;
98
+ if (entry.isFile()) {
99
+ try {
100
+ const stat = await fs.stat(fullPath);
101
+ extractedSize += stat.size;
102
+ }
103
+ catch {
104
+ // ignore stat errors for individual files
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return { fileCount, extractedSize };
111
+ }
112
+ async function validateCacheDirectory(extractDir, expectedFileCount) {
113
+ try {
114
+ const topLevel = await fs.readdir(extractDir);
115
+ if (topLevel.length === 0) {
116
+ return false;
117
+ }
118
+ if (expectedFileCount != null && expectedFileCount > 0) {
119
+ const { fileCount: actual } = await computeCacheMetadata(extractDir);
120
+ if (actual < expectedFileCount) {
121
+ builder_util_1.log.warn({ extractDir, expected: expectedFileCount, actual }, "Cache file count mismatch (fewer files than expected), treating as invalid");
122
+ return false;
123
+ }
124
+ }
125
+ return true;
126
+ }
127
+ catch (e) {
128
+ builder_util_1.log.warn({ extractDir, error: e.message }, "Failed to validate cache directory");
129
+ return false;
130
+ }
131
+ }
132
+ async function cleanupCacheDirectory(extractDir, { skipLockFiles = false } = {}) {
133
+ const filesToClean = [extractDir, `${extractDir}.state`, `${extractDir}.tmp`, ...(!skipLockFiles ? [`${extractDir}.lock`, `${extractDir}.tmp.lock`] : [])];
134
+ for (const file of filesToClean) {
135
+ try {
136
+ await fs.rm(file, { recursive: true, force: true });
137
+ }
138
+ catch (e) {
139
+ builder_util_1.log.warn({ file, error: e.message }, "Failed to clean up cache file");
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=cacheState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheState.js","sourceRoot":"","sources":["../../src/util/cacheState.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport * as fs from \"fs/promises\"\nimport * as path from \"path\"\n\nexport enum CacheState {\n pending = \"pending\",\n downloaded = \"downloaded\",\n extracting = \"extracting\",\n extracted = \"extracted\",\n complete = \"complete\",\n corrupted = \"corrupted\",\n}\n\nexport interface CacheStateFile {\n version: number\n state: CacheState\n timestamp: number\n fileCount: number\n extractedSize: number\n}\n\nconst STATE_FILE_VERSION = 1\nconst STALE_EXTRACTING_TIMEOUT_MS = 120000 // 120 seconds\n\nfunction getStateFilePath(extractDir: string): string {\n return `${extractDir}.state`\n}\n\nexport async function readCacheStateFile(extractDir: string): Promise<CacheStateFile | null> {\n const stateFile = getStateFilePath(extractDir)\n let content: string\n try {\n content = await fs.readFile(stateFile, \"utf-8\")\n } catch (e: any) {\n if (e.code !== \"ENOENT\") {\n log.warn({ stateFile, error: e.message }, \"Failed to read cache state file\")\n }\n return null\n }\n try {\n const data: CacheStateFile = JSON.parse(content)\n if (data.version !== STATE_FILE_VERSION) {\n log.warn({ stateFile, version: data.version, expected: STATE_FILE_VERSION }, \"Cache state file version mismatch, ignoring\")\n return null\n }\n if (data.state === CacheState.extracting) {\n const age = Date.now() - data.timestamp\n if (age > STALE_EXTRACTING_TIMEOUT_MS) {\n log.warn({ stateFile, age }, \"Detected stale extracting state, marking as corrupted\")\n return { ...data, state: CacheState.corrupted }\n }\n }\n return data\n } catch (e: any) {\n log.warn({ stateFile, error: e.message }, \"Failed to parse cache state file\")\n return null\n }\n}\n\nexport async function writeCacheState(extractDir: string, state: CacheState, metadata?: { fileCount?: number; extractedSize?: number }, throwOnError = false): Promise<void> {\n const stateFile = getStateFilePath(extractDir)\n const stateData: CacheStateFile = {\n version: STATE_FILE_VERSION,\n state,\n timestamp: Date.now(),\n fileCount: metadata?.fileCount ?? 0,\n extractedSize: metadata?.extractedSize ?? 0,\n }\n\n try {\n await fs.writeFile(stateFile, JSON.stringify(stateData, null, 2), \"utf-8\")\n } catch (e: any) {\n log.warn({ stateFile, error: e.message }, \"Failed to write cache state file\")\n if (throwOnError) {\n throw e\n }\n }\n}\n\nexport async function computeCacheMetadata(dir: string): Promise<{ fileCount: number; extractedSize: number }> {\n let fileCount = 0\n let extractedSize = 0\n const stack: string[] = [dir]\n while (stack.length > 0) {\n const current = stack.pop()!\n let entries\n try {\n entries = await fs.readdir(current, { withFileTypes: true })\n } catch {\n continue\n }\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n stack.push(fullPath)\n } else {\n fileCount++\n if (entry.isFile()) {\n try {\n const stat = await fs.stat(fullPath)\n extractedSize += stat.size\n } catch {\n // ignore stat errors for individual files\n }\n }\n }\n }\n }\n return { fileCount, extractedSize }\n}\n\nexport async function validateCacheDirectory(extractDir: string, expectedFileCount?: number): Promise<boolean> {\n try {\n const topLevel = await fs.readdir(extractDir)\n if (topLevel.length === 0) {\n return false\n }\n\n if (expectedFileCount != null && expectedFileCount > 0) {\n const { fileCount: actual } = await computeCacheMetadata(extractDir)\n if (actual < expectedFileCount) {\n log.warn({ extractDir, expected: expectedFileCount, actual }, \"Cache file count mismatch (fewer files than expected), treating as invalid\")\n return false\n }\n }\n\n return true\n } catch (e: any) {\n log.warn({ extractDir, error: e.message }, \"Failed to validate cache directory\")\n return false\n }\n}\n\nexport async function cleanupCacheDirectory(extractDir: string, { skipLockFiles = false } = {}): Promise<void> {\n const filesToClean = [extractDir, `${extractDir}.state`, `${extractDir}.tmp`, ...(!skipLockFiles ? [`${extractDir}.lock`, `${extractDir}.tmp.lock`] : [])]\n\n for (const file of filesToClean) {\n try {\n await fs.rm(file, { recursive: true, force: true })\n } catch (e: any) {\n log.warn({ file, error: e.message }, \"Failed to clean up cache file\")\n }\n }\n}\n"]}
@@ -30,7 +30,7 @@ export interface ElectronDownloadOptions {
30
30
  platform?: ElectronPlatformName;
31
31
  arch?: string;
32
32
  }
33
- export declare function getCacheDirectory(isAvoidSystemOnWindows?: boolean): string;
33
+ export declare function getCacheDirectory(isAvoidSystemOnWindows?: boolean, allowEnvVarOverride?: boolean): string;
34
34
  export declare function extractArchive(file: string, dir: string): Promise<void>;
35
35
  /**
36
36
  * Downloads a generic artifact (.tar.gz or .zip) from a GitHub release.
@@ -18,6 +18,7 @@ const lockfile = require("proper-lockfile");
18
18
  const promises_1 = require("stream/promises");
19
19
  const tar = require("tar");
20
20
  const unzipper = require("unzipper");
21
+ const cacheState_1 = require("./cacheState");
21
22
  function hashUrlSafe(input, length = 6) {
22
23
  let hash = 5381;
23
24
  for (let i = 0; i < input.length; i++) {
@@ -27,10 +28,10 @@ function hashUrlSafe(input, length = 6) {
27
28
  const out = hash.toString(36);
28
29
  return out.length >= length ? out.slice(0, length) : out.padStart(length, "0");
29
30
  }
30
- function getCacheDirectory(isAvoidSystemOnWindows = false) {
31
+ function getCacheDirectory(isAvoidSystemOnWindows = false, allowEnvVarOverride = true) {
31
32
  var _a, _b, _c, _d, _e;
32
33
  const env = (_a = process.env.ELECTRON_BUILDER_CACHE) === null || _a === void 0 ? void 0 : _a.trim();
33
- if (env && path.parse(env).root) {
34
+ if (allowEnvVarOverride && env && path.parse(env).root) {
34
35
  return env;
35
36
  }
36
37
  const appName = "electron-builder";
@@ -112,7 +113,7 @@ async function extractArchive(file, dir) {
112
113
  await fs.mkdir(tmpDir, { recursive: true });
113
114
  const release = await lockfile.lock(tmpDir, {
114
115
  retries: { retries: 5, minTimeout: 1000, maxTimeout: 5000 },
115
- stale: 60000,
116
+ stale: 120000, // Increased from 60s to allow long-running extractions
116
117
  });
117
118
  try {
118
119
  // rm + mkdir happen AFTER acquiring the lock so no concurrent caller can clear our tmpDir mid-extraction
@@ -125,11 +126,29 @@ async function extractArchive(file, dir) {
125
126
  await extractZipStreaming(file, tmpDir);
126
127
  }
127
128
  else if (file.endsWith(".7z")) {
128
- await (0, builder_util_1.exec)(await (0, builder_util_1.getPath7za)(), ["x", "-bd", file, `-o${tmpDir}`, "-y"]);
129
+ const cmd7za = await (0, builder_util_1.getPath7za)();
130
+ try {
131
+ await (0, builder_util_1.exec)(cmd7za, ["x", "-bd", file, `-o${tmpDir}`, "-y"]);
132
+ }
133
+ catch (e) {
134
+ // Check if extraction actually failed or just had benign warnings
135
+ const files = await fs.readdir(tmpDir);
136
+ if (files.length === 0) {
137
+ builder_util_1.log.warn({ file, tmpDir, error: e.message }, "7z extraction produced no output");
138
+ throw new Error(`7z extraction failed for ${file}: ${e.message}`);
139
+ }
140
+ // If files were extracted despite the error, log and continue
141
+ builder_util_1.log.warn({ error: e.message, filesExtracted: files.length }, "7z reported error but extracted files");
142
+ }
129
143
  }
130
144
  else {
131
145
  throw new Error(`Unsupported archive format: ${path.basename(file)}`);
132
146
  }
147
+ // Verify extraction produced files
148
+ const extractedFiles = await fs.readdir(tmpDir);
149
+ if (extractedFiles.length === 0) {
150
+ throw new Error(`Extraction of ${path.basename(file)} produced no files`);
151
+ }
133
152
  await fs.rm(dir, { recursive: true, force: true });
134
153
  await fs.rename(tmpDir, dir);
135
154
  }
@@ -138,17 +157,27 @@ async function extractArchive(file, dir) {
138
157
  }
139
158
  }
140
159
  async function downloadArtifactToFile(config, label) {
141
- const progress = process.stdout.isTTY ? new multiProgress_1.MultiProgress() : null;
142
- const progressBar = progress === null || progress === void 0 ? void 0 : progress.createBar(`${" ".repeat(builder_util_1.PADDING + 2)}[:bar] :percent | ${label}`, { total: 100 });
143
- progressBar === null || progressBar === void 0 ? void 0 : progressBar.render();
160
+ var _a, _b;
144
161
  let lastLoggedMilestone = -1;
162
+ const state = { bar: undefined };
145
163
  const downloadOptions = {
146
164
  timeout: { request: 10 * 60 * 1000 }, // prevent indefinite hang on stalled connections
147
165
  ...config.downloadOptions,
148
166
  getProgressCallback: info => {
167
+ // @electron/get passes downloadOptions (including this callback) to its internal
168
+ // SHASUMS256.txt validation download. That file is tiny (<1 MB) and fires at 100%
169
+ // immediately, producing a spurious bar even when the artifact itself is cached.
170
+ // Skip progress display for any download whose total size is known and small.
171
+ if (info.total && info.total < 1000000) {
172
+ return Promise.resolve();
173
+ }
174
+ if (!state.bar && process.stdout.isTTY) {
175
+ builder_util_1.log.info({ label }, "downloading");
176
+ state.bar = new multiProgress_1.MultiProgress().createBar(`${" ".repeat(builder_util_1.PADDING + 2)}[:bar] :percent | ${label}`, { total: 100 });
177
+ }
149
178
  const pct = info.percent != null ? Math.floor(info.percent * 100) : 0;
150
- if (progressBar) {
151
- progressBar.update(pct);
179
+ if (state.bar) {
180
+ state.bar.update(pct);
152
181
  }
153
182
  else {
154
183
  // log every 25% milestone for non-TTY environments (e.g. CI logs) to provide some visibility into download progress without overwhelming logs with too many updates
@@ -161,7 +190,6 @@ async function downloadArtifactToFile(config, label) {
161
190
  return Promise.resolve();
162
191
  },
163
192
  };
164
- builder_util_1.log.info({ label }, "downloading");
165
193
  const configWithProgress = { ...config, downloadOptions };
166
194
  try {
167
195
  let filePath;
@@ -180,11 +208,14 @@ async function downloadArtifactToFile(config, label) {
180
208
  builder_util_1.log.warn({ filePath, label }, "cached artifact missing from disk; retrying with cache write");
181
209
  filePath = await get.downloadArtifact({ ...configWithProgress, cacheMode: get_1.ElectronDownloadCacheMode.WriteOnly });
182
210
  }
211
+ if (!state.bar && lastLoggedMilestone === -1) {
212
+ builder_util_1.log.info({ label }, "using cached artifact");
213
+ }
183
214
  return filePath;
184
215
  }
185
216
  finally {
186
- progressBar === null || progressBar === void 0 ? void 0 : progressBar.update(100);
187
- progressBar === null || progressBar === void 0 ? void 0 : progressBar.terminate();
217
+ (_a = state.bar) === null || _a === void 0 ? void 0 : _a.update(100);
218
+ (_b = state.bar) === null || _b === void 0 ? void 0 : _b.terminate();
188
219
  }
189
220
  }
190
221
  /**
@@ -193,31 +224,58 @@ async function downloadArtifactToFile(config, label) {
193
224
  * Both public download functions delegate here after building their respective configs.
194
225
  */
195
226
  async function downloadAndExtract(config, extractDir, label) {
196
- const completeMarker = `${extractDir}.complete`;
197
- const isCached = async () => (0, builder_util_1.exists)(completeMarker);
198
227
  await fs.mkdir(extractDir, { recursive: true });
199
- if (await isCached()) {
200
- builder_util_1.log.debug({ file: label, path: extractDir }, "using cached artifact - skipping download/extract");
201
- return extractDir;
228
+ // Pre-lock fast path: only short-circuit for a definitively complete and valid cache.
229
+ // Do NOT clean up here — concurrent processes could race to delete under each other.
230
+ const stateData = await (0, cacheState_1.readCacheStateFile)(extractDir);
231
+ if ((stateData === null || stateData === void 0 ? void 0 : stateData.state) === cacheState_1.CacheState.complete) {
232
+ const isValid = await (0, cacheState_1.validateCacheDirectory)(extractDir, stateData.fileCount);
233
+ if (isValid) {
234
+ builder_util_1.log.debug({ file: label, path: extractDir }, "using cached artifact - cache valid");
235
+ return extractDir;
236
+ }
202
237
  }
203
238
  const release = await lockfile.lock(extractDir, {
204
239
  retries: { retries: 5, minTimeout: 1000, maxTimeout: 5000 },
205
- stale: 60000,
240
+ stale: 120000,
206
241
  });
207
242
  let downloadedFile = null;
208
243
  try {
209
244
  // Re-check after acquiring lock: another worker may have completed while we waited.
210
- if (await isCached()) {
211
- builder_util_1.log.debug({ file: label, path: extractDir }, "using cached artifact - skipping download/extract");
212
- return extractDir;
245
+ const stateDataAfterLock = await (0, cacheState_1.readCacheStateFile)(extractDir);
246
+ if ((stateDataAfterLock === null || stateDataAfterLock === void 0 ? void 0 : stateDataAfterLock.state) === cacheState_1.CacheState.complete) {
247
+ const isValid = await (0, cacheState_1.validateCacheDirectory)(extractDir, stateDataAfterLock.fileCount);
248
+ if (isValid) {
249
+ builder_util_1.log.debug({ file: label, path: extractDir }, "using cached artifact - skipping download/extract");
250
+ return extractDir;
251
+ }
252
+ builder_util_1.log.warn({ extractDir }, "Cache marked complete but files invalid, clearing");
253
+ }
254
+ else if ((stateDataAfterLock === null || stateDataAfterLock === void 0 ? void 0 : stateDataAfterLock.state) === cacheState_1.CacheState.corrupted) {
255
+ builder_util_1.log.warn({ extractDir }, "Corrupted cache detected, cleaning up and re-extracting");
213
256
  }
257
+ // Cleanup inside the lock — skip lock files since we currently hold them
258
+ await (0, cacheState_1.cleanupCacheDirectory)(extractDir, { skipLockFiles: true });
259
+ await fs.mkdir(extractDir, { recursive: true });
260
+ builder_util_1.log.debug({ file: label }, "downloading");
214
261
  downloadedFile = await downloadArtifactToFile(config, label);
262
+ if (!downloadedFile) {
263
+ throw new Error(`Failed to download artifact: ${label}`);
264
+ }
265
+ await (0, cacheState_1.writeCacheState)(extractDir, cacheState_1.CacheState.downloaded);
266
+ // Mark extracting so stale-lock detection can recover a crashed mid-extraction process
267
+ await (0, cacheState_1.writeCacheState)(extractDir, cacheState_1.CacheState.extracting);
268
+ // Extract while holding the lock to prevent concurrent interference
269
+ await extractArchive(downloadedFile, extractDir);
270
+ // Compute metadata with a full recursive walk now that tmpDir has been renamed to extractDir
271
+ const { fileCount, extractedSize } = await (0, cacheState_1.computeCacheMetadata)(extractDir);
272
+ // Write complete state with metadata BEFORE releasing the lock; throwOnError=true so a
273
+ // failed write (disk full, permissions) propagates instead of silently producing a no-op cache
274
+ await (0, cacheState_1.writeCacheState)(extractDir, cacheState_1.CacheState.complete, { fileCount, extractedSize }, true);
215
275
  }
216
276
  finally {
217
277
  await release().catch(err => builder_util_1.log.warn({ err }, "failed to release lockfile"));
218
278
  }
219
- await extractArchive(downloadedFile, extractDir);
220
- await fs.writeFile(completeMarker, "");
221
279
  return extractDir;
222
280
  }
223
281
  // ─── Public API ───────────────────────────────────────────────────────────────