@bolloon/bolloon-agent 0.3.6 → 0.3.7
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/dist/cli/loading-tui.js +386 -33
- package/dist/cli-entry.js +5 -10
- package/dist/electron/main.js +16 -0
- package/dist/electron/main.js.map +1 -1
- package/dist/index.js +101 -22
- package/dist/utils/auto-update.js +292 -112
- package/dist/utils/auto-update.js.map +1 -0
- package/package.json +8 -8
|
@@ -1,16 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* npm 自动更新检查器
|
|
3
4
|
*
|
|
4
5
|
* 功能:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
6
|
+
* - 启动时(后台、节流)检查 npm 注册表是否有新版本
|
|
7
|
+
* - 检测到新版本时自动下载并安装最新版本(可按需关闭)
|
|
8
|
+
* - 支持增量更新(只更新有变化的包)
|
|
9
|
+
*
|
|
10
|
+
* 设计要点:
|
|
11
|
+
* - 全局安装位置通过 `npm root -g` / `npm prefix -g` 动态探测,
|
|
12
|
+
* 不再依赖写死的路径,兼容 nvm / homebrew / 默认 prefix。
|
|
13
|
+
* - 运行中的包版本优先从全局安装位置(npm root -g 动态探测)读取,
|
|
14
|
+
* 开发态下若 cwd 的 package.json 就是本包则回退到 cwd,不受任意工作目录影响。
|
|
15
|
+
* - 检查频率受节流缓存约束(默认 24h 一次),不会每次启动都打 npm。
|
|
8
16
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.checkAndUpdate = checkAndUpdate;
|
|
52
|
+
exports.checkForUpdates = checkForUpdates;
|
|
53
|
+
exports.performUpdate = performUpdate;
|
|
54
|
+
const child_process_1 = require("child_process");
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const https = __importStar(require("https"));
|
|
58
|
+
const http = __importStar(require("http"));
|
|
14
59
|
// ANSI 颜色
|
|
15
60
|
const RESET = '\x1b[0m';
|
|
16
61
|
const BOLD = '\x1b[1m';
|
|
@@ -18,8 +63,14 @@ const CYAN = '\x1b[36m';
|
|
|
18
63
|
const GREEN = '\x1b[32m';
|
|
19
64
|
const YELLOW = '\x1b[33m';
|
|
20
65
|
const MAGENTA = '\x1b[35m';
|
|
21
|
-
|
|
22
|
-
|
|
66
|
+
const PKG_NAME = '@bolloon/bolloon-agent';
|
|
67
|
+
const BOLLOON_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.bolloon');
|
|
68
|
+
const UPDATE_CACHE = path.join(BOLLOON_DIR, '.update-check.json');
|
|
69
|
+
/**
|
|
70
|
+
* 通知用户。使用 stderr,避免在交互式 CLI 模式下 stdout 被吞掉。
|
|
71
|
+
*/
|
|
72
|
+
function notify(msg, color = RESET) {
|
|
73
|
+
process.stderr.write(`${color}${msg}${RESET}`);
|
|
23
74
|
}
|
|
24
75
|
function httpGet(url) {
|
|
25
76
|
return new Promise((resolve, reject) => {
|
|
@@ -37,70 +88,95 @@ function httpGet(url) {
|
|
|
37
88
|
});
|
|
38
89
|
}
|
|
39
90
|
/**
|
|
40
|
-
*
|
|
91
|
+
* 读取某目录下的 package.json 版本号
|
|
92
|
+
*/
|
|
93
|
+
function readVersion(dir) {
|
|
94
|
+
if (!dir)
|
|
95
|
+
return null;
|
|
96
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
97
|
+
try {
|
|
98
|
+
if (fs.existsSync(pkgPath)) {
|
|
99
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
100
|
+
return pkg.version || null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// 忽略
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 获取 bolloon 全局安装目录(动态探测,兼容多种 npm 安装方式)。
|
|
110
|
+
* 同时兼容 ESM(Node) 与 CJS(Electron) 上下文,不依赖 import.meta。
|
|
41
111
|
*/
|
|
42
112
|
function getGlobalBolloonDir() {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
113
|
+
const candidates = [];
|
|
114
|
+
// 1. npm root -g(最可靠)
|
|
115
|
+
try {
|
|
116
|
+
const npmRoot = (0, child_process_1.execSync)('npm root -g', { encoding: 'utf-8', timeout: 8000 }).trim();
|
|
117
|
+
if (npmRoot)
|
|
118
|
+
candidates.push(path.join(npmRoot, '@bolloon', 'bolloon-agent'));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// 忽略
|
|
122
|
+
}
|
|
123
|
+
// 2. npm prefix -g
|
|
124
|
+
try {
|
|
125
|
+
const npmPrefix = (0, child_process_1.execSync)('npm prefix -g', { encoding: 'utf-8', timeout: 8000 }).trim();
|
|
126
|
+
if (npmPrefix)
|
|
127
|
+
candidates.push(path.join(npmPrefix, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// 忽略
|
|
131
|
+
}
|
|
132
|
+
// 3. nvm 各版本目录
|
|
133
|
+
const home = process.env.HOME || '';
|
|
134
|
+
const nvmBase = path.join(home, '.nvm', 'versions', 'node');
|
|
135
|
+
try {
|
|
136
|
+
if (fs.existsSync(nvmBase)) {
|
|
137
|
+
for (const ver of fs.readdirSync(nvmBase)) {
|
|
138
|
+
candidates.push(path.join(nvmBase, ver, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
139
|
+
}
|
|
50
140
|
}
|
|
51
141
|
}
|
|
142
|
+
catch {
|
|
143
|
+
// 忽略
|
|
144
|
+
}
|
|
145
|
+
// 4. 常见写死路径兜底
|
|
146
|
+
candidates.push(path.join(home, '.npm-global', 'lib', 'node_modules', '@bolloon', 'bolloon-agent'), '/usr/local/lib/node_modules/@bolloon/bolloon-agent', '/opt/homebrew/lib/node_modules/@bolloon/bolloon-agent', path.join(home, 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
147
|
+
for (const p of candidates) {
|
|
148
|
+
if (fs.existsSync(path.join(p, 'package.json')))
|
|
149
|
+
return p;
|
|
150
|
+
}
|
|
52
151
|
return null;
|
|
53
152
|
}
|
|
54
153
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
154
|
+
* 获取当前安装的包版本。
|
|
155
|
+
* 主包优先用「全局安装位置」;开发态下若 cwd 的 package.json 就是本包则回退到 cwd。
|
|
156
|
+
* 不再无差别回退到 cwd(避免全局启动时误读用户工作目录的版本)。
|
|
57
157
|
*/
|
|
58
158
|
function getInstalledVersion(packageName) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
71
|
-
console.error(`[DEBUG] pkg.version=${pkg.version}`);
|
|
72
|
-
return pkg.version || null;
|
|
73
|
-
}
|
|
74
|
-
catch (e) {
|
|
75
|
-
// 忽略
|
|
159
|
+
if (packageName === PKG_NAME) {
|
|
160
|
+
const fromGlobal = readVersion(getGlobalBolloonDir());
|
|
161
|
+
if (fromGlobal)
|
|
162
|
+
return fromGlobal;
|
|
163
|
+
// 开发态:仅在 cwd 的 package.json 确为本包时才采用
|
|
164
|
+
const cwdPkg = path.join(process.cwd(), 'package.json');
|
|
165
|
+
try {
|
|
166
|
+
if (fs.existsSync(cwdPkg)) {
|
|
167
|
+
const data = JSON.parse(fs.readFileSync(cwdPkg, 'utf-8'));
|
|
168
|
+
if (data.name === PKG_NAME && data.version)
|
|
169
|
+
return data.version;
|
|
76
170
|
}
|
|
77
171
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
console.error(`[DEBUG] localPkgPath=${localPkgPath}, exists=${fs.existsSync(localPkgPath)}`);
|
|
81
|
-
if (fs.existsSync(localPkgPath)) {
|
|
82
|
-
try {
|
|
83
|
-
const pkg = JSON.parse(fs.readFileSync(localPkgPath, 'utf-8'));
|
|
84
|
-
console.error(`[DEBUG] local pkg.version=${pkg.version}`);
|
|
85
|
-
return pkg.version || null;
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
// 忽略
|
|
89
|
-
}
|
|
172
|
+
catch {
|
|
173
|
+
// 忽略
|
|
90
174
|
}
|
|
91
175
|
}
|
|
92
|
-
//
|
|
176
|
+
// 其它包:检查本地 node_modules
|
|
93
177
|
const packageJsonPath = findPackageJson(packageName);
|
|
94
|
-
console.error(`[DEBUG] findPackageJson=${packageJsonPath}`);
|
|
95
178
|
if (packageJsonPath) {
|
|
96
|
-
|
|
97
|
-
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
98
|
-
console.error(`[DEBUG] node_modules pkg.version=${pkg.version}`);
|
|
99
|
-
return pkg.version || null;
|
|
100
|
-
}
|
|
101
|
-
catch (e) {
|
|
102
|
-
// 忽略错误
|
|
103
|
-
}
|
|
179
|
+
return readVersion(path.dirname(packageJsonPath));
|
|
104
180
|
}
|
|
105
181
|
return null;
|
|
106
182
|
}
|
|
@@ -108,7 +184,6 @@ function getInstalledVersion(packageName) {
|
|
|
108
184
|
* 查找包的 package.json 路径
|
|
109
185
|
*/
|
|
110
186
|
function findPackageJson(packageName) {
|
|
111
|
-
// 检查当前项目的 node_modules
|
|
112
187
|
const checkPaths = [
|
|
113
188
|
path.join(process.cwd(), 'node_modules', packageName, 'package.json'),
|
|
114
189
|
path.join(process.cwd(), 'node_modules', '@' + packageName.split('/')[0], packageName.split('/')[1] || '', 'package.json'),
|
|
@@ -138,8 +213,9 @@ async function getLatestVersion(packageName) {
|
|
|
138
213
|
* 比较版本号
|
|
139
214
|
*/
|
|
140
215
|
function compareVersions(current, latest) {
|
|
141
|
-
const
|
|
142
|
-
const
|
|
216
|
+
const norm = (v) => v.replace(/^v/, '').split('-')[0].split('.').map(Number);
|
|
217
|
+
const currentParts = norm(current);
|
|
218
|
+
const latestParts = norm(latest);
|
|
143
219
|
for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {
|
|
144
220
|
const c = currentParts[i] || 0;
|
|
145
221
|
const l = latestParts[i] || 0;
|
|
@@ -151,11 +227,11 @@ function compareVersions(current, latest) {
|
|
|
151
227
|
return 0;
|
|
152
228
|
}
|
|
153
229
|
/**
|
|
154
|
-
* 检查
|
|
230
|
+
* 检查 bolloon 相关包是否有更新
|
|
155
231
|
*/
|
|
156
232
|
async function checkBolloonUpdates() {
|
|
157
233
|
const packagesToCheck = [
|
|
158
|
-
|
|
234
|
+
PKG_NAME,
|
|
159
235
|
'@bolloon/constraint-runtime',
|
|
160
236
|
];
|
|
161
237
|
const outdatedPackages = [];
|
|
@@ -164,15 +240,12 @@ async function checkBolloonUpdates() {
|
|
|
164
240
|
let latestVersion = '';
|
|
165
241
|
for (const pkg of packagesToCheck) {
|
|
166
242
|
const installed = getInstalledVersion(pkg);
|
|
167
|
-
console.error(`[DEBUG] getInstalledVersion(${pkg}) = ${installed}`);
|
|
168
243
|
if (!installed)
|
|
169
244
|
continue;
|
|
170
|
-
|
|
171
|
-
if (pkg === '@bolloon/bolloon-agent') {
|
|
245
|
+
if (pkg === PKG_NAME) {
|
|
172
246
|
currentVersion = installed;
|
|
173
247
|
}
|
|
174
248
|
const latest = await getLatestVersion(pkg);
|
|
175
|
-
console.error(`[DEBUG] getLatestVersion(${pkg}) = ${latest}`);
|
|
176
249
|
if (latest && compareVersions(installed, latest) < 0) {
|
|
177
250
|
hasUpdate = true;
|
|
178
251
|
latestVersion = latest;
|
|
@@ -187,7 +260,7 @@ async function checkBolloonUpdates() {
|
|
|
187
260
|
}
|
|
188
261
|
if (outdatedPackages.length === 0) {
|
|
189
262
|
return {
|
|
190
|
-
name:
|
|
263
|
+
name: PKG_NAME,
|
|
191
264
|
version: currentVersion,
|
|
192
265
|
latest: currentVersion,
|
|
193
266
|
outdated: false,
|
|
@@ -195,7 +268,7 @@ async function checkBolloonUpdates() {
|
|
|
195
268
|
};
|
|
196
269
|
}
|
|
197
270
|
return {
|
|
198
|
-
name:
|
|
271
|
+
name: PKG_NAME,
|
|
199
272
|
version: currentVersion,
|
|
200
273
|
latest: latestVersion,
|
|
201
274
|
outdated: hasUpdate,
|
|
@@ -207,7 +280,7 @@ async function checkBolloonUpdates() {
|
|
|
207
280
|
*/
|
|
208
281
|
function checkNpmOutdated() {
|
|
209
282
|
try {
|
|
210
|
-
const output = execSync('npm outdated --json', {
|
|
283
|
+
const output = (0, child_process_1.execSync)('npm outdated --json', {
|
|
211
284
|
encoding: 'utf-8',
|
|
212
285
|
timeout: 30000,
|
|
213
286
|
maxBuffer: 10 * 1024 * 1024,
|
|
@@ -238,21 +311,25 @@ function checkNpmOutdated() {
|
|
|
238
311
|
}
|
|
239
312
|
}
|
|
240
313
|
/**
|
|
241
|
-
*
|
|
242
|
-
*
|
|
314
|
+
* 解析 `name` 或 `name@version` 形式,未带版本时从 npm 解析 latest,
|
|
315
|
+
* 拼成 `name@version`,避免 npm 被本地 package.json 的 semver 约束卡住。
|
|
243
316
|
*/
|
|
244
|
-
async function
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
317
|
+
async function resolveTargetsWithVersion(targets) {
|
|
318
|
+
return Promise.all(targets.map(async (spec) => {
|
|
319
|
+
const m = spec.match(/^(.+?)@([^@]+)$/);
|
|
320
|
+
// 形如 @scope/name@1.2.3 或 name@1.2.3 且版本以数字开头 -> 已带版本
|
|
321
|
+
if (m && m[2] && /^\d/.test(m[2]))
|
|
322
|
+
return spec;
|
|
323
|
+
const latest = await getLatestVersion(spec);
|
|
324
|
+
return latest ? `${spec}@${latest}` : spec;
|
|
325
|
+
}));
|
|
248
326
|
}
|
|
249
327
|
/**
|
|
250
328
|
* 自动更新 npm 包, 传 `name@version` 形式的目标让 npm install 不被本地
|
|
251
|
-
* package.json 的 semver
|
|
252
|
-
* package.json 里 "^0.
|
|
329
|
+
* package.json 的 semver 约束卡住(旧版只传 name 时, npm 看到本地
|
|
330
|
+
* package.json 里 "^0.3.x" 已经满足就判 up to date, 永远升不上去)
|
|
253
331
|
*/
|
|
254
332
|
async function updatePackagesWithVersion(packagesWithVersion) {
|
|
255
|
-
// 解析 `name@version` 形式, 提取 name 用于 before/after 校验
|
|
256
333
|
const parsed = packagesWithVersion.map(spec => {
|
|
257
334
|
const at = spec.lastIndexOf('@');
|
|
258
335
|
if (at <= 0)
|
|
@@ -265,13 +342,14 @@ async function updatePackagesWithVersion(packagesWithVersion) {
|
|
|
265
342
|
before.set(p, getInstalledVersion(p));
|
|
266
343
|
// 用 targetsWithVersion 直接拼命令 - 包含具体版本号, 不会被本地约束拦截
|
|
267
344
|
const args = ['npm', 'install', '-g', ...packagesWithVersion];
|
|
268
|
-
|
|
345
|
+
notify(`\n${CYAN}📦 正在更新包...${RESET}\n`, RESET);
|
|
269
346
|
try {
|
|
270
|
-
execSync(args.join(' '), {
|
|
347
|
+
(0, child_process_1.execSync)(args.join(' '), {
|
|
271
348
|
encoding: 'utf-8',
|
|
272
349
|
timeout: 300000,
|
|
273
350
|
stdio: 'inherit',
|
|
274
|
-
cwd
|
|
351
|
+
// 全局安装与 cwd 无关,用中性目录避免本地 package.json 干扰
|
|
352
|
+
cwd: process.env.TMPDIR || '/tmp'
|
|
275
353
|
});
|
|
276
354
|
}
|
|
277
355
|
catch (e) {
|
|
@@ -291,7 +369,6 @@ async function updatePackagesWithVersion(packagesWithVersion) {
|
|
|
291
369
|
if (after && was && compareVersions(was, after) < 0) {
|
|
292
370
|
upgraded.push(p.name);
|
|
293
371
|
}
|
|
294
|
-
// 版本没变 = npm 仍判 up to date; 不当成功
|
|
295
372
|
}
|
|
296
373
|
if (upgraded.length > 0) {
|
|
297
374
|
return {
|
|
@@ -309,45 +386,132 @@ async function updatePackagesWithVersion(packagesWithVersion) {
|
|
|
309
386
|
};
|
|
310
387
|
}
|
|
311
388
|
/**
|
|
312
|
-
*
|
|
389
|
+
* 自动更新 npm 包(不传版本时自动解析 latest)
|
|
313
390
|
*/
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
391
|
+
async function updatePackages(packages) {
|
|
392
|
+
const targets = packages && packages.length > 0 ? packages : [PKG_NAME];
|
|
393
|
+
const withVersion = await resolveTargetsWithVersion(targets);
|
|
394
|
+
return updatePackagesWithVersion(withVersion);
|
|
395
|
+
}
|
|
396
|
+
function loadUpdateConfig() {
|
|
397
|
+
const def = { autoUpdate: true, autoRestart: true, checkIntervalHours: 24 };
|
|
398
|
+
try {
|
|
399
|
+
const cfgPath = path.join(BOLLOON_DIR, 'config.json');
|
|
400
|
+
if (fs.existsSync(cfgPath)) {
|
|
401
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8'));
|
|
402
|
+
if (typeof cfg.autoUpdate === 'boolean')
|
|
403
|
+
def.autoUpdate = cfg.autoUpdate;
|
|
404
|
+
if (typeof cfg.autoRestart === 'boolean')
|
|
405
|
+
def.autoRestart = cfg.autoRestart;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// 忽略
|
|
410
|
+
}
|
|
411
|
+
return def;
|
|
412
|
+
}
|
|
413
|
+
function readCache() {
|
|
414
|
+
try {
|
|
415
|
+
if (fs.existsSync(UPDATE_CACHE)) {
|
|
416
|
+
return JSON.parse(fs.readFileSync(UPDATE_CACHE, 'utf-8'));
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
// 忽略
|
|
421
|
+
}
|
|
422
|
+
return {};
|
|
423
|
+
}
|
|
424
|
+
function writeCache(patch) {
|
|
425
|
+
try {
|
|
426
|
+
fs.mkdirSync(BOLLOON_DIR, { recursive: true });
|
|
427
|
+
const merged = { ...readCache(), ...patch, lastCheck: Date.now() };
|
|
428
|
+
fs.writeFileSync(UPDATE_CACHE, JSON.stringify(merged));
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
// 忽略
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function shouldCheckNow(cfg) {
|
|
435
|
+
const cache = readCache();
|
|
436
|
+
const last = cache.lastCheck || 0;
|
|
437
|
+
const interval = cfg.checkIntervalHours * 3600 * 1000;
|
|
438
|
+
return Date.now() - last >= interval;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* 判断本次启动是否应执行自动更新检查。
|
|
442
|
+
* 显式屏蔽(--no-update / BOLLOON_SKIP_UPDATE)始终优先。
|
|
443
|
+
* 否则依据 config.json 的 autoUpdate(默认开启)或显式允许标志。
|
|
444
|
+
*/
|
|
445
|
+
function resolveAutoUpdatePolicy() {
|
|
446
|
+
const blockFlag = process.argv.includes('--no-update') || process.argv.includes('--skip-update');
|
|
447
|
+
const blockEnv = process.env.BOLLOON_SKIP_UPDATE === 'true';
|
|
318
448
|
const allowFlag = process.argv.includes('--update-check')
|
|
319
449
|
|| process.argv.includes('--update-now')
|
|
320
450
|
|| process.argv.includes('--allow-update');
|
|
321
451
|
const allowEnv = process.env.BOLLOON_AUTO_UPDATE === '1';
|
|
322
|
-
|
|
323
|
-
|
|
452
|
+
const cfg = loadUpdateConfig();
|
|
453
|
+
const blocked = blockFlag || blockEnv;
|
|
454
|
+
const enabled = cfg.autoUpdate || allowFlag || allowEnv;
|
|
455
|
+
return { blocked, enabled, allowFlag, allowEnv, cfg };
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* 检查并自动更新(启动时调用)
|
|
459
|
+
*
|
|
460
|
+
* @param opts.force 忽略节流/配置强制检查
|
|
461
|
+
* @param opts.onUpdated 安装成功且允许自动重启时调用(由调用方提供模式相关的重启逻辑,
|
|
462
|
+
* 例如 Electron 用 app.relaunch(),Node 用 detached 重新 spawn)。
|
|
463
|
+
* 若未提供或 autoRestart=false,则仅提示用户手动重启。
|
|
464
|
+
*/
|
|
465
|
+
async function checkAndUpdate(opts = {}) {
|
|
466
|
+
const policy = resolveAutoUpdatePolicy();
|
|
467
|
+
if (policy.blocked) {
|
|
468
|
+
return { hasUpdate: false, info: null, updated: false, message: '跳过更新检查(已显式禁用)' };
|
|
324
469
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
return { hasUpdate: false, info: null, updated: false, message: '跳过更新检查' };
|
|
470
|
+
if (!policy.enabled && !opts.force) {
|
|
471
|
+
return { hasUpdate: false, info: null, updated: false, message: '自动更新已关闭 (config.json autoUpdate=false,或设置 BOLLOON_AUTO_UPDATE=1 开启)' };
|
|
328
472
|
}
|
|
329
|
-
|
|
330
|
-
|
|
473
|
+
// 节流:除非显式触发或强制,否则距离上次检查不足间隔就跳过
|
|
474
|
+
if (!opts.force && !policy.allowFlag && !policy.allowEnv && !shouldCheckNow(policy.cfg)) {
|
|
475
|
+
return { hasUpdate: false, info: null, updated: false, message: '距上次检查不足间隔,跳过' };
|
|
331
476
|
}
|
|
332
|
-
|
|
477
|
+
notify(`\n${CYAN}🔍 检查更新...${RESET}`, RESET);
|
|
333
478
|
try {
|
|
334
|
-
// 检查 @bolloon 包的更新
|
|
335
479
|
const bolloonInfo = await checkBolloonUpdates();
|
|
336
480
|
if (bolloonInfo && bolloonInfo.outdated) {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
//
|
|
341
|
-
|
|
342
|
-
|
|
481
|
+
notify(`\n${YELLOW}⚠️ 发现新版本: ${bolloonInfo.latest}${RESET}\n`, RESET);
|
|
482
|
+
notify(` 当前版本: ${bolloonInfo.version}\n`, RESET);
|
|
483
|
+
notify(` 最新版本: ${bolloonInfo.latest}\n\n`, RESET);
|
|
484
|
+
// 避免对同一个版本反复自动安装失败:记录上次尝试
|
|
485
|
+
const cache = readCache();
|
|
486
|
+
const lastAttempt = cache.lastAttempt || {};
|
|
487
|
+
if (lastAttempt.version === bolloonInfo.latest && lastAttempt.ok === false && !opts.force) {
|
|
488
|
+
notify(`${YELLOW}💡 该版本上次自动更新失败,请手动运行: bolloon --update-now${RESET}\n\n`, RESET);
|
|
489
|
+
writeCache({ lastCheck: Date.now() });
|
|
490
|
+
return {
|
|
491
|
+
hasUpdate: true,
|
|
492
|
+
info: bolloonInfo,
|
|
493
|
+
updated: false,
|
|
494
|
+
message: `更新 ${bolloonInfo.latest} 上次失败,需手动更新`
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
// 自动更新(用户要求:检测到新版本包时自动更新)
|
|
343
498
|
const targetsWithVersion = bolloonInfo.packages.map(p => `${p.name}@${p.latest}`);
|
|
344
499
|
const result = await updatePackagesWithVersion(targetsWithVersion);
|
|
345
|
-
if (result.success) {
|
|
346
|
-
|
|
347
|
-
// 提示用户重启
|
|
348
|
-
log(`${YELLOW}💡 请重新运行 bolloon 以使用新版本${RESET}\n\n`, RESET);
|
|
500
|
+
if (result.success && result.updated) {
|
|
501
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: true } });
|
|
349
502
|
// 通知主进程更新完成
|
|
350
503
|
process.emit('bolloon-update-complete', result);
|
|
504
|
+
// 安装成功:按配置自动重启,或退回手动提示
|
|
505
|
+
if (opts.onUpdated && policy.cfg.autoRestart) {
|
|
506
|
+
notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest},即将自动重启以应用新版本...${RESET}\n\n`, RESET);
|
|
507
|
+
// 调用方执行模式相关的重启(Electron: app.relaunch(); Node: detached spawn)。
|
|
508
|
+
// 此调用预期会退出当前进程,不会返回。
|
|
509
|
+
opts.onUpdated();
|
|
510
|
+
// 兜底:若 onUpdated 意外返回,则手动退出
|
|
511
|
+
process.exit(0);
|
|
512
|
+
}
|
|
513
|
+
notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest}!请重新启动应用${RESET}\n`, RESET);
|
|
514
|
+
notify(`${YELLOW}💡 请重新运行 bolloon 以使用新版本${RESET}\n\n`, RESET);
|
|
351
515
|
return {
|
|
352
516
|
hasUpdate: true,
|
|
353
517
|
info: bolloonInfo,
|
|
@@ -355,7 +519,21 @@ export async function checkAndUpdate() {
|
|
|
355
519
|
message: `已更新到 ${bolloonInfo.latest}`
|
|
356
520
|
};
|
|
357
521
|
}
|
|
522
|
+
else if (result.success && !result.updated) {
|
|
523
|
+
// npm 判定已是最新(未真正升级),记录失败避免反复尝试
|
|
524
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
|
|
525
|
+
notify(` ${YELLOW}⚠ 已是最新(无需重启)${RESET}\n\n`, RESET);
|
|
526
|
+
return {
|
|
527
|
+
hasUpdate: true,
|
|
528
|
+
info: bolloonInfo,
|
|
529
|
+
updated: false,
|
|
530
|
+
message: '已是最新版本'
|
|
531
|
+
};
|
|
532
|
+
}
|
|
358
533
|
else {
|
|
534
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
|
|
535
|
+
notify(` ${YELLOW}⚠ 自动更新失败: ${result.error}${RESET}\n`, RESET);
|
|
536
|
+
notify(`${YELLOW}💡 可手动运行: bolloon --update-now${RESET}\n\n`, RESET);
|
|
359
537
|
return {
|
|
360
538
|
hasUpdate: true,
|
|
361
539
|
info: bolloonInfo,
|
|
@@ -365,7 +543,8 @@ export async function checkAndUpdate() {
|
|
|
365
543
|
}
|
|
366
544
|
}
|
|
367
545
|
else {
|
|
368
|
-
|
|
546
|
+
notify(` ${GREEN}✓${RESET} 已是最新版本 (${bolloonInfo?.version || 'unknown'})\n`, RESET);
|
|
547
|
+
writeCache({ lastAttempt: { version: '', ok: true } });
|
|
369
548
|
return {
|
|
370
549
|
hasUpdate: false,
|
|
371
550
|
info: bolloonInfo,
|
|
@@ -375,7 +554,7 @@ export async function checkAndUpdate() {
|
|
|
375
554
|
}
|
|
376
555
|
}
|
|
377
556
|
catch (e) {
|
|
378
|
-
|
|
557
|
+
notify(` ${YELLOW}⚠${RESET} 更新检查失败: ${e.message}\n`, RESET);
|
|
379
558
|
return {
|
|
380
559
|
hasUpdate: false,
|
|
381
560
|
info: null,
|
|
@@ -387,13 +566,13 @@ export async function checkAndUpdate() {
|
|
|
387
566
|
/**
|
|
388
567
|
* 仅检查更新,不自动安装
|
|
389
568
|
*/
|
|
390
|
-
|
|
569
|
+
async function checkForUpdates() {
|
|
391
570
|
return await checkBolloonUpdates();
|
|
392
571
|
}
|
|
393
572
|
/**
|
|
394
573
|
* 手动触发更新
|
|
395
574
|
*/
|
|
396
|
-
|
|
575
|
+
async function performUpdate(packages) {
|
|
397
576
|
return await updatePackages(packages);
|
|
398
577
|
}
|
|
399
578
|
// CLI 入口
|
|
@@ -416,3 +595,4 @@ if (process.argv[1]?.includes('auto-update')) {
|
|
|
416
595
|
}
|
|
417
596
|
})();
|
|
418
597
|
}
|
|
598
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/utils/auto-update.ts"],"names":[],"mappings":"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"}
|