electron-incremental-update 3.0.0-beta.6 → 3.0.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.
@@ -27,6 +27,11 @@ interface Version {
27
27
  }
28
28
  /**
29
29
  * Parse version string to {@link Version}, like `0.2.0-beta.1`
30
+ *
31
+ * **Supported format**: `major.minor.patch[-stage[.stageVersion]]`
32
+ *
33
+ * Build metadata (`+build`) and complex semver prerelease identifiers
34
+ * (e.g. `1.0.0-beta.1.2`) are not supported yet.
30
35
  * @param version version string
31
36
  */
32
37
  declare function parseVersion(version: string): Version;
@@ -138,7 +143,7 @@ interface IProvider {
138
143
  * Function to decompress file using brotli
139
144
  * @param buffer compressed file buffer
140
145
  */
141
- unzipFile: (buffer: Buffer) => Promise<Buffer>;
146
+ decompressFile: (buffer: Buffer) => Promise<Buffer>;
142
147
  /**
143
148
  * Verify asar signature,
144
149
  * if signature is valid, returns the version, otherwise returns `undefined`
@@ -147,8 +152,18 @@ interface IProvider {
147
152
  * @param signature signature
148
153
  * @param cert certificate
149
154
  */
150
- verifySignaure: (buffer: Buffer, version: string, signature: string, cert: string) => Promisable<boolean>;
155
+ verifySignature: (buffer: Buffer, version: string, signature: string, cert: string) => Promisable<boolean>;
151
156
  }
157
+ /**
158
+ * Custom URL handler for GitHub provider, useful for mirrors and custom gateways
159
+ * @param url original URL
160
+ * @example
161
+ * (url) => {
162
+ * url.hostname = 'mirror.ghproxy.com'
163
+ * url.pathname = 'https://github.com' + url.pathname
164
+ * return url
165
+ * }
166
+ */
152
167
  type URLHandler = (url: URL) => Promisable<URL | string | undefined | null>;
153
168
  //#endregion
154
169
  export { VersionJSON as a, Version as c, isUpdateJSON as d, parseVersion as f, UpdateInfoWithURL as i, defaultIsLowerVersion as l, Promisable as m, IProvider as n, UpdateInfo as o, Arrayable as p, URLHandler as r, UpdateJSON as s, DownloadingInfo as t, defaultVersionJsonGenerator as u };
@@ -27,6 +27,11 @@ interface Version {
27
27
  }
28
28
  /**
29
29
  * Parse version string to {@link Version}, like `0.2.0-beta.1`
30
+ *
31
+ * **Supported format**: `major.minor.patch[-stage[.stageVersion]]`
32
+ *
33
+ * Build metadata (`+build`) and complex semver prerelease identifiers
34
+ * (e.g. `1.0.0-beta.1.2`) are not supported yet.
30
35
  * @param version version string
31
36
  */
32
37
  declare function parseVersion(version: string): Version;
@@ -138,7 +143,7 @@ interface IProvider {
138
143
  * Function to decompress file using brotli
139
144
  * @param buffer compressed file buffer
140
145
  */
141
- unzipFile: (buffer: Buffer) => Promise<Buffer>;
146
+ decompressFile: (buffer: Buffer) => Promise<Buffer>;
142
147
  /**
143
148
  * Verify asar signature,
144
149
  * if signature is valid, returns the version, otherwise returns `undefined`
@@ -147,8 +152,18 @@ interface IProvider {
147
152
  * @param signature signature
148
153
  * @param cert certificate
149
154
  */
150
- verifySignaure: (buffer: Buffer, version: string, signature: string, cert: string) => Promisable<boolean>;
155
+ verifySignature: (buffer: Buffer, version: string, signature: string, cert: string) => Promisable<boolean>;
151
156
  }
157
+ /**
158
+ * Custom URL handler for GitHub provider, useful for mirrors and custom gateways
159
+ * @param url original URL
160
+ * @example
161
+ * (url) => {
162
+ * url.hostname = 'mirror.ghproxy.com'
163
+ * url.pathname = 'https://github.com' + url.pathname
164
+ * return url
165
+ * }
166
+ */
152
167
  type URLHandler = (url: URL) => Promisable<URL | string | undefined | null>;
