import type { z } from "zod"; import { array, literal, number, object, optional, string, union } from "zod"; export { commitHeaderSchema, diffSchema, commitSchema, commitsSchema }; export type { Commits, HunkLine, Commit, DiffFile, Diff, DiffCopiedChangeset, DiffMovedChangeset, CommitHeader, DiffAddedChangeset, DiffDeletedChangeset, DiffModifiedChangeset, DiffContent, }; 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, ]); 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"), ]), }); type DiffAddedChangeset = z.infer; const diffAddedChangesetSchema = object({ path: string(), diff: diffContentSchema, new: diffFileSchema, }); type DiffDeletedChangeset = z.infer; const diffDeletedChangesetSchema = object({ path: string(), diff: diffContentSchema, old: diffFileSchema, }); type DiffModifiedChangeset = z.infer; const diffModifiedChangesetSchema = object({ path: string(), diff: diffContentSchema, new: diffFileSchema, old: diffFileSchema, }); type DiffCopiedChangeset = z.infer; const diffCopiedChangesetSchema = object({ newPath: string(), oldPath: string(), }); type DiffMovedChangeset = z.infer; 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(), }), });