resume-extraction/lib/resume.ts (87 lines of code) (raw):
import { z } from 'zod'
// Schema used to extract values in a structured way
export const ResumeSchema = z.object({
name: z.string().optional(),
title: z.string().optional(),
location: z.string().optional(),
contactInfo: z.object({
email: z.string().optional(),
website: z.string().optional(),
linkedin: z.string().optional(),
twitter: z.string().optional(),
github: z.string().optional()
}),
workExperience: z
.array(
z.object({
startYear: z.string().optional(),
endYear: z.string().optional(),
title: z.string().optional(),
company: z.string().optional(),
location: z.string().optional(),
description: z.string().optional()
}),
{
description:
'Work experience, ordered from the most recent to the oldest.'
}
)
.optional(),
education: z
.array(
z.object({
startYear: z.string().optional(),
endYear: z.string().optional(),
degree: z.string().optional(),
institution: z.string().optional(),
location: z.string().optional(),
description: z.string().optional()
}),
{
description: 'Education, ordered from the most recent to the oldest.'
}
)
.optional(),
skills: z
.array(
z.object({
name: z.string().optional()
})
)
.optional()
})
export interface ExperienceItem {
title?: string
company?: string
startYear?: string
endYear?: string
location?: string
description?: string
}
export interface EducationItem {
institution?: string
degree?: string
startYear?: string
endYear?: string
location?: string
description?: string
}
export interface Skill {
name: string
level?: string
}
export interface ContactInfo {
email?: string
phone?: string
website?: string
linkedin?: string
twitter?: string
}
export interface ResumeValues {
name?: string
title?: string
location?: string
contactInfo?: ContactInfo
workExperience?: ExperienceItem[]
education?: EducationItem[]
skills?: Skill[]
}