153
168
  //#endregion
154
169
  export { VersionJSON as a, Version as c, isUpdateJSON as d, parseVersion as f, UpdateInfoWithURL as i, defaultIsLowerVersion as l, Promisable as m, IProvider as n, UpdateInfo as o, Arrayable as p, URLHandler as r, UpdateJSON as s, DownloadingInfo as t, defaultVersionJsonGenerator as u };
package/dist/utils.cjs CHANGED
@@ -1,19 +1,19 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_zip = require("./zip-D1dbBzw4.cjs");
3
- const require_electron = require("./electron-D_8AbLQ5.cjs");
4
- const require_download = require("./download-BYnkme_X.cjs");
5
- exports.aesDecrypt = require_zip.aesDecrypt;
6
- exports.aesEncrypt = require_zip.aesEncrypt;
2
+ const require_crypto = require("./crypto-BSky88mL.cjs");
3
+ const require_electron = require("./electron-CaS0I3S2.cjs");
4
+ const require_download = require("./download-KySXUyWC.cjs");
5
+ exports.aesDecrypt = require_crypto.aesDecrypt;
6
+ exports.aesEncrypt = require_crypto.aesEncrypt;
7
7
  exports.beautifyDevTools = require_electron.beautifyDevTools;
8
+ exports.defaultCompressFile = require_crypto.defaultCompressFile;
9
+ exports.defaultDecompressFile = require_crypto.defaultDecompressFile;
8
10
  exports.defaultDownloadAsar = require_download.defaultDownloadAsar;
9
11
  exports.defaultDownloadText = require_download.defaultDownloadText;
10
12
  exports.defaultDownloadUpdateJSON = require_download.defaultDownloadUpdateJSON;
11
- exports.defaultIsLowerVersion = require_zip.defaultIsLowerVersion;
12
- exports.defaultSignature = require_zip.defaultSignature;
13
- exports.defaultUnzipFile = require_zip.defaultUnzipFile;
14
- exports.defaultVerifySignature = require_zip.defaultVerifySignature;
15
- exports.defaultVersionJsonGenerator = require_zip.defaultVersionJsonGenerator;
16
- exports.defaultZipFile = require_zip.defaultZipFile;
13
+ exports.defaultIsLowerVersion = require_crypto.defaultIsLowerVersion;
14
+ exports.defaultSignature = require_crypto.defaultSignature;
15
+ exports.defaultVerifySignature = require_crypto.defaultVerifySignature;
16
+ exports.defaultVersionJsonGenerator = require_crypto.defaultVersionJsonGenerator;
17
17
  exports.disableHWAccForWin7 = require_electron.disableHWAccForWin7;
18
18
  exports.downloadUtil = require_download.downloadUtil;
19
19
  exports.getAppVersion = require_electron.getAppVersion;
@@ -25,15 +25,15 @@ exports.getPathFromMain = require_electron.getPathFromMain;
25
25
  exports.getPathFromPreload = require_electron.getPathFromPreload;
26
26
  exports.getPathFromPublic = require_electron.getPathFromPublic;
27
27
  exports.handleUnexpectedErrors = require_electron.handleUnexpectedErrors;
28
- exports.hashBuffer = require_zip.hashBuffer;
28
+ exports.hashBuffer = require_crypto.hashBuffer;
29
29
  exports.importNative = require_electron.importNative;
30
30
  exports.isDev = require_electron.isDev;
31
31
  exports.isLinux = require_electron.isLinux;
32
32
  exports.isMac = require_electron.isMac;
33
- exports.isUpdateJSON = require_zip.isUpdateJSON;
33
+ exports.isUpdateJSON = require_crypto.isUpdateJSON;
34
34
  exports.isWin = require_electron.isWin;
35
35
  exports.loadPage = require_electron.loadPage;
36
- exports.parseVersion = require_zip.parseVersion;
36
+ exports.parseVersion = require_crypto.parseVersion;
37
37
  exports.reloadOnPreloadScriptChanged = require_electron.reloadOnPreloadScriptChanged;
