fix(parser): make reactive-resume v3 parser more lenient with validation

This commit is contained in:
Amruth Pillai
2023-11-23 22:34:21 +01:00
parent 6e53a0f7a3
commit d36fc1b31d
3 changed files with 256 additions and 177 deletions

View File

@ -59,13 +59,15 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
const result = JSON.parse(JSON.stringify(defaultResumeData)) as ResumeData;
// Basics
result.basics.name = data.basics.name;
result.basics.name = data.basics.name ?? "";
result.basics.email = data.basics.email;
result.basics.phone = data.basics.phone;
result.basics.headline = data.basics.headline;
result.basics.location = data.basics.location.address;
result.sections.summary.content = data.basics.summary;
result.basics.picture.url = isUrl(data.basics.photo.url) ? data.basics.photo.url : "";
result.basics.phone = data.basics.phone ?? "";
result.basics.headline = data.basics.headline ?? "";
result.basics.location = data.basics.location.address ?? "";
result.sections.summary.content =
(typeof data.basics.summary === "string" ? data.basics.summary : data.basics.summary?.body) ??
"";
result.basics.picture.url = isUrl(data.basics.photo.url) ? data.basics.photo.url! : "";
// Profiles
if (data.basics.profiles) {
@ -73,10 +75,10 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
result.sections.profiles.items.push({
...defaultProfile,
id: createId(),
network: profile.network,
username: profile.username,
icon: profile.network.toLocaleLowerCase(),
url: { ...defaultProfile.url, href: isUrl(profile.url) ? profile.url : "" },
network: profile.network ?? "",
username: profile.username ?? "",
icon: (profile.network ?? "").toLocaleLowerCase(),
url: { ...defaultProfile.url, href: isUrl(profile.url) ? profile.url! : "" },
});
}
}
@ -84,14 +86,16 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Work
if (data.sections.work.items) {
for (const work of data.sections.work.items) {
if (!work) continue;
result.sections.experience.items.push({
...defaultExperience,
id: createId(),
company: work.name,
position: work.position,
summary: work.summary,
date: `${work.date.start} - ${work.date.end}`,
url: { ...defaultExperience.url, href: isUrl(work.url) ? work.url : "" },
company: work.name ?? "",
position: work.position ?? "",
summary: work.summary ?? "",
date: `${work.date?.start} - ${work.date?.end}`,
url: { ...defaultExperience.url, href: isUrl(work.url) ? work.url! : "" },
});
}
}
@ -99,14 +103,16 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Awards
if (data.sections.awards.items) {
for (const award of data.sections.awards.items) {
if (!award) continue;
result.sections.awards.items.push({
...defaultAward,
id: createId(),
title: award.title,
awarder: award.awarder,
date: award.date,
summary: award.summary,
url: { ...defaultAward.url, href: isUrl(award.url) ? award.url : "" },
title: award.title ?? "",
awarder: award.awarder ?? "",
date: award.date ?? "",
summary: award.summary ?? "",
url: { ...defaultAward.url, href: isUrl(award.url) ? award.url! : "" },
});
}
}
@ -114,13 +120,17 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Skills
if (data.sections.skills.items) {
for (const skill of data.sections.skills.items) {
if (!skill) continue;
result.sections.skills.items.push({
...defaultSkill,
id: createId(),
name: skill.name,
name: skill.name ?? "",
level: Math.floor(skill.levelNum / 2),
description: skill.level,
keywords: skill.keywords,
description: skill.level ?? "",
keywords: Array.isArray(skill.keywords)
? (skill.keywords.filter(Boolean) as string[])
: [],
});
}
}
@ -128,15 +138,19 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Projects
if (data.sections.projects.items) {
for (const project of data.sections.projects.items) {
if (!project) continue;
result.sections.projects.items.push({
...defaultProject,
id: createId(),
name: project.name,
summary: project.summary,
description: project.description,
date: `${project.date.start} - ${project.date.end}`,
keywords: project.keywords,
url: { ...defaultProject.url, href: isUrl(project.url) ? project.url : "" },
name: project.name ?? "",
summary: project.summary ?? "",
description: project.description ?? "",
date: `${project.date?.start} - ${project.date?.end}`,
keywords: Array.isArray(project.keywords)
? (project.keywords.filter(Boolean) as string[])
: [],
url: { ...defaultProject.url, href: isUrl(project.url) ? project.url! : "" },
});
}
}
@ -144,16 +158,18 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Education
if (data.sections.education.items) {
for (const education of data.sections.education.items) {
if (!education) continue;
result.sections.education.items.push({
...defaultEducation,
id: createId(),
institution: education.institution,
studyType: education.degree,
area: education.area,
score: education.score,
summary: education.summary,
date: `${education.date.start} - ${education.date.end}`,
url: { ...defaultEducation.url, href: isUrl(education.url) ? education.url : "" },
institution: education.institution ?? "",
studyType: education.degree ?? "",
area: education.area ?? "",
score: education.score ?? "",
summary: education.summary ?? "",
date: `${education.date?.start} - ${education.date?.end}`,
url: { ...defaultEducation.url, href: isUrl(education.url) ? education.url! : "" },
});
}
}
@ -161,11 +177,15 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Interests
if (data.sections.interests.items) {
for (const interest of data.sections.interests.items) {
if (!interest) continue;
result.sections.interests.items.push({
...defaultInterest,
id: createId(),
name: interest.name,
keywords: interest.keywords,
name: interest.name ?? "",
keywords: Array.isArray(interest.keywords)
? (interest.keywords.filter(Boolean) as string[])
: [],
});
}
}
@ -173,11 +193,13 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Languages
if (data.sections.languages.items) {
for (const language of data.sections.languages.items) {
if (!language) continue;
result.sections.languages.items.push({
...defaultLanguage,
id: createId(),
name: language.name,
description: language.level,
name: language.name ?? "",
description: language.level ?? "",
level: Math.floor(language.levelNum / 2),
});
}
@ -186,14 +208,16 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Volunteer
if (data.sections.volunteer.items) {
for (const volunteer of data.sections.volunteer.items) {
if (!volunteer) continue;
result.sections.volunteer.items.push({
...defaultVolunteer,
id: createId(),
organization: volunteer.organization,
position: volunteer.position,
summary: volunteer.summary,
date: `${volunteer.date.start} - ${volunteer.date.end}`,
url: { ...defaultVolunteer.url, href: isUrl(volunteer.url) ? volunteer.url : "" },
organization: volunteer.organization ?? "",
position: volunteer.position ?? "",
summary: volunteer.summary ?? "",
date: `${volunteer.date?.start} - ${volunteer.date?.end}`,
url: { ...defaultVolunteer.url, href: isUrl(volunteer.url) ? volunteer.url! : "" },
});
}
}
@ -201,12 +225,14 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// References
if (data.sections.references.items) {
for (const reference of data.sections.references.items) {
if (!reference) continue;
result.sections.references.items.push({
...defaultReference,
id: createId(),
name: reference.name,
summary: reference.summary,
description: reference.relationship,
name: reference.name ?? "",
summary: reference.summary ?? "",
description: reference.relationship ?? "",
});
}
}
@ -214,13 +240,15 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Publications
if (data.sections.publications.items) {
for (const publication of data.sections.publications.items) {
if (!publication) continue;
result.sections.publications.items.push({
...defaultPublication,
id: createId(),
name: publication.name,
summary: publication.summary,
date: publication.date,
url: { ...defaultPublication.url, href: isUrl(publication.url) ? publication.url : "" },
name: publication.name ?? "",
summary: publication.summary ?? "",
date: publication.date ?? "",
url: { ...defaultPublication.url, href: isUrl(publication.url) ? publication.url! : "" },
});
}
}
@ -228,16 +256,18 @@ export class ReactiveResumeV3Parser implements Parser<Json, ReactiveResumeV3> {
// Certifications
if (data.sections.certifications.items) {
for (const certification of data.sections.certifications.items) {
if (!certification) continue;
result.sections.certifications.items.push({
...defaultCertification,
id: createId(),
name: certification.name,
issuer: certification.issuer,
summary: certification.summary,
date: certification.date,
name: certification.name ?? "",
issuer: certification.issuer ?? "",
summary: certification.summary ?? "",
date: certification.date ?? "",
url: {
...defaultCertification.url,
href: isUrl(certification.url) ? certification.url : "",
href: isUrl(certification.url) ? certification.url! : "",
},
});
}