electron-userland / electron-builder

A complete solution to package and build a ready for distribution Electron app with “auto update” support out of the box
https://www.electron.build
MIT License
13.46k stars 1.71k forks source link

How to properly type updater events #8211

Open Stanzilla opened 1 month ago

Stanzilla commented 1 month ago

I'm using Vue and am trying to handle an ipcRenderer event that uses different electron-updater args but am failing to properly type them, currently I'm using this:

type UpdaterEventArg =
  | { status: "error"; error: Error; message?: string }
  | { status: "download-progress"; progressInfo: ProgressInfo }
  | { status: "update-downloaded"; event: UpdateDownloadedEvent }
  | { status: "update-not-available"; updateInfo: UpdateInfo }
  | { status: "checking-for-update" }
  | { status: "update-available"; updateInfo: UpdateInfo };

ipcRenderer.on(
      "updaterHandler",
      (_event, status: string, arg: UpdaterEventArg) => {
        console.log(`updaterHandler: ${status}`);

        if (status === "checking-for-update") {
          // No additional data for this status
          return;
        }

        this.updater.status = status;

        if (status === "download-progress" && "progressInfo" in arg) {
          this.updater.progress = Math.floor(arg.progressInfo.percent);
        }

        if (
          (status === "update-available" ||
            status === "update-not-available" ||
            status === "update-downloaded") &&
          "updateInfo" in arg
        ) {
          this.updater.path = `https://github.com/WeakAuras/WeakAuras-Companion/releases/download/v${arg.updateInfo.version}/${arg.updateInfo.path}`;
          this.updater.version = arg.updateInfo.version;

          // List if `updater.fullChangelog` is set to `true`, `string` otherwise.
          if (typeof arg.updateInfo.releaseNotes === "string") {
            this.updater.releaseNotes = arg.updateInfo.releaseNotes;
          } else if (Array.isArray(arg.updateInfo.releaseNotes)) {
            // Convert the array of ReleaseNoteInfo to a string
            this.updater.releaseNotes = arg.updateInfo.releaseNotes
              .map((note) => note.note)
              .join("\n");
          } else {
            this.updater.releaseNotes = "";
          }

          console.log(JSON.stringify(arg));
        }

        if (status === "error" && "error" in arg) {
          console.error(arg.error);
        }
      },
    );

There are several problems with this:

1) UpdateInfo is not available on update-available, instead the fields are on arc directly, see this dump:

{
    "tag": "v5.2.4",
    "version": "5.2.4",
    "files": [
        {
            "url": "WeakAuras-Companion-Setup-5.2.4.exe",
            "sha512": "rZTRAK77HoJzDxpvEFc7JgsT4tFoiuU+RymZ7rIsHmz51X/BhtnaAUf59dp272XfteZr6izGNOgD8apH2j1OcA==",
            "size": 95556822
        }
    ],
    "path": "WeakAuras-Companion-Setup-5.2.4.exe",
    "sha512": "rZTRAK77HoJzDxpvEFc7JgsT4tFoiuU+RymZ7rIsHmz51X/BhtnaAUf59dp272XfteZr6izGNOgD8apH2j1OcA==",
    "releaseDate": "2024-05-08T23:25:27.812Z",
    "releaseName": "5.2.4",
    "releaseNotes": "<p>Update wow version dropdown for Cataclysm &amp; TWW<br>\nHousekeeping</p>"
}

But when I try to adjust my code to use arg.version instead of arg.updateInfo.version the types fail. I'm unsure how to fix this type declaration and was hoping for some help from the community. Also the docs confused me here, https://www.electron.build/auto-update.html#event-update-available says there should be updateInfo.