import type { z } from "zod"; export type { Commits, HunkLine, Hunks, Commit, Diff, CommitHeader, DiffFile, DiffContent, }; import { array, literal, number, object, optional, string, union } from "zod"; export { commitHeaderSchema, diffSchema, commitSchema, commitsSchema }; const gitPersonSchema = object({ name: string(), email: string(), }); type CommitHeader = z.infer; const commitHeaderSchema = object({ id: string(), author: gitPersonSchema, summary: string(), description: string(), parents: array(string()), committer: gitPersonSchema.merge(object({ time: number() })), }); type AdditionHunkLine = z.infer; const additionHunkLineSchema = object({ line: string(), lineNo: number(), type: literal("addition"), }); type DeletionHunkLine = z.infer; const deletionHunkLineSchema = object({ line: string(), lineNo: number(), type: literal("deletion"), }); type DiffFile = z.infer; const diffFileSchema = object({ oid: string(), mode: union([ literal("blob"), literal("blobExecutable"), literal("tree"), literal("link"), literal("commit"), ]), }); type ContextHunkLine = z.infer; const contextHunkLineSchema = object({ line: string(), lineNoNew: number(), lineNoOld: number(), type: literal("context"), }); type HunkLine = AdditionHunkLine | DeletionHunkLine | ContextHunkLine; const hunkLineSchema = union([ additionHunkLineSchema, deletionHunkLineSchema, contextHunkLineSchema, ]); type Hunks = z.infer; const changesetHunkSchema = object({ header: string(), lines: array(hunkLineSchema), }); type DiffContent = z.infer; const diffContentSchema = object({ type: union([literal("plain"), literal("binary"), literal("empty")]), hunks: array(changesetHunkSchema), eof: union([ literal("noneMissing"), literal("oldMissing"), literal("newMissing"), literal("bothMissing"), ]), }); const diffChangesetSchema = object({ path: string(), diff: diffContentSchema, }); const diffAddedChangesetSchema = diffChangesetSchema.merge( object({ new: diffFileSchema }), ); const diffDeletedChangesetSchema = diffChangesetSchema.merge( object({ old: diffFileSchema }), ); const diffModifiedChangesetSchema = diffChangesetSchema.merge( object({ new: diffFileSchema, old: diffFileSchema }), ); const diffCopiedChangesetSchema = object({ newPath: string(), oldPath: string(), }); const diffMovedChangesetSchema = diffCopiedChangesetSchema.merge( object({ old: optional(diffFileSchema), new: optional(diffFileSchema), diff: optional(diffContentSchema), }), ); type Diff = z.infer; const diffSchema = object({ added: array(diffAddedChangesetSchema), deleted: array(diffDeletedChangesetSchema), modified: array(diffModifiedChangesetSchema), moved: array(diffMovedChangesetSchema), copied: array(diffCopiedChangesetSchema), stats: object({ filesChanged: number(), insertions: number(), deletions: number(), }), }); type Commit = z.infer; const commitSchema = object({ commit: commitHeaderSchema, diff: diffSchema, branches: array(string()), }); type Commits = z.infer; const commitsSchema = object({ commits: array(commitSchema), stats: object({ commits: number(), branches: number(), contributors: number(), }), });