38
38
  exports.requireNative = require_electron.requireNative;
39
39
  exports.resolveJson = require_download.resolveJson;
package/dist/utils.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as Version, d as isUpdateJSON, f as parseVersion, l as defaultIsLowerVersion, o as UpdateInfo, s as UpdateJSON, u as defaultVersionJsonGenerator } from "./types-BOqQ_r5Q.cjs";
2
- import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-BjWmHHAu.cjs";
1
+ import { c as Version, d as isUpdateJSON, f as parseVersion, l as defaultIsLowerVersion, o as UpdateInfo, s as UpdateJSON, u as defaultVersionJsonGenerator } from "./types-q78spjKB.cjs";
2
+ import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-BVmLiAvB.cjs";
3
3
  import { BrowserWindow } from "electron";
4
4
 
5
5
  //#region src/utils/crypto.d.ts
@@ -149,16 +149,16 @@ declare function handleUnexpectedErrors(callback: (err: unknown) => void): void;
149
149
  */
150
150
  declare function reloadOnPreloadScriptChanged(): void;
151
151
  //#endregion
152
- //#region src/utils/zip.d.ts
152
+ //#region src/utils/compress.d.ts
153
153
  /**
154
154
  * Default function to compress file using brotli
155
155
  * @param buffer uncompressed file buffer
156
156
  */
157
- declare function defaultZipFile(buffer: Buffer): Promise<Buffer>;
157
+ declare function defaultCompressFile(buffer: Buffer): Promise<Buffer>;
158
158
  /**
159
159
  * Default function to decompress file using brotli
160
160
  * @param buffer compressed file buffer
161
161
  */
162
- declare function defaultUnzipFile(buffer: Buffer): Promise<Buffer>;
162
+ declare function defaultDecompressFile(buffer: Buffer): Promise<Buffer>;
163
163
  //#endregion
