From 042be1216cb540f3d581ed6857573615e86f2575 Mon Sep 17 00:00:00 2001 From: pengx17 Date: Thu, 25 Apr 2024 03:52:29 +0000 Subject: [PATCH] build(electron): nsis updater compatibility fix (#6681) --- .../main/updater/custom-github-provider.ts | 29 +++++++++++++++++-- .../electron/test/main/updater.spec.ts | 19 +++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/packages/frontend/electron/src/main/updater/custom-github-provider.ts b/packages/frontend/electron/src/main/updater/custom-github-provider.ts index d3429c64cd..cf37a2522d 100644 --- a/packages/frontend/electron/src/main/updater/custom-github-provider.ts +++ b/packages/frontend/electron/src/main/updater/custom-github-provider.ts @@ -1,4 +1,8 @@ // credits: migrated from https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/src/providers/GitHubProvider.ts + +import fs from 'node:fs'; +import path from 'node:path'; + import type { CustomPublishOptions, GithubOptions, @@ -6,6 +10,7 @@ import type { XElement, } from 'builder-util-runtime'; import { HttpError, newError, parseXml } from 'builder-util-runtime'; +import { app } from 'electron'; import type { AppUpdater, ResolvedUpdateFileInfo, @@ -19,7 +24,6 @@ import { resolveFiles, } from 'electron-updater/out/providers/Provider'; import * as semver from 'semver'; - interface GithubUpdateInfo extends UpdateInfo { tag: string; } @@ -37,6 +41,13 @@ interface GithubRelease { const hrefRegExp = /\/tag\/([^/]+)$/; +function isSquirrelBuild() { + // if it is squirrel build, there will be 'squirrel.exe' + // otherwise it is in nsis web mode + const files = fs.readdirSync(path.dirname(app.getPath('exe'))); + return files.some(it => it.includes('squirrel.exe')); +} + export class CustomGitHubProvider extends BaseGitHubProvider { constructor( options: CustomPublishOptions, @@ -244,9 +255,21 @@ export class CustomGitHubProvider extends BaseGitHubProvider { } resolveFiles(updateInfo: GithubUpdateInfo): Array { + const filteredUpdateInfo = structuredClone(updateInfo); + // for windows, we need to determine its installer type (nsis or squirrel) + if (process.platform === 'win32' && updateInfo.files.length > 1) { + const isSquirrel = isSquirrelBuild(); + // @ts-expect-error we should be able to modify the object + filteredUpdateInfo.files = updateInfo.files.filter(file => { + return isSquirrel + ? !file.url.includes('nsis.exe') + : file.url.includes('nsis.exe'); + }); + } + // still replace space to - due to backward compatibility - return resolveFiles(updateInfo, this.baseUrl, p => - this.getBaseDownloadPath(updateInfo.tag, p.replace(/ /g, '-')) + return resolveFiles(filteredUpdateInfo, this.baseUrl, p => + this.getBaseDownloadPath(filteredUpdateInfo.tag, p.replace(/ /g, '-')) ); } diff --git a/packages/frontend/electron/test/main/updater.spec.ts b/packages/frontend/electron/test/main/updater.spec.ts index bfcd6e4ee9..d80e1e14c3 100644 --- a/packages/frontend/electron/test/main/updater.spec.ts +++ b/packages/frontend/electron/test/main/updater.spec.ts @@ -1,15 +1,32 @@ import nodePath from 'node:path'; +import { fileURLToPath } from 'node:url'; import type { UpdateCheckResult } from 'electron-updater'; import fs from 'fs-extra'; import { flatten } from 'lodash-es'; import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; -import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest'; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + it, + vi, +} from 'vitest'; import { CustomGitHubProvider } from '../../src/main/updater/custom-github-provider'; import { MockedAppAdapter, MockedUpdater } from './mocks'; +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +vi.mock('electron', () => ({ + app: { + getPath: () => __dirname, + }, +})); + const platformTail = (() => { // https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/src/providers/Provider.ts#L30 const platform = process.platform;