-
-
Notifications
You must be signed in to change notification settings - Fork 131
Expand file tree
/
Copy pathversion-checker.ts
More file actions
84 lines (70 loc) · 2.54 KB
/
version-checker.ts
File metadata and controls
84 lines (70 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { readFileSync } from 'fs'
import { join, dirname } from 'path'
import { fileURLToPath } from 'url'
export const PACKAGE_NAME = '@tarquinen/opencode-dcp'
export const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
export function getLocalVersion(): string {
try {
const pkgPath = join(__dirname, '../../package.json')
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))
return pkg.version
} catch {
return '0.0.0'
}
}
export async function getNpmVersion(): Promise<string | null> {
try {
const controller = new AbortController()
const timeout = setTimeout(() => controller.abort(), 5000)
const res = await fetch(NPM_REGISTRY_URL, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
})
clearTimeout(timeout)
if (!res.ok) return null
const data = await res.json() as { version?: string }
return data.version ?? null
} catch {
return null
}
}
export function isOutdated(local: string, remote: string): boolean {
const parseVersion = (v: string) => v.split('.').map(n => parseInt(n, 10) || 0)
const [localParts, remoteParts] = [parseVersion(local), parseVersion(remote)]
for (let i = 0; i < Math.max(localParts.length, remoteParts.length); i++) {
const l = localParts[i] ?? 0
const r = remoteParts[i] ?? 0
if (r > l) return true
if (l > r) return false
}
return false
}
export async function checkForUpdates(client: any, logger?: { info: (component: string, message: string, data?: any) => void }, showToast: boolean = true): Promise<void> {
try {
const local = getLocalVersion()
const npm = await getNpmVersion()
if (!npm) {
logger?.info("version", "Version check skipped", { reason: "npm fetch failed" })
return
}
if (!isOutdated(local, npm)) {
logger?.info("version", "Up to date", { local, npm })
return
}
logger?.info("version", "Update available", { local, npm })
if (!showToast) {
return
}
await client.tui.showToast({
body: {
title: "DCP: Update available",
message: `v${local} → v${npm}\nUse ${PACKAGE_NAME}@latest to auto-update`,
variant: "info",
duration: 6000
}
})
} catch {
}
}