Skip to content

Commit d02b059

Browse files
committed
chore: add upgrade step while processing resume
1 parent de02411 commit d02b059

File tree

3 files changed

+112
-20
lines changed

3 files changed

+112
-20
lines changed

index.js

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,111 @@ Handlebars.registerHelper('link', (body) => {
7575
return `<a href="${body}">${host}</a>`;
7676
});
7777

78+
/**
79+
* Many users still have JSON Resumes written against old versions of the spec.
80+
* We detect this and upgrade them to the latest version behind the scenes.
81+
*
82+
* Writes to the object directly.
83+
*
84+
* @param {any} resume
85+
* @returns {boolean}
86+
* If the JSON Resume was modified, so it was using outdated property names.
87+
*
88+
* @see https://github.com/jsonresume/resume-schema/releases/tag/v0.0.17
89+
* @see https://github.com/jsonresume/resume-schema/releases/tag/v0.0.12
90+
*/
91+
function upgradeOutdatedResume(resume) {
92+
let upgraded = false;
93+
94+
if (resume.bio && !resume.basics) {
95+
resume.basics = resume.bio;
96+
upgraded = true;
97+
}
98+
99+
if ((resume.basics?.firstName || resume.basics?.lastName) && !resume.basics.name) {
100+
const names = [];
101+
102+
if (resume.basics.firstName) {
103+
names.push(resume.basics.firstName);
104+
}
105+
106+
if (resume.basics.lastName) {
107+
names.push(resume.basics.lastName);
108+
}
109+
110+
resume.basics.name = names.join(' ');
111+
upgraded = true;
112+
}
113+
114+
if (resume.basics?.picture && !resume.basics.image) {
115+
resume.basics.image = resume.basics.picture;
116+
upgraded = true;
117+
}
118+
119+
if (resume.basics?.website && !resume.basics.url) {
120+
resume.basics.url = resume.basics.website;
121+
upgraded = true;
122+
}
123+
124+
if (resume.basics?.state && !resume.basics?.region) {
125+
resume.basics.region = resume.basics.state;
126+
upgraded = true;
127+
}
128+
129+
if (Array.isArray(resume.work)) {
130+
for (const work of resume.work) {
131+
if (work?.company && !work.name) {
132+
work.name = work.company;
133+
upgraded = true;
134+
}
135+
136+
if (work?.website && !work.url) {
137+
work.url = work.website;
138+
upgraded = true;
139+
}
140+
}
141+
}
142+
143+
if (Array.isArray(resume.volunteer)) {
144+
for (const volunteer of resume.volunteer) {
145+
if (volunteer?.website && !volunteer.url) {
146+
volunteer.url = volunteer.website;
147+
upgraded = true;
148+
}
149+
}
150+
}
151+
152+
if (Array.isArray(resume.publications)) {
153+
for (const publication of resume.publications) {
154+
if (publication?.website && !publication.url) {
155+
publication.url = publication.website;
156+
upgraded = true;
157+
}
158+
}
159+
}
160+
161+
if (resume.hobbies && !resume.interests) {
162+
resume.interests = resume.hobbies;
163+
upgraded = true;
164+
}
165+
166+
if (Array.isArray(resume.languages)) {
167+
for (const language of resume.languages) {
168+
if (language?.name && !language.language) {
169+
language.language = language.name;
170+
upgraded = true;
171+
}
172+
173+
if (language?.level && !language.fluency) {
174+
language.fluency = language.level;
175+
upgraded = true;
176+
}
177+
}
178+
}
179+
180+
return upgraded;
181+
}
182+
78183
/**
79184
* @param {any} resume
80185
* @returns {Promise<string>}
@@ -85,9 +190,12 @@ export async function render(resume) {
85190
fs.readFile(import.meta.dirname + '/resume.handlebars', 'utf-8'),
86191
]);
87192

88-
const { profiles } = resume.basics;
193+
if (upgradeOutdatedResume(resume)) {
194+
console.warn('⚠️ Resume is written against an outdated version of the JSON Resume schema.\n⚠️ This will still work, but you should consider updating your resume.\n⚠️ See: https://jsonresume.org/schema');
195+
}
89196

90-
if (Array.isArray(profiles)) {
197+
if (Array.isArray(resume.basics?.profiles)) {
198+
const { profiles } = resume.basics;
91199
const xTwitter = profiles.find((profile) => {
92200
const name = profile.network.toLowerCase();
93201
return name === 'x' || name === 'twitter';

resume.handlebars

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@
6565

6666
{{{link url}}}
6767
</div>
68-
{{else if website}}
69-
<div class="website">
70-
<strong>Website</strong>
71-
<a href="{{website}}">{{website}}</a>
72-
</div>
7368
{{/if}}
7469
{{#if email}}
7570
<div class="email">
@@ -129,10 +124,6 @@
129124
<h3 class="work_name">
130125
{{name}}
131126
</h3>
132-
{{else if company}}
133-
<h3 class="work_name">
134-
{{company}}
135-
</h3>
136127
{{/if}}
137128

138129
<div class="split">
@@ -152,10 +143,6 @@
152143
<div class="work_website">
153144
{{{link url}}}
154145
</div>
155-
{{else if website}}
156-
<div class="work_website">
157-
<a href="{{website}}">{{website}}</a>
158-
</div>
159146
{{/if}}
160147
</div>
161148

@@ -209,10 +196,6 @@
209196
<div class="work_website">
210197
{{{link url}}}
211198
</div>
212-
{{else if website}}
213-
<div class="work_website">
214-
<a href="{{website}}">{{website}}</a>
215-
</div>
216199
{{/if}}
217200
</div>
218201

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"checkJs": true,
1111
"strict": true,
1212
"resolveJsonModule": true,
13-
"skipLibCheck": true
13+
"skipLibCheck": true,
14+
"noImplicitAny": false
1415
},
1516
"exclude": [
1617
".yarn/",

0 commit comments

Comments
 (0)