@auxiora/updater 1.10.0

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.
Files changed (66) hide show
  1. package/LICENSE +191 -0
  2. package/dist/detector.d.ts +10 -0
  3. package/dist/detector.d.ts.map +1 -0
  4. package/dist/detector.js +106 -0
  5. package/dist/detector.js.map +1 -0
  6. package/dist/health-checker.d.ts +15 -0
  7. package/dist/health-checker.d.ts.map +1 -0
  8. package/dist/health-checker.js +41 -0
  9. package/dist/health-checker.js.map +1 -0
  10. package/dist/index.d.ts +20 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +19 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/strategies/apt.d.ts +10 -0
  15. package/dist/strategies/apt.d.ts.map +1 -0
  16. package/dist/strategies/apt.js +46 -0
  17. package/dist/strategies/apt.js.map +1 -0
  18. package/dist/strategies/brew.d.ts +10 -0
  19. package/dist/strategies/brew.d.ts.map +1 -0
  20. package/dist/strategies/brew.js +43 -0
  21. package/dist/strategies/brew.js.map +1 -0
  22. package/dist/strategies/docker.d.ts +10 -0
  23. package/dist/strategies/docker.d.ts.map +1 -0
  24. package/dist/strategies/docker.js +75 -0
  25. package/dist/strategies/docker.js.map +1 -0
  26. package/dist/strategies/git.d.ts +10 -0
  27. package/dist/strategies/git.d.ts.map +1 -0
  28. package/dist/strategies/git.js +59 -0
  29. package/dist/strategies/git.js.map +1 -0
  30. package/dist/strategies/index.d.ts +10 -0
  31. package/dist/strategies/index.d.ts.map +1 -0
  32. package/dist/strategies/index.js +31 -0
  33. package/dist/strategies/index.js.map +1 -0
  34. package/dist/strategies/k8s.d.ts +10 -0
  35. package/dist/strategies/k8s.d.ts.map +1 -0
  36. package/dist/strategies/k8s.js +53 -0
  37. package/dist/strategies/k8s.js.map +1 -0
  38. package/dist/strategies/npm.d.ts +10 -0
  39. package/dist/strategies/npm.d.ts.map +1 -0
  40. package/dist/strategies/npm.js +50 -0
  41. package/dist/strategies/npm.js.map +1 -0
  42. package/dist/strategies/tarball.d.ts +11 -0
  43. package/dist/strategies/tarball.d.ts.map +1 -0
  44. package/dist/strategies/tarball.js +72 -0
  45. package/dist/strategies/tarball.js.map +1 -0
  46. package/dist/types.d.ts +61 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +8 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/updater.d.ts +28 -0
  51. package/dist/updater.d.ts.map +1 -0
  52. package/dist/updater.js +225 -0
  53. package/dist/updater.js.map +1 -0
  54. package/dist/util/download.d.ts +2 -0
  55. package/dist/util/download.d.ts.map +1 -0
  56. package/dist/util/download.js +20 -0
  57. package/dist/util/download.js.map +1 -0
  58. package/dist/util/exec.d.ts +17 -0
  59. package/dist/util/exec.d.ts.map +1 -0
  60. package/dist/util/exec.js +32 -0
  61. package/dist/util/exec.js.map +1 -0
  62. package/dist/version-checker.d.ts +12 -0
  63. package/dist/version-checker.d.ts.map +1 -0
  64. package/dist/version-checker.js +108 -0
  65. package/dist/version-checker.js.map +1 -0
  66. package/package.json +31 -0
