electron-incremental-update 1.2.0 → 2.0.0-beta.1

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.
@@ -1,236 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
- // src/utils/electron.ts
9
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
10
- import { basename, dirname, join } from "node:path";
11
- import { release } from "node:os";
12
- import { app } from "electron";
13
- var is = {
14
- dev: !app.isPackaged,
15
- win: process.platform === "win32",
16
- mac: process.platform === "darwin",
17
- linux: process.platform === "linux"
18
- };
19
- function getPathFromAppNameAsar(...path) {
20
- return is.dev ? "DEV.asar" : join(dirname(app.getAppPath()), `${app.name}.asar`, ...path);
21
- }
22
- function getVersions() {
23
- const platform = is.win ? "Windows" : is.mac ? "MacOS" : process.platform.toUpperCase();
24
- return {
25
- appVersion: is.dev ? app.getVersion() : readFileSync(getPathFromAppNameAsar("version"), "utf-8"),
26
- entryVersion: app.getVersion(),
27
- electronVersion: process.versions.electron,
28
- nodeVersion: process.versions.node,
29
- systemVersion: `${platform} ${release()}`
30
- };
31
- }
32
- function loadNativeModuleFromEntry(devEntryDirPath = "../../dist-entry", entryDirPath = join(app.getAppPath(), basename(devEntryDirPath))) {
33
- const path = is.dev ? devEntryDirPath : entryDirPath;
34
- return (moduleName) => {
35
- try {
36
- return __require(join(path, moduleName));
37
- } catch (error) {
38
- console.error("fail to load module", error);
39
- }
40
- };
41
- }
42
- function restartApp() {
43
- app.relaunch();
44
- app.quit();
45
- }
46
- function setAppUserModelId(id) {
47
- app.setAppUserModelId(is.dev ? process.execPath : id ?? `org.${app.name}`);
48
- }
49
- function disableHWAccForWin7() {
50
- if (release().startsWith("6.1")) {
51
- app.disableHardwareAcceleration();
52
- }
53
- }
54
- function singleInstance(window) {
55
- const result = app.requestSingleInstanceLock();
56
- result ? app.on("second-instance", () => {
57
- if (window) {
58
- window.show();
59
- if (window.isMinimized()) {
60
- window.restore();
61
- }
62
- window.focus();
63
- }
64
- }) : app.quit();
65
- return result;
66
- }
67
- function setPortableAppDataPath(dirName = "data") {
68
- const portablePath = join(dirname(app.getPath("exe")), dirName);
69
- if (!existsSync(portablePath)) {
70
- mkdirSync(portablePath);
71
- }
72
- app.setPath("appData", portablePath);
73
- }
74
- function waitAppReady(timeout = 1e3) {
75
- return app.isReady() ? Promise.resolve() : new Promise((resolve, reject) => {
76
- const _ = setTimeout(() => {
77
- reject(new Error("app is not ready"));
78
- }, timeout);
79
- app.whenReady().then(() => {
80
- clearTimeout(_);
81
- resolve();
82
- });
83
- });
84
- }
85
- function getPaths(entryDirName = "dist-entry") {
86
- const root = join(__dirname, "..");
87
- const mainDirPath = join(root, "main");
88
- const preloadDirPath = join(root, "preload");
89
- const rendererDirPath = join(root, "renderer");
90
- const devServerURL = process.env.VITE_DEV_SERVER_URL;
91
- const indexHTMLPath = join(rendererDirPath, "index.html");
92
- const publicDirPath = devServerURL ? join(root, "../public") : rendererDirPath;
93
- return {
94
- /**
95
- * @example
96
- * ```ts
97
- * devServerURL && win.loadURL(devServerURL)
98
- * ```
99
- */
100
- devServerURL,
101
- /**
102
- * @example
103
- * ```ts
104
- * win.loadFile(indexHTMLPath)
105
- * ```
106
- */
107
- indexHTMLPath,
108
- /**
109
- * get path inside entry asar
110
- * @param paths joined path
111
- */
112
- getPathFromEntryAsar(...paths) {
113
- return join(app.getAppPath(), entryDirName, ...paths);
114
- },
115
- /**
116
- * get path inside `${electron.app.name}.asar/main`
117
- * @param paths joined path
118
- */
119
- getPathFromMain(...paths) {
120
- return join(mainDirPath, ...paths);
121
- },
122
- /**
123
- * get path inside `${electron.app.name}.asar/preload`
124
- * @param paths joined path
125
- */
126
- getPathFromPreload(...paths) {
127
- return join(preloadDirPath, ...paths);
128
- },
129
- /**
130
- * get path inside public dir
131
- * @param paths joined path
132
- */
133
- getPathFromPublic(...paths) {
134
- return join(publicDirPath, ...paths);
135
- }
136
- };
137
- }
138
-
139
- // src/utils/zip.ts
140
- import { existsSync as existsSync2, readFileSync as readFileSync2, rmSync, writeFileSync } from "node:fs";
141
- import { brotliCompress, brotliDecompress } from "node:zlib";
142
- async function unzipFile(gzipPath, targetFilePath = gzipPath.slice(0, -3)) {
143
- if (!existsSync2(gzipPath)) {
144
- throw new Error(`path to zipped file not exist: ${gzipPath}`);
145
- }
146
- const compressedBuffer = readFileSync2(gzipPath);
147
- return new Promise((resolve, reject) => {
148
- brotliDecompress(compressedBuffer, (err, buffer) => {
149
- rmSync(gzipPath);
150
- if (err) {
151
- reject(err);
152
- }
153
- writeFileSync(targetFilePath, buffer);
154
- resolve(null);
155
- });
156
- });
157
- }
158
- async function zipFile(filePath, targetFilePath = `${filePath}.gz`) {
159
- if (!existsSync2(filePath)) {
160
- throw new Error(`path to be zipped not exist: ${filePath}`);
161
- }
162
- const buffer = readFileSync2(filePath);
163
- return new Promise((resolve, reject) => {
164
- brotliCompress(buffer, (err, buffer2) => {
165
- if (err) {
166
- reject(err);
167
- }
168
- writeFileSync(targetFilePath, buffer2);
169
- resolve(null);
170
- });
171
- });
172
- }
173
-
174
- // src/utils/pure.ts
175
- function parseGithubCdnURL(originRepoURL, cdnPrefix, relativeFilePath) {
176
- if (!originRepoURL.startsWith("https://github.com/")) {
177
- throw new Error("origin url must start with https://github.com/");
178
- }
179
- originRepoURL = originRepoURL.trim().replace(/\/?$/, "/").trim();
180
- relativeFilePath = relativeFilePath.trim().replace(/^\/|\/?$/g, "").trim();
181
- cdnPrefix = cdnPrefix.trim().replace(/^\/?|\/?$/g, "").trim();
182
- return originRepoURL.replace("github.com", cdnPrefix) + relativeFilePath;
183
- }
184
- function handleUnexpectedErrors(callback) {
185
- process.on("uncaughtException", callback);
186
- process.on("unhandledRejection", callback);
187
- }
188
- function parseVersion(version) {
189
- const semver = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9.-]+))?/i;
190
- const match = semver.exec(version);
191
- if (!match) {
192
- throw new TypeError(`invalid version: ${version}`);
193
- }
194
- const [major, minor, patch] = match.slice(1, 4).map(Number);
195
- const ret = {
196
- major,
197
- minor,
198
- patch,
199
- stage: "",
200
- stageVersion: -1
201
- };
202
- if (match[4]) {
203
- let [stage, _v] = match[4].split(".");
204
- ret.stage = stage;
205
- ret.stageVersion = Number(_v) || -1;
206
- }
207
- if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) {
208
- throw new TypeError(`invalid version: ${version}`);
209
- }
210
- return ret;
211
- }
212
- function isUpdateJSON(json) {
213
- const is2 = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
214
- return is2(json) && is2(json?.beta);
215
- }
216
-
217
- export {
218
- __require,
219
- is,
220
- getPathFromAppNameAsar,
221
- getVersions,
222
- loadNativeModuleFromEntry,
223
- restartApp,
224
- setAppUserModelId,
225
- disableHWAccForWin7,
226
- singleInstance,
227
- setPortableAppDataPath,
228
- waitAppReady,
229
- getPaths,
230
- unzipFile,
231
- zipFile,
232
- parseGithubCdnURL,
233
- handleUnexpectedErrors,
234
- parseVersion,
235
- isUpdateJSON
236
- };
package/dist/vite.d.ts DELETED
@@ -1,372 +0,0 @@
1
- import { Plugin } from 'vite';
2
- import { ElectronSimpleOptions } from 'vite-plugin-electron/simple';
3
- import { Promisable } from '@subframe7536/type-utils';
4
- import { BuildOptions } from 'esbuild';
5
-
6
- type UpdateInfo = {
7
- signature: string;
8
- minimumVersion: string;
9
- version: string;
10
- size: number;
11
- };
12
- type UpdateJSON = UpdateInfo & {
13
- beta: UpdateInfo;
14
- };
15
-
16
- type PKG = {
17
- name: string;
18
- version: string;
19
- main: string;
20
- };
21
- type DistinguishedName = {
22
- countryName?: string;
23
- stateOrProvinceName?: string;
24
- localityName?: string;
25
- organizationName?: string;
26
- organizationalUnitName?: string;
27
- commonName?: string;
28
- serialNumber?: string;
29
- title?: string;
30
- description?: string;
31
- businessCategory?: string;
32
- emailAddress?: string;
33
- };
34
- type BuildEntryOption = {
35
- /**
36
- * whether to minify
37
- * @default isBuild
38
- */
39
- minify?: boolean;
40
- /**
41
- * whether to generate sourcemap
42
- * @default isBuild
43
- */
44
- sourcemap?: boolean;
45
- /**
46
- * path to app entry output file
47
- * @default 'dist-entry'
48
- */
49
- entryOutputDirPath?: string;
50
- /**
51
- * path to app entry file
52
- * @default 'electron/entry.ts'
53
- */
54
- appEntryPath?: string;
55
- /**
56
- * esbuild path map of native modules in entry directory
57
- *
58
- * @default {}
59
- * @example
60
- * { db: './electron/native/db.ts' }
61
- */
62
- nativeModuleEntryMap?: Record<string, string>;
63
- /**
64
- * custom options for esbuild
65
- * ```ts
66
- * // default options
67
- * const options = {
68
- * entryPoints: {
69
- * entry: appEntryPath,
70
- * ...moduleEntryMap,
71
- * },
72
- * bundle: true,
73
- * platform: 'node',
74
- * outdir: entryOutputDirPath,
75
- * minify,
76
- * sourcemap,
77
- * entryNames: '[dir]/[name]',
78
- * assetNames: '[dir]/[name]',
79
- * external: ['electron', 'original-fs'],
80
- * loader: {
81
- * '.node': 'empty',
82
- * },
83
- * define: {
84
- * __SIGNATURE_CERT__: JSON.stringify(cert),
85
- * },
86
- * }
87
- * ```
88
- */
89
- overrideEsbuildOptions?: BuildOptions;
90
- /**
91
- * resolve extra files on startup, such as `.node`
92
- * @remark won't trigger will reload
93
- */
94
- postBuild?: (args: {
95
- /**
96
- * get path from `entryOutputDirPath`
97
- */
98
- getPathFromEntryOutputDir: (...paths: string[]) => string;
99
- /**
100
- * check exist and copy file to `entryOutputDirPath`
101
- *
102
- * if `to` absent, set to `basename(from)`
103
- *
104
- * if `skipIfExist` absent, skip copy if `to` exist
105
- */
106
- copyToEntryOutputDir: (options: {
107
- from: string;
108
- to?: string;
109
- /**
110
- * skip copy if `to` exist
111
- * @default true
112
- */
113
- skipIfExist?: boolean;
114
- }) => void;
115
- }) => Promisable<void>;
116
- };
117
- type GeneratorOverrideFunctions = {
118
- /**
119
- * custom signature generate function
120
- * @param buffer file buffer
121
- * @param privateKey private key
122
- * @param cert certificate string, **EOL must be '\n'**
123
- * @param version current version
124
- */
125
- generateSignature?: (buffer: Buffer, privateKey: string, cert: string, version: string) => string | Promise<string>;
126
- /**
127
- * custom generate version json function
128
- * @param existingJson The existing JSON object.
129
- * @param buffer file buffer
130
- * @param signature generated signature
131
- * @param version current version
132
- * @param minVersion The minimum version
133
- * @returns The updated version json
134
- */
135
- generateVersionJson?: (existingJson: UpdateJSON, buffer: Buffer, signature: string, version: string, minVersion: string) => UpdateJSON | Promise<UpdateJSON>;
136
- };
137
- type ElectronUpdaterOptions = {
138
- /**
139
- * mini version of entry
140
- * @default '0.0.0'
141
- */
142
- minimumVersion?: string;
143
- /**
144
- * config for entry (app.asar)
145
- */
146
- entry?: BuildEntryOption;
147
- /**
148
- * paths config
149
- */
150
- paths?: {
151
- /**
152
- * Path to asar file
153
- * @default `release/${app.name}.asar`
154
- */
155
- asarOutputPath?: string;
156
- /**
157
- * Path to version info output, content is {@link UpdateJSON}
158
- * @default `version.json`
159
- */
160
- versionPath?: string;
161
- /**
162
- * Path to gzipped asar file
163
- * @default `release/${app.name}-${version}.asar.gz`
164
- */
165
- gzipPath?: string;
166
- /**
167
- * Path to electron build output
168
- * @default `dist-electron`
169
- */
170
- electronDistPath?: string;
171
- /**
172
- * Path to renderer build output
173
- * @default `dist`
174
- */
175
- rendererDistPath?: string;
176
- };
177
- /**
178
- * signature config
179
- */
180
- keys?: {
181
- /**
182
- * path to the pem file that contains private key
183
- * if not ended with .pem, it will be appended
184
- *
185
- * **if `UPDATER_PK` is set, will read it instead of read from `privateKeyPath`**
186
- * @default 'keys/private.pem'
187
- */
188
- privateKeyPath?: string;
189
- /**
190
- * path to the pem file that contains public key
191
- * if not ended with .pem, it will be appended
192
- *
193
- * **if `UPDATER_CERT` is set, will read it instead of read from `certPath`**
194
- * @default 'keys/cert.pem'
195
- */
196
- certPath?: string;
197
- /**
198
- * length of the key
199
- * @default 2048
200
- */
201
- keyLength?: number;
202
- /**
203
- * X509 certificate info
204
- *
205
- * only generate simple **self-signed** certificate **without extensions**
206
- */
207
- certInfo?: {
208
- /**
209
- * the subject of the certificate
210
- *
211
- * @default { commonName: `${app.name}`, organizationName: `org.${app.name}` }
212
- */
213
- subject?: DistinguishedName;
214
- /**
215
- * expire days of the certificate
216
- *
217
- * @default 3650
218
- */
219
- days?: number;
220
- };
221
- overrideGenerator?: GeneratorOverrideFunctions;
222
- };
223
- };
224
-
225
- type BytecodeOptions = {
226
- /**
227
- * strings that should be transformed
228
- */
229
- protectedStrings?: string[];
230
- /**
231
- * Remember to set `sandbox: false` when creating window
232
- */
233
- enablePreload?: boolean;
234
- };
235
-
236
- type MakeRequired<T, K extends keyof T> = Exclude<T, undefined> & {
237
- [P in K]-?: T[P];
238
- };
239
- type ReplaceKey<T, Key extends keyof T, NewKey extends string> = Omit<T, Key> & {
240
- [P in NewKey]: T[Key];
241
- };
242
- type MakeRequiredAndReplaceKey<T, K extends keyof T, NewKey extends string> = MakeRequired<ReplaceKey<T, K, NewKey>, NewKey>;
243
- /**
244
- * startup function for debug (see {@link https://github.com/electron-vite/electron-vite-vue/blob/main/vite.config.ts electron-vite-vue template})
245
- * @example
246
- * import { debugStartup, buildElectronPluginOptions } from 'electron-incremental-update/vite'
247
- * const options = buildElectronPluginOptions({
248
- * // ...
249
- * main: {
250
- * // ...
251
- * startup: debugStartup
252
- * },
253
- * })
254
- */
255
- declare function debugStartup(args: {
256
- startup: (argv?: string[]) => Promise<void>;
257
- reload: () => void;
258
- }): void;
259
- type ElectronWithUpdaterOptions = {
260
- /**
261
- * whether is in build mode
262
- * ```ts
263
- * export default defineConfig(({ command }) => {
264
- * const isBuild = command === 'build'
265
- * })
266
- * ```
267
- */
268
- isBuild: boolean;
269
- /**
270
- * manually setup package.json, read name, version and main
271
- * ```ts
272
- * import pkg from './package.json'
273
- * ```
274
- */
275
- pkg?: PKG;
276
- /**
277
- * whether to generate sourcemap
278
- * @default !isBuild
279
- */
280
- sourcemap?: boolean;
281
- /**
282
- * whether to minify the code
283
- * @default isBuild
284
- */
285
- minify?: boolean;
286
- /**
287
- * whether to generate bytecode
288
- *
289
- * **only support commonjs**
290
- *
291
- * only main process by default, if you want to use in preload script, please use `electronWithUpdater({ bytecode: { enablePreload: true } })` and set `sandbox: false` when creating window
292
- */
293
- bytecode?: boolean | BytecodeOptions;
294
- /**
295
- * use NotBundle() plugin in main
296
- * @default true
297
- */
298
- useNotBundle?: boolean;
299
- /**
300
- * Whether to log parsed options
301
- *
302
- * to show certificate and private keys, set `logParsedOptions: { showKeys: true }`
303
- */
304
- logParsedOptions?: boolean | {
305
- showKeys: boolean;
306
- };
307
- /**
308
- * main options
309
- */
310
- main: MakeRequiredAndReplaceKey<ElectronSimpleOptions['main'], 'entry', 'files'>;
311
- /**
312
- * preload options
313
- */
314
- preload: MakeRequiredAndReplaceKey<Exclude<ElectronSimpleOptions['preload'], undefined>, 'input', 'files'>;
315
- /**
316
- * updater options
317
- */
318
- updater?: ElectronUpdaterOptions;
319
- };
320
- /**
321
- * build options for `vite-plugin-electron/simple`
322
- * - integrate with updater
323
- * - only contains `main` and `preload` configs
324
- * - remove old electron files
325
- * - externalize dependencies
326
- * - auto restart when entry file changes
327
- * - other configs in {@link https://github.com/electron-vite/electron-vite-vue/blob/main/vite.config.ts electron-vite-vue template}
328
- * - no `vite-plugin-electron-renderer` config
329
- *
330
- * you can override all the configs
331
- *
332
- * **Limitation**: entry file change cannot trigger auto restart
333
- *
334
- * @example
335
- * import { defineConfig } from 'vite'
336
- * import { debugStartup, electronWithUpdater } from 'electron-incremental-update/vite'
337
- * import pkg from './package.json'
338
- *
339
- * export default defineConfig(async ({ command }) => {
340
- * const isBuild = command === 'build'
341
- * return {
342
- * plugins: [
343
- * electronWithUpdater({
344
- * pkg,
345
- * isBuild,
346
- * logParsedOptions: true,
347
- * main: {
348
- * files: ['./electron/main/index.ts', './electron/main/worker.ts'],
349
- * // see https://github.com/electron-vite/electron-vite-vue/blob/85ed267c4851bf59f32888d766c0071661d4b94c/vite.config.ts#L22-L28
350
- * onstart: debugStartup,
351
- * },
352
- * preload: {
353
- * files: './electron/preload/index.ts',
354
- * },
355
- * updater: {
356
- * // options
357
- * }
358
- * }),
359
- * ],
360
- * server: process.env.VSCODE_DEBUG && (() => {
361
- * const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL)
362
- * return {
363
- * host: url.hostname,
364
- * port: +url.port,
365
- * }
366
- * })(),
367
- * }
368
- * })
369
- */
370
- declare function electronWithUpdater(options: ElectronWithUpdaterOptions): Promise<(Plugin<any> | Promise<Plugin<any>[]> | undefined)[] | null>;
371
-
372
- export { type ElectronWithUpdaterOptions, debugStartup, electronWithUpdater };