electron-updater 7.0.0-alpha.5 → 7.0.0-alpha.7

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This module allows you to automatically update your application. You only need to install this module and write two lines of code!
4
4
  To publish your updates you just need simple file hosting, it does not require a dedicated server.
5
5
 
6
- See [Auto Update](https://electron.build/auto-update) for more information.
6
+ See [Auto Update](https://electron.build/docs/features/auto-update) for more information.
7
7
 
8
8
  Supported OS:
9
9
  - macOS ([Squirrel.Mac](https://github.com/Squirrel/Squirrel.Mac)).
@@ -1 +1 @@
1
- {"version":3,"file":"NsisUpdater.d.ts","sourceRoot":"","sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA6F,MAAM,sBAAsB,CAAA;AAEnJ,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAI9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAQtD,qBAAa,WAAY,SAAQ,WAAW;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;gBAEb,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU;IAUhE,OAAO,CAAC,sCAAsC;IAe9C,SAAS,CAAC,0BAA0B,EAAE,yBAAyB,CACS;IAExE;;;OAGG;IACH,IAAI,yBAAyB,IAAI,yBAAyB,CAEzD;IAED,IAAI,yBAAyB,CAAC,KAAK,EAAE,yBAAyB,EAI7D;IAED,gBAAgB;IAChB,SAAS,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YA2ElF,eAAe;IAmB7B,SAAS,CAAC,gCAAgC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMzF,SAAS,KAAK,kCAAkC,IAAI,OAAO,CAE1D;IAED,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;YAyDvC,8BAA8B;CAiC7C"}
1
+ {"version":3,"file":"NsisUpdater.d.ts","sourceRoot":"","sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA6F,MAAM,sBAAsB,CAAA;AAEnJ,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAI9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAQtD,qBAAa,WAAY,SAAQ,WAAW;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;gBAEb,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU;IAUhE,OAAO,CAAC,sCAAsC;IAe9C,SAAS,CAAC,0BAA0B,EAAE,yBAAyB,CACS;IAExE;;;OAGG;IACH,IAAI,yBAAyB,IAAI,yBAAyB,CAEzD;IAED,IAAI,yBAAyB,CAAC,KAAK,EAAE,yBAAyB,EAI7D;IAED,gBAAgB;IAChB,SAAS,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YA2ElF,eAAe;IAwB7B,SAAS,CAAC,gCAAgC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMzF,SAAS,KAAK,kCAAkC,IAAI,OAAO,CAE1D;IAED,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;YAyDvC,8BAA8B;CAiC7C"}
@@ -113,12 +113,15 @@ export class NsisUpdater extends BaseUpdater {
113
113
  try {
114
114
  publisherName = (await this.configOnDisk.value).publisherName;
115
115
  if (publisherName == null) {
116
+ this._logger.warn("Signature verification of the downloaded update was skipped because no publisherName is present in app-update.yml. " +
117
+ "Sign your build so electron-builder can derive publisherName from the code signing certificate automatically, or set win.publisherName explicitly. " +
118
+ "This fail-open behavior is deprecated: electron-builder v28 will treat a missing publisherName as a verification failure (fail-closed).");
116
119
  return null;
117
120
  }
118
121
  }
119
122
  catch (e) {
120
123
  if (e.code === "ENOENT") {
121
- // no app-update.yml
124
+ // no app-update.yml at all (unpackaged/dev mode) — nothing to verify against, stay silent
122
125
  return null;
123
126
  }
124
127
  throw e;
@@ -1 +1 @@
1
- {"version":3,"file":"NsisUpdater.js","sourceRoot":"","sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\"\nimport { AllPublishOptions, newError, PackageFileInfo, CURRENT_APP_INSTALLER_FILE_NAME, CURRENT_APP_PACKAGE_FILE_NAME } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter.js\"\nimport { DownloadUpdateOptions } from \"./AppUpdater.js\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater.js\"\nimport { DifferentialDownloaderOptions } from \"./differentialDownloader/DifferentialDownloader.js\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js\"\nimport { DOWNLOAD_PROGRESS } from \"./types.js\"\nimport { VerifyUpdateCodeSignature } from \"./index.js\"\nimport { findFile, Provider } from \"./providers/Provider.js\"\nimport fsExtra from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier.js\"\nimport { URL } from \"url\"\n\nconst require = createRequire(import.meta.url)\n\nexport class NsisUpdater extends BaseUpdater {\n /**\n * Specify custom install directory path\n *\n */\n installDirectory?: string\n\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n this.seedWebInstallerDefaultFromPackageType()\n }\n\n // nsis-web installs self-identify via a `resources/package-type` marker written by the installer.\n // When present, pre-seed disableWebInstaller=false so web-installer updates work without the app\n // wiring the flag by hand. This is a default only — an explicit `autoUpdater.disableWebInstaller = …`\n // set later by the app still wins (the setter runs after construction). A plain `nsis` marker is left\n // untouched so the secure `?? true` default and the v27 grace-period warning stay intact.\n private seedWebInstallerDefaultFromPackageType(): void {\n try {\n const resourcesPath = process.resourcesPath\n if (!resourcesPath) {\n return\n }\n const packageTypePath = path.join(resourcesPath, \"package-type\")\n if (fsExtra.existsSync(packageTypePath) && fsExtra.readFileSync(packageTypePath, \"utf-8\").trim() === \"nsis-web\") {\n this.disableWebInstaller = false\n }\n } catch (_ignored) {\n // best-effort: a missing/unreadable marker just leaves the secure default in place\n }\n }\n\n protected _verifyUpdateCodeSignature: VerifyUpdateCodeSignature = (publisherNames: Array<string>, unescapedTempUpdateFile: string) =>\n verifySignature(publisherNames, unescapedTempUpdateFile, this._logger)\n\n /**\n * The verifyUpdateCodeSignature. You can pass [win-verify-signature](https://github.com/beyondkmp/win-verify-trust) or another custom verify function: ` (publisherName: string[], path: string) => Promise<string | null>`.\n * The default verify function uses [windowsExecutableCodeSignatureVerifier](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts)\n */\n get verifyUpdateCodeSignature(): VerifyUpdateCodeSignature {\n return this._verifyUpdateCodeSignature\n }\n\n set verifyUpdateCodeSignature(value: VerifyUpdateCodeSignature) {\n if (value) {\n this._verifyUpdateCodeSignature = value\n }\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n // Tri-state: `undefined` means the app never set disableWebInstaller (relies on the v27 default), `true`/`false` are explicit choices.\n const webInstallerExplicitlySet = downloadUpdateOptions.disableWebInstaller !== undefined\n const webInstallerDisabled = downloadUpdateOptions.disableWebInstaller ?? true\n\n if (isWebInstaller && webInstallerDisabled) {\n if (webInstallerExplicitlySet) {\n throw newError(\n `Unable to download new version ${downloadUpdateOptions.updateInfoAndProvider.info.version}. Web Installers are disabled`,\n \"ERR_UPDATER_WEB_INSTALLER_DISABLED\"\n )\n }\n // Grace period: the app receives a web-installer update but never opted in. Warn loudly and still download for now; v28 will fail-closed.\n this._logger.warn(\n \"Web installer packages are in use but disableWebInstaller was not explicitly set. v27 defaults to true (web installers disabled) and currently still downloads them with this warning; v28 will fail-closed and throw ERR_UPDATER_WEB_INSTALLER_DISABLED. To keep downloading web installers, set autoUpdater.disableWebInstaller = false. To accept the v28 default, set it to true (or remove the override).\"\n )\n }\n if (!isWebInstaller && webInstallerExplicitlySet && webInstallerDisabled === false) {\n this._logger.warn(\n \"disableWebInstaller is explicitly set to false, but a full installer (not a web installer) was downloaded. As of v27 web installers are opt-in (disabled by default); remove the override unless you intentionally publish NSIS web-installer packages.\"\n )\n }\n if (\n isWebInstaller ||\n downloadUpdateOptions.disableDifferentialDownload ||\n (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider, CURRENT_APP_INSTALLER_FILE_NAME))\n ) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(\n `New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`,\n \"ERR_UPDATER_INVALID_SIGNATURE\"\n )\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packageFile, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo.path), packageFile, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo.sha512,\n })\n } catch (e: any) {\n try {\n await fsExtra.unlink(packageFile)\n } catch (_ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n return null\n }\n } catch (e: any) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml\n return null\n }\n throw e\n }\n return await this._verifyUpdateCodeSignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile)\n }\n\n // the cached installer sat on disk since a previous launch, so its Authenticode signature is re-verified before an\n // install-on-next-launch is executed (same check as at download time)\n protected verifyInstallerSignatureOnLaunch(installerPath: string): Promise<string | null> {\n return this.verifySignature(installerPath)\n }\n\n // per-user NSIS installs run without an elevation prompt (per-machine installs are filtered separately via\n // isAdminRightsRequired), so the automatic install at startup is allowed\n protected get isAutoInstallOnNextLaunchSupported(): boolean {\n return true\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const installerPath = this.installerPath\n if (installerPath == null) {\n this.dispatchError(new Error(\"No update filepath provided, can't quit and install\"))\n return false\n }\n\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n if (this.installDirectory) {\n // maybe check if folder exists\n args.push(`/D=${this.installDirectory}`)\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n this.spawnLog(path.join(process.resourcesPath, \"elevate.exe\"), [installerPath].concat(args)).catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n this.spawnLog(installerPath, args).catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(\n `Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES, and will try to use electron.shell.openItem if ENOENT`\n )\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n } else if (errorCode === \"ENOENT\") {\n require(\"electron\")\n .shell.openPath(installerPath)\n .catch((err: Error) => this.dispatchError(err))\n } else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadWebPackage(\n downloadUpdateOptions: DownloadUpdateOptions,\n packageInfo: PackageFileInfo,\n packagePath: string,\n provider: Provider<any>\n ): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions).download()\n } catch (e: any) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n"]}
1
+ {"version":3,"file":"NsisUpdater.js","sourceRoot":"","sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAqB,QAAQ,EAAmB,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACnJ,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAE9D,OAAO,EAAE,8CAA8C,EAAE,MAAM,4EAA4E,CAAA;AAC3I,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,EAAE,QAAQ,EAAY,MAAM,yBAAyB,CAAA;AAC5D,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAC7E,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,MAAM,OAAO,WAAY,SAAQ,WAAW;IAO1C,YAAY,OAAkC,EAAE,GAAgB;QAC9D,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAwBX,+BAA0B,GAA8B,CAAC,cAA6B,EAAE,uBAA+B,EAAE,EAAE,CACnI,eAAe,CAAC,cAAc,EAAE,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAxBtE,IAAI,CAAC,sCAAsC,EAAE,CAAA;IAC/C,CAAC;IAED,kGAAkG;IAClG,iGAAiG;IACjG,sGAAsG;IACtG,sGAAsG;IACtG,0FAA0F;IAClF,sCAAsC;QAC5C,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;YAC3C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAM;YACR,CAAC;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;YAChE,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBAChH,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAA;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,mFAAmF;QACrF,CAAC;IACH,CAAC;IAKD;;;OAGG;IACH,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,0BAA0B,CAAA;IACxC,CAAC;IAED,IAAI,yBAAyB,CAAC,KAAgC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;QACzC,CAAC;IACH,CAAC;IAED,gBAAgB;IACN,gBAAgB,CAAC,qBAA4C;QACrE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,QAAQ,CAAA;QACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAE,CAAA;QAC1G,OAAO,IAAI,CAAC,eAAe,CAAC;YAC1B,aAAa,EAAE,KAAK;YACpB,qBAAqB;YACrB,QAAQ;YACR,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gBAChF,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;gBACxC,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,CAAA;gBACjE,uIAAuI;gBACvI,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,mBAAmB,KAAK,SAAS,CAAA;gBACzF,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,mBAAmB,IAAI,IAAI,CAAA;gBAE9E,IAAI,cAAc,IAAI,oBAAoB,EAAE,CAAC;oBAC3C,IAAI,yBAAyB,EAAE,CAAC;wBAC9B,MAAM,QAAQ,CACZ,kCAAkC,qBAAqB,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,+BAA+B,EACzH,oCAAoC,CACrC,CAAA;oBACH,CAAC;oBACD,0IAA0I;oBAC1I,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,gZAAgZ,CACjZ,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,cAAc,IAAI,yBAAyB,IAAI,oBAAoB,KAAK,KAAK,EAAE,CAAC;oBACnF,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,yPAAyP,CAC1P,CAAA;gBACH,CAAC;gBACD,IACE,cAAc;oBACd,qBAAqB,CAAC,2BAA2B;oBACjD,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,EAAE,eAAe,EAAE,QAAQ,EAAE,+BAA+B,CAAC,CAAC,EACvI,CAAC;oBACD,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,CAAC,CAAA;gBAClF,CAAC;gBAED,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;gBAC/E,IAAI,2BAA2B,IAAI,IAAI,EAAE,CAAC;oBACxC,MAAM,kBAAkB,EAAE,CAAA;oBAC1B,yCAAyC;oBACzC,MAAM,QAAQ,CACZ,eAAe,qBAAqB,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,4CAA4C,2BAA2B,EAAE,EAChJ,+BAA+B,CAChC,CAAA;gBACH,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,MAAM,IAAI,CAAC,8BAA8B,CAAC,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;wBACzG,IAAI,CAAC;4BACH,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE;gCACvE,OAAO,EAAE,qBAAqB,CAAC,cAAc;gCAC7C,iBAAiB,EAAE,qBAAqB,CAAC,iBAAiB;gCAC1D,MAAM,EAAE,WAAW,CAAC,MAAM;6BAC3B,CAAC,CAAA;wBACJ,CAAC;wBAAC,OAAO,CAAM,EAAE,CAAC;4BAChB,IAAI,CAAC;gCACH,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;4BACnC,CAAC;4BAAC,OAAO,QAAQ,EAAE,CAAC;gCAClB,SAAS;4BACX,CAAC;4BAED,MAAM,CAAC,CAAA;wBACT,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAED,8DAA8D;IAC9D,kJAAkJ;IAClJ,kEAAkE;IAC1D,KAAK,CAAC,eAAe,CAAC,cAAsB;QAClD,IAAI,aAA4C,CAAA;QAChD,IAAI,CAAC;YACH,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,aAAa,CAAA;YAC7D,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,qHAAqH;oBACnH,qJAAqJ;oBACrJ,yIAAyI,CAC5I,CAAA;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxB,0FAA0F;gBAC1F,OAAO,IAAI,CAAA;YACb,CAAC;YACD,MAAM,CAAC,CAAA;QACT,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC,CAAA;IAC9H,CAAC;IAED,mHAAmH;IACnH,sEAAsE;IAC5D,gCAAgC,CAAC,aAAqB;QAC9D,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC;IAED,2GAA2G;IAC3G,yEAAyE;IACzE,IAAc,kCAAkC;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IAES,SAAS,CAAC,OAAuB;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;QACxC,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAA;YACpF,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;QAC1B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,+BAA+B;YAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAA;QACxG,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,2BAA2B;YAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,kBAAkB,GAAG,GAAS,EAAE;YACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QAChI,CAAC,CAAA;QAED,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;YAC1F,kBAAkB,EAAE,CAAA;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;YACpD,oEAAoE;YACpE,4GAA4G;YAC5G,MAAM,SAAS,GAAI,CAA2B,CAAC,IAAI,CAAA;YACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,qCAAqC,SAAS,qBAAqB,CAAC,CAAC,OAAO,0GAA0G,CACvL,CAAA;YACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACtD,kBAAkB,EAAE,CAAA;YACtB,CAAC;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,CAAC,UAAU,CAAC;qBAChB,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;qBAC7B,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,8BAA8B,CAC1C,qBAA4C,EAC5C,WAA4B,EAC5B,WAAmB,EACnB,QAAuB;QAEvB,IAAI,WAAW,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC;YACH,MAAM,eAAe,GAAkC;gBACrD,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;gBACjC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAuB,CAAC,QAAQ,EAAE,6BAA6B,CAAC;gBACxF,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,OAAO,EAAE,WAAW;gBACpB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB;gBAC7D,iBAAiB,EAAE,qBAAqB,CAAC,iBAAiB;aAC3D,CAAA;YAED,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,eAAe,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;YACrE,CAAC;YAED,MAAM,IAAI,8CAA8C,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAA;QACtH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;YAChG,mEAAmE;YACnE,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;QACrC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF","sourcesContent":["import { createRequire } from \"node:module\"\nimport { AllPublishOptions, newError, PackageFileInfo, CURRENT_APP_INSTALLER_FILE_NAME, CURRENT_APP_PACKAGE_FILE_NAME } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter.js\"\nimport { DownloadUpdateOptions } from \"./AppUpdater.js\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater.js\"\nimport { DifferentialDownloaderOptions } from \"./differentialDownloader/DifferentialDownloader.js\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js\"\nimport { DOWNLOAD_PROGRESS } from \"./types.js\"\nimport { VerifyUpdateCodeSignature } from \"./index.js\"\nimport { findFile, Provider } from \"./providers/Provider.js\"\nimport fsExtra from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier.js\"\nimport { URL } from \"url\"\n\nconst require = createRequire(import.meta.url)\n\nexport class NsisUpdater extends BaseUpdater {\n /**\n * Specify custom install directory path\n *\n */\n installDirectory?: string\n\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n this.seedWebInstallerDefaultFromPackageType()\n }\n\n // nsis-web installs self-identify via a `resources/package-type` marker written by the installer.\n // When present, pre-seed disableWebInstaller=false so web-installer updates work without the app\n // wiring the flag by hand. This is a default only — an explicit `autoUpdater.disableWebInstaller = …`\n // set later by the app still wins (the setter runs after construction). A plain `nsis` marker is left\n // untouched so the secure `?? true` default and the v27 grace-period warning stay intact.\n private seedWebInstallerDefaultFromPackageType(): void {\n try {\n const resourcesPath = process.resourcesPath\n if (!resourcesPath) {\n return\n }\n const packageTypePath = path.join(resourcesPath, \"package-type\")\n if (fsExtra.existsSync(packageTypePath) && fsExtra.readFileSync(packageTypePath, \"utf-8\").trim() === \"nsis-web\") {\n this.disableWebInstaller = false\n }\n } catch (_ignored) {\n // best-effort: a missing/unreadable marker just leaves the secure default in place\n }\n }\n\n protected _verifyUpdateCodeSignature: VerifyUpdateCodeSignature = (publisherNames: Array<string>, unescapedTempUpdateFile: string) =>\n verifySignature(publisherNames, unescapedTempUpdateFile, this._logger)\n\n /**\n * The verifyUpdateCodeSignature. You can pass [win-verify-signature](https://github.com/beyondkmp/win-verify-trust) or another custom verify function: ` (publisherName: string[], path: string) => Promise<string | null>`.\n * The default verify function uses [windowsExecutableCodeSignatureVerifier](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/src/windowsExecutableCodeSignatureVerifier.ts)\n */\n get verifyUpdateCodeSignature(): VerifyUpdateCodeSignature {\n return this._verifyUpdateCodeSignature\n }\n\n set verifyUpdateCodeSignature(value: VerifyUpdateCodeSignature) {\n if (value) {\n this._verifyUpdateCodeSignature = value\n }\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n // Tri-state: `undefined` means the app never set disableWebInstaller (relies on the v27 default), `true`/`false` are explicit choices.\n const webInstallerExplicitlySet = downloadUpdateOptions.disableWebInstaller !== undefined\n const webInstallerDisabled = downloadUpdateOptions.disableWebInstaller ?? true\n\n if (isWebInstaller && webInstallerDisabled) {\n if (webInstallerExplicitlySet) {\n throw newError(\n `Unable to download new version ${downloadUpdateOptions.updateInfoAndProvider.info.version}. Web Installers are disabled`,\n \"ERR_UPDATER_WEB_INSTALLER_DISABLED\"\n )\n }\n // Grace period: the app receives a web-installer update but never opted in. Warn loudly and still download for now; v28 will fail-closed.\n this._logger.warn(\n \"Web installer packages are in use but disableWebInstaller was not explicitly set. v27 defaults to true (web installers disabled) and currently still downloads them with this warning; v28 will fail-closed and throw ERR_UPDATER_WEB_INSTALLER_DISABLED. To keep downloading web installers, set autoUpdater.disableWebInstaller = false. To accept the v28 default, set it to true (or remove the override).\"\n )\n }\n if (!isWebInstaller && webInstallerExplicitlySet && webInstallerDisabled === false) {\n this._logger.warn(\n \"disableWebInstaller is explicitly set to false, but a full installer (not a web installer) was downloaded. As of v27 web installers are opt-in (disabled by default); remove the override unless you intentionally publish NSIS web-installer packages.\"\n )\n }\n if (\n isWebInstaller ||\n downloadUpdateOptions.disableDifferentialDownload ||\n (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider, CURRENT_APP_INSTALLER_FILE_NAME))\n ) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(\n `New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`,\n \"ERR_UPDATER_INVALID_SIGNATURE\"\n )\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packageFile, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo.path), packageFile, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo.sha512,\n })\n } catch (e: any) {\n try {\n await fsExtra.unlink(packageFile)\n } catch (_ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n this._logger.warn(\n \"Signature verification of the downloaded update was skipped because no publisherName is present in app-update.yml. \" +\n \"Sign your build so electron-builder can derive publisherName from the code signing certificate automatically, or set win.publisherName explicitly. \" +\n \"This fail-open behavior is deprecated: electron-builder v28 will treat a missing publisherName as a verification failure (fail-closed).\"\n )\n return null\n }\n } catch (e: any) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml at all (unpackaged/dev mode) — nothing to verify against, stay silent\n return null\n }\n throw e\n }\n return await this._verifyUpdateCodeSignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile)\n }\n\n // the cached installer sat on disk since a previous launch, so its Authenticode signature is re-verified before an\n // install-on-next-launch is executed (same check as at download time)\n protected verifyInstallerSignatureOnLaunch(installerPath: string): Promise<string | null> {\n return this.verifySignature(installerPath)\n }\n\n // per-user NSIS installs run without an elevation prompt (per-machine installs are filtered separately via\n // isAdminRightsRequired), so the automatic install at startup is allowed\n protected get isAutoInstallOnNextLaunchSupported(): boolean {\n return true\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const installerPath = this.installerPath\n if (installerPath == null) {\n this.dispatchError(new Error(\"No update filepath provided, can't quit and install\"))\n return false\n }\n\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n if (this.installDirectory) {\n // maybe check if folder exists\n args.push(`/D=${this.installDirectory}`)\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n this.spawnLog(path.join(process.resourcesPath, \"elevate.exe\"), [installerPath].concat(args)).catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n this.spawnLog(installerPath, args).catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(\n `Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES, and will try to use electron.shell.openItem if ENOENT`\n )\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n } else if (errorCode === \"ENOENT\") {\n require(\"electron\")\n .shell.openPath(installerPath)\n .catch((err: Error) => this.dispatchError(err))\n } else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadWebPackage(\n downloadUpdateOptions: DownloadUpdateOptions,\n packageInfo: PackageFileInfo,\n packagePath: string,\n provider: Provider<any>\n ): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions).download()\n } catch (e: any) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GitLabProvider.d.ts","sourceRoot":"","sources":["../../src/providers/GitLabProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EAIb,UAAU,EAGX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAA0D,QAAQ,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAExH,UAAU,gBAAiB,SAAQ,UAAU;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5B;AAED,qBAAa,cAAe,SAAQ,QAAQ,CAAC,gBAAgB,CAAC;IAwB1D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxB1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,mBAAmB,CAAgC;IAE3D;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iBAAiB;gBAKN,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,UAAU,EACpC,cAAc,EAAE,sBAAsB;IAcxC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,cAAc;IAM9F,OAAO,KAAK,OAAO,GAGlB;IAEK,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA0GnD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;YAYd,yBAAyB;IA+BvC;;OAEG;YACW,yBAAyB;IAevC;;OAEG;YACW,0BAA0B;IAoBlC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAyB1I,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAyBzE,QAAQ,IAAI,MAAM;CAGnB"}
1
+ {"version":3,"file":"GitLabProvider.d.ts","sourceRoot":"","sources":["../../src/providers/GitLabProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EAIb,UAAU,EAGX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAA0D,QAAQ,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAExH,UAAU,gBAAiB,SAAQ,UAAU;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5B;AAED,qBAAa,cAAe,SAAQ,QAAQ,CAAC,gBAAgB,CAAC;IAwB1D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxB1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,mBAAmB,CAAgC;IAE3D;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iBAAiB;gBAKN,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,UAAU,EACpC,cAAc,EAAE,sBAAsB;IAcxC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,cAAc;IAM9F,OAAO,KAAK,OAAO,GAGlB;IAEK,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2GnD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;YAYd,yBAAyB;IA+BvC;;OAEG;YACW,yBAAyB;IAevC;;OAEG;YACW,0BAA0B;IAoBlC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAyB1I,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAyBzE,QAAQ,IAAI,MAAM;CAGnB"}
@@ -83,7 +83,8 @@ export class GitLabProvider extends Provider {
83
83
  }
84
84
  channelFileUrl = new URL(channelAsset.direct_asset_url);
85
85
  const authHeaders = getGitlabAuthHeaders(this.options.token || null);
86
- const headers = Object.keys(authHeaders).length ? authHeaders : undefined;
86
+ const isSameOriginAsApi = channelFileUrl.protocol === this.baseApiUrl.protocol && channelFileUrl.host === this.baseApiUrl.host;
87
+ const headers = isSameOriginAsApi && Object.keys(authHeaders).length ? authHeaders : undefined;
87
88
  try {
88
89
  const result = await this.httpRequest(channelFileUrl, headers, cancellationToken);
89
90
  if (!result) {
@@ -1 +1 @@
1
- {"version":3,"file":"GitLabProvider.js","sourceRoot":"","sources":["../../src/providers/GitLabProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CancellationToken,\n getGitlabAuthHeaders,\n GitlabOptions,\n HttpError,\n newError,\n UpdateFileInfo,\n UpdateInfo,\n GitlabReleaseInfo,\n GitlabReleaseAsset,\n} from \"builder-util-runtime\"\nimport { OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { URL } from \"url\"\nimport escapeRegExp from \"lodash.escaperegexp\"\nimport { AppUpdater } from \"../AppUpdater.js\"\nimport { ResolvedUpdateFileInfo } from \"../types.js\"\nimport { getChannelFilename, newBaseUrl, newUrlFromBase } from \"../util.js\"\nimport { channelFileNotFoundError, getFileList, parseUpdateInfo, Provider, ProviderRuntimeOptions } from \"./Provider.js\"\n\ninterface GitlabUpdateInfo extends UpdateInfo {\n tag: string\n assets: Map<string, string> // filename -> download URL mapping\n}\n\nexport class GitLabProvider extends Provider<GitlabUpdateInfo> {\n private readonly baseApiUrl: URL\n // Cache the latest version info to avoid unnecessary HTTP requests\n private cachedLatestVersion: GitlabUpdateInfo | null = null\n\n /**\n * Normalizes filenames by replacing spaces and underscores with dashes.\n *\n * This is a workaround to handle filename formatting differences between tools:\n * - electron-builder formats filenames like \"test file.txt\" as \"test-file.txt\"\n * - GitLab may provide asset URLs using underscores, such as \"test_file.txt\"\n *\n * Because of this mismatch, we can't reliably extract the correct filename from\n * the asset path without normalization. This function ensures consistent matching\n * across different filename formats by converting all spaces and underscores to dashes.\n *\n * @param filename The filename to normalize\n * @returns The normalized filename with spaces and underscores replaced by dashes\n */\n private normalizeFilename(filename: string): string {\n return filename.replace(/ |_/g, \"-\")\n }\n\n constructor(\n private readonly options: GitlabOptions,\n private readonly updater: AppUpdater,\n runtimeOptions: ProviderRuntimeOptions\n ) {\n super({\n ...runtimeOptions,\n // GitLab might not support multiple range requests efficiently\n isUseMultipleRangeRequest: false,\n })\n\n const defaultHost = \"gitlab.com\"\n const host = options.host || defaultHost\n\n this.baseApiUrl = newBaseUrl(`https://${host}/api/v4`)\n }\n\n protected createRequestOptions(url: URL, headers?: OutgoingHttpHeaders | null): RequestOptions {\n const result = super.createRequestOptions(url, headers)\n ;(result as any).redirect = \"manual\"\n return result\n }\n\n private get channel(): string {\n const result = this.updater.channel || this.options.channel\n return result == null ? this.getDefaultChannelName() : this.getCustomChannelName(result)\n }\n\n async getLatestVersion(): Promise<GitlabUpdateInfo> {\n const cancellationToken = new CancellationToken()\n\n // Get latest release from GitLab API using the permalink/latest endpoint\n const latestReleaseUrl = newUrlFromBase(`projects/${this.options.projectId}/releases/permalink/latest`, this.baseApiUrl)\n\n const header = { Accept: \"application/json\", ...getGitlabAuthHeaders(this.options.token || null) }\n let releaseResponse: string | null\n try {\n releaseResponse = await this.httpRequest(latestReleaseUrl, header, cancellationToken)\n } catch (e: any) {\n throw newError(`Unable to find latest release on GitLab (${latestReleaseUrl}): ${e.stack || e.message}`, \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\")\n }\n\n if (!releaseResponse) {\n throw newError(\"No published releases on GitLab\", \"ERR_UPDATER_NO_PUBLISHED_VERSIONS\")\n }\n\n let latestRelease: GitlabReleaseInfo\n try {\n latestRelease = JSON.parse(releaseResponse)\n } catch (e: any) {\n throw newError(\n `Unable to parse latest release response from GitLab (${latestReleaseUrl}): response was not valid JSON: ${e.stack || e.message}`,\n \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\"\n )\n }\n\n if (latestRelease.upcoming_release) {\n throw newError(\"Latest GitLab release is scheduled but not yet published\", \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\")\n }\n\n const tag = latestRelease.tag_name\n\n // Look for channel file in release assets\n let rawData: string | null = null\n let channelFile = \"\"\n let channelFileUrl: URL | null = null\n\n const fetchChannelData = async (channelName: string): Promise<string> => {\n channelFile = getChannelFilename(channelName)\n\n // Find the channel file in GitLab release assets\n const channelAsset = latestRelease.assets.links.find(asset => asset.name === channelFile)\n\n if (!channelAsset) {\n throw newError(`Cannot find ${channelFile} in the latest release assets`, \"ERR_UPDATER_CHANNEL_FILE_NOT_FOUND\")\n }\n\n channelFileUrl = new URL(channelAsset.direct_asset_url)\n const authHeaders = getGitlabAuthHeaders(this.options.token || null)\n const headers = Object.keys(authHeaders).length ? authHeaders : undefined\n\n try {\n const result = await this.httpRequest(channelFileUrl, headers, cancellationToken)\n if (!result) {\n throw newError(`Empty response from ${channelFileUrl}`, \"ERR_UPDATER_CHANNEL_FILE_NOT_FOUND\")\n }\n return result\n } catch (e: any) {\n if (e instanceof HttpError && e.statusCode === 404) {\n throw channelFileNotFoundError(channelFile, channelFileUrl, e)\n }\n throw e\n }\n }\n\n try {\n rawData = await fetchChannelData(this.channel)\n } catch (e: any) {\n // If custom channel fails, try default channel as fallback\n if (this.channel !== this.getDefaultChannelName()) {\n rawData = await fetchChannelData(this.getDefaultChannelName())\n } else {\n throw e\n }\n }\n\n if (!rawData) {\n throw newError(`Unable to parse channel data from ${channelFile}`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n\n const result = parseUpdateInfo(rawData, channelFile, channelFileUrl!)\n\n // Set release name from GitLab if not present\n if (result.releaseName == null) {\n result.releaseName = latestRelease.name\n }\n\n // Set release notes from GitLab description if not present\n if (result.releaseNotes == null) {\n result.releaseNotes = latestRelease.description || null\n }\n\n const gitlabUpdateInfo = {\n tag: tag,\n assets: this.convertAssetsToMap(latestRelease.assets),\n ...result,\n }\n\n // Cache the latest version info\n this.cachedLatestVersion = gitlabUpdateInfo\n\n return gitlabUpdateInfo\n }\n\n /**\n * Utility function to convert GitlabReleaseAsset to Map<string, string>\n * Maps asset names to their download URLs\n */\n private convertAssetsToMap(assets: GitlabReleaseAsset): Map<string, string> {\n const assetsMap = new Map<string, string>()\n for (const asset of assets.links) {\n assetsMap.set(this.normalizeFilename(asset.name), asset.direct_asset_url)\n }\n return assetsMap\n }\n\n /**\n * Find blockmap file URL in assets map for a specific filename\n */\n private findBlockMapInAssets(assets: Map<string, string>, filename: string): URL | null {\n const possibleBlockMapNames = [`${filename}.blockmap`, `${this.normalizeFilename(filename)}.blockmap`]\n\n for (const blockMapName of possibleBlockMapNames) {\n const assetUrl = assets.get(blockMapName)\n if (assetUrl) {\n return new URL(assetUrl)\n }\n }\n return null\n }\n\n private async fetchReleaseInfoByVersion(version: string): Promise<GitlabReleaseInfo | null> {\n const cancellationToken = new CancellationToken()\n\n // Try v-prefixed version first, then fallback to plain version\n const possibleReleaseIds = [`v${version}`, version]\n\n for (const releaseId of possibleReleaseIds) {\n const releaseUrl = newUrlFromBase(`projects/${this.options.projectId}/releases/${encodeURIComponent(releaseId)}`, this.baseApiUrl)\n\n try {\n const header = { Accept: \"application/json\", ...getGitlabAuthHeaders(this.options.token || null) }\n const releaseResponse = await this.httpRequest(releaseUrl, header, cancellationToken)\n\n if (releaseResponse) {\n const release: GitlabReleaseInfo = JSON.parse(releaseResponse)\n return release\n }\n } catch (e: any) {\n // If it's a 404 error, try the next release ID format\n if (e instanceof HttpError && e.statusCode === 404) {\n continue\n }\n // For other errors, throw immediately\n throw newError(`Unable to find release ${releaseId} on GitLab (${releaseUrl}): ${e.stack || e.message}`, \"ERR_UPDATER_RELEASE_NOT_FOUND\")\n }\n }\n\n // If we get here, none of the release ID formats worked\n throw newError(`Unable to find release with version ${version} (tried: ${possibleReleaseIds.join(\", \")}) on GitLab`, \"ERR_UPDATER_RELEASE_NOT_FOUND\")\n }\n\n /**\n * Get version info for blockmap files, using cache when possible\n */\n private async getVersionInfoForBlockMap(version: string): Promise<Map<string, string> | null> {\n // Check if we can use cached version info\n if (this.cachedLatestVersion && this.cachedLatestVersion.version === version) {\n return this.cachedLatestVersion.assets\n }\n\n // Fetch version info if not cached or version doesn't match\n const versionInfo = await this.fetchReleaseInfoByVersion(version)\n if (versionInfo && versionInfo.assets) {\n return this.convertAssetsToMap(versionInfo.assets)\n }\n\n return null\n }\n\n /**\n * Find blockmap URLs from version assets\n */\n private async findBlockMapUrlsFromAssets(oldVersion: string, newVersion: string, baseFilename: string): Promise<[URL | null, URL | null]> {\n let newBlockMapUrl: URL | null = null\n let oldBlockMapUrl: URL | null = null\n\n // Get new version assets\n const newVersionAssets = await this.getVersionInfoForBlockMap(newVersion)\n if (newVersionAssets) {\n newBlockMapUrl = this.findBlockMapInAssets(newVersionAssets, baseFilename)\n }\n\n // Get old version assets\n const oldVersionAssets = await this.getVersionInfoForBlockMap(oldVersion)\n if (oldVersionAssets) {\n const oldFilename = baseFilename.replace(new RegExp(escapeRegExp(newVersion), \"g\"), oldVersion)\n oldBlockMapUrl = this.findBlockMapInAssets(oldVersionAssets, oldFilename)\n }\n\n return [oldBlockMapUrl, newBlockMapUrl]\n }\n\n async getBlockMapFiles(baseUrl: URL, oldVersion: string, newVersion: string, oldBlockMapFileBaseUrl: string | null = null): Promise<URL[]> {\n // If is `project_upload`, find blockmap files from corresponding gitLab assets\n // Because each asset has an unique path that includes an identified hash code,\n // e.g. https://gitlab.com/-/project/71361100/uploads/051f27a925eaf679f2ad688105362acc/latest.yml\n if (this.options.uploadTarget === \"project_upload\") {\n // Get the base filename from the URL to find corresponding blockmap files\n const baseFilename = baseUrl.pathname.split(\"/\").pop() || \"\"\n\n // Try to find blockmap files in GitLab assets\n const [oldBlockMapUrl, newBlockMapUrl] = await this.findBlockMapUrlsFromAssets(oldVersion, newVersion, baseFilename)\n\n if (!newBlockMapUrl) {\n throw newError(`Cannot find blockmap file for ${newVersion} in GitLab assets`, \"ERR_UPDATER_BLOCKMAP_FILE_NOT_FOUND\")\n }\n\n if (!oldBlockMapUrl) {\n throw newError(`Cannot find blockmap file for ${oldVersion} in GitLab assets`, \"ERR_UPDATER_BLOCKMAP_FILE_NOT_FOUND\")\n }\n\n return [oldBlockMapUrl, newBlockMapUrl]\n } else {\n return super.getBlockMapFiles(baseUrl, oldVersion, newVersion, oldBlockMapFileBaseUrl)\n }\n }\n\n resolveFiles(updateInfo: GitlabUpdateInfo): Array<ResolvedUpdateFileInfo> {\n return getFileList(updateInfo).map((fileInfo: UpdateFileInfo) => {\n // Try both original and normalized filename formats\n const possibleNames = [\n fileInfo.url, // Original filename\n this.normalizeFilename(fileInfo.url), // Normalized filename (spaces/underscores → dashes)\n ]\n\n const matchingAssetName = possibleNames.find(name => updateInfo.assets.has(name))\n const assetUrl = matchingAssetName ? updateInfo.assets.get(matchingAssetName) : undefined\n\n if (!assetUrl) {\n throw newError(\n `Cannot find asset \"${fileInfo.url}\" in GitLab release assets. Available assets: ${Array.from(updateInfo.assets.keys()).join(\", \")}`,\n \"ERR_UPDATER_ASSET_NOT_FOUND\"\n )\n }\n\n return {\n url: new URL(assetUrl),\n info: fileInfo,\n }\n })\n }\n\n toString(): string {\n return `GitLab (projectId: ${this.options.projectId}, channel: ${this.channel})`\n }\n}\n"]}
1
+ {"version":3,"file":"GitLabProvider.js","sourceRoot":"","sources":["../../src/providers/GitLabProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,SAAS,EACT,QAAQ,GAKT,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,YAAY,MAAM,qBAAqB,CAAA;AAG9C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAA0B,MAAM,eAAe,CAAA;AAOxH,MAAM,OAAO,cAAe,SAAQ,QAA0B;IAK5D;;;;;;;;;;;;;OAaG;IACK,iBAAiB,CAAC,QAAgB;QACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,YACmB,OAAsB,EACtB,OAAmB,EACpC,cAAsC;QAEtC,KAAK,CAAC;YACJ,GAAG,cAAc;YACjB,+DAA+D;YAC/D,yBAAyB,EAAE,KAAK;SACjC,CAAC,CAAA;QARe,YAAO,GAAP,OAAO,CAAe;QACtB,YAAO,GAAP,OAAO,CAAY;QAvBtC,mEAAmE;QAC3D,wBAAmB,GAA4B,IAAI,CAAA;QA+BzD,MAAM,WAAW,GAAG,YAAY,CAAA;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;QAExC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,WAAW,IAAI,SAAS,CAAC,CAAA;IACxD,CAAC;IAES,oBAAoB,CAAC,GAAQ,EAAE,OAAoC;QAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CACtD;QAAC,MAAc,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACpC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAY,OAAO;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;QAC3D,OAAO,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAC1F,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAEjD,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,cAAc,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,SAAS,4BAA4B,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAExH,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAA;QAClG,IAAI,eAA8B,CAAA;QAClC,IAAI,CAAC;YACH,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAA;QACvF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,CAAC,4CAA4C,gBAAgB,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,sCAAsC,CAAC,CAAA;QAClJ,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,QAAQ,CAAC,iCAAiC,EAAE,mCAAmC,CAAC,CAAA;QACxF,CAAC;QAED,IAAI,aAAgC,CAAA;QACpC,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,CACZ,wDAAwD,gBAAgB,mCAAmC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EACjI,sCAAsC,CACvC,CAAA;QACH,CAAC;QAED,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;YACnC,MAAM,QAAQ,CAAC,0DAA0D,EAAE,sCAAsC,CAAC,CAAA;QACpH,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAA;QAElC,0CAA0C;QAC1C,IAAI,OAAO,GAAkB,IAAI,CAAA;QACjC,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,IAAI,cAAc,GAAe,IAAI,CAAA;QAErC,MAAM,gBAAgB,GAAG,KAAK,EAAE,WAAmB,EAAmB,EAAE;YACtE,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;YAE7C,iDAAiD;YACjD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;YAEzF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,QAAQ,CAAC,eAAe,WAAW,+BAA+B,EAAE,oCAAoC,CAAC,CAAA;YACjH,CAAC;YAED,cAAc,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;YACvD,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;YACpE,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,KAAK,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAA;YAC9H,MAAM,OAAO,GAAG,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;YAE9F,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAA;gBACjF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,QAAQ,CAAC,uBAAuB,cAAc,EAAE,EAAE,oCAAoC,CAAC,CAAA;gBAC/F,CAAC;gBACD,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACnD,MAAM,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;gBAChE,CAAC;gBACD,MAAM,CAAC,CAAA;YACT,CAAC;QACH,CAAC,CAAA;QAED,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,2DAA2D;YAC3D,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;gBAClD,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAA;YAChE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAA;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,qCAAqC,WAAW,EAAE,EAAE,iCAAiC,CAAC,CAAA;QACvG,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,cAAe,CAAC,CAAA;QAErE,8CAA8C;QAC9C,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAA;QACzC,CAAC;QAED,2DAA2D;QAC3D,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,WAAW,IAAI,IAAI,CAAA;QACzD,CAAC;QAED,MAAM,gBAAgB,GAAG;YACvB,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC;YACrD,GAAG,MAAM;SACV,CAAA;QAED,gCAAgC;QAChC,IAAI,CAAC,mBAAmB,GAAG,gBAAgB,CAAA;QAE3C,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,MAA0B;QACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,MAA2B,EAAE,QAAgB;QACxE,MAAM,qBAAqB,GAAG,CAAC,GAAG,QAAQ,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAEtG,KAAK,MAAM,YAAY,IAAI,qBAAqB,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,OAAe;QACrD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAEjD,+DAA+D;QAC/D,MAAM,kBAAkB,GAAG,CAAC,IAAI,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAEnD,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,SAAS,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YAElI,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAA;gBAClG,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAA;gBAErF,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,OAAO,GAAsB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;oBAC9D,OAAO,OAAO,CAAA;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,sDAAsD;gBACtD,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACnD,SAAQ;gBACV,CAAC;gBACD,sCAAsC;gBACtC,MAAM,QAAQ,CAAC,0BAA0B,SAAS,eAAe,UAAU,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,+BAA+B,CAAC,CAAA;YAC3I,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,MAAM,QAAQ,CAAC,uCAAuC,OAAO,YAAY,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAA;IACvJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CAAC,OAAe;QACrD,0CAA0C;QAC1C,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7E,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAA;QACxC,CAAC;QAED,4DAA4D;QAC5D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAA;QACjE,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B,CAAC,UAAkB,EAAE,UAAkB,EAAE,YAAoB;QACnG,IAAI,cAAc,GAAe,IAAI,CAAA;QACrC,IAAI,cAAc,GAAe,IAAI,CAAA;QAErC,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAA;QACzE,IAAI,gBAAgB,EAAE,CAAC;YACrB,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;QAC5E,CAAC;QAED,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAA;QACzE,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;YAC/F,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAY,EAAE,UAAkB,EAAE,UAAkB,EAAE,yBAAwC,IAAI;QACvH,+EAA+E;QAC/E,+EAA+E;QAC/E,iGAAiG;QACjG,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,gBAAgB,EAAE,CAAC;YACnD,0EAA0E;YAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;YAE5D,8CAA8C;YAC9C,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;YAEpH,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,QAAQ,CAAC,iCAAiC,UAAU,mBAAmB,EAAE,qCAAqC,CAAC,CAAA;YACvH,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,QAAQ,CAAC,iCAAiC,UAAU,mBAAmB,EAAE,qCAAqC,CAAC,CAAA;YACvH,CAAC;YAED,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAED,YAAY,CAAC,UAA4B;QACvC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,QAAwB,EAAE,EAAE;YAC9D,oDAAoD;YACpD,MAAM,aAAa,GAAG;gBACpB,QAAQ,CAAC,GAAG,EAAE,oBAAoB;gBAClC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,oDAAoD;aAC3F,CAAA;YAED,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;YACjF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAEzF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,QAAQ,CACZ,sBAAsB,QAAQ,CAAC,GAAG,iDAAiD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpI,6BAA6B,CAC9B,CAAA;YACH,CAAC;YAED,OAAO;gBACL,GAAG,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;gBACtB,IAAI,EAAE,QAAQ;aACf,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,sBAAsB,IAAI,CAAC,OAAO,CAAC,SAAS,cAAc,IAAI,CAAC,OAAO,GAAG,CAAA;IAClF,CAAC;CACF","sourcesContent":["import {\n CancellationToken,\n getGitlabAuthHeaders,\n GitlabOptions,\n HttpError,\n newError,\n UpdateFileInfo,\n UpdateInfo,\n GitlabReleaseInfo,\n GitlabReleaseAsset,\n} from \"builder-util-runtime\"\nimport { OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { URL } from \"url\"\nimport escapeRegExp from \"lodash.escaperegexp\"\nimport { AppUpdater } from \"../AppUpdater.js\"\nimport { ResolvedUpdateFileInfo } from \"../types.js\"\nimport { getChannelFilename, newBaseUrl, newUrlFromBase } from \"../util.js\"\nimport { channelFileNotFoundError, getFileList, parseUpdateInfo, Provider, ProviderRuntimeOptions } from \"./Provider.js\"\n\ninterface GitlabUpdateInfo extends UpdateInfo {\n tag: string\n assets: Map<string, string> // filename -> download URL mapping\n}\n\nexport class GitLabProvider extends Provider<GitlabUpdateInfo> {\n private readonly baseApiUrl: URL\n // Cache the latest version info to avoid unnecessary HTTP requests\n private cachedLatestVersion: GitlabUpdateInfo | null = null\n\n /**\n * Normalizes filenames by replacing spaces and underscores with dashes.\n *\n * This is a workaround to handle filename formatting differences between tools:\n * - electron-builder formats filenames like \"test file.txt\" as \"test-file.txt\"\n * - GitLab may provide asset URLs using underscores, such as \"test_file.txt\"\n *\n * Because of this mismatch, we can't reliably extract the correct filename from\n * the asset path without normalization. This function ensures consistent matching\n * across different filename formats by converting all spaces and underscores to dashes.\n *\n * @param filename The filename to normalize\n * @returns The normalized filename with spaces and underscores replaced by dashes\n */\n private normalizeFilename(filename: string): string {\n return filename.replace(/ |_/g, \"-\")\n }\n\n constructor(\n private readonly options: GitlabOptions,\n private readonly updater: AppUpdater,\n runtimeOptions: ProviderRuntimeOptions\n ) {\n super({\n ...runtimeOptions,\n // GitLab might not support multiple range requests efficiently\n isUseMultipleRangeRequest: false,\n })\n\n const defaultHost = \"gitlab.com\"\n const host = options.host || defaultHost\n\n this.baseApiUrl = newBaseUrl(`https://${host}/api/v4`)\n }\n\n protected createRequestOptions(url: URL, headers?: OutgoingHttpHeaders | null): RequestOptions {\n const result = super.createRequestOptions(url, headers)\n ;(result as any).redirect = \"manual\"\n return result\n }\n\n private get channel(): string {\n const result = this.updater.channel || this.options.channel\n return result == null ? this.getDefaultChannelName() : this.getCustomChannelName(result)\n }\n\n async getLatestVersion(): Promise<GitlabUpdateInfo> {\n const cancellationToken = new CancellationToken()\n\n // Get latest release from GitLab API using the permalink/latest endpoint\n const latestReleaseUrl = newUrlFromBase(`projects/${this.options.projectId}/releases/permalink/latest`, this.baseApiUrl)\n\n const header = { Accept: \"application/json\", ...getGitlabAuthHeaders(this.options.token || null) }\n let releaseResponse: string | null\n try {\n releaseResponse = await this.httpRequest(latestReleaseUrl, header, cancellationToken)\n } catch (e: any) {\n throw newError(`Unable to find latest release on GitLab (${latestReleaseUrl}): ${e.stack || e.message}`, \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\")\n }\n\n if (!releaseResponse) {\n throw newError(\"No published releases on GitLab\", \"ERR_UPDATER_NO_PUBLISHED_VERSIONS\")\n }\n\n let latestRelease: GitlabReleaseInfo\n try {\n latestRelease = JSON.parse(releaseResponse)\n } catch (e: any) {\n throw newError(\n `Unable to parse latest release response from GitLab (${latestReleaseUrl}): response was not valid JSON: ${e.stack || e.message}`,\n \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\"\n )\n }\n\n if (latestRelease.upcoming_release) {\n throw newError(\"Latest GitLab release is scheduled but not yet published\", \"ERR_UPDATER_LATEST_VERSION_NOT_FOUND\")\n }\n\n const tag = latestRelease.tag_name\n\n // Look for channel file in release assets\n let rawData: string | null = null\n let channelFile = \"\"\n let channelFileUrl: URL | null = null\n\n const fetchChannelData = async (channelName: string): Promise<string> => {\n channelFile = getChannelFilename(channelName)\n\n // Find the channel file in GitLab release assets\n const channelAsset = latestRelease.assets.links.find(asset => asset.name === channelFile)\n\n if (!channelAsset) {\n throw newError(`Cannot find ${channelFile} in the latest release assets`, \"ERR_UPDATER_CHANNEL_FILE_NOT_FOUND\")\n }\n\n channelFileUrl = new URL(channelAsset.direct_asset_url)\n const authHeaders = getGitlabAuthHeaders(this.options.token || null)\n const isSameOriginAsApi = channelFileUrl.protocol === this.baseApiUrl.protocol && channelFileUrl.host === this.baseApiUrl.host\n const headers = isSameOriginAsApi && Object.keys(authHeaders).length ? authHeaders : undefined\n\n try {\n const result = await this.httpRequest(channelFileUrl, headers, cancellationToken)\n if (!result) {\n throw newError(`Empty response from ${channelFileUrl}`, \"ERR_UPDATER_CHANNEL_FILE_NOT_FOUND\")\n }\n return result\n } catch (e: any) {\n if (e instanceof HttpError && e.statusCode === 404) {\n throw channelFileNotFoundError(channelFile, channelFileUrl, e)\n }\n throw e\n }\n }\n\n try {\n rawData = await fetchChannelData(this.channel)\n } catch (e: any) {\n // If custom channel fails, try default channel as fallback\n if (this.channel !== this.getDefaultChannelName()) {\n rawData = await fetchChannelData(this.getDefaultChannelName())\n } else {\n throw e\n }\n }\n\n if (!rawData) {\n throw newError(`Unable to parse channel data from ${channelFile}`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n\n const result = parseUpdateInfo(rawData, channelFile, channelFileUrl!)\n\n // Set release name from GitLab if not present\n if (result.releaseName == null) {\n result.releaseName = latestRelease.name\n }\n\n // Set release notes from GitLab description if not present\n if (result.releaseNotes == null) {\n result.releaseNotes = latestRelease.description || null\n }\n\n const gitlabUpdateInfo = {\n tag: tag,\n assets: this.convertAssetsToMap(latestRelease.assets),\n ...result,\n }\n\n // Cache the latest version info\n this.cachedLatestVersion = gitlabUpdateInfo\n\n return gitlabUpdateInfo\n }\n\n /**\n * Utility function to convert GitlabReleaseAsset to Map<string, string>\n * Maps asset names to their download URLs\n */\n private convertAssetsToMap(assets: GitlabReleaseAsset): Map<string, string> {\n const assetsMap = new Map<string, string>()\n for (const asset of assets.links) {\n assetsMap.set(this.normalizeFilename(asset.name), asset.direct_asset_url)\n }\n return assetsMap\n }\n\n /**\n * Find blockmap file URL in assets map for a specific filename\n */\n private findBlockMapInAssets(assets: Map<string, string>, filename: string): URL | null {\n const possibleBlockMapNames = [`${filename}.blockmap`, `${this.normalizeFilename(filename)}.blockmap`]\n\n for (const blockMapName of possibleBlockMapNames) {\n const assetUrl = assets.get(blockMapName)\n if (assetUrl) {\n return new URL(assetUrl)\n }\n }\n return null\n }\n\n private async fetchReleaseInfoByVersion(version: string): Promise<GitlabReleaseInfo | null> {\n const cancellationToken = new CancellationToken()\n\n // Try v-prefixed version first, then fallback to plain version\n const possibleReleaseIds = [`v${version}`, version]\n\n for (const releaseId of possibleReleaseIds) {\n const releaseUrl = newUrlFromBase(`projects/${this.options.projectId}/releases/${encodeURIComponent(releaseId)}`, this.baseApiUrl)\n\n try {\n const header = { Accept: \"application/json\", ...getGitlabAuthHeaders(this.options.token || null) }\n const releaseResponse = await this.httpRequest(releaseUrl, header, cancellationToken)\n\n if (releaseResponse) {\n const release: GitlabReleaseInfo = JSON.parse(releaseResponse)\n return release\n }\n } catch (e: any) {\n // If it's a 404 error, try the next release ID format\n if (e instanceof HttpError && e.statusCode === 404) {\n continue\n }\n // For other errors, throw immediately\n throw newError(`Unable to find release ${releaseId} on GitLab (${releaseUrl}): ${e.stack || e.message}`, \"ERR_UPDATER_RELEASE_NOT_FOUND\")\n }\n }\n\n // If we get here, none of the release ID formats worked\n throw newError(`Unable to find release with version ${version} (tried: ${possibleReleaseIds.join(\", \")}) on GitLab`, \"ERR_UPDATER_RELEASE_NOT_FOUND\")\n }\n\n /**\n * Get version info for blockmap files, using cache when possible\n */\n private async getVersionInfoForBlockMap(version: string): Promise<Map<string, string> | null> {\n // Check if we can use cached version info\n if (this.cachedLatestVersion && this.cachedLatestVersion.version === version) {\n return this.cachedLatestVersion.assets\n }\n\n // Fetch version info if not cached or version doesn't match\n const versionInfo = await this.fetchReleaseInfoByVersion(version)\n if (versionInfo && versionInfo.assets) {\n return this.convertAssetsToMap(versionInfo.assets)\n }\n\n return null\n }\n\n /**\n * Find blockmap URLs from version assets\n */\n private async findBlockMapUrlsFromAssets(oldVersion: string, newVersion: string, baseFilename: string): Promise<[URL | null, URL | null]> {\n let newBlockMapUrl: URL | null = null\n let oldBlockMapUrl: URL | null = null\n\n // Get new version assets\n const newVersionAssets = await this.getVersionInfoForBlockMap(newVersion)\n if (newVersionAssets) {\n newBlockMapUrl = this.findBlockMapInAssets(newVersionAssets, baseFilename)\n }\n\n // Get old version assets\n const oldVersionAssets = await this.getVersionInfoForBlockMap(oldVersion)\n if (oldVersionAssets) {\n const oldFilename = baseFilename.replace(new RegExp(escapeRegExp(newVersion), \"g\"), oldVersion)\n oldBlockMapUrl = this.findBlockMapInAssets(oldVersionAssets, oldFilename)\n }\n\n return [oldBlockMapUrl, newBlockMapUrl]\n }\n\n async getBlockMapFiles(baseUrl: URL, oldVersion: string, newVersion: string, oldBlockMapFileBaseUrl: string | null = null): Promise<URL[]> {\n // If is `project_upload`, find blockmap files from corresponding gitLab assets\n // Because each asset has an unique path that includes an identified hash code,\n // e.g. https://gitlab.com/-/project/71361100/uploads/051f27a925eaf679f2ad688105362acc/latest.yml\n if (this.options.uploadTarget === \"project_upload\") {\n // Get the base filename from the URL to find corresponding blockmap files\n const baseFilename = baseUrl.pathname.split(\"/\").pop() || \"\"\n\n // Try to find blockmap files in GitLab assets\n const [oldBlockMapUrl, newBlockMapUrl] = await this.findBlockMapUrlsFromAssets(oldVersion, newVersion, baseFilename)\n\n if (!newBlockMapUrl) {\n throw newError(`Cannot find blockmap file for ${newVersion} in GitLab assets`, \"ERR_UPDATER_BLOCKMAP_FILE_NOT_FOUND\")\n }\n\n if (!oldBlockMapUrl) {\n throw newError(`Cannot find blockmap file for ${oldVersion} in GitLab assets`, \"ERR_UPDATER_BLOCKMAP_FILE_NOT_FOUND\")\n }\n\n return [oldBlockMapUrl, newBlockMapUrl]\n } else {\n return super.getBlockMapFiles(baseUrl, oldVersion, newVersion, oldBlockMapFileBaseUrl)\n }\n }\n\n resolveFiles(updateInfo: GitlabUpdateInfo): Array<ResolvedUpdateFileInfo> {\n return getFileList(updateInfo).map((fileInfo: UpdateFileInfo) => {\n // Try both original and normalized filename formats\n const possibleNames = [\n fileInfo.url, // Original filename\n this.normalizeFilename(fileInfo.url), // Normalized filename (spaces/underscores → dashes)\n ]\n\n const matchingAssetName = possibleNames.find(name => updateInfo.assets.has(name))\n const assetUrl = matchingAssetName ? updateInfo.assets.get(matchingAssetName) : undefined\n\n if (!assetUrl) {\n throw newError(\n `Cannot find asset \"${fileInfo.url}\" in GitLab release assets. Available assets: ${Array.from(updateInfo.assets.keys()).join(\", \")}`,\n \"ERR_UPDATER_ASSET_NOT_FOUND\"\n )\n }\n\n return {\n url: new URL(assetUrl),\n info: fileInfo,\n }\n })\n }\n\n toString(): string {\n return `GitLab (projectId: ${this.options.projectId}, channel: ${this.channel})`\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-updater",
3
- "version": "7.0.0-alpha.5",
3
+ "version": "7.0.0-alpha.7",
4
4
  "description": "Cross platform updater for electron applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,8 @@
14
14
  "types": "./dist/indexInternal.d.ts",
15
15
  "import": "./dist/indexInternal.js",
16
16
  "require": "./dist/indexInternal.js"
17
- }
17
+ },
18
+ "./package.json": "./package.json"
18
19
  },
19
20
  "author": "Vladimir Krivosheev",
20
21
  "license": "MIT",
@@ -36,7 +37,7 @@
36
37
  "lodash.isequal": "^4.5.0",
37
38
  "semver": "~7.7.3",
38
39
  "tiny-typed-emitter": "^2.1.0",
39
- "builder-util-runtime": "10.0.0-alpha.5"
40
+ "builder-util-runtime": "10.0.0-alpha.7"
40
41
  },
41
42
  "devDependencies": {
42
43
  "@types/fs-extra": "9.0.13",
@@ -44,7 +45,7 @@
44
45
  "@types/lodash.escaperegexp": "4.1.6",
45
46
  "@types/lodash.isequal": "4.5.5",
46
47
  "@types/semver": "7.7.1",
47
- "electron": "39.8.5"
48
+ "electron": "39.8.10"
48
49
  },
49
50
  "types": "./dist/index.d.ts",
50
51
  "publishConfig": {