@@ -0,0 +1,225 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { getLogger } from '@auxiora/logger';
4
+ const logger = getLogger('updater:orchestrator');
5
+ export class Updater {
6
+ detector;
7
+ versionChecker;
8
+ healthChecker;
9
+ strategies;
10
+ constructor(options) {
11
+ this.detector = options.detector;
12
+ this.versionChecker = options.versionChecker;
13
+ this.healthChecker = options.healthChecker;
14
+ this.strategies = options.strategies;
15
+ }
16
+ async update(channel = 'stable') {
17
+ const start = Date.now();
18
+ const info = this.detector.detect();
19
+ if (!info.canSelfUpdate) {
20
+ return {
21
+ success: false,
22
+ previousVersion: info.currentVersion,
23
+ newVersion: info.currentVersion,
24
+ method: info.method,
25
+ rolledBack: false,
26
+ error: `Cannot self-update from installation method: ${info.method}`,
27
+ durationMs: Date.now() - start,
28
+ };
29
+ }
30
+ const strategy = this.strategies.get(info.method);
31
+ if (!strategy) {
32
+ return {
33
+ success: false,
34
+ previousVersion: info.currentVersion,
35
+ newVersion: info.currentVersion,
36
+ method: info.method,
37
+ rolledBack: false,
38
+ error: `No update strategy for method: ${info.method}`,
39
+ durationMs: Date.now() - start,
40
+ };
41
+ }
42
+ const checkResult = await this.versionChecker.check(info.currentVersion, channel);
43
+ if (!checkResult.available) {
44
+ return {
45
+ success: false,
46
+ previousVersion: info.currentVersion,
47
+ newVersion: info.currentVersion,
48
+ method: info.method,
49
+ rolledBack: false,
50
+ error: 'Already up to date',
51
+ durationMs: Date.now() - start,
52
+ };
53
+ }
54
+ let staged;
55
+ try {
56
+ logger.info('Staging update', { from: info.currentVersion, to: checkResult.latestVersion });
57
+ staged = await strategy.stage(checkResult, info);
58
+ }
59
+ catch (error) {
60
+ return {
61
+ success: false,
62
+ previousVersion: info.currentVersion,
63
+ newVersion: checkResult.latestVersion,
64
+ method: info.method,
65
+ rolledBack: false,
66
+ error: `Stage failed: ${error instanceof Error ? error.message : String(error)}`,
67
+ durationMs: Date.now() - start,
68
+ };
69
+ }
70
+ // Persist staged update for crash recovery
71
+ this.persistStagedUpdate(staged);
72
+ try {
73
+ logger.info('Applying update', { version: staged.targetVersion });
74
+ await strategy.apply(staged);
75
+ logger.info('Restarting', { method: info.method });
76
+ await strategy.restart(info);
77
+ logger.info('Running health check');
78
+ const health = await this.healthChecker.waitForHealthy(staged.targetVersion);
79
+ if (health.healthy) {
80
+ await strategy.cleanup(staged);
81
+ this.removeStagedUpdate();
82
+ logger.info('Update successful', { version: staged.targetVersion });
83
+ return {
84
+ success: true,
85
+ previousVersion: staged.previousVersion,
86
+ newVersion: staged.targetVersion,
87
+ method: info.method,
88
+ rolledBack: false,
89
+ durationMs: Date.now() - start,
90
+ };
91
+ }
92
+ // Health check failed — rollback
93
+ logger.error('Health check failed, rolling back', { error: new Error(health.reason ?? 'Unknown') });
94
+ await strategy.rollback(staged);
95
+ await strategy.restart(info);
96
+ this.removeStagedUpdate();
97
+ return {
98
+ success: false,
99
+ previousVersion: staged.previousVersion,
100
+ newVersion: staged.targetVersion,
101
+ method: info.method,
102
+ rolledBack: true,
103
+ error: health.reason ?? 'Health check failed after update',
104
+ durationMs: Date.now() - start,
105
+ };
106
+ }
107
+ catch (error) {
108
+ // Apply/restart failed — attempt rollback
109
+ logger.error('Update failed, attempting rollback', {
110
+ error: error instanceof Error ? error : new Error(String(error)),
111
+ });
112
+ try {
113
+ await strategy.rollback(staged);
114
+ await strategy.restart(info);
115
+ }
116
+ catch (rollbackError) {
117
+ logger.error('Rollback also failed', {
118
+ error: rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError)),
119
+ });
120
+ }
121
+ this.removeStagedUpdate();
122
+ return {
123
+ success: false,
124
+ previousVersion: staged.previousVersion,
125
+ newVersion: staged.targetVersion,
126
+ method: info.method,
127
+ rolledBack: true,
128
+ error: `Update failed: ${error instanceof Error ? error.message : String(error)}`,
129
+ durationMs: Date.now() - start,
130
+ };
131
+ }
132
+ }
133
+ /** Recover from a previously incomplete update (crash recovery). */
134
+ async recoverIfNeeded() {
135
+ const staged = this.loadStagedUpdate();
136
+ if (!staged)
137
+ return null;
138
+ logger.info('Found incomplete update, rolling back', { version: staged.targetVersion });
139
+ const strategy = this.strategies.get(staged.method);
140
+ if (!strategy) {
141
+ this.removeStagedUpdate();
142
+ return null;
143
+ }
144
+ const info = this.detector.detect();
145
+ try {
146
+ await strategy.rollback(staged);
147
+ await strategy.restart(info);
148
+ }
149
+ catch (error) {
150
+ logger.error('Recovery rollback failed', {
151
+ error: error instanceof Error ? error : new Error(String(error)),
152
+ });
153
+ }
154
+ this.removeStagedUpdate();
155
+ return {
156
+ success: false,
157
+ previousVersion: staged.previousVersion,
158
+ newVersion: staged.targetVersion,
159
+ method: staged.method,
160
+ rolledBack: true,
161
+ error: 'Recovered from incomplete update',
162
+ durationMs: 0,
163
+ };
164
+ }
165
+ /** Manual rollback command. */
166
+ async rollback() {
167
+ const staged = this.loadStagedUpdate();
168
+ if (!staged) {
169
+ throw new Error('No staged update found to rollback');
170
+ }
171
+ const strategy = this.strategies.get(staged.method);
172
+ if (!strategy) {
173
+ throw new Error(`No strategy for method: ${staged.method}`);
174
+ }
175
+ const info = this.detector.detect();
176
+ await strategy.rollback(staged);
177
+ await strategy.restart(info);
178
+ this.removeStagedUpdate();
179
+ logger.info('Manual rollback complete');
180
+ }
181
+ getDataDir() {
182
+ const xdg = process.env.XDG_DATA_HOME;
183
+ if (xdg)
184
+ return path.join(xdg, 'auxiora');
185
+ const home = process.env.HOME ?? '/tmp';
186
+ return path.join(home, '.local', 'share', 'auxiora');
187
+ }
188
+ getStagedUpdatePath() {
189
+ return path.join(this.getDataDir(), 'last-update.json');
190
+ }
191
+ persistStagedUpdate(staged) {
192
+ const filePath = this.getStagedUpdatePath();
193
+ const dir = path.dirname(filePath);
194
+ if (!fs.existsSync(dir)) {
195
+ fs.mkdirSync(dir, { recursive: true });
196
+ }
197
+ fs.writeFileSync(filePath, JSON.stringify(staged, null, 2));
198
+ logger.debug('Persisted staged update', { path: filePath });
199
+ }
200
+ loadStagedUpdate() {
201
+ const filePath = this.getStagedUpdatePath();
202
+ try {
203
+ if (!fs.existsSync(filePath))
204
+ return null;
205
+ const data = fs.readFileSync(filePath, 'utf-8');
206
+ return JSON.parse(data);
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ removeStagedUpdate() {
213
+ const filePath = this.getStagedUpdatePath();
214
+ try {
215
+ if (fs.existsSync(filePath)) {
216
+ fs.unlinkSync(filePath);
217
+ logger.debug('Removed staged update file');
218
+ }
219
+ }
220
+ catch {
221
+ // Ignore
222
+ }
223
+ }
224
+ }
225
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function downloadFile(url: string, destPath: string): Promise<string>;
2
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/util/download.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBjF"}
@@ -0,0 +1,20 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { getLogger } from '@auxiora/logger';
4
+ const logger = getLogger('updater:download');
5
+ export async function downloadFile(url, destPath) {
6
+ logger.info('Downloading', { url, destPath });
7
+ const dir = path.dirname(destPath);
8
+ if (!fs.existsSync(dir)) {
9
+ fs.mkdirSync(dir, { recursive: true });
10
+ }
11
+ const response = await fetch(url);
12
+ if (!response.ok) {
13
+ throw new Error(`Download failed: HTTP ${response.status} from ${url}`);
14
+ }
15
+ const buffer = Buffer.from(await response.arrayBuffer());
16
+ fs.writeFileSync(destPath, buffer);
17
+ logger.info('Download complete', { destPath, bytes: buffer.length });
18
+ return destPath;
19
+ }
20
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/util/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAgB;IAC9D,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface ExecResult {
2
+ status: 'ok' | 'error';
3
+ stdout: string;
4
+ stderr: string;
5
+ exitCode: number | null;
6
+ }
7
+ export interface ExecOptions {
8
+ timeoutMs?: number;
9
+ cwd?: string;
10
+ env?: NodeJS.ProcessEnv;
11
+ }
12
+ /**
13
+ * Safe subprocess execution using execFile (no shell, no injection).
14
+ * Never throws — returns a result object with status.
15
+ */
16
+ export declare function safeExecFile(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
17
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/util/exec.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
@@ -0,0 +1,32 @@
1
+ import { execFile } from 'node:child_process';
2
+ /**
3
+ * Safe subprocess execution using execFile (no shell, no injection).
4
+ * Never throws — returns a result object with status.
5
+ */
6
+ export function safeExecFile(command, args, options) {
7
+ return new Promise((resolve) => {
8
+ execFile(command, args, {
9
+ timeout: options?.timeoutMs ?? 120_000,
10
+ cwd: options?.cwd,
11
+ env: options?.env ?? process.env,
12
+ maxBuffer: 10 * 1024 * 1024,
13
+ }, (error, stdout, stderr) => {
14
+ if (error) {
15
+ resolve({
16
+ status: 'error',
17
+ stdout: stdout ?? '',
18
+ stderr: stderr || error.message,
19
+ exitCode: error.code != null ? (typeof error.code === 'number' ? error.code : 1) : 1,
20
+ });
21
+ return;
22
+ }
23
+ resolve({
24
+ status: 'ok',
25
+ stdout: stdout ?? '',
26
+ stderr: stderr ?? '',
27
+ exitCode: 0,
28
+ });
29
+ });
30
+ });
31
+ }
32
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/util/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAe9C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,IAAc,EACd,OAAqB;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,OAAO,EACP,IAAI,EACJ;YACE,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,OAAO;YACtC,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;YAChC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC;oBACN,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,MAAM,IAAI,EAAE;oBACpB,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO;oBAC/B,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACrF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,OAAO,CAAC;gBACN,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,MAAM,IAAI,EAAE;gBACpB,MAAM,EAAE,MAAM,IAAI,EAAE;gBACpB,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { UpdateChannel, UpdateCheckResult } from './types.js';
2
+ export declare class VersionChecker {
3
+ private readonly owner;
4
+ private readonly repo;
5
+ private cache;
6
+ constructor(owner: string, repo: string);
7
+ check(currentVersion: string, channel: UpdateChannel): Promise<UpdateCheckResult>;
8
+ private fetchReleases;
9
+ private filterByChannel;
10
+ private isNewer;
11
+ }
12
+ //# sourceMappingURL=version-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-checker.d.ts","sourceRoot":"","sources":["../src/version-checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBnE,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,KAAK,CAAiE;gBAG3D,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM;IAGzB,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAmDzE,aAAa;IAmB3B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,OAAO;CAqBhB"}
@@ -0,0 +1,108 @@
1
+ import { getLogger } from '@auxiora/logger';
2
+ const logger = getLogger('updater:version-checker');
3
+ const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
4
+ export class VersionChecker {
5
+ owner;
6
+ repo;
7
+ cache = null;
8
+ constructor(owner, repo) {
9
+ this.owner = owner;
10
+ this.repo = repo;
11
+ }
12
+ async check(currentVersion, channel) {
13
+ const empty = {
14
+ available: false,
15
+ currentVersion,
16
+ latestVersion: currentVersion,
17
+ channel,
18
+ releaseUrl: '',
19
+ releaseNotes: '',
20
+ publishedAt: 0,
21
+ assets: [],
22
+ };
23
+ try {
24
+ const releases = await this.fetchReleases();
25
+ const candidates = this.filterByChannel(releases, channel);
26
+ if (candidates.length === 0)
27
+ return empty;
28
+ candidates.sort((a, b) => new Date(b.published_at).getTime() - new Date(a.published_at).getTime());
29
+ const latest = candidates[0];
30
+ const latestVersion = latest.tag_name.replace(/^v/, '');
31
+ if (!this.isNewer(currentVersion, latestVersion)) {
32
+ return empty;
33
+ }
34
+ return {
35
+ available: true,
36
+ currentVersion,
37
+ latestVersion,
38
+ channel,
39
+ releaseUrl: latest.html_url,
40
+ releaseNotes: latest.body ?? '',
41
+ publishedAt: new Date(latest.published_at).getTime(),
42
+ assets: latest.assets.map(a => ({
43
+ name: a.name,
44
+ url: a.browser_download_url,
45
+ size: a.size,
46
+ contentType: a.content_type,
47
+ })),
48
+ };
49
+ }
50
+ catch (error) {
51
+ logger.error('Failed to check for updates', {
52
+ error: error instanceof Error ? error : new Error(String(error)),
53
+ });
54
+ return empty;
55
+ }
56
+ }
57
+ async fetchReleases() {
58
+ if (this.cache && Date.now() - this.cache.fetchedAt < CACHE_TTL_MS) {
59
+ return this.cache.releases;
60
+ }
61
+ const url = `https://api.github.com/repos/${this.owner}/${this.repo}/releases?per_page=20`;
62
+ const response = await fetch(url, {
63
+ headers: { Accept: 'application/vnd.github+json' },
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`GitHub API returned ${response.status}`);
67
+ }
68
+ const releases = (await response.json());
69
+ this.cache = { releases, fetchedAt: Date.now() };
70
+ return releases;
71
+ }
72
+ filterByChannel(releases, channel) {
73
+ switch (channel) {
74
+ case 'stable':
75
+ return releases.filter(r => !r.prerelease && !r.tag_name.includes('-'));
76
+ case 'beta':
77
+ return releases;
78
+ case 'nightly':
79
+ return releases.filter(r => r.tag_name.includes('nightly') || r.prerelease);
80
+ default:
81
+ return releases.filter(r => !r.prerelease);
82
+ }
83
+ }
84
+ isNewer(currentVer, candidateVer) {
85
+ const parse = (v) => {
86
+ const clean = v.replace(/^v/, '');
87
+ const [main, pre] = clean.split('-', 2);
88
+ const parts = main.split('.').map(Number);
89
+ return { major: parts[0] ?? 0, minor: parts[1] ?? 0, patch: parts[2] ?? 0, pre };
90
+ };
91
+ const cur = parse(currentVer);
92
+ const can = parse(candidateVer);
93
+ if (can.major !== cur.major)
94
+ return can.major > cur.major;
95
+ if (can.minor !== cur.minor)
96
+ return can.minor > cur.minor;
97
+ if (can.patch !== cur.patch)
98
+ return can.patch > cur.patch;
99
+ if (cur.pre && !can.pre)
100
+ return true;
101
+ if (!cur.pre && can.pre)
102
+ return false;
103
+ if (cur.pre && can.pre)
104
+ return can.pre > cur.pre;
105
+ return false;
106
+ }
107
+ }
108
+ //# sourceMappingURL=version-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-checker.js","sourceRoot":"","sources":["../src/version-checker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@auxiora/updater",
3
+ "version": "1.10.0",
4
+ "description": "Self-update system with installation detection, version checking, and strategy-based updates",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@auxiora/logger": "1.10.0"
16
+ },
17
+ "engines": {
18
+ "node": ">=22.0.0"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "files": [
24
+ "dist/"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "clean": "rm -rf dist",
29
+ "typecheck": "tsc --noEmit"
30
+ }
31
+ }