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.
- package/out/ProtonFramework.d.ts +1 -1
- package/out/ProtonFramework.js +2 -2
- package/out/ProtonFramework.js.map +1 -1
- package/out/configuration.d.ts +95 -65
- package/out/configuration.js.map +1 -1
- package/out/core.d.ts +2 -2
- package/out/core.js.map +1 -1
- package/out/electron/ElectronFramework.js +6 -3
- package/out/electron/ElectronFramework.js.map +1 -1
- package/out/frameworks/LibUiFramework.d.ts +3 -2
- package/out/frameworks/LibUiFramework.js +5 -2
- package/out/frameworks/LibUiFramework.js.map +1 -1
- package/out/index.d.ts +1 -1
- package/out/index.js.map +1 -1
- package/out/macPackager.js +12 -0
- package/out/macPackager.js.map +1 -1
- package/out/node-module-collector/moduleManager.d.ts +7 -1
- package/out/node-module-collector/moduleManager.js +9 -2
- package/out/node-module-collector/moduleManager.js.map +1 -1
- package/out/node-module-collector/nodeModulesCollector.js +3 -2
- package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +13 -0
- package/out/node-module-collector/pnpmNodeModulesCollector.js +54 -12
- package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/out/options/AppXOptions.d.ts +1 -1
- package/out/options/AppXOptions.js.map +1 -1
- package/out/options/PlatformSpecificBuildOptions.d.ts +31 -11
- package/out/options/PlatformSpecificBuildOptions.js.map +1 -1
- package/out/options/SnapOptions.d.ts +1 -1
- package/out/options/SnapOptions.js.map +1 -1
- package/out/options/linuxOptions.d.ts +38 -12
- package/out/options/linuxOptions.js.map +1 -1
- package/out/options/macOptions.d.ts +10 -7
- package/out/options/macOptions.js.map +1 -1
- package/out/options/metadata.d.ts +1 -2
- package/out/options/metadata.js.map +1 -1
- package/out/options/pkgOptions.d.ts +1 -1
- package/out/options/pkgOptions.js.map +1 -1
- package/out/options/winOptions.d.ts +15 -5
- package/out/options/winOptions.js.map +1 -1
- package/out/packager.js +2 -3
- package/out/packager.js.map +1 -1
- package/out/platformPackager.js +1 -1
- package/out/platformPackager.js.map +1 -1
- package/out/targets/FpmTarget.js +3 -2
- package/out/targets/FpmTarget.js.map +1 -1
- package/out/targets/LinuxTargetHelper.d.ts +4 -4
- package/out/targets/LinuxTargetHelper.js.map +1 -1
- package/out/targets/appimage/AppImageTarget.d.ts +1 -0
- package/out/targets/appimage/AppImageTarget.js +30 -10
- package/out/targets/appimage/AppImageTarget.js.map +1 -1
- package/out/targets/appimage/appImageUtil.d.ts +10 -2
- package/out/targets/appimage/appImageUtil.js +2 -5
- package/out/targets/appimage/appImageUtil.js.map +1 -1
- package/out/targets/archive.js +20 -6
- package/out/targets/archive.js.map +1 -1
- package/out/targets/nsis/NsisTarget.js +11 -11
- package/out/targets/nsis/NsisTarget.js.map +1 -1
- package/out/targets/nsis/nsisOptions.d.ts +20 -16
- package/out/targets/nsis/nsisOptions.js.map +1 -1
- package/out/targets/nsis/nsisScriptGenerator.d.ts +1 -0
- package/out/targets/nsis/nsisScriptGenerator.js +14 -1
- package/out/targets/nsis/nsisScriptGenerator.js.map +1 -1
- package/out/targets/nsis/nsisUtil.js +2 -1
- package/out/targets/nsis/nsisUtil.js.map +1 -1
- package/out/util/appBuilder.js +1 -1
- package/out/util/appBuilder.js.map +1 -1
- package/out/util/cacheState.d.ts +28 -0
- package/out/util/cacheState.js +143 -0
- package/out/util/cacheState.js.map +1 -0
- package/out/util/electronGet.d.ts +1 -1
- package/out/util/electronGet.js +81 -23
- package/out/util/electronGet.js.map +1 -1
- package/out/util/macroExpander.js +3 -0
- package/out/util/macroExpander.js.map +1 -1
- package/out/util/resEdit.d.ts +10 -0
- package/out/util/resEdit.js +48 -0
- package/out/util/resEdit.js.map +1 -0
- package/out/util/resolve.js +11 -1
- package/out/util/resolve.js.map +1 -1
- package/out/version.d.ts +1 -1
- package/out/version.js +1 -1
- package/out/version.js.map +1 -1
- package/out/vm/ParallelsVm.d.ts +16 -0
- package/out/vm/ParallelsVm.js +0 -1
- package/out/vm/ParallelsVm.js.map +1 -1
- package/out/winPackager.js +44 -42
- package/out/winPackager.js.map +1 -1
- package/package.json +8 -8
- 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":";;;AAAA,+CAA4E;AAE5E,kCAAiC;AACjC,6BAA4B;AAC5B,6BAA4B;AAC5B,mDAAsE;AACtE,wDAAwD;AAI3C,QAAA,gBAAgB,GAAG,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAA;AAE1C,QAAA,iBAAiB,GAAG,CAAC,GAAG,EAAE;IACrC,IAAI,QAAuC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAc,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAA;IACzE,OAAO;QACL,IAAI,EAAE,CAAC,QAAuC,EAAmB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1F,OAAO,EAAE,CAAC,OAAoB,EAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KAC1D,CAAA;AACH,CAAC,CAAC,EAAE,CAAA;AAEG,MAAM,SAAS,GAAG,GAAG,EAAE;;IAC5B,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,yBAAyB,0CAAE,IAAI,EAAE,CAAA;IAC5D,IAAI,CAAC,IAAA,8BAAe,EAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,kBAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAA;QAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,OAAoB,EAAE,EAAE;QACrD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAA;YAC3D,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACtD,OAAO,IAAA,iCAAmB,EAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAClE,CAAC;QACH,CAAC;QACD,kGAAkG;QAClG,OAAO,IAAA,2BAAa,EAAC,cAAc,EAAE,iBAAiB,EAAE,kEAAkE,CAAC,CAAA;IAC7H,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAjBY,QAAA,SAAS,aAiBrB;AAEM,MAAM,mBAAmB,GAAG,GAAG,EAAE;;IACtC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,0CAAE,IAAI,EAAE,CAAA;IACtE,IAAI,CAAC,IAAA,8BAAe,EAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,kBAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAA;QACxD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,OAAoB,EAAE,EAAE;QACrD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAA;YAC9D,OAAO,IAAA,iCAAmB,EAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,IAAA,2BAAa,EAAC,sBAAsB,EAAE,yBAAyB,EAAE,kEAAkE,CAAC,CAAA;IAC7I,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAbY,QAAA,mBAAmB,uBAa/B;AAOD,MAAa,gBAAgB;IAO3B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;QAN5C,iBAAY,GAAG,IAAI,GAAG,EAAiC,CAAA;QACvD,mBAAc,GAAG,IAAI,GAAG,EAA4B,CAAA;QAErE,eAAe;QACf,aAAQ,GAAG,CAAC,CAAA;IAEoD,CAAC;IAEjE,KAAK,CAAC,QAAQ,CAAC,IAAU,EAAE,MAAkB;QAC3C,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAA;YACzC,aAAa,GAAG,IAAI,CAAC,aAAa;iBAC/B,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;iBACvB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;iBACnD,IAAI,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE,CAAC,CAAC;gBACvB,QAAQ;gBACR,YAAY,EAAE,MAAM,IAAA,sBAAO,EAAC,SAAS,CAAC;aACvC,CAAC,CAAC,CAAA;YACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAA;QAClC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;QACjC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACxB,OAAM;QACR,CAAC;QAED,MAAM,aAAa,GAAkB,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;CACF;AA/CD,4CA+CC;AAED,MAAa,iBAAiB;IAA9B;QACmB,WAAM,GAAG,IAAI,GAAG,EAAwB,CAAA;IAkC3D,CAAC;IAhCC,IAAI,CAAC,SAAiB,EAAE,MAAkB;QACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;YACxD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QAED,IAAI,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAA;QAC1D,IAAI,mBAAmB,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACxE,mBAAmB,GAAG,IAAI,CAAA;YAC1B,kBAAG,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;QAC3F,CAAC;QAED,IAAI,mBAAmB,KAAK,KAAK,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,OAAO,GAAG,IAAA,iBAAS,GAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;YAChE,MAAM,OAAO,GAAG,IAAA,uBAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YACtE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAA;YAC9F,IAAI,qBAAqB,KAAK,KAAK,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;gBAChE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;YAC5D,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACnC,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAnCD,8CAmCC;AAED,MAAM,YAAY;IAIhB,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;IACpB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,SAAwB;QAC5B,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAA;YAClC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;QAC1E,IAAI,CAAC,SAAS,IAAI,IAAI,CAAA;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,SAAS,IAAI,CAAC,CAAA;QACnB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;YAC1C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,MAAK;YACP,CAAC;YACD,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAED,MAAa,iBAAiB;IAC5B,uCAAuC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAqB,EAAE,eAAuB;QAC9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACf,WAAW;QACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC9C,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACf,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACjC,uBAAuB;QACvB,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACd,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;YAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;YAClC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACf,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,OAAO,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,OAAO,CAAC;gBACb,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC,CAAA;oBACvD,MAAK;gBACP,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,IAAI,UAAU,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;oBACxD,CAAC;oBACD,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,UAAU,CAAA;QAC3C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAA;QACvF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACtH,UAAU,CAAC,MAAM,EAAE,CAAA,CAAC,IAAI;QACxB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QACD,UAAU,CAAC,MAAM,EAAE,CAAA,CAAC,IAAI;QACxB,IAAI,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACnC,CAAC;QAED,IAAI,WAAW,GAAG,IAAI,CAAA;QACtB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAA;YAC9B,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAC5C,IAAI,GAAG,IAAI,GAAG,UAAU,CAAA;YACxB,IAAI,IAAI,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,GAAG,IAAI,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC7G,MAAK;YACP,CAAC;YACD,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YACtC,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;YAC5C,WAAW,CAAC,MAAM,EAAE,CAAA,CAAC,IAAI;YACzB,IAAI,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACrC,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;gBAC3C,CAAC;gBACD,WAAW,GAAG,MAAM,CAAA;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;QAC/C,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;IACnD,CAAC;CACF;AAtFD,8CAsFC","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"]}
|
package/out/util/appBuilder.js
CHANGED
|
@@ -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,+
|
|
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.
|
package/out/util/electronGet.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
151
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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:
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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 ───────────────────────────────────────────────────────────────
|