diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 67a4370..5cfb1a2 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -7,10 +7,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: Setup Node.js
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v3
with:
node-version: 16
@@ -27,4 +27,4 @@ jobs:
run: npm run build
- name: Coverage
- uses: codecov/codecov-action@v2
+ uses: codecov/codecov-action@v3
diff --git a/components/awards.js b/components/awards.js
new file mode 100644
index 0000000..f33c29f
--- /dev/null
+++ b/components/awards.js
@@ -0,0 +1,29 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Date from './date.js'
+
+export default function Awards(awards = []) {
+ return awards.length > 0 && html`
+
+ Awards
+
+ ${awards.map(({ awarder, date, summary, title }) => html`
+
+
+ ${summary && markdown(summary)}
+
+ `)}
+
+
+ `
+}
diff --git a/components/certificates.js b/components/certificates.js
new file mode 100644
index 0000000..807c7c4
--- /dev/null
+++ b/components/certificates.js
@@ -0,0 +1,28 @@
+import html from '../utils/html.js'
+import Date from './date.js'
+import Link from './link.js'
+
+export default function Certificates(certificates = []) {
+ return certificates.length > 0 && html`
+
+ Certificates
+
+ ${certificates.map(({ date, issuer, name, url }) => html`
+
+
+
+ `)}
+
+
+ `
+}
diff --git a/components/date.js b/components/date.js
new file mode 100644
index 0000000..96fc898
--- /dev/null
+++ b/components/date.js
@@ -0,0 +1,12 @@
+import html from '../utils/html.js'
+
+const formatDate = dateString =>
+ new Date(dateString).toLocaleDateString('en', {
+ month: 'short',
+ year: 'numeric',
+ timeZone: 'UTC',
+ })
+
+export default function Duration(date) {
+ return html`${formatDate(date)} `
+}
diff --git a/components/duration.js b/components/duration.js
new file mode 100644
index 0000000..abc53be
--- /dev/null
+++ b/components/duration.js
@@ -0,0 +1,6 @@
+import html from '../utils/html.js'
+import Date from './date.js'
+
+export default function Duration(startDate, endDate) {
+ return html`${Date(startDate)} – ${endDate ? Date(endDate) : 'Present'}`
+}
diff --git a/components/education.js b/components/education.js
new file mode 100644
index 0000000..aabf903
--- /dev/null
+++ b/components/education.js
@@ -0,0 +1,32 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Duration from './duration.js'
+import Link from './link.js'
+
+export default function Education(education = []) {
+ return education.length > 0 && html`
+
+ Education
+
+ ${education.map(({ area, courses = [], institution, startDate, endDate, studyType, url }) => html`
+
+
+ ${studyType && markdown(studyType)}
+ ${courses.length > 0 && html`
+ Courses
+
+ ${courses.map(course => html`${markdown(course)} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/header.js b/components/header.js
new file mode 100644
index 0000000..8ca7f5a
--- /dev/null
+++ b/components/header.js
@@ -0,0 +1,56 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Icon from './icon.js'
+import Link from './link.js'
+
+const formatCountry = countryCode => Intl.DisplayNames
+ ? new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode)
+ : countryCode
+
+export default function Header(basics = {}) {
+ const { email, image, label, location, name, phone, profiles = [], summary, url } = basics
+
+ return html`
+
+ `
+}
diff --git a/components/icon.js b/components/icon.js
new file mode 100644
index 0000000..15b6bd5
--- /dev/null
+++ b/components/icon.js
@@ -0,0 +1,6 @@
+import { icons } from 'feather-icons'
+
+export default function Icon(name, fallback) {
+ const ico = icons[name.toLowerCase()] || icons[fallback.toLowerCase()]
+ return ico.toSvg({ width: 16, height: 16 })
+}
diff --git a/components/interests.js b/components/interests.js
new file mode 100644
index 0000000..2d61ff5
--- /dev/null
+++ b/components/interests.js
@@ -0,0 +1,21 @@
+import html from '../utils/html.js'
+
+export default function Interests(interests = []) {
+ return interests.length > 0 && html`
+
+ Interests
+
+ ${interests.map(({ keywords = [], name }) => html`
+
+ ${name && html`
${name} `}
+ ${keywords.length > 0 && html`
+
+ ${keywords.map(keyword => html`${keyword} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/languages.js b/components/languages.js
new file mode 100644
index 0000000..71f820d
--- /dev/null
+++ b/components/languages.js
@@ -0,0 +1,17 @@
+import html from '../utils/html.js'
+
+export default function Languages(languages = []) {
+ return languages.length > 0 && html`
+
+ Languages
+
+ ${languages.map(({ fluency, language }) => html`
+
+ ${language && html`
${language} `}
+ ${fluency}
+
+ `)}
+
+
+ `
+}
diff --git a/components/link.js b/components/link.js
new file mode 100644
index 0000000..ae96d81
--- /dev/null
+++ b/components/link.js
@@ -0,0 +1,9 @@
+import html from '../utils/html.js'
+
+const formatURL = url => url.replace(/^(https?:|)\/\//, '').replace(/\/$/, '')
+
+export default function Link(url, name) {
+ return name
+ ? (url ? html`${name} ` : name)
+ : url && html`${formatURL(url)} `
+}
diff --git a/components/meta.js b/components/meta.js
new file mode 100644
index 0000000..4a35278
--- /dev/null
+++ b/components/meta.js
@@ -0,0 +1,11 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+
+export default function Meta(basics = {}) {
+ const { name, summary } = basics
+
+ return html`
+ ${name && html`
${name} `}
+ ${summary && html` `}
+ `
+}
diff --git a/components/projects.js b/components/projects.js
new file mode 100644
index 0000000..058abf2
--- /dev/null
+++ b/components/projects.js
@@ -0,0 +1,38 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Duration from './duration.js'
+import Link from './link.js'
+
+const formatRoles = arr => Intl.ListFormat
+ ? new Intl.ListFormat('en').format(arr)
+ : arr.join(', ')
+
+export default function Projects(projects = []) {
+ return projects.length > 0 && html`
+
+ Projects
+
+ ${projects.map(({ description, entity, highlights = [], name, startDate, endDate, roles = [], url }) => html`
+
+
+ ${description && markdown(description)}
+ ${highlights.length > 0 && html`
+
+ ${highlights.map(highlight => html`${markdown(highlight)} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/publications.js b/components/publications.js
new file mode 100644
index 0000000..f6d6c16
--- /dev/null
+++ b/components/publications.js
@@ -0,0 +1,30 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Date from './date.js'
+import Link from './link.js'
+
+export default function Publications(publications = []) {
+ return publications.length > 0 && html`
+
+ Publications
+
+ ${publications.map(({ name, publisher, releaseDate, summary, url }) => html`
+
+
+ ${summary && markdown(summary)}
+
+ `)}
+
+
+ `
+}
diff --git a/components/references.js b/components/references.js
new file mode 100644
index 0000000..09af338
--- /dev/null
+++ b/components/references.js
@@ -0,0 +1,22 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+
+export default function References(references = []) {
+ return references.length > 0 && html`
+
+ References
+
+ ${references.map(({ name, reference }) => html`
+
+ ${reference && markdown(reference)}
+ ${name && html`
+
+ ${name}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/skills.js b/components/skills.js
new file mode 100644
index 0000000..f4b8a0f
--- /dev/null
+++ b/components/skills.js
@@ -0,0 +1,21 @@
+import html from '../utils/html.js'
+
+export default function Skills(skills = []) {
+ return skills.length > 0 && html`
+
+ Skills
+
+ ${skills.map(({ keywords = [], name }) => html`
+
+ ${name && html`
${name} `}
+ ${keywords.length > 0 && html`
+
+ ${keywords.map(keyword => html`${keyword} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/volunteer.js b/components/volunteer.js
new file mode 100644
index 0000000..e08bb2d
--- /dev/null
+++ b/components/volunteer.js
@@ -0,0 +1,31 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Duration from './duration.js'
+import Link from './link.js'
+
+export default function Volunteer(volunteer = []) {
+ return volunteer.length > 0 && html`
+
+ Volunteer
+
+ ${volunteer.map(({ highlights = [], organization, position, startDate, endDate, summary, url }) => html`
+
+
+ ${summary && markdown(summary)}
+ ${highlights.length > 0 && html`
+
+ ${highlights.map(highlight => html`${markdown(highlight)} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/components/work.js b/components/work.js
new file mode 100644
index 0000000..f3fcc9c
--- /dev/null
+++ b/components/work.js
@@ -0,0 +1,35 @@
+import html from '../utils/html.js'
+import markdown from '../utils/markdown.js'
+import Duration from './duration.js'
+import Link from './link.js'
+
+export default function Work(work = []) {
+ return work.length > 0 && html`
+
+ Work
+
+ ${work.map(({ description, highlights = [], location, name, position, startDate, endDate, summary, url }) => html`
+
+
+ ${summary && markdown(summary)}
+ ${highlights.length > 0 && html`
+
+ ${highlights.map(highlight => html`${markdown(highlight)} `)}
+
+ `}
+
+ `)}
+
+
+ `
+}
diff --git a/index.js b/index.js
index e9ead99..216a1eb 100644
--- a/index.js
+++ b/index.js
@@ -1,70 +1,17 @@
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
-import { icons } from 'feather-icons'
-import Handlebars from 'handlebars'
-import micromark from 'micromark'
-import striptags from 'striptags'
-const dirname =
- typeof __dirname === 'string'
- ? __dirname
- : path.dirname(fileURLToPath(import.meta.url))
-const extname = '.hbs'
-const partialsDir = path.join(dirname, 'partials')
+import Resume from './resume.js'
-fs.readdirSync(partialsDir)
- .filter(filename => path.extname(filename) === extname)
- .map(filename => [
- filename,
- fs.readFileSync(path.join(partialsDir, filename), 'utf8'),
- ])
- .forEach(([filename, template]) =>
- Handlebars.registerPartial(path.basename(filename, extname), template),
- )
-
-Handlebars.registerHelper('formatCountry', countryCode =>
- Intl.DisplayNames
- ? new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode)
- : countryCode,
-)
-
-Handlebars.registerHelper('formatDate', dateString =>
- new Date(dateString).toLocaleDateString('en', {
- month: 'short',
- year: 'numeric',
- timeZone: 'UTC',
- }),
-)
-
-Handlebars.registerHelper('formatPhone', phone =>
- phone.replace(/[^\d|+]+/g, ''),
-)
-
-Handlebars.registerHelper('formatURL', url =>
- url.replace(/^(https?:|)\/\//, '').replace(/\/$/, ''),
-)
-
-Handlebars.registerHelper('icon', (name, fallback) =>
- (icons[name.toLowerCase()] || icons[fallback.toLowerCase()]).toSvg({
- width: 16,
- height: 16,
- }),
-)
-
-Handlebars.registerHelper('join', arr =>
- Intl.ListFormat ? new Intl.ListFormat('en').format(arr) : arr.join(', '),
-)
-
-Handlebars.registerHelper('markdown', doc => micromark(doc))
-
-Handlebars.registerHelper('stripTags', html => striptags(html))
+const dirname = typeof __dirname === 'string'
+ ? __dirname
+ : path.dirname(fileURLToPath(import.meta.url))
export const pdfRenderOptions = { mediaType: 'print' }
export const render = resume => {
- const template = fs.readFileSync(path.resolve(dirname, 'resume.hbs'), 'utf-8')
const css = fs.readFileSync(path.resolve(dirname, 'style.css'), 'utf-8')
- return Handlebars.compile(template)({ css, resume })
+ return Resume(resume, css)
}
diff --git a/package-lock.json b/package-lock.json
index 4822b00..92c3b0b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,6 @@
"license": "MIT",
"dependencies": {
"feather-icons": "^4.28.0",
- "handlebars": "^4.7.0",
"micromark": "^2.11.0",
"striptags": "^3.2.0"
},
@@ -55,9 +54,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.20.10",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
- "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+ "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -103,9 +102,9 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
- "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+ "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.20.7",
@@ -471,13 +470,13 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
- "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+ "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.20.7",
- "@babel/traverse": "^7.20.7",
+ "@babel/traverse": "^7.20.13",
"@babel/types": "^7.20.7"
},
"engines": {
@@ -570,9 +569,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
- "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
+ "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -1141,9 +1140,9 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.20.11",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz",
- "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==",
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz",
+ "integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.20.2"
@@ -1503,9 +1502,9 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz",
- "integrity": "sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz",
+ "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.18.6",
@@ -1858,9 +1857,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.13.11"
@@ -1884,9 +1883,9 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.20.12",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz",
- "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==",
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+ "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
@@ -1895,7 +1894,7 @@
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.20.7",
+ "@babel/parser": "^7.20.13",
"@babel/types": "^7.20.7",
"debug": "^4.1.0",
"globals": "^11.1.0"
@@ -2429,9 +2428,9 @@
}
},
"node_modules/acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -2929,9 +2928,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001442",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz",
- "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==",
+ "version": "1.0.30001449",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz",
+ "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==",
"dev": true,
"funding": [
{
@@ -3184,9 +3183,9 @@
"dev": true
},
"node_modules/core-js": {
- "version": "3.27.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz",
- "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==",
+ "version": "3.27.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz",
+ "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -3194,9 +3193,9 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.27.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz",
- "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==",
+ "version": "3.27.2",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+ "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4"
@@ -3439,9 +3438,9 @@
"dev": true
},
"node_modules/deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+ "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -3621,13 +3620,14 @@
}
},
"node_modules/es-abstract": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz",
- "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==",
+ "version": "1.21.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+ "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
"dev": true,
"dependencies": {
+ "available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.0",
+ "es-set-tostringtag": "^2.0.1",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"function.prototype.name": "^1.1.5",
@@ -3640,7 +3640,7 @@
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.4",
- "is-array-buffer": "^3.0.0",
+ "is-array-buffer": "^3.0.1",
"is-callable": "^1.2.7",
"is-negative-zero": "^2.0.2",
"is-regex": "^1.1.4",
@@ -4031,9 +4031,9 @@
}
},
"node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4283,9 +4283,9 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
@@ -4334,9 +4334,9 @@
}
},
"node_modules/glob": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
- "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -4374,9 +4374,9 @@
}
},
"node_modules/glob/node_modules/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4386,9 +4386,9 @@
}
},
"node_modules/globals": {
- "version": "13.19.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
- "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@@ -4472,26 +4472,6 @@
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
- "node_modules/handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
- "dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
- },
- "engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
- }
- },
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -5391,9 +5371,9 @@
}
},
"node_modules/js-sdsl": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
- "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -5567,9 +5547,9 @@
}
},
"node_modules/listr2": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz",
- "integrity": "sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.7.tgz",
+ "integrity": "sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==",
"dev": true,
"dependencies": {
"cli-truncate": "^2.1.0",
@@ -5577,7 +5557,7 @@
"log-update": "^4.0.0",
"p-map": "^4.0.0",
"rfdc": "^1.3.0",
- "rxjs": "^7.5.7",
+ "rxjs": "^7.8.0",
"through": "^2.3.8",
"wrap-ansi": "^7.0.0"
},
@@ -6072,6 +6052,7 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6138,11 +6119,6 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- },
"node_modules/node-preload": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
@@ -6487,9 +6463,9 @@
}
},
"node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7549,9 +7525,9 @@
}
},
"node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"dev": true,
"engines": {
"node": ">=6"
@@ -8368,6 +8344,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -10824,9 +10801,9 @@
"dev": true
},
"node_modules/tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"dev": true
},
"node_modules/type-check": {
@@ -10889,18 +10866,6 @@
"node": ">=4.2.0"
}
},
- "node_modules/uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
- "optional": true,
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/unbox-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@@ -11113,11 +11078,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
- },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
diff --git a/package.json b/package.json
index 67cde6a..69117ce 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,7 @@
],
"scripts": {
"build": "microbundle build --target node",
- "postbuild": "cp -r resume.hbs partials style.css dist",
+ "postbuild": "cp -r style.css dist",
"prebuild:demo": "npm run build",
"build:demo": "mkdir -p public && cat node_modules/resume-schema/sample.resume.json | ./bin/cli.js > public/index.html",
"format": "prettier --ignore-path .gitignore .",
@@ -49,7 +49,6 @@
},
"dependencies": {
"feather-icons": "^4.28.0",
- "handlebars": "^4.7.0",
"micromark": "^2.11.0",
"striptags": "^3.2.0"
},
diff --git a/partials/awards.hbs b/partials/awards.hbs
deleted file mode 100644
index 25b7b93..0000000
--- a/partials/awards.hbs
+++ /dev/null
@@ -1,27 +0,0 @@
-{{#if resume.awards.length}}
-
- Awards
-
- {{#each resume.awards}}
-
-
- {{#summary}}
- {{{markdown .}}}
- {{/summary}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/certificates.hbs b/partials/certificates.hbs
deleted file mode 100644
index 17c6acf..0000000
--- a/partials/certificates.hbs
+++ /dev/null
@@ -1,24 +0,0 @@
-{{#if resume.certificates.length}}
-
- Certificates
-
- {{#each resume.certificates}}
-
-
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/education.hbs b/partials/education.hbs
deleted file mode 100644
index 08d1c1d..0000000
--- a/partials/education.hbs
+++ /dev/null
@@ -1,34 +0,0 @@
-{{#if resume.education.length}}
-
- Education
-
- {{#each resume.education}}
-
-
- {{#studyType}}
- {{{markdown .}}}
- {{/studyType}}
- {{#if courses.length}}
- Courses
-
- {{#courses}}
- {{{markdown .}}}
- {{/courses}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/header.hbs b/partials/header.hbs
deleted file mode 100644
index 2dd74ce..0000000
--- a/partials/header.hbs
+++ /dev/null
@@ -1,65 +0,0 @@
-
diff --git a/partials/interests.hbs b/partials/interests.hbs
deleted file mode 100644
index 8db3d21..0000000
--- a/partials/interests.hbs
+++ /dev/null
@@ -1,21 +0,0 @@
-{{#if resume.interests.length}}
-
- Interests
-
- {{#each resume.interests}}
-
- {{#name}}
-
{{.}}
- {{/name}}
- {{#if keywords.length}}
-
- {{#keywords}}
- {{.}}
- {{/keywords}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/languages.hbs b/partials/languages.hbs
deleted file mode 100644
index a2ad553..0000000
--- a/partials/languages.hbs
+++ /dev/null
@@ -1,15 +0,0 @@
-{{#if resume.languages.length}}
-
- Languages
-
- {{#each resume.languages}}
-
- {{#language}}
-
{{.}}
- {{/language}}
- {{fluency}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/link.hbs b/partials/link.hbs
deleted file mode 100644
index b373510..0000000
--- a/partials/link.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{#if name}}{{#if url}}{{name}} {{else}}{{name}}{{/if}}{{else}}{{#url}}{{formatURL .}} {{/url}}{{/if}}
\ No newline at end of file
diff --git a/partials/meta.hbs b/partials/meta.hbs
deleted file mode 100644
index 7c82935..0000000
--- a/partials/meta.hbs
+++ /dev/null
@@ -1,2 +0,0 @@
-{{#name}}{{.}} {{/name}}
-{{#summary}} {{/summary}}
diff --git a/partials/projects.hbs b/partials/projects.hbs
deleted file mode 100644
index fc92e0a..0000000
--- a/partials/projects.hbs
+++ /dev/null
@@ -1,38 +0,0 @@
-{{#if resume.projects.length}}
-
- Projects
-
- {{#each resume.projects}}
-
-
- {{#description}}
- {{{markdown .}}}
- {{/description}}
- {{#if highlights.length}}
-
- {{#highlights}}
- {{{markdown .}}}
- {{/highlights}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/publications.hbs b/partials/publications.hbs
deleted file mode 100644
index 83f3458..0000000
--- a/partials/publications.hbs
+++ /dev/null
@@ -1,27 +0,0 @@
-{{#if resume.publications.length}}
-
- Publications
-
- {{#each resume.publications}}
-
-
- {{#summary}}
- {{{markdown .}}}
- {{/summary}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/references.hbs b/partials/references.hbs
deleted file mode 100644
index 11c968f..0000000
--- a/partials/references.hbs
+++ /dev/null
@@ -1,19 +0,0 @@
-{{#if resume.references.length}}
-
- References
-
- {{#each resume.references}}
- {{#if reference}}
-
- {{{markdown reference}}}
- {{#name}}
-
- {{.}}
-
- {{/name}}
-
- {{/if}}
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/skills.hbs b/partials/skills.hbs
deleted file mode 100644
index dbc1f6e..0000000
--- a/partials/skills.hbs
+++ /dev/null
@@ -1,21 +0,0 @@
-{{#if resume.skills.length}}
-
- Skills
-
- {{#each resume.skills}}
-
- {{#name}}
-
{{.}}
- {{/name}}
- {{#if keywords.length}}
-
- {{#keywords}}
- {{.}}
- {{/keywords}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/volunteer.hbs b/partials/volunteer.hbs
deleted file mode 100644
index afd05a6..0000000
--- a/partials/volunteer.hbs
+++ /dev/null
@@ -1,31 +0,0 @@
-{{#if resume.volunteer.length}}
-
- Volunteer
-
- {{#each resume.volunteer}}
-
-
- {{#summary}}
- {{{markdown .}}}
- {{/summary}}
- {{#if highlights.length}}
-
- {{#highlights}}
- {{{markdown .}}}
- {{/highlights}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/partials/work.hbs b/partials/work.hbs
deleted file mode 100644
index f1ab4cd..0000000
--- a/partials/work.hbs
+++ /dev/null
@@ -1,39 +0,0 @@
-{{#if resume.work.length}}
-
- Work
-
- {{#each resume.work}}
-
-
- {{#summary}}
- {{{markdown .}}}
- {{/summary}}
- {{#if highlights.length}}
-
- {{#highlights}}
- {{{markdown .}}}
- {{/highlights}}
-
- {{/if}}
-
- {{/each}}
-
-
-{{/if}}
diff --git a/resume.hbs b/resume.hbs
deleted file mode 100644
index ad31a85..0000000
--- a/resume.hbs
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- {{#resume.basics}}
- {{> meta}}
- {{/resume.basics}}
-
-
-
-
-
- {{#resume.basics}}
- {{> header}}
- {{/resume.basics}}
-
- {{> work}}
- {{> volunteer}}
- {{> education}}
- {{> projects}}
- {{> awards}}
- {{> certificates}}
- {{> publications}}
- {{> skills}}
- {{> languages}}
- {{> interests}}
- {{> references}}
-
-
diff --git a/resume.js b/resume.js
new file mode 100644
index 0000000..2515b99
--- /dev/null
+++ b/resume.js
@@ -0,0 +1,41 @@
+import Awards from './components/awards.js'
+import Certificates from './components/certificates.js'
+import Education from './components/education.js'
+import Header from './components/header.js'
+import Interests from './components/interests.js'
+import Languages from './components/languages.js'
+import Meta from './components/meta.js'
+import Projects from './components/projects.js'
+import Publications from './components/publications.js'
+import References from './components/references.js'
+import Skills from './components/skills.js'
+import Volunteer from './components/volunteer.js'
+import Work from './components/work.js'
+import html from './utils/html.js'
+
+export default function Resume(resume, css) {
+ return html`
+
+
+
+ ${Meta(resume.basics)}
+
+
+
+
+
+ ${Header(resume.basics)}
+ ${Work(resume.work)}
+ ${Volunteer(resume.volunteer)}
+ ${Education(resume.education)}
+ ${Projects(resume.projects)}
+ ${Awards(resume.awards)}
+ ${Certificates(resume.certificates)}
+ ${Publications(resume.publications)}
+ ${Skills(resume.skills)}
+ ${Languages(resume.languages)}
+ ${Interests(resume.interests)}
+ ${References(resume.references)}
+
+ `
+}
diff --git a/tap-snapshots/test/render.js.test.cjs b/tap-snapshots/test/render.js.test.cjs
index 768b047..473e867 100644
--- a/tap-snapshots/test/render.js.test.cjs
+++ b/tap-snapshots/test/render.js.test.cjs
@@ -7,14 +7,16 @@
'use strict'
exports[`test/render.js TAP renders a resume > must match snapshot 1`] = `
-
-
-
- Richard Hendriks
-
-
-
-
-
-
-