lot of bugfixes, better migration script

This commit is contained in:
Amruth Pillai
2026-01-23 01:07:52 +01:00
parent a10954ed14
commit 35e2daa807
95 changed files with 3661 additions and 3645 deletions
+3
View File
@@ -584,6 +584,9 @@ export class JSONResumeImporter {
id: generateId(),
hidden: false,
name: ref.name || "",
position: "",
website: { url: "", label: "" },
phone: "",
description: ref.reference ? `<p>${ref.reference}</p>` : "",
})),
};
@@ -1,3 +1,5 @@
/** biome-ignore-all lint/style/noNonNullAssertion: only used in places where we know the value is not null */
import z, { flattenError, ZodError } from "zod";
import { type ResumeData, resumeDataSchema } from "@/schema/resume/data";
import { type Template, templateSchema } from "@/schema/templates";
@@ -122,7 +124,6 @@ type V4ResumeData = {
items: Array<{
id: string;
visible: boolean;
name?: string;
title?: string;
awarder?: string;
date?: string;
@@ -433,16 +434,16 @@ export class ReactiveResumeV4JSONImporter {
},
sections: {
profiles: {
title: (v4Data.sections.profiles?.name ?? "").trim() || "Profiles",
title: v4Data.sections.profiles?.name ?? "",
columns: v4Data.sections.profiles?.columns ?? 1,
hidden: !(v4Data.sections.profiles?.visible ?? true),
items: (v4Data.sections.profiles?.items ?? [])
.filter((item) => item.network && item.network.trim().length > 0)
.filter((item) => item.network && item.network.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
icon: item.icon ?? "",
network: item.network?.trim() || "Other",
network: item.network!,
username: item.username ?? "",
website: {
url: item.url?.href ?? "",
@@ -451,15 +452,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
experience: {
title: (v4Data.sections.experience?.name ?? "").trim() || "Experience",
title: v4Data.sections.experience?.name ?? "",
columns: v4Data.sections.experience?.columns ?? 1,
hidden: !(v4Data.sections.experience?.visible ?? true),
items: (v4Data.sections.experience?.items ?? [])
.filter((item) => item.company && item.company.trim().length > 0)
.filter((item) => item.company && item.company.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
company: item.company?.trim() || "Company",
company: item.company!,
position: item.position ?? "",
location: item.location ?? "",
period: item.date ?? "",
@@ -471,15 +472,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
education: {
title: (v4Data.sections.education?.name ?? "").trim() || "Education",
title: v4Data.sections.education?.name ?? "",
columns: v4Data.sections.education?.columns ?? 1,
hidden: !(v4Data.sections.education?.visible ?? true),
items: (v4Data.sections.education?.items ?? [])
.filter((item) => item.institution && item.institution.trim().length > 0)
.filter((item) => item.institution && item.institution.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
school: item.institution?.trim() || "School",
school: item.institution!,
degree: item.studyType ?? "",
area: item.area ?? "",
grade: item.score ?? "",
@@ -493,15 +494,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
projects: {
title: (v4Data.sections.projects?.name ?? "").trim() || "Projects",
title: v4Data.sections.projects?.name ?? "",
columns: v4Data.sections.projects?.columns ?? 1,
hidden: !(v4Data.sections.projects?.visible ?? true),
items: (v4Data.sections.projects?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
name: item.name?.trim() || "Project",
name: item.name!,
period: item.date ?? "",
website: {
url: item.url?.href ?? "",
@@ -511,59 +512,59 @@ export class ReactiveResumeV4JSONImporter {
})),
},
skills: {
title: (v4Data.sections.skills?.name ?? "").trim() || "Skills",
title: v4Data.sections.skills?.name ?? "",
columns: v4Data.sections.skills?.columns ?? 1,
hidden: !(v4Data.sections.skills?.visible ?? true),
items: (v4Data.sections.skills?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
icon: "",
name: item.name?.trim() || "Skill",
name: item.name!,
proficiency: item.description ?? "",
level: clampLevel(item.level ?? 0),
keywords: item.keywords ?? [],
})),
},
languages: {
title: (v4Data.sections.languages?.name ?? "").trim() || "Languages",
title: v4Data.sections.languages?.name ?? "",
columns: v4Data.sections.languages?.columns ?? 1,
hidden: !(v4Data.sections.languages?.visible ?? true),
items: (v4Data.sections.languages?.items ?? [])
.filter((item) => item.language && item.language.trim().length > 0)
.filter((item) => item.language && item.language.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
language: item.language?.trim() || "Language",
language: item.language!,
fluency: item.fluency ?? "",
level: clampLevel(item.level ?? 0),
})),
},
interests: {
title: (v4Data.sections.interests?.name ?? "").trim() || "Interests",
title: v4Data.sections.interests?.name ?? "",
columns: v4Data.sections.interests?.columns ?? 1,
hidden: !(v4Data.sections.interests?.visible ?? true),
items: (v4Data.sections.interests?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
icon: "",
name: item.name?.trim() || "Interest",
name: item.name!,
keywords: item.keywords ?? [],
})),
},
awards: {
title: (v4Data.sections.awards?.name ?? "").trim() || "Awards",
title: v4Data.sections.awards?.name ?? "",
columns: v4Data.sections.awards?.columns ?? 1,
hidden: !(v4Data.sections.awards?.visible ?? true),
items: (v4Data.sections.awards?.items ?? [])
.filter((item) => (item.title || item.name) && (item.title?.trim() || item.name?.trim() || "").length > 0)
.filter((item) => item.title && item.title.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
title: (item.title || item.name)?.trim() || "Award",
title: item.title!,
awarder: item.awarder ?? "",
date: item.date ?? "",
website: {
@@ -574,15 +575,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
certifications: {
title: (v4Data.sections.certifications?.name ?? "").trim() || "Certifications",
title: v4Data.sections.certifications?.name ?? "",
columns: v4Data.sections.certifications?.columns ?? 1,
hidden: !(v4Data.sections.certifications?.visible ?? true),
items: (v4Data.sections.certifications?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
title: item.name?.trim() || "Certification",
title: item.name!,
issuer: item.issuer ?? "",
date: item.date ?? "",
website: {
@@ -593,15 +594,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
publications: {
title: (v4Data.sections.publications?.name ?? "").trim() || "Publications",
title: v4Data.sections.publications?.name ?? "",
columns: v4Data.sections.publications?.columns ?? 1,
hidden: !(v4Data.sections.publications?.visible ?? true),
items: (v4Data.sections.publications?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
title: item.name?.trim() || "Publication",
title: item.name!,
publisher: item.publisher ?? "",
date: item.date ?? "",
website: {
@@ -612,15 +613,15 @@ export class ReactiveResumeV4JSONImporter {
})),
},
volunteer: {
title: (v4Data.sections.volunteer?.name ?? "").trim() || "Volunteering",
title: v4Data.sections.volunteer?.name ?? "",
columns: v4Data.sections.volunteer?.columns ?? 1,
hidden: !(v4Data.sections.volunteer?.visible ?? true),
items: (v4Data.sections.volunteer?.items ?? [])
.filter((item) => item.organization && item.organization.trim().length > 0)
.filter((item) => item.organization && item.organization.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
organization: item.organization?.trim() || "Organization",
organization: item.organization!,
location: item.location ?? "",
period: item.date ?? "",
website: {
@@ -631,16 +632,22 @@ export class ReactiveResumeV4JSONImporter {
})),
},
references: {
title: (v4Data.sections.references?.name ?? "").trim() || "References",
title: v4Data.sections.references?.name ?? "",
columns: v4Data.sections.references?.columns ?? 1,
hidden: !(v4Data.sections.references?.visible ?? true),
items: (v4Data.sections.references?.items ?? [])
.filter((item) => item.name && item.name.trim().length > 0)
.filter((item) => item.name && item.name.length > 0)
.map((item) => ({
id: item.id ?? generateId(),
hidden: !(item.visible ?? true),
name: item.name?.trim() || "Reference",
description: item.summary ?? item.description ?? "",
name: item.name!,
position: item.description ?? "",
phone: "",
website: {
url: item.url?.href ?? "",
label: item.url?.label ?? "",
},
description: item.summary ?? "",
})),
},
},
@@ -652,10 +659,10 @@ export class ReactiveResumeV4JSONImporter {
hidden: !(section.visible ?? true),
items: section.items
.filter((item) => item.visible !== false)
.map((item) => ({
.map((item, index) => ({
id: item.id || generateId(),
hidden: !item.visible,
company: item.name?.trim() || "",
company: item.name?.trim() || `#${index + 1}`,
position: item.description ?? "",
location: item.location ?? "",
period: item.date ?? "",