electron-incremental-update 3.0.0-beta.5 → 3.0.0-beta.6

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.
@@ -0,0 +1,254 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ let node_crypto = require("node:crypto");
24
+ node_crypto = __toESM(node_crypto, 1);
25
+ let node_zlib = require("node:zlib");
26
+ node_zlib = __toESM(node_zlib, 1);
27
+ //#region src/utils/version.ts
28
+ const REG_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9]+)(?:\.(\d+))?)?$/i;
29
+ /**
30
+ * Parse version string to {@link Version}, like `0.2.0-beta.1`
31
+ * @param version version string
32
+ */
33
+ function parseVersion(version) {
34
+ const match = REG_VERSION.exec(version);
35
+ if (!match) throw new TypeError(`invalid version: ${version}`);
36
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
37
+ const ret = {
38
+ major,
39
+ minor,
40
+ patch,
41
+ stage: "",
42
+ stageVersion: -1
43
+ };
44
+ if (match[4]) {
45
+ ret.stage = match[4];
46
+ ret.stageVersion = match[5] === void 0 ? -1 : Number(match[5]);
47
+ }
48
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) throw new TypeError(`Invalid version: ${version}`);
49
+ return ret;
50
+ }
51
+ function parsePrerelease(version) {
52
+ if (!version.stage) return [];
53
+ return [version.stage, version.stageVersion === -1 ? void 0 : String(version.stageVersion)].filter((value) => value !== void 0).flatMap((value) => value.split(".")).map((raw) => {
54
+ return {
55
+ raw,
56
+ numeric: /^\d+$/.test(raw) ? Number(raw) : void 0
57
+ };
58
+ });
59
+ }
60
+ function comparePrerelease(oldV, newV) {
61
+ const oldParts = parsePrerelease(oldV);
62
+ const newParts = parsePrerelease(newV);
63
+ if (oldParts.length === 0 || newParts.length === 0) return oldParts.length > 0 && newParts.length === 0;
64
+ const length = Math.max(oldParts.length, newParts.length);
65
+ for (let i = 0; i < length; i++) {
66
+ const oldPart = oldParts[i];
67
+ const newPart = newParts[i];
68
+ if (!oldPart) return true;
69
+ if (!newPart) return false;
70
+ if (oldPart.raw === newPart.raw) continue;
71
+ if (oldPart.numeric !== void 0 && newPart.numeric !== void 0) return oldPart.numeric < newPart.numeric;
72
+ if (oldPart.numeric !== void 0) return true;
73
+ if (newPart.numeric !== void 0) return false;
74
+ return oldPart.raw < newPart.raw;
75
+ }
76
+ return false;
77
+ }
78
+ /**
79
+ * Default function to check the old version is less than new version
80
+ * @param oldVer old version string
81
+ * @param newVer new version string
82
+ */
83
+ function defaultIsLowerVersion(oldVer, newVer) {
84
+ const oldV = parseVersion(oldVer);
85
+ const newV = parseVersion(newVer);
86
+ for (const key of [
87
+ "major",
88
+ "minor",
89
+ "patch"
90
+ ]) if (oldV[key] !== newV[key]) return oldV[key] < newV[key];
91
+ return comparePrerelease(oldV, newV);
92
+ }
93
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
94
+ /**
95
+ * Check is `UpdateJSON`
96
+ * @param json any variable
97
+ */
98
+ function isUpdateJSON(json) {
99
+ return json && is(json) && is(json.beta);
100
+ }
101
+ /**
102
+ * Default function to generate `UpdateJSON`
103
+ * @param existingJson exising update json
104
+ * @param signature sigature
105
+ * @param version target version
106
+ * @param minimumVersion minimum version
107
+ */
108
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
109
+ existingJson.beta = {
110
+ version,
111
+ minimumVersion,
112
+ signature
113
+ };
114
+ if (!parseVersion(version).stage) {
115
+ existingJson.version = version;
116
+ existingJson.minimumVersion = minimumVersion;
117
+ existingJson.signature = signature;
118
+ }
119
+ return existingJson;
120
+ }
121
+ //#endregion
122
+ //#region src/utils/crypto.ts
123
+ function hashBuffer(data, length) {
124
+ const hash = node_crypto.default.createHash("SHA256").update(data).digest("binary");
125
+ return Buffer.from(hash).subarray(0, length);
126
+ }
127
+ function aesEncrypt(plainText, key, iv) {
128
+ const cipher = node_crypto.default.createCipheriv("aes-256-cbc", key, iv);
129
+ return cipher.update(plainText, "utf8", "base64url") + cipher.final("base64url");
130
+ }
131
+ /**
132
+ * Default function to generate asar signature, returns generated signature
133
+ * @param buffer file buffer
134
+ * @param privateKey primary key
135
+ * @param cert certificate
136
+ * @param version target version
137
+ */
138
+ function defaultSignature(buffer, privateKey, cert, version) {
139
+ return aesEncrypt(`${node_crypto.default.createSign("RSA-SHA256").update(buffer).sign(node_crypto.default.createPrivateKey(privateKey), "base64")}%${version}`, hashBuffer(cert, 32), hashBuffer(buffer, 16));
140
+ }
141
+ function aesDecrypt(encryptedText, key, iv) {
142
+ const decipher = node_crypto.default.createDecipheriv("aes-256-cbc", key, iv);
143
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
144
+ }
145
+ /**
146
+ * Default function to verify asar signature,
147
+ * if signature is valid, returns the version, otherwise returns `undefined`
148
+ * @param buffer file buffer
149
+ * @param version target version
150
+ * @param signature signature
151
+ * @param cert certificate
152
+ */
153
+ function defaultVerifySignature(buffer, version, signature, cert) {
154
+ try {
155
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
156
+ if (ver !== version) return false;
157
+ return node_crypto.default.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
158
+ } catch {
159
+ return false;
160
+ }
161
+ }
162
+ //#endregion
163
+ //#region src/utils/zip.ts
164
+ /**
165
+ * Default function to compress file using brotli
166
+ * @param buffer uncompressed file buffer
167
+ */
168
+ async function defaultZipFile(buffer) {
169
+ return new Promise((resolve, reject) => {
170
+ node_zlib.default.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
171
+ });
172
+ }
173
+ /**
174
+ * Default function to decompress file using brotli
175
+ * @param buffer compressed file buffer
176
+ */
177
+ async function defaultUnzipFile(buffer) {
178
+ return new Promise((resolve, reject) => {
179
+ node_zlib.default.brotliDecompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
180
+ });
181
+ }
182
+ //#endregion
183
+ Object.defineProperty(exports, "__toESM", {
184
+ enumerable: true,
185
+ get: function() {
186
+ return __toESM;
187
+ }
188
+ });
189
+ Object.defineProperty(exports, "aesDecrypt", {
190
+ enumerable: true,
191
+ get: function() {
192
+ return aesDecrypt;
193
+ }
194
+ });
195
+ Object.defineProperty(exports, "aesEncrypt", {
196
+ enumerable: true,
197
+ get: function() {
198
+ return aesEncrypt;
199
+ }
200
+ });
201
+ Object.defineProperty(exports, "defaultIsLowerVersion", {
202
+ enumerable: true,
203
+ get: function() {
204
+ return defaultIsLowerVersion;
205
+ }
206
+ });
207
+ Object.defineProperty(exports, "defaultSignature", {
208
+ enumerable: true,
209
+ get: function() {
210
+ return defaultSignature;
211
+ }
212
+ });
213
+ Object.defineProperty(exports, "defaultUnzipFile", {
214
+ enumerable: true,
215
+ get: function() {
216
+ return defaultUnzipFile;
217
+ }
218
+ });
219
+ Object.defineProperty(exports, "defaultVerifySignature", {
220
+ enumerable: true,
221
+ get: function() {
222
+ return defaultVerifySignature;
223
+ }
224
+ });
225
+ Object.defineProperty(exports, "defaultVersionJsonGenerator", {
226
+ enumerable: true,
227
+ get: function() {
228
+ return defaultVersionJsonGenerator;
229
+ }
230
+ });
231
+ Object.defineProperty(exports, "defaultZipFile", {
232
+ enumerable: true,
233
+ get: function() {
234
+ return defaultZipFile;
235
+ }
236
+ });
237
+ Object.defineProperty(exports, "hashBuffer", {
238
+ enumerable: true,
239
+ get: function() {
240
+ return hashBuffer;
241
+ }
242
+ });
243
+ Object.defineProperty(exports, "isUpdateJSON", {
244
+ enumerable: true,
245
+ get: function() {
246
+ return isUpdateJSON;
247
+ }
248
+ });
249
+ Object.defineProperty(exports, "parseVersion", {
250
+ enumerable: true,
251
+ get: function() {
252
+ return parseVersion;
253
+ }
254
+ });
@@ -0,0 +1,159 @@
1
+ import crypto from "node:crypto";
2
+ import zlib from "node:zlib";
3
+ //#region src/utils/version.ts
4
+ const REG_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9]+)(?:\.(\d+))?)?$/i;
5
+ /**
6
+ * Parse version string to {@link Version}, like `0.2.0-beta.1`
7
+ * @param version version string
8
+ */
9
+ function parseVersion(version) {
10
+ const match = REG_VERSION.exec(version);
11
+ if (!match) throw new TypeError(`invalid version: ${version}`);
12
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
13
+ const ret = {
14
+ major,
15
+ minor,
16
+ patch,
17
+ stage: "",
18
+ stageVersion: -1
19
+ };
20
+ if (match[4]) {
21
+ ret.stage = match[4];
22
+ ret.stageVersion = match[5] === void 0 ? -1 : Number(match[5]);
23
+ }
24
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) throw new TypeError(`Invalid version: ${version}`);
25
+ return ret;
26
+ }
27
+ function parsePrerelease(version) {
28
+ if (!version.stage) return [];
29
+ return [version.stage, version.stageVersion === -1 ? void 0 : String(version.stageVersion)].filter((value) => value !== void 0).flatMap((value) => value.split(".")).map((raw) => {
30
+ return {
31
+ raw,
32
+ numeric: /^\d+$/.test(raw) ? Number(raw) : void 0
33
+ };
34
+ });
35
+ }
36
+ function comparePrerelease(oldV, newV) {
37
+ const oldParts = parsePrerelease(oldV);
38
+ const newParts = parsePrerelease(newV);
39
+ if (oldParts.length === 0 || newParts.length === 0) return oldParts.length > 0 && newParts.length === 0;
40
+ const length = Math.max(oldParts.length, newParts.length);
41
+ for (let i = 0; i < length; i++) {
42
+ const oldPart = oldParts[i];
43
+ const newPart = newParts[i];
44
+ if (!oldPart) return true;
45
+ if (!newPart) return false;
46
+ if (oldPart.raw === newPart.raw) continue;
47
+ if (oldPart.numeric !== void 0 && newPart.numeric !== void 0) return oldPart.numeric < newPart.numeric;
48
+ if (oldPart.numeric !== void 0) return true;
49
+ if (newPart.numeric !== void 0) return false;
50
+ return oldPart.raw < newPart.raw;
51
+ }
52
+ return false;
53
+ }
54
+ /**
55
+ * Default function to check the old version is less than new version
56
+ * @param oldVer old version string
57
+ * @param newVer new version string
58
+ */
59
+ function defaultIsLowerVersion(oldVer, newVer) {
60
+ const oldV = parseVersion(oldVer);
61
+ const newV = parseVersion(newVer);
62
+ for (const key of [
63
+ "major",
64
+ "minor",
65
+ "patch"
66
+ ]) if (oldV[key] !== newV[key]) return oldV[key] < newV[key];
67
+ return comparePrerelease(oldV, newV);
68
+ }
69
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
70
+ /**
71
+ * Check is `UpdateJSON`
72
+ * @param json any variable
73
+ */
74
+ function isUpdateJSON(json) {
75
+ return json && is(json) && is(json.beta);
76
+ }
77
+ /**
78
+ * Default function to generate `UpdateJSON`
79
+ * @param existingJson exising update json
80
+ * @param signature sigature
81
+ * @param version target version
82
+ * @param minimumVersion minimum version
83
+ */
84
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
85
+ existingJson.beta = {
86
+ version,
87
+ minimumVersion,
88
+ signature
89
+ };
90
+ if (!parseVersion(version).stage) {
91
+ existingJson.version = version;
92
+ existingJson.minimumVersion = minimumVersion;
93
+ existingJson.signature = signature;
94
+ }
95
+ return existingJson;
96
+ }
97
+ //#endregion
98
+ //#region src/utils/crypto.ts
99
+ function hashBuffer(data, length) {
100
+ const hash = crypto.createHash("SHA256").update(data).digest("binary");
101
+ return Buffer.from(hash).subarray(0, length);
102
+ }
103
+ function aesEncrypt(plainText, key, iv) {
104
+ const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
105
+ return cipher.update(plainText, "utf8", "base64url") + cipher.final("base64url");
106
+ }
107
+ /**
108
+ * Default function to generate asar signature, returns generated signature
109
+ * @param buffer file buffer
110
+ * @param privateKey primary key
111
+ * @param cert certificate
112
+ * @param version target version
113
+ */
114
+ function defaultSignature(buffer, privateKey, cert, version) {
115
+ return aesEncrypt(`${crypto.createSign("RSA-SHA256").update(buffer).sign(crypto.createPrivateKey(privateKey), "base64")}%${version}`, hashBuffer(cert, 32), hashBuffer(buffer, 16));
116
+ }
117
+ function aesDecrypt(encryptedText, key, iv) {
118
+ const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
119
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
120
+ }
121
+ /**
122
+ * Default function to verify asar signature,
123
+ * if signature is valid, returns the version, otherwise returns `undefined`
124
+ * @param buffer file buffer
125
+ * @param version target version
126
+ * @param signature signature
127
+ * @param cert certificate
128
+ */
129
+ function defaultVerifySignature(buffer, version, signature, cert) {
130
+ try {
131
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
132
+ if (ver !== version) return false;
133
+ return crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
134
+ } catch {
135
+ return false;
136
+ }
137
+ }
138
+ //#endregion
139
+ //#region src/utils/zip.ts
140
+ /**
141
+ * Default function to compress file using brotli
142
+ * @param buffer uncompressed file buffer
143
+ */
144
+ async function defaultZipFile(buffer) {
145
+ return new Promise((resolve, reject) => {
146
+ zlib.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
147
+ });
148
+ }
149
+ /**
150
+ * Default function to decompress file using brotli
151
+ * @param buffer compressed file buffer
152
+ */
153
+ async function defaultUnzipFile(buffer) {
154
+ return new Promise((resolve, reject) => {
155
+ zlib.brotliDecompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
156
+ });
157
+ }
158
+ //#endregion
159
+ export { defaultSignature as a, defaultIsLowerVersion as c, parseVersion as d, aesEncrypt as i, defaultVersionJsonGenerator as l, defaultZipFile as n, defaultVerifySignature as o, aesDecrypt as r, hashBuffer as s, defaultUnzipFile as t, isUpdateJSON as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-incremental-update",
3
- "version": "3.0.0-beta.5",
3
+ "version": "3.0.0-beta.6",
4
4
  "description": "Electron incremental update tools with Vite plugin, support bytecode protection",
5
5
  "keywords": [
6
6
  "bytecode",
@@ -12,16 +12,10 @@
12
12
  "author": "subframe7536",
13
13
  "repository": {
14
14
  "type": "git",
15
- "url": "git+https://github.com/subframe7536/electron-incremental-update.git"
15
+ "url": "git+https://github.com/electron-vite/electron-incremental-update.git"
16
16
  },
17
17
  "files": [
18
- "dist",
19
- "provider.d.ts",
20
- "provider.js",
21
- "utils.d.ts",
22
- "utils.js",
23
- "vite.d.ts",
24
- "vite.js"
18
+ "dist"
25
19
  ],
26
20
  "type": "module",
27
21
  "main": "./dist/index.cjs",
@@ -39,16 +33,16 @@
39
33
  },
40
34
  "exports": {
41
35
  ".": {
42
- "require": "./dist/index.cjs",
43
- "import": "./dist/index.mjs"
36
+ "import": "./dist/index.mjs",
37
+ "require": "./dist/index.cjs"
44
38
  },
45
39
  "./provider": {
46
- "require": "./dist/provider.cjs",
47
- "import": "./dist/provider.mjs"
40
+ "import": "./dist/provider.mjs",
41
+ "require": "./dist/provider.cjs"
48
42
  },
49
43
  "./utils": {
50
- "require": "./dist/utils.cjs",
51
- "import": "./dist/utils.mjs"
44
+ "import": "./dist/utils.mjs",
45
+ "require": "./dist/utils.cjs"
52
46
  },
53
47
  "./vite": "./dist/vite.mjs",
54
48
  "./package.json": "./package.json"
@@ -60,7 +54,8 @@
60
54
  "scripts": {
61
55
  "dev": "tsdown --watch",
62
56
  "build": "tsdown",
63
- "play": "vite",
57
+ "play": "bun run build && vite",
58
+ "play:build": "vite build",
64
59
  "release": "bun run format && bun run lint && bun run test && bun run build && bumpp --all",
65
60
  "test": "bun test --preload ./tests/setup.ts",
66
61
  "test:dev": "bun test --watch",
@@ -69,30 +64,30 @@
69
64
  "qa": "oxlint --fix && oxfmt && tsc --noEmit"
70
65
  },
71
66
  "dependencies": {
72
- "@babel/plugin-transform-arrow-functions": "^7.27.1",
73
- "@babel/plugin-transform-template-literals": "^7.27.1",
74
- "ci-info": "^4.3.1",
75
- "local-pkg": "^1.1.2",
76
- "magic-string": "^0.30.21",
77
- "selfsigned": "^5.5.0"
67
+ "@babel/plugin-transform-arrow-functions": "^7.29.7",
68
+ "@babel/plugin-transform-template-literals": "^7.29.7",
69
+ "ci-info": "^4.4.0",
70
+ "selfsigned": "^5.5.0",
71
+ "vite-plugin-electron": "~1.0.4"
78
72
  },
79
73
  "devDependencies": {
80
- "@subframe7536/type-utils": "^0.2.0",
74
+ "@subf/config": "^0.2.1",
75
+ "@tsdown/css": "^0.22.1",
81
76
  "@types/babel__core": "^7.20.5",
82
- "@types/bun": "^1.3.6",
83
- "bumpp": "^10.4.0",
84
- "electron": "39.2.7",
85
- "oxfmt": "^0.26.0",
86
- "oxlint": "^1.41.0",
87
- "tsdown": "^0.20.0",
88
- "typescript": "^5.9.3",
89
- "vite": "^8.0.0-beta.9"
77
+ "@types/bun": "^1.3.14",
78
+ "bumpp": "^11.1.0",
79
+ "electron": "42.2.0",
80
+ "oxfmt": "^0.53.0",
81
+ "oxlint": "^1.68.0",
82
+ "tsdown": "^0.22.1",
83
+ "typescript": "^6.0.3",
84
+ "vite": "^8.0.16"
90
85
  },
91
86
  "peerDependencies": {
92
- "@babel/core": "^7",
93
- "@electron/asar": "*"
87
+ "@babel/core": "^7.29.7",
88
+ "@electron/asar": "4.2.0"
94
89
  },
95
90
  "overrides": {
96
- "vite": "^8.0.0-beta.9"
91
+ "@electron/get": "^5.0.0"
97
92
  }
98
93
  }