import type { PiWebCapability, PiWebComponentStatus, PiWebInstallationInfo, PiWebRuntimeComponent, PiWebVersionResponse } from "./apiTypes.js"; import { isPiWebCapability } from "./capabilities.js"; export function parsePiWebVersionResponse(value: unknown): PiWebVersionResponse | undefined { if (!isRecord(value)) return undefined; const packageName = value["packageName"]; const generatedAt = value["generatedAt"]; const components = value["components"]; if (typeof packageName !== "string" || packageName === "" || typeof generatedAt !== "string" || generatedAt === "" || !isRecord(components)) return undefined; const web = parsePiWebComponentStatus(components["web"]); const sessiond = parsePiWebComponentStatus(components["sessiond"]); if (web === undefined || sessiond === undefined) return undefined; return { packageName, generatedAt, components: { web, sessiond } }; } export function parsePiWebRuntimeComponent(value: unknown): PiWebRuntimeComponent | undefined { if (!isRecord(value)) return undefined; const component = value["component"]; const label = value["label"]; const runtimeVersion = value["runtimeVersion"]; const available = value["available"]; const capabilities = parsePiWebCapabilities(value["capabilities"]); const error = value["error"]; if (component !== "web" && component !== "sessiond") return undefined; if (typeof label !== "string" || label === "" || typeof available !== "boolean" || capabilities === undefined) return undefined; return { component, label, ...(typeof runtimeVersion === "string" ? { runtimeVersion } : {}), available, capabilities, ...(typeof error === "string" ? { error } : {}), }; } export function parsePiWebComponentStatus(value: unknown): PiWebComponentStatus | undefined { if (!isRecord(value)) return undefined; const component = value["component"]; const label = value["label"]; const runtimeVersion = value["runtimeVersion"]; const installedVersion = value["installedVersion"]; const stale = value["stale"]; const available = value["available"]; const error = value["error"]; const installation = parsePiWebInstallationInfo(value["installation"]); if (component !== "web" && component !== "sessiond") return undefined; if (typeof label !== "string" || label === "" || typeof stale !== "boolean" || typeof available !== "boolean") return undefined; return { component, label, ...(typeof runtimeVersion === "string" ? { runtimeVersion } : {}), ...(typeof installedVersion === "string" ? { installedVersion } : {}), stale, available, ...(installation === undefined ? {} : { installation }), ...(typeof error === "string" ? { error } : {}), }; } function parsePiWebCapabilities(value: unknown): PiWebCapability[] | undefined { if (!Array.isArray(value) || !value.every(isPiWebCapability)) return undefined; return value; } export function parsePiWebInstallationInfo(value: unknown): PiWebInstallationInfo | undefined { if (!isRecord(value)) return undefined; const kind = value["kind"]; const path = value["path"]; const source = value["source"]; const scope = value["scope"]; const npmRoot = value["npmRoot"]; const dockerMode = value["dockerMode"]; if (kind !== "pi-package" && kind !== "npm-global" && kind !== "local" && kind !== "docker" && kind !== "unknown") return undefined; return { kind, ...(typeof path === "string" ? { path } : {}), ...(typeof source === "string" ? { source } : {}), ...(scope === "user" || scope === "project" ? { scope } : {}), ...(typeof npmRoot === "string" ? { npmRoot } : {}), ...(dockerMode === "runtime" || dockerMode === "dev" ? { dockerMode } : {}), }; } function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); }