electron-incremental-update 2.2.6 → 2.3.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.
@@ -60,14 +60,14 @@ async function downloadUtil(url, headers, onResponse) {
60
60
  function trimData(data) {
61
61
  return data.trim().slice(0, 5e3).replace(/\s+/g, " ");
62
62
  }
63
- var defaultResolveDataFn = (data, resolve, reject) => {
63
+ var resolveJson = (data, resolve, reject) => {
64
64
  try {
65
65
  resolve(JSON.parse(data));
66
66
  } catch {
67
67
  reject(new Error(`Invalid json, "${trimData(data)}"`));
68
68
  }
69
69
  };
70
- async function defaultDownloadJSON(url, headers, signal, resolveData = defaultResolveDataFn) {
70
+ async function defaultDownloadText(url, headers, signal, resolveData) {
71
71
  return await downloadUtil(
72
72
  url,
73
73
  headers,
@@ -83,7 +83,7 @@ async function defaultDownloadJSON(url, headers, signal, resolveData = defaultRe
83
83
  );
84
84
  }
85
85
  async function defaultDownloadUpdateJSON(url, headers, signal) {
86
- return await defaultDownloadJSON(
86
+ return await defaultDownloadText(
87
87
  url,
88
88
  headers,
89
89
  signal,
@@ -144,4 +144,4 @@ async function defaultUnzipFile(buffer) {
144
144
  });
145
145
  }
146
146
 
147
- export { aesDecrypt, aesEncrypt, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, downloadUtil, getHeader, hashBuffer };
147
+ export { aesDecrypt, aesEncrypt, defaultDownloadAsar, defaultDownloadText, defaultDownloadUpdateJSON, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, downloadUtil, getHeader, hashBuffer, resolveJson };
package/dist/index.cjs CHANGED
@@ -103,7 +103,15 @@ var Updater = class extends events.EventEmitter {
103
103
  }
104
104
  this.logger?.debug(`Download from \`${this.provider.name}\``);
105
105
  try {
106
- const result = format === "json" ? await this.provider.downloadJSON(electron__default.default.app.name, __EIU_VERSION_PATH__, this.controller.signal) : await this.provider.downloadAsar(this.info, this.controller.signal, (info) => this.emit("download-progress", info));
106
+ const result = format === "json" ? await this.provider.downloadJSON(
107
+ electron__default.default.app.name,
108
+ __EIU_VERSION_PATH__,
109
+ this.controller.signal
110
+ ) : await this.provider.downloadAsar(
111
+ this.info,
112
+ this.controller.signal,
113
+ (info) => this.emit("download-progress", info)
114
+ );
107
115
  this.logger?.debug(`Download ${format} success${format === "buffer" ? `, file size: ${result.length}` : ""}`);
108
116
  return result;
109
117
  } catch (e) {
@@ -127,13 +135,19 @@ var Updater = class extends events.EventEmitter {
127
135
  if (!data && !this.provider) {
128
136
  const msg = "No update json or provider";
129
137
  this.err("Check update failed", "ERR_PARAM", msg);
130
- return emitUnavailable(msg, "UNAVAILABLE_ERROR");
138
+ return emitUnavailable(
139
+ msg,
140
+ "UNAVAILABLE_ERROR"
141
+ );
131
142
  }
132
143
  const _data = await this.fetch("json", data);
133
144
  if (!_data) {
134
- return emitUnavailable("Failed to get update info", "UNAVAILABLE_ERROR");
145
+ return emitUnavailable(
146
+ "Failed to get update info",
147
+ "UNAVAILABLE_ERROR"
148
+ );
135
149
  }
136
- const { signature, version, minimumVersion, url = "", ...rest } = this.receiveBeta ? _data.beta : _data;
150
+ const { signature, version, minimumVersion, url, ...rest } = this.receiveBeta ? _data.beta : _data;
137
151
  const info = { signature, minimumVersion, version, url };
138
152
  const extraVersionInfo = {
139
153
  signature,
@@ -145,16 +159,27 @@ var Updater = class extends events.EventEmitter {
145
159
  };
146
160
  this.logger?.debug(`Checked update, version: ${version}, signature: ${signature}`);
147
161
  if (isDev && !this.forceUpdate && !data) {
148
- return emitUnavailable("Skip check update in dev mode. To force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON", "UNAVAILABLE_DEV");
162
+ return emitUnavailable(
163
+ "Skip check update in dev mode. To force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON",
164
+ "UNAVAILABLE_DEV"
165
+ );
149
166
  }
150
167
  const isLowerVersion = this.provider.isLowerVersion;
151
168
  try {
152
169
  if (isLowerVersion(extraVersionInfo.entryVersion, minimumVersion)) {
153
- return emitUnavailable(`Entry Version (${extraVersionInfo.entryVersion}) < MinimumVersion (${minimumVersion})`, "UNAVAILABLE_VERSION", extraVersionInfo);
170
+ return emitUnavailable(
171
+ `Entry Version (${extraVersionInfo.entryVersion}) < MinimumVersion (${minimumVersion})`,
172
+ "UNAVAILABLE_VERSION",
173
+ extraVersionInfo
174
+ );
154
175
  }
155
176
  this.logger?.info(`Current version is ${extraVersionInfo.appVersion}, new version is ${version}`);
156
177
  if (!isLowerVersion(extraVersionInfo.appVersion, version)) {
157
- return emitUnavailable(`Current version (${extraVersionInfo.appVersion}) > New version (${version})`, "UNAVAILABLE_VERSION", extraVersionInfo);
178
+ return emitUnavailable(
179
+ `Current version (${extraVersionInfo.appVersion}) > New version (${version})`,
180
+ "UNAVAILABLE_VERSION",
181
+ extraVersionInfo
182
+ );
158
183
  }
159
184
  this.logger?.info(`Update available: ${version}`);
160
185
  this.emit("update-available", extraVersionInfo);
@@ -162,7 +187,11 @@ var Updater = class extends events.EventEmitter {
162
187
  return true;
163
188
  } catch {
164
189
  const msg = "Fail to parse version string";
165
- this.err("Check update failed", "ERR_VALIDATE", msg);
190
+ this.err(
191
+ "Check update failed",
192
+ "ERR_VALIDATE",
193
+ msg
194
+ );
166
195
  return emitUnavailable(msg, "UNAVAILABLE_ERROR", extraVersionInfo);
167
196
  }
168
197
  }
@@ -170,24 +199,40 @@ var Updater = class extends events.EventEmitter {
170
199
  const _sig = info?.signature ?? this.info?.signature;
171
200
  const _version = info?.version ?? this.info?.version;
172
201
  if (!_sig || !_version) {
173
- this.err("Download failed", "ERR_PARAM", "No update signature, please call `checkUpdate` first or manually setup params");
202
+ this.err(
203
+ "Download failed",
204
+ "ERR_PARAM",
205
+ "No update signature, please call `checkUpdate` first or manually setup params"
206
+ );
174
207
  return false;
175
208
  }
176
209
  if (!data && !this.provider) {
177
- this.err("Download failed", "ERR_PARAM", "No update asar buffer and provider");
210
+ this.err(
211
+ "Download failed",
212
+ "ERR_PARAM",
213
+ "No update asar buffer and provider"
214
+ );
178
215
  return false;
179
216
  }
180
217
  const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
181
218
  if (!buffer) {
182
- this.err("Download failed", "ERR_PARAM", "No update asar file buffer");
219
+ this.err(
220
+ "Download failed",
221
+ "ERR_PARAM",
222
+ "No update asar file buffer"
223
+ );
183
224
  return false;
184
225
  }
185
- this.logger?.debug("verify start");
226
+ this.logger?.debug("Validation start");
186
227
  if (!await this.provider.verifySignaure(buffer, _version, _sig, this.CERT)) {
187
- this.err("Download failed", "ERR_VALIDATE", "Invalid update asar file");
228
+ this.err(
229
+ "Download failed",
230
+ "ERR_VALIDATE",
231
+ "Invalid update asar file"
232
+ );
188
233
  return false;
189
234
  }
190
- this.logger?.debug("Verify success");
235
+ this.logger?.debug("Validation end");
191
236
  try {
192
237
  const tmpFilePath = `${getPathFromAppNameAsar()}.tmp`;
193
238
  this.logger?.debug(`Install to ${tmpFilePath}`);
@@ -197,7 +242,11 @@ var Updater = class extends events.EventEmitter {
197
242
  this.emit("update-downloaded");
198
243
  return true;
199
244
  } catch (error) {
200
- this.err("Download failed", "ERR_DOWNLOAD", `Fail to unwrap asar file, ${error}`);
245
+ this.err(
246
+ "Download failed",
247
+ "ERR_DOWNLOAD",
248
+ `Fail to unwrap asar file, ${error}`
249
+ );
201
250
  return false;
202
251
  }
203
252
  }
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-1T_tRG8a.cjs';
1
+ import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-CU7GyVez.cjs';
2
2
  import { Promisable } from '@subframe7536/type-utils';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import 'node:url';
@@ -55,8 +55,8 @@ declare class Updater<T extends UpdateInfoWithExtraVersion = UpdateInfoWithExtra
55
55
  'update-not-available': [code: UpdaterUnavailableCode, msg: string, info?: T];
56
56
  'error': [error: UpdaterError];
57
57
  'download-progress': [info: DownloadingInfo];
58
- 'update-downloaded': any;
59
- 'update-cancelled': any;
58
+ 'update-downloaded': [];
59
+ 'update-cancelled': [];
60
60
  }> {
61
61
  private CERT;
62
62
  private controller;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-1T_tRG8a.js';
1
+ import { U as UpdateInfo, I as IProvider, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-CU7GyVez.js';
2
2
  import { Promisable } from '@subframe7536/type-utils';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import 'node:url';
@@ -55,8 +55,8 @@ declare class Updater<T extends UpdateInfoWithExtraVersion = UpdateInfoWithExtra
55
55
  'update-not-available': [code: UpdaterUnavailableCode, msg: string, info?: T];
56
56
  'error': [error: UpdaterError];
57
57
  'download-progress': [info: DownloadingInfo];
58
- 'update-downloaded': any;
59
- 'update-cancelled': any;
58
+ 'update-downloaded': [];
59
+ 'update-cancelled': [];
60
60
  }> {
61
61
  private CERT;
62
62
  private controller;
package/dist/index.js CHANGED
@@ -67,7 +67,15 @@ var Updater = class extends EventEmitter {
67
67
  }
68
68
  this.logger?.debug(`Download from \`${this.provider.name}\``);
69
69
  try {
70
- const result = format === "json" ? await this.provider.downloadJSON(electron2.app.name, __EIU_VERSION_PATH__, this.controller.signal) : await this.provider.downloadAsar(this.info, this.controller.signal, (info) => this.emit("download-progress", info));
70
+ const result = format === "json" ? await this.provider.downloadJSON(
71
+ electron2.app.name,
72
+ __EIU_VERSION_PATH__,
73
+ this.controller.signal
74
+ ) : await this.provider.downloadAsar(
75
+ this.info,
76
+ this.controller.signal,
77
+ (info) => this.emit("download-progress", info)
78
+ );
71
79
  this.logger?.debug(`Download ${format} success${format === "buffer" ? `, file size: ${result.length}` : ""}`);
72
80
  return result;
73
81
  } catch (e) {
@@ -91,13 +99,19 @@ var Updater = class extends EventEmitter {
91
99
  if (!data && !this.provider) {
92
100
  const msg = "No update json or provider";
93
101
  this.err("Check update failed", "ERR_PARAM", msg);
94
- return emitUnavailable(msg, "UNAVAILABLE_ERROR");
102
+ return emitUnavailable(
103
+ msg,
104
+ "UNAVAILABLE_ERROR"
105
+ );
95
106
  }
96
107
  const _data = await this.fetch("json", data);
97
108
  if (!_data) {
98
- return emitUnavailable("Failed to get update info", "UNAVAILABLE_ERROR");
109
+ return emitUnavailable(
110
+ "Failed to get update info",
111
+ "UNAVAILABLE_ERROR"
112
+ );
99
113
  }
100
- const { signature, version, minimumVersion, url = "", ...rest } = this.receiveBeta ? _data.beta : _data;
114
+ const { signature, version, minimumVersion, url, ...rest } = this.receiveBeta ? _data.beta : _data;
101
115
  const info = { signature, minimumVersion, version, url };
102
116
  const extraVersionInfo = {
103
117
  signature,
@@ -109,16 +123,27 @@ var Updater = class extends EventEmitter {
109
123
  };
110
124
  this.logger?.debug(`Checked update, version: ${version}, signature: ${signature}`);
111
125
  if (isDev && !this.forceUpdate && !data) {
112
- return emitUnavailable("Skip check update in dev mode. To force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON", "UNAVAILABLE_DEV");
126
+ return emitUnavailable(
127
+ "Skip check update in dev mode. To force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON",
128
+ "UNAVAILABLE_DEV"
129
+ );
113
130
  }
114
131
  const isLowerVersion = this.provider.isLowerVersion;
115
132
  try {
116
133
  if (isLowerVersion(extraVersionInfo.entryVersion, minimumVersion)) {
117
- return emitUnavailable(`Entry Version (${extraVersionInfo.entryVersion}) < MinimumVersion (${minimumVersion})`, "UNAVAILABLE_VERSION", extraVersionInfo);
134
+ return emitUnavailable(
135
+ `Entry Version (${extraVersionInfo.entryVersion}) < MinimumVersion (${minimumVersion})`,
136
+ "UNAVAILABLE_VERSION",
137
+ extraVersionInfo
138
+ );
118
139
  }
119
140
  this.logger?.info(`Current version is ${extraVersionInfo.appVersion}, new version is ${version}`);
120
141
  if (!isLowerVersion(extraVersionInfo.appVersion, version)) {
121
- return emitUnavailable(`Current version (${extraVersionInfo.appVersion}) > New version (${version})`, "UNAVAILABLE_VERSION", extraVersionInfo);
142
+ return emitUnavailable(
143
+ `Current version (${extraVersionInfo.appVersion}) > New version (${version})`,
144
+ "UNAVAILABLE_VERSION",
145
+ extraVersionInfo
146
+ );
122
147
  }
123
148
  this.logger?.info(`Update available: ${version}`);
124
149
  this.emit("update-available", extraVersionInfo);
@@ -126,7 +151,11 @@ var Updater = class extends EventEmitter {
126
151
  return true;
127
152
  } catch {
128
153
  const msg = "Fail to parse version string";
129
- this.err("Check update failed", "ERR_VALIDATE", msg);
154
+ this.err(
155
+ "Check update failed",
156
+ "ERR_VALIDATE",
157
+ msg
158
+ );
130
159
  return emitUnavailable(msg, "UNAVAILABLE_ERROR", extraVersionInfo);
131
160
  }
132
161
  }
@@ -134,24 +163,40 @@ var Updater = class extends EventEmitter {
134
163
  const _sig = info?.signature ?? this.info?.signature;
135
164
  const _version = info?.version ?? this.info?.version;
136
165
  if (!_sig || !_version) {
137
- this.err("Download failed", "ERR_PARAM", "No update signature, please call `checkUpdate` first or manually setup params");
166
+ this.err(
167
+ "Download failed",
168
+ "ERR_PARAM",
169
+ "No update signature, please call `checkUpdate` first or manually setup params"
170
+ );
138
171
  return false;
139
172
  }
140
173
  if (!data && !this.provider) {
141
- this.err("Download failed", "ERR_PARAM", "No update asar buffer and provider");
174
+ this.err(
175
+ "Download failed",
176
+ "ERR_PARAM",
177
+ "No update asar buffer and provider"
178
+ );
142
179
  return false;
143
180
  }
144
181
  const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
145
182
  if (!buffer) {
146
- this.err("Download failed", "ERR_PARAM", "No update asar file buffer");
183
+ this.err(
184
+ "Download failed",
185
+ "ERR_PARAM",
186
+ "No update asar file buffer"
187
+ );
147
188
  return false;
148
189
  }
149
- this.logger?.debug("verify start");
190
+ this.logger?.debug("Validation start");
150
191
  if (!await this.provider.verifySignaure(buffer, _version, _sig, this.CERT)) {
151
- this.err("Download failed", "ERR_VALIDATE", "Invalid update asar file");
192
+ this.err(
193
+ "Download failed",
194
+ "ERR_VALIDATE",
195
+ "Invalid update asar file"
196
+ );
152
197
  return false;
153
198
  }
154
- this.logger?.debug("Verify success");
199
+ this.logger?.debug("Validation end");
155
200
  try {
156
201
  const tmpFilePath = `${getPathFromAppNameAsar()}.tmp`;
157
202
  this.logger?.debug(`Install to ${tmpFilePath}`);
@@ -161,7 +206,11 @@ var Updater = class extends EventEmitter {
161
206
  this.emit("update-downloaded");
162
207
  return true;
163
208
  } catch (error) {
164
- this.err("Download failed", "ERR_DOWNLOAD", `Fail to unwrap asar file, ${error}`);
209
+ this.err(
210
+ "Download failed",
211
+ "ERR_DOWNLOAD",
212
+ `Fail to unwrap asar file, ${error}`
213
+ );
165
214
  return false;
166
215
  }
167
216
  }
package/dist/provider.cjs CHANGED
@@ -93,14 +93,14 @@ async function downloadUtil(url, headers, onResponse) {
93
93
  function trimData(data) {
94
94
  return data.trim().slice(0, 5e3).replace(/\s+/g, " ");
95
95
  }
96
- var defaultResolveDataFn = (data, resolve, reject) => {
96
+ var resolveJson = (data, resolve, reject) => {
97
97
  try {
98
98
  resolve(JSON.parse(data));
99
99
  } catch {
100
100
  reject(new Error(`Invalid json, "${trimData(data)}"`));
101
101
  }
102
102
  };
103
- async function defaultDownloadJSON(url, headers, signal, resolveData = defaultResolveDataFn) {
103
+ async function defaultDownloadText(url, headers, signal, resolveData) {
104
104
  return await downloadUtil(
105
105
  url,
106
106
  headers,
@@ -116,7 +116,7 @@ async function defaultDownloadJSON(url, headers, signal, resolveData = defaultRe
116
116
  );
117
117
  }
118
118
  async function defaultDownloadUpdateJSON(url, headers, signal) {
119
- return await defaultDownloadJSON(
119
+ return await defaultDownloadText(
120
120
  url,
121
121
  headers,
122
122
  signal,
@@ -207,23 +207,10 @@ var BaseProvider = class {
207
207
  */
208
208
  unzipFile = defaultUnzipFile;
209
209
  };
210
- var GitHubProvider = class extends BaseProvider {
211
- name = "GithubProvider";
212
- options;
213
- /**
214
- * Update Provider for Github repo
215
- * - download update json from `https://github.com/{user}/{repo}/raw/HEAD/{versionPath}`
216
- * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
217
- *
218
- * you can setup `urlHandler` in {@link GitHubProviderOptions} to modify url before request
219
- * @param options provider options
220
- */
210
+ var BaseGitHubProvider = class extends BaseProvider {
221
211
  constructor(options) {
222
212
  super();
223
213
  this.options = options;
224
- if (!options.branch) {
225
- this.options.branch = "HEAD";
226
- }
227
214
  }
228
215
  get urlHandler() {
229
216
  return this.options.urlHandler;
@@ -238,19 +225,15 @@ var GitHubProvider = class extends BaseProvider {
238
225
  );
239
226
  return (await this.urlHandler?.(url$1) || url$1).toString();
240
227
  }
241
- getHeaders(accept) {
242
- return { Accept: `application/${accept}`, ...this.options.extraHeaders };
243
- }
244
- /**
245
- * @inheritdoc
246
- */
247
228
  async downloadJSON(name, versionPath, signal) {
248
229
  const { beta, version, ...info } = await defaultDownloadUpdateJSON(
249
- await this.parseURL(`raw/${this.options.branch}/${versionPath}`),
230
+ await this.parseURL(await this.getVersionURL(versionPath, signal)),
250
231
  this.getHeaders("json"),
251
232
  signal
252
233
  );
253
- const getURL = (ver) => this.parseURL(`releases/download/v${ver}/${name}-${ver}.asar.gz`);
234
+ const getURL = (ver) => this.parseURL(
235
+ `releases/download/v${ver}/${name}-${ver}.asar.gz`
236
+ );
254
237
  return {
255
238
  ...info,
256
239
  version,
@@ -273,32 +256,22 @@ var GitHubProvider = class extends BaseProvider {
273
256
  );
274
257
  }
275
258
  };
259
+
260
+ // src/provider/github/api.ts
276
261
  var ERROR_MSG = "Cannot find UpdateJSON in latest release";
277
- var GitHubApiProvider = class extends BaseProvider {
262
+ var GitHubApiProvider = class extends BaseGitHubProvider {
278
263
  name = "GithubApiProvider";
279
- options;
280
264
  /**
281
265
  * Update Provider for Github API, you need to upload `version.json` to release as well
282
266
  * - check update from `https://api.github.com/repos/{user}/{repo}/releases?per_page=1`
283
267
  * - download update json and get version and download url
284
268
  * - download update asar from update info
285
269
  *
286
- * you can setup `urlHandler` in {@link GitHubApiProviderOptions} to modify url before request
270
+ * you can setup `urlHandler` in options to modify url before request
287
271
  * @param options provider options
288
272
  */
289
273
  constructor(options) {
290
- super();
291
- this.options = options;
292
- }
293
- get urlHandler() {
294
- return this.options.urlHandler;
295
- }
296
- set urlHandler(handler) {
297
- this.options.urlHandler = handler;
298
- }
299
- async parseURL(url$1) {
300
- const _url = new url.URL(url$1);
301
- return (await this.urlHandler?.(_url) || _url).toString();
274
+ super(options);
302
275
  }
303
276
  getHeaders(accept) {
304
277
  return {
@@ -310,64 +283,92 @@ var GitHubApiProvider = class extends BaseProvider {
310
283
  /**
311
284
  * @inheritdoc
312
285
  */
313
- async downloadJSON(name, versionPath, signal) {
286
+ async getVersionURL(versionPath, signal) {
314
287
  const basename = versionPath.slice(versionPath.lastIndexOf("/") + 1);
315
- const data = await defaultDownloadJSON(
288
+ const data = await defaultDownloadText(
316
289
  await this.parseURL(`https://api.github.com/repos/${this.options.user}/${this.options.repo}/releases?per_page=1`),
317
290
  this.getHeaders("vnd.github.v3+json"),
318
- signal
291
+ signal,
292
+ resolveJson
319
293
  );
320
294
  const versionAssets = data[0]?.assets.find((asset) => asset.name === basename);
321
295
  if (!versionAssets) {
322
296
  throw new Error(`${ERROR_MSG}, ${"message" in data ? data.message : "please check the release assets"}`);
323
297
  }
324
- const { beta, version, ...info } = await defaultDownloadUpdateJSON(
325
- versionAssets.browser_download_url,
326
- this.getHeaders("json"),
327
- signal
328
- );
329
- const getURL = (ver) => {
330
- const _ver = data.find((r) => r.tag_name === ver);
331
- if (!_ver) {
332
- throw new Error(ERROR_MSG);
333
- }
334
- const asset = _ver.assets.find((a) => a.name === `${name}-${ver}.asar.gz`);
335
- if (!asset) {
336
- throw new Error(ERROR_MSG);
337
- }
338
- return this.parseURL(asset.browser_download_url);
339
- };
340
- return {
341
- ...info,
342
- version,
343
- url: await getURL(version),
344
- beta: {
345
- ...beta,
346
- url: await getURL(beta.version)
347
- }
348
- };
298
+ return versionAssets.browser_download_url;
299
+ }
300
+ };
301
+
302
+ // src/provider/github/atom.ts
303
+ var GitHubAtomProvider = class extends BaseGitHubProvider {
304
+ name = "GithubAtomProvider";
305
+ /**
306
+ * Update Provider for Github repo
307
+ * - check update from `https://github.com/{user}/{repo}/releases.atom`
308
+ * - download update json from `https://github.com/{user}/{repo}/releases/download/v{version}/{versionPath}`
309
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
310
+ *
311
+ * you can setup `urlHandler` in options to modify url before request
312
+ * @param options provider options
313
+ */
314
+ constructor(options) {
315
+ super(options);
316
+ }
317
+ getHeaders(accept) {
318
+ return { Accept: `application/${accept}`, ...this.options.extraHeaders };
349
319
  }
350
320
  /**
351
321
  * @inheritdoc
352
322
  */
353
- async downloadAsar(info, signal, onDownloading) {
354
- if (!info.url) {
355
- throw new Error("Cannot download asar without url");
356
- }
357
- return await defaultDownloadAsar(
358
- info.url,
359
- this.getHeaders("octet-stream"),
323
+ async getVersionURL(versionPath, signal) {
324
+ const tag = await defaultDownloadText(
325
+ await this.parseURL(`releases.atom`),
326
+ this.getHeaders("xml"),
360
327
  signal,
361
- onDownloading
328
+ (data, resolve, reject) => {
329
+ const result = data.match(/<entry>\s*<id>([^<]*\/)?([^/<]+)<\/id>/)?.[2];
330
+ if (result) {
331
+ resolve(result);
332
+ } else {
333
+ reject("No tag matched");
334
+ }
335
+ }
362
336
  );
337
+ return `releases/download/v${tag}/${versionPath}`;
338
+ }
339
+ };
340
+ var GitHubProvider = class extends BaseGitHubProvider {
341
+ name = "GithubProvider";
342
+ /**
343
+ * Update Provider for Github repo
344
+ * - download update json from `https://github.com/{user}/{repo}/raw/HEAD/{versionPath}`
345
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
346
+ *
347
+ * you can setup `urlHandler` in options to modify url before request
348
+ * @param options provider options
349
+ */
350
+ constructor(options) {
351
+ super(options);
352
+ if (!options.branch) {
353
+ this.options.branch = "HEAD";
354
+ }
355
+ }
356
+ getHeaders(accept) {
357
+ return { Accept: `application/${accept}`, ...this.options.extraHeaders };
358
+ }
359
+ getVersionURL(versionPath) {
360
+ return `raw/${this.options.branch}/${versionPath}`;
363
361
  }
364
362
  };
365
363
 
364
+ exports.BaseGitHubProvider = BaseGitHubProvider;
366
365
  exports.BaseProvider = BaseProvider;
367
366
  exports.GitHubApiProvider = GitHubApiProvider;
367
+ exports.GitHubAtomProvider = GitHubAtomProvider;
368
368
  exports.GitHubProvider = GitHubProvider;
369
369
  exports.defaultDownloadAsar = defaultDownloadAsar;
370
- exports.defaultDownloadJSON = defaultDownloadJSON;
370
+ exports.defaultDownloadText = defaultDownloadText;
371
371
  exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
372
372
  exports.downloadUtil = downloadUtil;
373
373
  exports.getHeader = getHeader;
374
+ exports.resolveJson = resolveJson;