electron-incremental-update 2.2.3 → 2.2.5

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
@@ -197,19 +197,6 @@ export default startupWithUpdater((updater) => {
197
197
  updater.onDownloading = ({ percent }) => {
198
198
  console.log(percent)
199
199
  }
200
- updater.logger = console
201
- updater.receiveBeta = true
202
- // setup provider later
203
- updater.provider = new GitHubProvider({
204
- user: 'yourname',
205
- repo: 'electron',
206
- // setup url handler
207
- urlHandler: (url) => {
208
- url.hostname = 'mirror.ghproxy.com'
209
- url.pathname = `https://github.com${url.pathname}`
210
- return url
211
- }
212
- })
213
200
 
214
201
  updater.on('update-available', async ({ version }) => {
215
202
  const { response } = await dialog.showMessageBox({
@@ -222,25 +209,56 @@ export default startupWithUpdater((updater) => {
222
209
  }
223
210
  await updater.downloadUpdate()
224
211
  })
212
+
225
213
  updater.on('update-not-available', (code, reason, info) => console.log(code, reason, info))
214
+
226
215
  updater.on('download-progress', (data) => {
227
216
  console.log(data)
228
217
  main.send(BrowserWindow.getAllWindows()[0], 'msg', data)
229
218
  })
219
+
230
220
  updater.on('update-downloaded', () => {
231
221
  updater.quitAndInstall()
232
222
  })
223
+
233
224
  updater.checkForUpdates()
234
225
  })
235
226
  ```
236
227
 
228
+ #### Dynamicly setup `UpdateProvider`
229
+
230
+ ```ts
231
+ updater.provider = new GitHubProvider({
232
+ user: 'yourname',
233
+ repo: 'electron',
234
+ // setup url handler
235
+ urlHandler: (url) => {
236
+ url.hostname = 'mirror.ghproxy.com'
237
+ url.pathname = `https://github.com${url.pathname}`
238
+ return url
239
+ }
240
+ })
241
+ ```
242
+
243
+ #### Custom logger
244
+
245
+ ```ts
246
+ updater.logger = console
247
+ ```
248
+
249
+ #### Setup Beta Channel
250
+
251
+ ```ts
252
+ updater.receiveBeta = true
253
+ ```
254
+
237
255
  ### Use Native Modules
238
256
 
239
257
  To reduce production size, it is recommended that all the **native modules** should be set as `dependency` in `package.json` and other packages should be set as `devDependencies`. Also, `electron-rebuild` only check dependencies inside `dependency` field.
240
258
 
241
259
  If you are using `electron-builder` to build distributions, all the native modules with its **large relavent `node_modiles`** will be packaged into `app.asar` by default.
242
260
 
243
- Luckily, `Esbuild` can bundle all the dependencies. Just follow the steps:
261
+ Luckily, `vite` can bundle all the dependencies. Just follow the steps:
244
262
 
245
263
  1. setup `nativeModuleEntryMap` option
246
264
  2. Manually copy the native binaries in `postBuild` callback
@@ -1,5 +1,5 @@
1
1
  import { readableSize } from './chunk-TPTWE33H.js';
2
- import { convertLiteral, bytecodeModuleLoaderCode, bytecodeModuleLoader, convertArrowFunctionAndTemplate, compileToBytecode, useStrict, toRelativePath } from './chunk-LR7LR5WG.js';
2
+ import { convertArrowFunctionAndTemplate, bytecodeModuleLoader, bytecodeModuleLoaderCode, convertLiteral, compileToBytecode, useStrict, toRelativePath } from './chunk-LR7LR5WG.js';
3
3
  import { bytecodeLog, bytecodeId } from './chunk-5NKEXGI3.js';
4
4
  import fs from 'node:fs';
5
5
  import path from 'node:path';
@@ -38,15 +38,20 @@ function getHeader(headers, key) {
38
38
  return value;
39
39
  }
40
40
  }
41
- async function downloadUtil(url, headers, signal, onResponse) {
41
+ async function downloadUtil(url, headers, onResponse) {
42
42
  await electron.app.whenReady();
43
43
  return new Promise((resolve, reject) => {
44
- const request = electron.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
45
- signal.addEventListener("abort", () => request.abort(), { once: true });
44
+ const request = electron.net.request({
45
+ cache: "no-cache",
46
+ headers,
47
+ method: "GET",
48
+ redirect: "follow",
49
+ url
50
+ });
46
51
  request.on("response", (resp) => {
47
- resp.on("aborted", () => reject(new Error("aborted")));
48
- resp.on("error", () => reject(new Error("download error")));
49
- onResponse(resp, resolve, reject);
52
+ resp.on("aborted", () => reject(new Error("Aborted")));
53
+ resp.on("error", reject);
54
+ onResponse(request, resp, resolve, reject);
50
55
  });
51
56
  request.on("error", reject);
52
57
  request.end();
@@ -66,11 +71,14 @@ async function defaultDownloadJSON(url, headers, signal, resolveData = defaultRe
66
71
  return await downloadUtil(
67
72
  url,
68
73
  headers,
69
- signal,
70
- (resp, resolve, reject) => {
74
+ (request, resp, resolve, reject) => {
71
75
  let data = "";
72
76
  resp.on("data", (chunk) => data += chunk);
73
77
  resp.on("end", () => resolveData(data, resolve, reject));
78
+ signal.addEventListener("abort", () => {
79
+ request.abort();
80
+ data = null;
81
+ }, { once: true });
74
82
  }
75
83
  );
76
84
  }
@@ -99,25 +107,29 @@ async function defaultDownloadAsar(url, headers, signal, onDownloading) {
99
107
  return await downloadUtil(
100
108
  url,
101
109
  headers,
102
- signal,
103
- (resp, resolve) => {
110
+ (request, resp, resolve) => {
104
111
  const total = +getHeader(resp.headers, "content-length") || -1;
105
- const data = [];
112
+ let data = [];
106
113
  resp.on("data", (chunk) => {
107
114
  const delta = chunk.length;
108
115
  transferred += delta;
109
116
  const current = Date.now();
110
117
  onDownloading?.({
118
+ bps: delta / (current - time),
119
+ delta,
111
120
  percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
112
121
  total,
113
- transferred,
114
- delta,
115
- bps: delta / (current - time)
122
+ transferred
116
123
  });
117
124
  time = current;
118
125
  data.push(chunk);
119
126
  });
120
127
  resp.on("end", () => resolve(Buffer.concat(data)));
128
+ signal.addEventListener("abort", () => {
129
+ request.abort();
130
+ data.length = 0;
131
+ data = null;
132
+ }, { once: true });
121
133
  }
122
134
  );
123
135
  }
@@ -185,7 +185,7 @@ function convertLiteral(code, sourcemap, offset) {
185
185
  }
186
186
  return {
187
187
  code: s.toString(),
188
- map: sourcemap ? s.generateMap({ hires: true }) : void 0
188
+ map: sourcemap ? s.generateMap({ hires: true }) : undefined
189
189
  };
190
190
  }
191
191
 
@@ -71,13 +71,13 @@ function loadPage(win, htmlFilePath = "index.html") {
71
71
  }
72
72
  function beautifyDevTools(win, options) {
73
73
  const { mono, sans, scrollbar = true } = options;
74
- win.webContents.on("devtools-opened", () => {
75
- let css = `:root{--sans: ${sans};--mono: ${mono}}:root,body{--source-code-font-family: var(--mono) !important;--source-code-font-size: 12px !important;--monospace-font-family: var(--mono) !important;--monospace-font-size: 12px !important;--default-font-family: var(--sans), sans-serif !important;--default-font-size: 12px !important}button,input,select,.undisplayable-text,.expandable-inline-button{font-family:var(--sans)!important}`;
74
+ win.webContents.on("devtools-opened", async () => {
75
+ let css = `:root{--sans:${sans};--mono:${mono}}:root,body{--source-code-font-family:var(--mono)!important;--source-code-font-size:12px!important;--monospace-font-family:var(--mono)!important;--monospace-font-size:12px!important;--default-font-family:var(--sans), sans-serif!important;--default-font-size:12px!important}button,input,select,.undisplayable-text,.expandable-inline-button{font-family:var(--sans)!important}`;
76
76
  if (scrollbar) {
77
- css += ":root{--scrollbar-width: max(.85vw, 10px)}@media (prefers-color-scheme: light){:root{--scrollbar-color-rgb: 0, 0, 0}}@media (prefers-color-scheme: dark){:root{--scrollbar-color-rgb: 255, 255, 255}}*::-webkit-scrollbar{width:var(--scrollbar-width)!important;height:var(--scrollbar-width)!important}*::-webkit-scrollbar-track{background-color:transparent!important;border-radius:var(--scrollbar-width)!important;box-shadow:none!important}*::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 var(--scrollbar-width)!important;border-radius:var(--scrollbar-width)!important;border:calc(var(--scrollbar-width) * 2 / 9) solid transparent!important;background-clip:content-box;background-color:transparent!important;color:rgba(var(--scrollbar-color-rgb),30%)!important}*::-webkit-scrollbar-thumb:hover{color:rgba(var(--scrollbar-color-rgb),45%)!important}*::-webkit-scrollbar-thumb:active{color:rgba(var(--scrollbar-color-rgb),60%)!important}@supports not selector(::-webkit-scrollbar){html{scrollbar-color:rgb(var(--scrollbar-color-rgb));scrollbar-width:thin}}";
77
+ css += ":root{--scrollbar-width:max(.85vw,10px)}@media (prefers-color-scheme:light){:root{--scrollbar-color-rgb:0,0,0}}@media (prefers-color-scheme:dark){:root{--scrollbar-color-rgb:255,255,255}}*::-webkit-scrollbar{width:var(--scrollbar-width)!important;height:var(--scrollbar-width)!important}*::-webkit-scrollbar-track{background-color:transparent!important;border-radius:var(--scrollbar-width)!important;box-shadow:none!important}*::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 var(--scrollbar-width)!important;border-radius:var(--scrollbar-width)!important;border:calc(var(--scrollbar-width) * 2/9) solid transparent!important;background-clip:content-box;background-color:transparent!important;color:rgba(var(--scrollbar-color-rgb),30%)!important}*::-webkit-scrollbar-thumb:hover{color:rgba(var(--scrollbar-color-rgb),45%)!important}*::-webkit-scrollbar-thumb:active{color:rgba(var(--scrollbar-color-rgb),60%)!important}@supports not selector(::-webkit-scrollbar){html{scrollbar-color:rgb(var(--scrollbar-color-rgb));scrollbar-width:thin}}";
78
78
  }
79
- const js = `let overriddenStyle=document.createElement('style');overriddenStyle.innerHTML='${css}';document.body.append(overriddenStyle);document.body.classList.remove('platform-windows','platform-mac','platform-linux');`;
80
- win?.webContents.devToolsWebContents?.executeJavaScript(js);
79
+ const js = `${'function run(n){let d=document.createElement("style");d.innerHTML=n,document.body.append(d),["platform-windows","platform-mac","platform-linux"].forEach(e=>document.querySelectorAll(`.${e}`).forEach(o=>o.classList.remove(e))),l();const r=new MutationObserver(e=>{for(const o of e)if(o.type==="childList")for(let t=0;t<o.addedNodes.length;t++)o.addedNodes[t].classList.contains("editor-tooltip-host")&&l()});r.observe(document.body,{childList:!0});function l(){document.querySelectorAll(".editor-tooltip-host").forEach(e=>{if(e?.shadowRoot?.querySelectorAll(\'[data-key="overridden-dev-tools-font"]\').length===0){const o=document.createElement("style");o.setAttribute("data-key","overridden-dev-tools-font"),o.innerHTML=`${n}.cm-tooltip-autocomplete ul[role=listbox]{font-family:var(--mono)!important;}`,e.shadowRoot.append(o)}})}window.onbeforeunload=()=>r.disconnect()}'};run(\`${css}\`)`;
80
+ await win?.webContents.devToolsWebContents?.executeJavaScript(js);
81
81
  });
82
82
  }
83
83
  function getPathFromMain(...paths) {
package/dist/index.cjs CHANGED
@@ -177,7 +177,7 @@ var Updater = class extends events.EventEmitter {
177
177
  this.err("Download failed", "ERR_PARAM", "No update asar buffer and provider");
178
178
  return false;
179
179
  }
180
- const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
180
+ const buffer = await this.fetch("buffer", data ? Buffer.from(data) : undefined);
181
181
  if (!buffer) {
182
182
  this.err("Download failed", "ERR_PARAM", "No update asar file buffer");
183
183
  return false;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Promisable } from '@subframe7536/type-utils';
2
- import { I as IProvider, U as UpdateInfo, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-C5M2xRjF.cjs';
2
+ import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-1T_tRG8a.cjs';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import 'node:url';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Promisable } from '@subframe7536/type-utils';
2
- import { I as IProvider, U as UpdateInfo, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-C5M2xRjF.js';
2
+ import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-1T_tRG8a.js';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import 'node:url';
5
5
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isDev, getAppVersion, getEntryVersion, getPathFromAppNameAsar, restartApp } from './chunk-YZGE4RFY.js';
1
+ import { isDev, getEntryVersion, getAppVersion, getPathFromAppNameAsar, restartApp } from './chunk-QKKPETVJ.js';
2
2
  import { isUpdateJSON, __require } from './chunk-AAAM44NW.js';
3
3
  import fs2 from 'node:fs';
4
4
  import path from 'node:path';
@@ -141,7 +141,7 @@ var Updater = class extends EventEmitter {
141
141
  this.err("Download failed", "ERR_PARAM", "No update asar buffer and provider");
142
142
  return false;
143
143
  }
144
- const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
144
+ const buffer = await this.fetch("buffer", data ? Buffer.from(data) : undefined);
145
145
  if (!buffer) {
146
146
  this.err("Download failed", "ERR_PARAM", "No update asar file buffer");
147
147
  return false;
package/dist/provider.cjs CHANGED
@@ -1,36 +1,17 @@
1
1
  'use strict';
2
2
 
3
+ var electron = require('electron');
3
4
  var crypto = require('crypto');
4
5
  var zlib = require('zlib');
5
- var electron = require('electron');
6
6
  var url = require('url');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
+ var electron__default = /*#__PURE__*/_interopDefault(electron);
10
11
  var crypto__default = /*#__PURE__*/_interopDefault(crypto);
11
12
  var zlib__default = /*#__PURE__*/_interopDefault(zlib);
12
- var electron__default = /*#__PURE__*/_interopDefault(electron);
13
13
 
14
- // src/utils/crypto.ts
15
- function hashBuffer(data, length) {
16
- const hash = crypto__default.default.createHash("SHA256").update(data).digest("binary");
17
- return Buffer.from(hash).subarray(0, length);
18
- }
19
- function aesDecrypt(encryptedText, key, iv) {
20
- const decipher = crypto__default.default.createDecipheriv("aes-256-cbc", key, iv);
21
- return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
22
- }
23
- function defaultVerifySignature(buffer, version, signature, cert) {
24
- try {
25
- const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
26
- if (ver !== version) {
27
- return false;
28
- }
29
- return crypto__default.default.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
30
- } catch {
31
- return false;
32
- }
33
- }
14
+ // src/utils/download.ts
34
15
 
35
16
  // src/utils/version.ts
36
17
  function parseVersion(version) {
@@ -80,28 +61,8 @@ var is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
80
61
  function isUpdateJSON(json) {
81
62
  return is(json) && is(json?.beta);
82
63
  }
83
- async function defaultUnzipFile(buffer) {
84
- return new Promise((resolve, reject) => {
85
- zlib__default.default.brotliDecompress(buffer, (err, buffer2) => err ? reject(err) : resolve(buffer2));
86
- });
87
- }
88
64
 
89
- // src/provider/base.ts
90
- var BaseProvider = class {
91
- name = "BaseProvider";
92
- /**
93
- * @inheritdoc
94
- */
95
- isLowerVersion = defaultIsLowerVersion;
96
- /**
97
- * @inheritdoc
98
- */
99
- verifySignaure = defaultVerifySignature;
100
- /**
101
- * @inheritdoc
102
- */
103
- unzipFile = defaultUnzipFile;
104
- };
65
+ // src/utils/download.ts
105
66
  function getHeader(headers, key) {
106
67
  const value = headers[key];
107
68
  if (Array.isArray(value)) {
@@ -110,15 +71,20 @@ function getHeader(headers, key) {
110
71
  return value;
111
72
  }
112
73
  }
113
- async function downloadUtil(url, headers, signal, onResponse) {
74
+ async function downloadUtil(url, headers, onResponse) {
114
75
  await electron__default.default.app.whenReady();
115
76
  return new Promise((resolve, reject) => {
116
- const request = electron__default.default.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
117
- signal.addEventListener("abort", () => request.abort(), { once: true });
77
+ const request = electron__default.default.net.request({
78
+ cache: "no-cache",
79
+ headers,
80
+ method: "GET",
81
+ redirect: "follow",
82
+ url
83
+ });
118
84
  request.on("response", (resp) => {
119
- resp.on("aborted", () => reject(new Error("aborted")));
120
- resp.on("error", () => reject(new Error("download error")));
121
- onResponse(resp, resolve, reject);
85
+ resp.on("aborted", () => reject(new Error("Aborted")));
86
+ resp.on("error", reject);
87
+ onResponse(request, resp, resolve, reject);
122
88
  });
123
89
  request.on("error", reject);
124
90
  request.end();
@@ -138,11 +104,14 @@ async function defaultDownloadJSON(url, headers, signal, resolveData = defaultRe
138
104
  return await downloadUtil(
139
105
  url,
140
106
  headers,
141
- signal,
142
- (resp, resolve, reject) => {
107
+ (request, resp, resolve, reject) => {
143
108
  let data = "";
144
109
  resp.on("data", (chunk) => data += chunk);
145
110
  resp.on("end", () => resolveData(data, resolve, reject));
111
+ signal.addEventListener("abort", () => {
112
+ request.abort();
113
+ data = null;
114
+ }, { once: true });
146
115
  }
147
116
  );
148
117
  }
@@ -171,28 +140,73 @@ async function defaultDownloadAsar(url, headers, signal, onDownloading) {
171
140
  return await downloadUtil(
172
141
  url,
173
142
  headers,
174
- signal,
175
- (resp, resolve) => {
143
+ (request, resp, resolve) => {
176
144
  const total = +getHeader(resp.headers, "content-length") || -1;
177
- const data = [];
145
+ let data = [];
178
146
  resp.on("data", (chunk) => {
179
147
  const delta = chunk.length;
180
148
  transferred += delta;
181
149
  const current = Date.now();
182
150
  onDownloading?.({
151
+ bps: delta / (current - time),
152
+ delta,
183
153
  percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
184
154
  total,
185
- transferred,
186
- delta,
187
- bps: delta / (current - time)
155
+ transferred
188
156
  });
189
157
  time = current;
190
158
  data.push(chunk);
191
159
  });
192
160
  resp.on("end", () => resolve(Buffer.concat(data)));
161
+ signal.addEventListener("abort", () => {
162
+ request.abort();
163
+ data.length = 0;
164
+ data = null;
165
+ }, { once: true });
193
166
  }
194
167
  );
195
168
  }
169
+ function hashBuffer(data, length) {
170
+ const hash = crypto__default.default.createHash("SHA256").update(data).digest("binary");
171
+ return Buffer.from(hash).subarray(0, length);
172
+ }
173
+ function aesDecrypt(encryptedText, key, iv) {
174
+ const decipher = crypto__default.default.createDecipheriv("aes-256-cbc", key, iv);
175
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
176
+ }
177
+ function defaultVerifySignature(buffer, version, signature, cert) {
178
+ try {
179
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
180
+ if (ver !== version) {
181
+ return false;
182
+ }
183
+ return crypto__default.default.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
184
+ } catch {
185
+ return false;
186
+ }
187
+ }
188
+ async function defaultUnzipFile(buffer) {
189
+ return new Promise((resolve, reject) => {
190
+ zlib__default.default.brotliDecompress(buffer, (err, buffer2) => err ? reject(err) : resolve(buffer2));
191
+ });
192
+ }
193
+
194
+ // src/provider/base.ts
195
+ var BaseProvider = class {
196
+ name = "BaseProvider";
197
+ /**
198
+ * @inheritdoc
199
+ */
200
+ isLowerVersion = defaultIsLowerVersion;
201
+ /**
202
+ * @inheritdoc
203
+ */
204
+ verifySignaure = defaultVerifySignature;
205
+ /**
206
+ * @inheritdoc
207
+ */
208
+ unzipFile = defaultUnzipFile;
209
+ };
196
210
  var GitHubProvider = class extends BaseProvider {
197
211
  name = "GithubProvider";
198
212
  options;
@@ -1,10 +1,10 @@
1
- import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-C5M2xRjF.cjs';
2
- export { b as UpdateJSONWithURL } from './types-C5M2xRjF.cjs';
3
- import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-BQS8qbGA.cjs';
4
- export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-BQS8qbGA.cjs';
1
+ import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-DemXr4mk.cjs';
2
+ export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-DemXr4mk.cjs';
3
+ import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-1T_tRG8a.cjs';
4
+ export { b as UpdateJSONWithURL } from './types-1T_tRG8a.cjs';
5
5
  import '@subframe7536/type-utils';
6
- import 'node:url';
7
6
  import 'electron';
7
+ import 'node:url';
8
8
 
9
9
  declare abstract class BaseProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> implements IProvider<T> {
10
10
  name: string;
@@ -1,10 +1,10 @@
1
- import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-C5M2xRjF.js';
2
- export { b as UpdateJSONWithURL } from './types-C5M2xRjF.js';
3
- import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-DbfskMQi.js';
4
- export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-DbfskMQi.js';
1
+ import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-CDmogV-s.js';
2
+ export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-CDmogV-s.js';
3
+ import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-1T_tRG8a.js';
4
+ export { b as UpdateJSONWithURL } from './types-1T_tRG8a.js';
5
5
  import '@subframe7536/type-utils';
6
- import 'node:url';
7
6
  import 'electron';
7
+ import 'node:url';
8
8
 
9
9
  declare abstract class BaseProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> implements IProvider<T> {
10
10
  name: string;
package/dist/provider.js CHANGED
@@ -1,5 +1,5 @@
1
- import { defaultVerifySignature, defaultUnzipFile, defaultDownloadUpdateJSON, defaultDownloadAsar, defaultDownloadJSON } from './chunk-D7NXTCQW.js';
2
- export { defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, downloadUtil, getHeader } from './chunk-D7NXTCQW.js';
1
+ import { defaultVerifySignature, defaultUnzipFile, defaultDownloadUpdateJSON, defaultDownloadAsar, defaultDownloadJSON } from './chunk-KLUIYBS4.js';
2
+ export { defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, downloadUtil, getHeader } from './chunk-KLUIYBS4.js';
3
3
  import { defaultIsLowerVersion } from './chunk-AAAM44NW.js';
4
4
  import { URL } from 'node:url';
5
5
 
@@ -119,7 +119,7 @@ interface IProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> {
119
119
  */
120
120
  downloadJSON: (name: string, versionPath: string, signal: AbortSignal) => Promise<T>;
121
121
  /**
122
- * Download update asar
122
+ * Download update asar buffer
123
123
  * @param updateInfo existing update info
124
124
  * @param signal abort signal
125
125
  * @param onDownloading hook for on downloading
@@ -119,7 +119,7 @@ interface IProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> {
119
119
  */
120
120
  downloadJSON: (name: string, versionPath: string, signal: AbortSignal) => Promise<T>;
121
121
  /**
122
- * Download update asar
122
+ * Download update asar buffer
123
123
  * @param updateInfo existing update info
124
124
  * @param signal abort signal
125
125
  * @param onDownloading hook for on downloading
package/dist/utils.cjs CHANGED
@@ -119,15 +119,20 @@ function getHeader(headers, key) {
119
119
  return value;
120
120
  }
121
121
  }
122
- async function downloadUtil(url, headers, signal, onResponse) {
122
+ async function downloadUtil(url, headers, onResponse) {
123
123
  await electron2__default.default.app.whenReady();
124
124
  return new Promise((resolve, reject) => {
125
- const request = electron2__default.default.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
126
- signal.addEventListener("abort", () => request.abort(), { once: true });
125
+ const request = electron2__default.default.net.request({
126
+ cache: "no-cache",
127
+ headers,
128
+ method: "GET",
129
+ redirect: "follow",
130
+ url
131
+ });
127
132
  request.on("response", (resp) => {
128
- resp.on("aborted", () => reject(new Error("aborted")));
129
- resp.on("error", () => reject(new Error("download error")));
130
- onResponse(resp, resolve, reject);
133
+ resp.on("aborted", () => reject(new Error("Aborted")));
134
+ resp.on("error", reject);
135
+ onResponse(request, resp, resolve, reject);
131
136
  });
132
137
  request.on("error", reject);
133
138
  request.end();
@@ -147,11 +152,14 @@ async function defaultDownloadJSON(url, headers, signal, resolveData = defaultRe
147
152
  return await downloadUtil(
148
153
  url,
149
154
  headers,
150
- signal,
151
- (resp, resolve, reject) => {
155
+ (request, resp, resolve, reject) => {
152
156
  let data = "";
153
157
  resp.on("data", (chunk) => data += chunk);
154
158
  resp.on("end", () => resolveData(data, resolve, reject));
159
+ signal.addEventListener("abort", () => {
160
+ request.abort();
161
+ data = null;
162
+ }, { once: true });
155
163
  }
156
164
  );
157
165
  }
@@ -180,25 +188,29 @@ async function defaultDownloadAsar(url, headers, signal, onDownloading) {
180
188
  return await downloadUtil(
181
189
  url,
182
190
  headers,
183
- signal,
184
- (resp, resolve) => {
191
+ (request, resp, resolve) => {
185
192
  const total = +getHeader(resp.headers, "content-length") || -1;
186
- const data = [];
193
+ let data = [];
187
194
  resp.on("data", (chunk) => {
188
195
  const delta = chunk.length;
189
196
  transferred += delta;
190
197
  const current = Date.now();
191
198
  onDownloading?.({
199
+ bps: delta / (current - time),
200
+ delta,
192
201
  percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
193
202
  total,
194
- transferred,
195
- delta,
196
- bps: delta / (current - time)
203
+ transferred
197
204
  });
198
205
  time = current;
199
206
  data.push(chunk);
200
207
  });
201
208
  resp.on("end", () => resolve(Buffer.concat(data)));
209
+ signal.addEventListener("abort", () => {
210
+ request.abort();
211
+ data.length = 0;
212
+ data = null;
213
+ }, { once: true });
202
214
  }
203
215
  );
204
216
  }
@@ -270,13 +282,13 @@ function loadPage(win, htmlFilePath = "index.html") {
270
282
  }
271
283
  function beautifyDevTools(win, options) {
272
284
  const { mono, sans, scrollbar = true } = options;
273
- win.webContents.on("devtools-opened", () => {
274
- let css = `:root{--sans: ${sans};--mono: ${mono}}:root,body{--source-code-font-family: var(--mono) !important;--source-code-font-size: 12px !important;--monospace-font-family: var(--mono) !important;--monospace-font-size: 12px !important;--default-font-family: var(--sans), sans-serif !important;--default-font-size: 12px !important}button,input,select,.undisplayable-text,.expandable-inline-button{font-family:var(--sans)!important}`;
285
+ win.webContents.on("devtools-opened", async () => {
286
+ let css = `:root{--sans:${sans};--mono:${mono}}:root,body{--source-code-font-family:var(--mono)!important;--source-code-font-size:12px!important;--monospace-font-family:var(--mono)!important;--monospace-font-size:12px!important;--default-font-family:var(--sans), sans-serif!important;--default-font-size:12px!important}button,input,select,.undisplayable-text,.expandable-inline-button{font-family:var(--sans)!important}`;
275
287
  if (scrollbar) {
276
- css += ":root{--scrollbar-width: max(.85vw, 10px)}@media (prefers-color-scheme: light){:root{--scrollbar-color-rgb: 0, 0, 0}}@media (prefers-color-scheme: dark){:root{--scrollbar-color-rgb: 255, 255, 255}}*::-webkit-scrollbar{width:var(--scrollbar-width)!important;height:var(--scrollbar-width)!important}*::-webkit-scrollbar-track{background-color:transparent!important;border-radius:var(--scrollbar-width)!important;box-shadow:none!important}*::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 var(--scrollbar-width)!important;border-radius:var(--scrollbar-width)!important;border:calc(var(--scrollbar-width) * 2 / 9) solid transparent!important;background-clip:content-box;background-color:transparent!important;color:rgba(var(--scrollbar-color-rgb),30%)!important}*::-webkit-scrollbar-thumb:hover{color:rgba(var(--scrollbar-color-rgb),45%)!important}*::-webkit-scrollbar-thumb:active{color:rgba(var(--scrollbar-color-rgb),60%)!important}@supports not selector(::-webkit-scrollbar){html{scrollbar-color:rgb(var(--scrollbar-color-rgb));scrollbar-width:thin}}";
288
+ css += ":root{--scrollbar-width:max(.85vw,10px)}@media (prefers-color-scheme:light){:root{--scrollbar-color-rgb:0,0,0}}@media (prefers-color-scheme:dark){:root{--scrollbar-color-rgb:255,255,255}}*::-webkit-scrollbar{width:var(--scrollbar-width)!important;height:var(--scrollbar-width)!important}*::-webkit-scrollbar-track{background-color:transparent!important;border-radius:var(--scrollbar-width)!important;box-shadow:none!important}*::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 var(--scrollbar-width)!important;border-radius:var(--scrollbar-width)!important;border:calc(var(--scrollbar-width) * 2/9) solid transparent!important;background-clip:content-box;background-color:transparent!important;color:rgba(var(--scrollbar-color-rgb),30%)!important}*::-webkit-scrollbar-thumb:hover{color:rgba(var(--scrollbar-color-rgb),45%)!important}*::-webkit-scrollbar-thumb:active{color:rgba(var(--scrollbar-color-rgb),60%)!important}@supports not selector(::-webkit-scrollbar){html{scrollbar-color:rgb(var(--scrollbar-color-rgb));scrollbar-width:thin}}";
277
289
  }
278
- const js = `let overriddenStyle=document.createElement('style');overriddenStyle.innerHTML='${css}';document.body.append(overriddenStyle);document.body.classList.remove('platform-windows','platform-mac','platform-linux');`;
279
- win?.webContents.devToolsWebContents?.executeJavaScript(js);
290
+ const js = `${'function run(n){let d=document.createElement("style");d.innerHTML=n,document.body.append(d),["platform-windows","platform-mac","platform-linux"].forEach(e=>document.querySelectorAll(`.${e}`).forEach(o=>o.classList.remove(e))),l();const r=new MutationObserver(e=>{for(const o of e)if(o.type==="childList")for(let t=0;t<o.addedNodes.length;t++)o.addedNodes[t].classList.contains("editor-tooltip-host")&&l()});r.observe(document.body,{childList:!0});function l(){document.querySelectorAll(".editor-tooltip-host").forEach(e=>{if(e?.shadowRoot?.querySelectorAll(\'[data-key="overridden-dev-tools-font"]\').length===0){const o=document.createElement("style");o.setAttribute("data-key","overridden-dev-tools-font"),o.innerHTML=`${n}.cm-tooltip-autocomplete ul[role=listbox]{font-family:var(--mono)!important;}`,e.shadowRoot.append(o)}})}window.onbeforeunload=()=>r.disconnect()}'};run(\`${css}\`)`;
291
+ await win?.webContents.devToolsWebContents?.executeJavaScript(js);
280
292
  });
281
293
  }
282
294
  function getPathFromMain(...paths) {
package/dist/utils.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- export { b as aesDecrypt, a as aesEncrypt, j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, d as defaultSignature, l as defaultUnzipFile, c as defaultVerifySignature, k as defaultZipFile, e as downloadUtil, g as getHeader, h as hashBuffer } from './zip-BQS8qbGA.cjs';
1
+ export { b as aesDecrypt, a as aesEncrypt, j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, d as defaultSignature, l as defaultUnzipFile, c as defaultVerifySignature, k as defaultZipFile, e as downloadUtil, g as getHeader, h as hashBuffer } from './zip-DemXr4mk.cjs';
2
2
  import { BrowserWindow } from 'electron';
3
- export { U as UpdateInfo, a as UpdateJSON, V as Version, d as defaultIsLowerVersion, c as defaultVersionJsonGenerator, i as isUpdateJSON, p as parseVersion } from './types-C5M2xRjF.cjs';
3
+ export { U as UpdateInfo, a as UpdateJSON, V as Version, d as defaultIsLowerVersion, c as defaultVersionJsonGenerator, i as isUpdateJSON, p as parseVersion } from './types-1T_tRG8a.cjs';
4
4
  import '@subframe7536/type-utils';
5
5
  import 'node:url';
6
6
 
@@ -90,6 +90,7 @@ interface BeautifyDevToolsOptions {
90
90
  * Beautify devtools' font and scrollbar
91
91
  * @param win target window
92
92
  * @param options sans font family, mono font family and scrollbar
93
+ * @see https://github.com/electron/electron/issues/42055
93
94
  */
94
95
  declare function beautifyDevTools(win: BrowserWindow, options: BeautifyDevToolsOptions): void;
95
96
  /**
package/dist/utils.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { b as aesDecrypt, a as aesEncrypt, j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, d as defaultSignature, l as defaultUnzipFile, c as defaultVerifySignature, k as defaultZipFile, e as downloadUtil, g as getHeader, h as hashBuffer } from './zip-DbfskMQi.js';
1
+ export { b as aesDecrypt, a as aesEncrypt, j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, d as defaultSignature, l as defaultUnzipFile, c as defaultVerifySignature, k as defaultZipFile, e as downloadUtil, g as getHeader, h as hashBuffer } from './zip-CDmogV-s.js';
2
2
  import { BrowserWindow } from 'electron';
3
- export { U as UpdateInfo, a as UpdateJSON, V as Version, d as defaultIsLowerVersion, c as defaultVersionJsonGenerator, i as isUpdateJSON, p as parseVersion } from './types-C5M2xRjF.js';
3
+ export { U as UpdateInfo, a as UpdateJSON, V as Version, d as defaultIsLowerVersion, c as defaultVersionJsonGenerator, i as isUpdateJSON, p as parseVersion } from './types-1T_tRG8a.js';
4
4
  import '@subframe7536/type-utils';
5
5
  import 'node:url';
6
6
 
@@ -90,6 +90,7 @@ interface BeautifyDevToolsOptions {
90
90
  * Beautify devtools' font and scrollbar
91
91
  * @param win target window
92
92
  * @param options sans font family, mono font family and scrollbar
93
+ * @see https://github.com/electron/electron/issues/42055
93
94
  */
94
95
  declare function beautifyDevTools(win: BrowserWindow, options: BeautifyDevToolsOptions): void;
95
96
  /**
package/dist/utils.js CHANGED
@@ -1,3 +1,3 @@
1
- export { beautifyDevTools, disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, importNative, isDev, isLinux, isMac, isWin, loadPage, reloadOnPreloadScriptChanged, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance } from './chunk-YZGE4RFY.js';
2
- export { aesDecrypt, aesEncrypt, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, downloadUtil, getHeader, hashBuffer } from './chunk-D7NXTCQW.js';
1
+ export { beautifyDevTools, disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, importNative, isDev, isLinux, isMac, isWin, loadPage, reloadOnPreloadScriptChanged, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance } from './chunk-QKKPETVJ.js';
2
+ export { aesDecrypt, aesEncrypt, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, downloadUtil, getHeader, hashBuffer } from './chunk-KLUIYBS4.js';
3
3
  export { defaultIsLowerVersion, defaultVersionJsonGenerator, isUpdateJSON, parseVersion } from './chunk-AAAM44NW.js';
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
- import { readableSize, copyAndSkipIfExist } from './chunk-TPTWE33H.js';
2
- import { isUpdateJSON, defaultVersionJsonGenerator } from './chunk-LR7LR5WG.js';
1
+ import { copyAndSkipIfExist, readableSize } from './chunk-TPTWE33H.js';
2
+ import { defaultVersionJsonGenerator, isUpdateJSON } from './chunk-LR7LR5WG.js';
3
3
  export { convertLiteral } from './chunk-LR7LR5WG.js';
4
4
  import { log, id } from './chunk-5NKEXGI3.js';
5
5
  import fs2 from 'node:fs';
@@ -226,7 +226,7 @@ function parseOptions(pkg, sourcemap = false, minify = false, options = {}) {
226
226
  return false;
227
227
  }
228
228
  if (!external) {
229
- return void 0;
229
+ return undefined;
230
230
  }
231
231
  if (typeof external === "string") {
232
232
  return source === external;
@@ -309,16 +309,16 @@ async function electronWithUpdater(options) {
309
309
  } = options;
310
310
  if (!pkg || !pkg.version || !pkg.name || !pkg.main) {
311
311
  log.error("package.json not found or invalid", { timestamp: true });
312
- return void 0;
312
+ return undefined;
313
313
  }
314
314
  const isESM = pkg.type === "module";
315
- let bytecodeOptions = typeof bytecode === "object" ? bytecode : bytecode === true ? { enable: true } : void 0;
315
+ let bytecodeOptions = typeof bytecode === "object" ? bytecode : bytecode === true ? { enable: true } : undefined;
316
316
  if (isESM && bytecodeOptions?.enable) {
317
317
  (await import('./constant-ME27JB5D.js')).bytecodeLog.warn(
318
318
  '`bytecodePlugin` does not support ES module, please remove "type": "module" in package.json',
319
319
  { timestamp: true }
320
320
  );
321
- bytecodeOptions = void 0;
321
+ bytecodeOptions = undefined;
322
322
  }
323
323
  const {
324
324
  buildAsarOption,
@@ -388,7 +388,7 @@ async function electronWithUpdater(options) {
388
388
  external: (src) => src.startsWith("node:") || Object.keys("dependencies" in pkg ? pkg.dependencies : {}).includes(src) || src === "original-fs",
389
389
  treeshake: true
390
390
  };
391
- const esmShimPlugin = isESM ? (await import('./esm-4S4XCVEW.js')).esm() : void 0;
391
+ const esmShimPlugin = isESM ? (await import('./esm-4S4XCVEW.js')).esm() : undefined;
392
392
  const electronPluginOptions = {
393
393
  main: {
394
394
  entry: _main.files,
@@ -407,7 +407,7 @@ async function electronWithUpdater(options) {
407
407
  vite: mergeConfig(
408
408
  {
409
409
  plugins: [
410
- !isBuild && useNotBundle ? notBundle() : void 0,
410
+ !isBuild && useNotBundle ? notBundle() : undefined,
411
411
  bytecodeOptions && await import('./bytecode-R2B4KTMV.js').then((m) => m.bytecodePlugin("main", bytecodeOptions)),
412
412
  esmShimPlugin
413
413
  ],
@@ -449,7 +449,7 @@ async function electronWithUpdater(options) {
449
449
  }
450
450
  ],
451
451
  build: {
452
- sourcemap: sourcemap ? "inline" : void 0,
452
+ sourcemap: sourcemap ? "inline" : undefined,
453
453
  minify,
454
454
  outDir: `${buildAsarOption.electronDistPath}/preload`,
455
455
  rollupOptions
@@ -1,5 +1,5 @@
1
1
  import { Arrayable } from '@subframe7536/type-utils';
2
- import { a as UpdateJSON, D as DownloadingInfo } from './types-C5M2xRjF.cjs';
2
+ import { a as UpdateJSON, D as DownloadingInfo } from './types-1T_tRG8a.js';
3
3
  import { IncomingMessage } from 'electron';
4
4
 
5
5
  declare function hashBuffer(data: string | Buffer, length: number): Buffer;
@@ -29,7 +29,7 @@ declare function defaultVerifySignature(buffer: Buffer, version: string, signatu
29
29
  * @param key target header key
30
30
  */
31
31
  declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
32
- declare function downloadUtil<T>(url: string, headers: Record<string, any>, signal: AbortSignal, onResponse: (resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
32
+ declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: Electron.ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
33
33
  type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
34
34
  /**
35
35
  * Default function to download json and parse to UpdateJson
@@ -1,5 +1,5 @@
1
1
  import { Arrayable } from '@subframe7536/type-utils';
2
- import { a as UpdateJSON, D as DownloadingInfo } from './types-C5M2xRjF.js';
2
+ import { a as UpdateJSON, D as DownloadingInfo } from './types-1T_tRG8a.cjs';
3
3
  import { IncomingMessage } from 'electron';
4
4
 
5
5
  declare function hashBuffer(data: string | Buffer, length: number): Buffer;
@@ -29,7 +29,7 @@ declare function defaultVerifySignature(buffer: Buffer, version: string, signatu
29
29
  * @param key target header key
30
30
  */
31
31
  declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
32
- declare function downloadUtil<T>(url: string, headers: Record<string, any>, signal: AbortSignal, onResponse: (resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
32
+ declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: Electron.ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
33
33
  type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
34
34
  /**
35
35
  * Default function to download json and parse to UpdateJson
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "electron-incremental-update",
3
3
  "type": "module",
4
- "version": "2.2.3",
4
+ "version": "2.2.5",
5
5
  "description": "Electron incremental update tools with Vite plugin, support bytecode protection",
6
6
  "author": "subframe7536",
7
7
  "license": "MIT",
@@ -60,27 +60,32 @@
60
60
  "esbuild": "*"
61
61
  },
62
62
  "dependencies": {
63
- "@babel/core": "^7.26.0",
63
+ "@babel/core": "^7.26.7",
64
64
  "@babel/plugin-transform-arrow-functions": "^7.25.9",
65
65
  "@babel/plugin-transform-template-literals": "^7.25.9",
66
66
  "@subframe7536/type-utils": "^0.1.6",
67
67
  "ci-info": "^4.1.0",
68
- "local-pkg": "^0.5.1",
69
- "magic-string": "^0.30.14",
68
+ "local-pkg": "^1.0.0",
69
+ "magic-string": "^0.30.17",
70
70
  "selfsigned": "^2.4.1",
71
71
  "vite-plugin-electron": "^0.29.0"
72
72
  },
73
73
  "devDependencies": {
74
- "@subframe7536/eslint-config": "^0.9.7",
74
+ "@subframe7536/eslint-config": "^1.1.8",
75
75
  "@types/babel__core": "^7.20.5",
76
- "@types/node": "^20.17.9",
77
- "bumpp": "^9.8.1",
78
- "electron": "32.2.6",
79
- "eslint": "^9.15.0",
80
- "tsup": "^8.3.5",
81
- "typescript": "^5.7.2",
82
- "vite": "^6.0.1",
76
+ "@types/node": "^20.17.17",
77
+ "bumpp": "^10.0.1",
78
+ "electron": "34.0.2",
79
+ "eslint": "^9.19.0",
80
+ "tsup": "^8.3.6",
81
+ "typescript": "^5.7.3",
82
+ "vite": "^6.0.11",
83
83
  "vite-plugin-electron": "^0.29.0",
84
- "vitest": "^2.1.6"
84
+ "vitest": "^3.0.5"
85
+ },
86
+ "pnpm": {
87
+ "overrides": {
88
+ "is-core-module": "npm:@nolyfill/is-core-module@^1"
89
+ }
85
90
  }
86
91
  }