@@ -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' ;
0 commit comments