164
- export { UpdateInfo, UpdateJSON, Version, aesDecrypt, aesEncrypt, beautifyDevTools, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultVersionJsonGenerator, defaultZipFile, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
164
+ export { UpdateInfo, UpdateJSON, Version, aesDecrypt, aesEncrypt, beautifyDevTools, defaultCompressFile, defaultDecompressFile, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultVerifySignature, defaultVersionJsonGenerator, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
package/dist/utils.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as Version, d as isUpdateJSON, f as parseVersion, l as defaultIsLowerVersion, o as UpdateInfo, s as UpdateJSON, u as defaultVersionJsonGenerator } from "./types-BOqQ_r5Q.mjs";
2
- import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-DVWJfV3S.mjs";
1
+ import { c as Version, d as isUpdateJSON, f as parseVersion, l as defaultIsLowerVersion, o as UpdateInfo, s as UpdateJSON, u as defaultVersionJsonGenerator } from "./types-q78spjKB.mjs";
2
+ import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-GONr15zK.mjs";
3
3
  import { BrowserWindow } from "electron";
4
4
 
5
5
  //#region src/utils/crypto.d.ts
@@ -149,16 +149,16 @@ declare function handleUnexpectedErrors(callback: (err: unknown) => void): void;
149
149
  */
150
150
  declare function reloadOnPreloadScriptChanged(): void;
151
151
  //#endregion
152
- //#region src/utils/zip.d.ts
152
+ //#region src/utils/compress.d.ts
153
153
  /**
154
154
  * Default function to compress file using brotli
155
155
  * @param buffer uncompressed file buffer
156
156
  */
157
- declare function defaultZipFile(buffer: Buffer): Promise<Buffer>;
157
+ declare function defaultCompressFile(buffer: Buffer): Promise<Buffer>;
158
158
  /**
159
159
  * Default function to decompress file using brotli
160
160
  * @param buffer compressed file buffer
161
161
  */
162
- declare function defaultUnzipFile(buffer: Buffer): Promise<Buffer>;
162
+ declare function defaultDecompressFile(buffer: Buffer): Promise<Buffer>;
163
163
  //#endregion
164
- export { UpdateInfo, UpdateJSON, Version, aesDecrypt, aesEncrypt, beautifyDevTools, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultVersionJsonGenerator, defaultZipFile, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
164
+ export { UpdateInfo, UpdateJSON, Version, aesDecrypt, aesEncrypt, beautifyDevTools, defaultCompressFile, defaultDecompressFile, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultVerifySignature, defaultVersionJsonGenerator, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
package/dist/utils.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as defaultSignature, c as defaultIsLowerVersion, d as parseVersion, i as aesEncrypt, l as defaultVersionJsonGenerator, n as defaultZipFile, o as defaultVerifySignature, r as aesDecrypt, s as hashBuffer, t as defaultUnzipFile, u as isUpdateJSON } from "./zip-DUK3opmV.mjs";
2
- import { C as singleInstance, S as setPortableDataPath, _ as reloadOnPreloadScriptChanged, a as getPathFromAppNameAsar, b as setAppUserModelId, c as getPathFromPreload, d as importNative, f as isDev, g as loadPage, h as isWin, i as getEntryVersion, l as getPathFromPublic, m as isMac, n as disableHWAccForWin7, o as getPathFromEntryAsar, p as isLinux, r as getAppVersion, s as getPathFromMain, t as beautifyDevTools, u as handleUnexpectedErrors, v as requireNative, x as setPortableAppDataPath, y as restartApp } from "./electron-BInvFJ-W.mjs";
3
- import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-BGaAyi1Z.mjs";
4
- export { aesDecrypt, aesEncrypt, beautifyDevTools, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultVersionJsonGenerator, defaultZipFile, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
1
+ import { a as hashBuffer, c as defaultIsLowerVersion, d as parseVersion, i as defaultVerifySignature, l as defaultVersionJsonGenerator, n as aesEncrypt, o as defaultCompressFile, r as defaultSignature, s as defaultDecompressFile, t as aesDecrypt, u as isUpdateJSON } from "./crypto-DZzMmoz2.mjs";
2
+ import { C as singleInstance, S as setPortableDataPath, _ as reloadOnPreloadScriptChanged, a as getPathFromAppNameAsar, b as setAppUserModelId, c as getPathFromPreload, d as importNative, f as isDev, g as loadPage, h as isWin, i as getEntryVersion, l as getPathFromPublic, m as isMac, n as disableHWAccForWin7, o as getPathFromEntryAsar, p as isLinux, r as getAppVersion, s as getPathFromMain, t as beautifyDevTools, u as handleUnexpectedErrors, v as requireNative, x as setPortableAppDataPath, y as restartApp } from "./electron-BrIF1urZ.mjs";
3
+ import { a as getHeader, i as downloadUtil, n as defaultDownloadText, o as resolveJson, r as defaultDownloadUpdateJSON, t as defaultDownloadAsar } from "./download-BdX4fZYM.mjs";
4
+ export { aesDecrypt, aesEncrypt, beautifyDevTools, defaultCompressFile, defaultDecompressFile, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultIsLowerVersion, defaultSignature, defaultVerifySignature, defaultVersionJsonGenerator, disableHWAccForWin7, downloadUtil, getAppVersion, getEntryVersion, getHeader, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, hashBuffer, importNative, isDev, isLinux, isMac, isUpdateJSON, isWin, loadPage, parseVersion, reloadOnPreloadScriptChanged, requireNative, resolveJson, restartApp, setAppUserModelId, setPortableAppDataPath, setPortableDataPath, singleInstance };
package/dist/vite.d.mts CHANGED
@@ -271,7 +271,7 @@ interface LocalDevUpdateOptions {
271
271
  * Directory that contains local update resources.
272
272
  *
273
273
  * The generated version file is written under `{baseDir}/{versionPath}` and
274
- * update archives are written as `{baseDir}/{name}-{version}.asar.gz`.
274
+ * update archives are written as `{baseDir}/{name}-{version}.asar.br`.
275
275
  *
276
276
  * @default 'release/local-update'
277
277
  */
@@ -315,10 +315,10 @@ interface UpdaterOptions {
315
315
  */
316
316
  versionPath?: string;
317
317
  /**
318
- * Path to gzipped asar file
319
- * @default `release/${app.name}-${version}.asar.gz`
318
+ * Path to compressed asar file
319
+ * @default `release/${app.name}-${version}.asar.br`
320
320
  */
321
- gzipPath?: string;
321
+ compressedPath?: string;
322
322
  /**
323
323
  * Path to electron build output
324
324
  * @default `dist-electron`
@@ -395,10 +395,10 @@ interface GeneratorOverrideFunctions {
395
395
  */
396
396
  generateUpdateJson?: (existingJson: UpdateJSON, signature: string, version: string, minVersion: string) => Promisable<UpdateJSON>;
397
397
  /**
398
- * Custom generate zip file buffer
398
+ * Custom generate compressed file buffer
399
399
  * @param buffer source buffer
400
400
  */
401
- generateGzipFile?: (buffer: Buffer) => Promisable<Buffer>;
401
+ generateCompressedFile?: (buffer: Buffer) => Promisable<Buffer>;
402
402
  }
403
403
  //#endregion
404
404
  //#region src/vite/core.d.ts
@@ -442,10 +442,15 @@ declare function electronWithUpdater(options: ElectronWithUpdaterOptions): Promi
442
442
  //#endregion
443
443
  //#region src/vite/define.d.ts
444
444
  interface ElectronViteHelperOptions extends ElectronWithUpdaterOptions {
445
+ /**
446
+ * Root dir of project
447
+ * @default process.cwd()
448
+ */
449
+ root?: string;
445
450
  /**
446
451
  * Config for renderer process
447
452
  */
448
- renderer?: UserConfig;
453
+ renderer?: Omit<UserConfig, "root">;
449
454
  }
450
455
  /**
451
456
  * Vite config helper
@@ -455,6 +460,7 @@ interface ElectronViteHelperOptions extends ElectronWithUpdaterOptions {
455
460
  * import { defineElectronConfig } from 'electron-incremental-update/vite'
456
461
  *
457
462
  * export default defineElectronConfig({
463
+ * // root: './apps'
458
464
  * main: {
459
465
  * files: ['./electron/main/index.ts', './electron/main/worker.ts'],
460
466
  * },
@@ -465,13 +471,7 @@ interface ElectronViteHelperOptions extends ElectronWithUpdaterOptions {
465
471
  * // options
466
472
  * },
467
473
  * renderer: {
468
- * server: process.env.VSCODE_DEBUG && (() => {
469
- * const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL)
470
- * return {
471
- * host: url.hostname,
472
- * port: +url.port,
473
- * }
474
- * })(),
474
+ * // plugins: []
475
475
  * }
476
476
  * })
477
477
  * ```
package/dist/vite.mjs CHANGED
@@ -5,8 +5,8 @@ import { isCI } from "ci-info";
5
5
  import { createLogger, mergeConfig, normalizePath } from "vite";
6
6
  import { electronPluginFactory } from "vite-plugin-electron/multi-env";
7
7
  import { esmShim } from "vite-plugin-electron/plugin";
8
- import crypto from "node:crypto";
9
8
  import zlib from "node:zlib";
9
+ import crypto from "node:crypto";
10
10
  import cp from "node:child_process";
11
11
  import * as babel from "@babel/core";
12
12
  import { copyFile, cp as cp$1, mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
@@ -41,6 +41,17 @@ function fixWinCharEncoding(fn) {
41
41
  });
42
42
  }
43
43
  //#endregion
44
+ //#region src/utils/compress.ts
45
+ /**
46
+ * Default function to compress file using brotli
47
+ * @param buffer uncompressed file buffer
48
+ */
49
+ async function defaultCompressFile(buffer) {
50
+ return new Promise((resolve, reject) => {
51
+ zlib.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
52
+ });
53
+ }
54
+ //#endregion
44
55
  //#region src/utils/crypto.ts
45
56
  function hashBuffer(data, length) {
46
57
  const hash = crypto.createHash("SHA256").update(data).digest("binary");
@@ -65,6 +76,11 @@ function defaultSignature(buffer, privateKey, cert, version) {
65
76
  const REG_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9]+)(?:\.(\d+))?)?$/i;
66
77
  /**
67
78
  * Parse version string to {@link Version}, like `0.2.0-beta.1`
79
+ *
80
+ * **Supported format**: `major.minor.patch[-stage[.stageVersion]]`
81
+ *
82
+ * Build metadata (`+build`) and complex semver prerelease identifiers
83
+ * (e.g. `1.0.0-beta.1.2`) are not supported yet.
68
84
  * @param version version string
69
85
  */
70
86
  function parseVersion(version) {
@@ -114,17 +130,6 @@ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVe
114
130
  return existingJson;
115
131
  }
116
132
  //#endregion
117
- //#region src/utils/zip.ts
118
- /**
119
- * Default function to compress file using brotli
120
- * @param buffer uncompressed file buffer
121
- */
122
- async function defaultZipFile(buffer) {
123
- return new Promise((resolve, reject) => {
124
- zlib.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
125
- });
126
- }
127
- //#endregion
128
133
  //#region src/vite/constant.ts
129
134
  const id = "electron-incremental-update";
130
135
  const bytecodeId = `${id}-bytecode`;
@@ -446,14 +451,14 @@ async function prepareLocalDevUpdateResource({ root, pkg, buildAsarOption, versi
446
451
  const stagedElectronDistPath = path.join(workDir, "dist-electron");
447
452
  const resolvedVersionPath = path.join(localDevUpdate.baseDir, versionPath);
448
453
  const asarPath = path.join(localDevUpdate.baseDir, `${pkg.name}.asar`);
449
- const gzipPath = path.join(localDevUpdate.baseDir, `${pkg.name}-${targetVersion}.asar.gz`);
454
+ const compressedPath = path.join(localDevUpdate.baseDir, `${pkg.name}-${targetVersion}.asar.br`);
450
455
  try {
451
456
  await mkdir(localDevUpdate.baseDir, { recursive: true });
452
457
  await mkdir(path.dirname(resolvedVersionPath), { recursive: true });
453
458
  await cp$1(path.resolve(root, buildAsarOption.electronDistPath), stagedElectronDistPath, { recursive: true });
454
459
  await writeFile(path.join(stagedElectronDistPath, "version"), targetVersion, "utf-8");
455
460
  await createPackage(stagedElectronDistPath, asarPath);
456
- await writeFile(gzipPath, await buildAsarOption.generateGzipFile(await readFile(asarPath)));
461
+ await writeFile(compressedPath, await buildAsarOption.generateCompressedFile(await readFile(asarPath)));
457
462
  const updateJSON = defaultVersionJsonGenerator(await readExistingUpdateJSON(resolvedVersionPath, targetVersion), LOCAL_DEV_SIGNATURE, targetVersion, minimumVersion);
458
463
  if (!isUpdateJSON(updateJSON)) throw new Error("Invalid local dev update json");
459
464
  await writeFile(resolvedVersionPath, JSON.stringify(updateJSON, null, 2), "utf-8");
@@ -565,20 +570,20 @@ function copyAndSkipIfExist(from, to, skipIfExist) {
565
570
  * @param options - Asar build options
566
571
  * @returns Buffer of the built asar file
567
572
  */
568
- async function buildAsar(root, { version, asarOutputPath, electronDistPath, rendererDistPath, gzipPath, generateGzipFile }) {
573
+ async function buildAsar(root, { version, asarOutputPath, electronDistPath, rendererDistPath, compressedPath, generateCompressedFile }) {
569
574
  electronDistPath = path.resolve(root, electronDistPath);
570
575
  asarOutputPath = path.resolve(root, asarOutputPath);
571
576
  rendererDistPath = path.resolve(root, rendererDistPath);
572
- gzipPath = path.resolve(root, gzipPath);
577
+ compressedPath = path.resolve(root, compressedPath);
573
578
  const rPath = path.join(electronDistPath, "renderer");
574
579
  await fs.promises.cp(rendererDistPath, rPath, { recursive: true });
575
580
  fs.writeFileSync(path.join(electronDistPath, "version"), version);
576
581
  await fs.promises.mkdir(path.dirname(asarOutputPath), { recursive: true });
577
582
  await createPackage(electronDistPath, asarOutputPath);
578
- const buf = await generateGzipFile(fs.readFileSync(asarOutputPath));
579
- await fs.promises.mkdir(path.dirname(gzipPath), { recursive: true });
580
- fs.writeFileSync(gzipPath, buf);
581
- log.info(`Build update asar to '${gzipPath}' [${readableSize(buf.length)}]`, { timestamp: true });
583
+ const buf = await generateCompressedFile(fs.readFileSync(asarOutputPath));
584
+ await fs.promises.mkdir(path.dirname(compressedPath), { recursive: true });
585
+ fs.writeFileSync(compressedPath, buf);
586
+ log.info(`Build update asar to '${compressedPath}' [${readableSize(buf.length)}]`, { timestamp: true });
582
587
  return buf;
583
588
  }
584
589
  /**
@@ -586,7 +591,8 @@ async function buildAsar(root, { version, asarOutputPath, electronDistPath, rend
586
591
  * @param options - Version build options
587
592
  * @param asarBuffer - Buffer of the asar file to sign
588
593
  */
589
- async function buildUpdateJson({ versionPath, privateKey, cert, version, minimumVersion, generateSignature, generateUpdateJson }, asarBuffer) {
594
+ async function buildUpdateJson(root, { versionPath, privateKey, cert, version, minimumVersion, generateSignature, generateUpdateJson }, asarBuffer) {
595
+ const resolvedVersionPath = path.resolve(root, versionPath);
590
596
  let _json = {
591
597
  beta: {
592
598
  minimumVersion: version,
@@ -605,9 +611,9 @@ async function buildUpdateJson({ versionPath, privateKey, cert, version, minimum
605
611
  const sig = await generateSignature(asarBuffer, privateKey, cert, version);
606
612
  _json = await generateUpdateJson(_json, sig, version, minimumVersion);
607
613
  if (!isUpdateJSON(_json)) throw new Error("Invalid update json");
608
- await fs.promises.mkdir(path.dirname(versionPath), { recursive: true });
609
- fs.writeFileSync(versionPath, JSON.stringify(_json, null, 2));
610
- log.info(`build update json to '${versionPath}'`, { timestamp: true });
614
+ await fs.promises.mkdir(path.dirname(resolvedVersionPath), { recursive: true });
615
+ fs.writeFileSync(resolvedVersionPath, JSON.stringify(_json, null, 2));
616
+ log.info(`Build update json to '${resolvedVersionPath}'`, { timestamp: true });
611
617
  }
612
618
  //#endregion
613
619
  //#region src/vite/utils/key.ts
@@ -678,10 +684,10 @@ function parseSubjects(subject) {
678
684
  //#endregion
679
685
  //#region src/vite/core.ts
680
686
  async function resolveUpdaterOption(root, pkg, options = {}, resolveSignatureKeys = true) {
681
- const { minimumVersion = "0.0.0", paths: { asarOutputPath = `release/${pkg.name}.asar`, gzipPath = `release/${pkg.name}-${pkg.version}.asar.gz`, entryOutDir = "dist-entry", electronDistPath = "dist-electron", rendererDistPath = "dist", versionPath = "release/version.json" } = {}, keys: { privateKeyPath = "keys/private.pem", certPath = "keys/cert.pem", keyLength = 2048, certInfo: { subject = {
687
+ const { minimumVersion = "0.0.0", paths: { asarOutputPath = `release/${pkg.name}.asar`, compressedPath = `release/${pkg.name}-${pkg.version}.asar.br`, entryOutDir = "dist-entry", electronDistPath = "dist-electron", rendererDistPath = "dist", versionPath = "release/version.json" } = {}, keys: { privateKeyPath = "keys/private.pem", certPath = "keys/cert.pem", keyLength = 2048, certInfo: { subject = {
682
688
  commonName: pkg.name,
683
689
  organizationName: `org.${pkg.name}`
684
- }, days = 3650 } = {} } = {}, overrideGenerator: { generateGzipFile = defaultZipFile, generateSignature = defaultSignature, generateUpdateJson = defaultVersionJsonGenerator } = {} } = options;
690
+ }, days = 3650 } = {} } = {}, overrideGenerator: { generateCompressedFile = defaultCompressFile, generateSignature = defaultSignature, generateUpdateJson = defaultVersionJsonGenerator } = {} } = options;
685
691
  const { privateKey, cert } = resolveSignatureKeys ? await parseKeys({
686
692
  keyLength,
687
693
  privateKeyPath: path.resolve(root, privateKeyPath),
@@ -696,10 +702,10 @@ async function resolveUpdaterOption(root, pkg, options = {}, resolveSignatureKey
696
702
  buildAsarOption: {
697
703
  version: pkg.version,
698
704
  asarOutputPath,
699
- gzipPath,
705
+ compressedPath,
700
706
  electronDistPath,
701
707
  rendererDistPath,
702
- generateGzipFile
708
+ generateCompressedFile
703
709
  },
704
710
  buildVersionOption: {
705
711
  version: pkg.version,
@@ -869,7 +875,7 @@ async function createElectronOptions(options, context) {
869
875
  if (context.isDev) return;
870
876
  const buffer = await buildAsar(context.root, buildAsarOption);
871
877
  if (!buildVersionJson && !isCI) log.warn("No `buildVersionJson` option setup, skip build version json. Only build in CI by default", { timestamp: true });
872
- else await buildUpdateJson(buildVersionOption, buffer);
878
+ else await buildUpdateJson(context.root, buildVersionOption, buffer);
873
879
  }
874
880
  }
875
881
  ],
@@ -944,6 +950,7 @@ async function electronWithUpdater(options) {
944
950
  * import { defineElectronConfig } from 'electron-incremental-update/vite'
945
951
  *
946
952
  * export default defineElectronConfig({
953
+ * // root: './apps'
947
954
  * main: {
948
955
  * files: ['./electron/main/index.ts', './electron/main/worker.ts'],
949
956
  * },
@@ -954,13 +961,7 @@ async function electronWithUpdater(options) {
954
961
  * // options
955
962
  * },
956
963
  * renderer: {
957
- * server: process.env.VSCODE_DEBUG && (() => {
958
- * const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL)
959
- * return {
960
- * host: url.hostname,
961
- * port: +url.port,
962
- * }
963
- * })(),
964
+ * // plugins: []
964
965
  * }
965
966
  * })
966
967
  * ```
@@ -970,6 +971,7 @@ function defineElectronConfig(options) {
970
971
  const result = options.renderer ?? {};
971
972
  result.plugins ??= [];
972
973
  result.plugins.push(electronPlugin);
974
+ result.root = options.root;
973
975
  const rendererDistPath = options.updater?.paths?.rendererDistPath;
974
976
  if (rendererDistPath) {
975
977
  result.build ??= {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-incremental-update",
3
- "version": "3.0.0-beta.6",
3
+ "version": "3.0.0",
4
4
  "description": "Electron incremental update tools with Vite plugin, support bytecode protection",
5
5
  "keywords": [
6
6
  "bytecode",
@@ -61,7 +61,7 @@
61
61
  "test:dev": "bun test --watch",
62
62
  "format": "oxfmt",
63
63
  "lint": "oxlint --fix",
64
- "qa": "oxlint --fix && oxfmt && tsc --noEmit"
64
+ "qa": "bun run lint && bun run format && tsc --noEmit"
65
65
  },
66
66
  "dependencies": {
67
67
  "@babel/plugin-transform-arrow-functions": "^7.29.7",
@@ -72,14 +72,14 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@subf/config": "^0.2.1",
75
- "@tsdown/css": "^0.22.1",
75
+ "@tsdown/css": "^0.22.2",
76
76
  "@types/babel__core": "^7.20.5",
77
77
  "@types/bun": "^1.3.14",
78
78
  "bumpp": "^11.1.0",
79
79
  "electron": "42.2.0",
80
- "oxfmt": "^0.53.0",
81
- "oxlint": "^1.68.0",
82
- "tsdown": "^0.22.1",
80
+ "oxfmt": "^0.54.0",
81
+ "oxlint": "^1.69.0",
82
+ "tsdown": "^0.22.2",
83
83
  "typescript": "^6.0.3",
84
84
  "vite": "^8.0.16"
85
85
  },