mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 06:45:22 +00:00
79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
import { normalize, type ViewDiff } from "./session-diff"
|
|
|
|
type Kind = "add" | "update" | "delete" | "move"
|
|
|
|
type Raw = {
|
|
filePath?: string
|
|
relativePath?: string
|
|
type?: Kind
|
|
patch?: string
|
|
diff?: string
|
|
before?: string
|
|
after?: string
|
|
additions?: number
|
|
deletions?: number
|
|
movePath?: string
|
|
}
|
|
|
|
export type ApplyPatchFile = {
|
|
filePath: string
|
|
relativePath: string
|
|
type: Kind
|
|
additions: number
|
|
deletions: number
|
|
movePath?: string
|
|
view: ViewDiff
|
|
}
|
|
|
|
function kind(value: unknown) {
|
|
if (value === "add" || value === "update" || value === "delete" || value === "move") return value
|
|
}
|
|
|
|
function status(type: Kind): "added" | "deleted" | "modified" {
|
|
if (type === "add") return "added"
|
|
if (type === "delete") return "deleted"
|
|
return "modified"
|
|
}
|
|
|
|
export function patchFile(raw: unknown): ApplyPatchFile | undefined {
|
|
if (!raw || typeof raw !== "object") return
|
|
|
|
const value = raw as Raw
|
|
const type = kind(value.type)
|
|
const filePath = typeof value.filePath === "string" ? value.filePath : undefined
|
|
const relativePath = typeof value.relativePath === "string" ? value.relativePath : filePath
|
|
const patch = typeof value.patch === "string" ? value.patch : typeof value.diff === "string" ? value.diff : undefined
|
|
const before = typeof value.before === "string" ? value.before : undefined
|
|
const after = typeof value.after === "string" ? value.after : undefined
|
|
|
|
if (!type || !filePath || !relativePath) return
|
|
if (!patch && before === undefined && after === undefined) return
|
|
|
|
const additions = typeof value.additions === "number" ? value.additions : 0
|
|
const deletions = typeof value.deletions === "number" ? value.deletions : 0
|
|
const movePath = typeof value.movePath === "string" ? value.movePath : undefined
|
|
|
|
return {
|
|
filePath,
|
|
relativePath,
|
|
type,
|
|
additions,
|
|
deletions,
|
|
movePath,
|
|
view: normalize({
|
|
file: relativePath,
|
|
patch,
|
|
before,
|
|
after,
|
|
additions,
|
|
deletions,
|
|
status: status(type),
|
|
}),
|
|
}
|
|
}
|
|
|
|
export function patchFiles(raw: unknown) {
|
|
if (!Array.isArray(raw)) return []
|
|
return raw.map(patchFile).filter((file): file is ApplyPatchFile => !!file)
|
|
}
|