(extensionPath: string)
| 55 | } |
| 56 | |
| 57 | async function readInstallMarker(extensionPath: string): Promise<InstallMarker> { |
| 58 | try { |
| 59 | const raw = await fsp.readFile(path.join(extensionPath, INSTALL_MARKER), 'utf8') |
| 60 | const parsed = JSON.parse(raw) as unknown |
| 61 | if (!isRecord(parsed)) return { version: null, installedAt: null } |
| 62 | return { |
| 63 | version: typeof parsed.version === 'string' ? parsed.version : null, |
| 64 | installedAt: typeof parsed.installedAt === 'string' ? parsed.installedAt : null |
| 65 | } |
| 66 | } catch { |
| 67 | return { version: null, installedAt: null } |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | async function localExtensionExists(extensionPath: string): Promise<boolean> { |
| 72 | try { |
no test coverage detected