Skip to content

Instantly share code, notes, and snippets.

@guillegette
Created April 15, 2026 10:21
Show Gist options
  • Select an option

  • Save guillegette/85960de57fcf26af47fc3029c8a35519 to your computer and use it in GitHub Desktop.

Select an option

Save guillegette/85960de57fcf26af47fc3029c8a35519 to your computer and use it in GitHub Desktop.
Resume schema
const { z } = require('zod');
const iso8601 = z
.string()
.regex(/^([1-2][0-9]{3}(-[0-1][0-9])?(-[0-3][0-9])?)$/)
.or(z.literal('TODAY'))
.or(z.literal(''))
.optional()
.catch('');
const locationSchema = z.object({
address: z.string().optional(),
postalCode: z.string().optional(),
city: z.string().optional(),
countryCode: z.string().optional(),
region: z.string().optional(),
});
const profileSchema = z.object({
type: z.string()
.transform(s => s.trim().toLowerCase()) // ensures lowercase normalization
.optional(),
url: z.string().min(1),
username: z.string().optional(),
label: z.string().optional(),
});
const basicsSchema = z.object({
name: z.string().optional(),
label: z.string().optional(),
image: z.string().optional(),
email: z.string().optional(),
phone: z.string().optional(),
summary: z.string().optional(),
location: locationSchema.optional(),
profiles: z.array(profileSchema).optional(),
});
const workSchema = z.object({
name: z.string().optional(),
position: z.string().optional(),
location: z.string().optional(),
description: z.string().optional(),
url: z.string().optional(),
startDate: iso8601,
endDate: iso8601,
});
const projectSchema = z.object({
name: z.string().optional(),
description: z.string().optional(),
keywords: z.array(z.string()).optional(),
role: z.string().optional(),
entity: z.string().optional(),
type: z.string().optional(),
startDate: iso8601,
endDate: iso8601,
url: z.string().optional(),
});
const educationSchema = z.object({
institution: z.string().optional(),
url: z.string().optional(),
area: z.string().optional(),
studyType: z.string().optional(),
location: z.string().optional(),
startDate: iso8601,
endDate: iso8601,
score: z.string().optional(),
courses: z.array(z.string()).optional(),
description: z.string().optional(),
});
const volunteerSchema = z.object({
organization: z.string().optional(),
position: z.string().optional(),
location: z.string().optional(),
url: z.string().optional(),
startDate: iso8601,
endDate: iso8601,
description: z.string().optional(),
});
const certificateSchema = z.object({
name: z.string().optional(),
issuer: z.string().optional(),
location: z.string().optional(),
url: z.string().optional(),
date: iso8601,
description: z.string().optional(),
});
const awardSchema = z.object({
title: z.string().optional(),
awarder: z.string().optional(),
location: z.string().optional(),
date: iso8601,
description: z.string().optional(),
});
const publicationSchema = z.object({
name: z.string().optional(),
publisher: z.string().optional(),
authors: z.array(z.string()).optional(),
releaseDate: iso8601,
url: z.string().optional(),
description: z.string().optional(),
});
const skillSchema = z.object({
name: z.string().optional(),
level: z.string().optional(),
keywords: z.array(z.string()).optional(),
});
const languageSchema = z.object({
language: z.string().optional(),
fluency: z.string().optional(),
});
const interestSchema = z.object({
name: z.string().optional(),
keywords: z.array(z.string()).optional(),
});
const resumeExtractionSchema = z.object({
basics: basicsSchema.optional(),
work: z.array(workSchema).optional(),
projects: z.array(projectSchema).optional(),
education: z.array(educationSchema).optional(),
volunteer: z.array(volunteerSchema).optional(),
certificates: z.array(certificateSchema).optional(),
awards: z.array(awardSchema).optional(),
publications: z.array(publicationSchema).optional(),
skills: z.array(skillSchema).optional(),
languages: z.array(languageSchema).optional(),
interests: z.array(interestSchema).optional(),
});
module.exports = resumeExtractionSchema;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment