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` +
+
+

${title}

+
+ ${awarder && html` +
+ Awarded by ${awarder} +
+ `} + ${date && Date(date)} +
+
+ ${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` +
+
+

${Link(url, name)}

+
+ ${issuer && html` +
+ Issued by ${issuer} +
+ `} + ${date && Date(date)} +
+
+
+ `)} +
+
+ ` +} 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`` +} 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` +
+
+

${Link(url, institution)}

+
+ ${area && html`${area}`} +
${Duration(startDate, endDate)}
+
+
+ ${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` +
+ ${image && html``} +
+ ${name && html`

${name}

`} + ${label && html`

${label}

`} +
+ ${summary && html`
${markdown(summary)}
`} + +
+ ` +} 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` +
+
+

${Link(url, name)}

+
+
+ ${roles.length > 0 && html`${formatRoles(roles)}`} + ${entity && html`at ${entity}`} +
+
${Duration(startDate, endDate)}
+
+
+ ${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` +
+
+

${Link(url, name)}

+
+ ${publisher && html` +
+ Published by ${publisher} +
+ `} + ${releaseDate && Date(releaseDate)} +
+
+ ${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` +
+
+

${position}

+
+ ${Link(url, organization)} +
${Duration(startDate, endDate)}
+
+
+ ${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` +
+
+

${position}

+
+
+ ${Link(url, name)} + ${description && html`${description}`} +
+
${Duration(startDate, endDate)}
+ ${location && html`
${location}
`} +
+
+ ${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}} -
-
-

{{title}}

-
- {{#awarder}} -
- Awarded by {{.}} -
- {{/awarder}} - {{#date}} - - {{/date}} -
-
- {{#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}} -
-
-

{{> link}}

-
- {{#issuer}} -
- Issued by {{.}} -
- {{/issuer}} - {{#date}} - - {{/date}} -
-
-
- {{/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}} -
-
-

{{> link name=institution}}

-
- {{#area}} - {{.}} - {{/area}} -
- – - {{#if endDate}}{{else}}Present{{/if}} -
-
-
- {{#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 @@ -
- {{#image}} - - {{/image}} -
- {{#name}} -

{{.}}

- {{/name}} - {{#label}} -

{{.}}

- {{/label}} -
- {{#summary}} -
- {{{markdown .}}} -
- {{/summary}} - -
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}} -
-
-

{{> link}}

-
-
- {{#if roles}} - {{join roles}} - {{/if}} - {{#entity}} - at {{.}} - {{/entity}} -
-
- – - {{#if endDate}}{{else}}Present{{/if}} -
-
-
- {{#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}} -
-
-

{{> link}}

-
- {{#publisher}} -
- Published by {{.}} -
- {{/publisher}} - {{#releaseDate}} - - {{/releaseDate}} -
-
- {{#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}} -
-
-

{{position}}

-
- {{> link name=organization}} -
- – - {{#if endDate}}{{else}}Present{{/if}} -
-
-
- {{#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}} -
-
-

{{position}}

-
-
- {{> link}} - {{#description}} - {{.}} - {{/description}} -
-
- – - {{#if endDate}}{{else}}Present{{/if}} -
- {{#location}} -
{{.}}
- {{/location}} -
-
- {{#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 - - - - - - -
- -
-

Richard Hendriks

-

Programmer

-
+ + + +
+ +
+

Richard Hendriks

+

Programmer

+
+

Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinal!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a “length-limited” conversation!

+ +
+ + +
+

Work

+
+
-

Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinal!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a “length-limited” conversation!

+
+

CEO/President

+
+
+ Pied Piper + Awesome compression company +
+
+
Palo Alto, CA
+
+
+

Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.

+ +
    +
  • Build an algorithm for artist to detect if their music was violating copy right infringement laws

  • Successfully won Techcrunch Disrupt

  • Optimized an algorithm that holds the current world record for Weisman Scores

  • +
+
- -
- -
-

Work

-
-
-
-

CEO/President

-
-
- Pied Piper - Awesome compression company -
-
- – - -
-
Palo Alto, CA
-
-
-

Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.

-
    -
  • Build an algorithm for artist to detect if their music was violating copy right infringement laws

  • -
  • Successfully won Techcrunch Disrupt

  • -
  • Optimized an algorithm that holds the current world record for Weisman Scores

  • -
-
-
-
-
-

Volunteer

-
-
-
-

Teacher

-
- CoderDojo -
- – - -
-
-
-

Global movement of free coding clubs for young people.

-
    -
  • Awarded 'Teacher of the Month'

  • -
-
-
-
-
-

Education

-
-
-
-

University of Oklahoma

-
- Information Technology -
- – - -
-
-
-

Bachelor

-
Courses
-
    -
  • DB1101 - Basic SQL

  • -
  • CS2011 - Java Introduction

  • -
-
-
-
-
-

Projects

-
-
-
-

Miss Direction

-
-
- Team lead and Designer - at Smoogle -
-
- – - -
-
-
-

A mapping engine that misguides you

-
    -
  • Won award at AIHacks 2016

  • -
  • Built by all women team of newbie programmers

  • -
  • Using modern technologies such as GoogleMaps, Chrome Extension and Javascript

  • -
-
-
-
-
-

Awards

-
-
-
-

Digital Compression Pioneer Award

-
-
- Awarded by Techcrunch -
- -
-
-

There is no spoon.

-
-
-
-
-

Publications

-
-
-
-

Video compression for 3d media

-
-
- Published by Hooli -
- -
-
-

Innovative middle-out compression algorithm that changes the way we store data.

-
-
-
-
-

Skills

-
-
-

Web Development

-
    -
  • HTML
  • -
  • CSS
  • -
  • Javascript
  • -
+ +
+
+ + +
+

Volunteer

+
+ +
+
+

Teacher

+
+ CoderDojo +
+
+
+

Global movement of free coding clubs for young people.

+ +
    +
  • Awarded 'Teacher of the Month'

  • +
+ +
+ +
+
+ + +
+

Education

+
+ +
+
+

University of Oklahoma

+
+ Information Technology +
+
+
+

Bachelor

+ +
Courses
+
    +
  • DB1101 - Basic SQL

  • CS2011 - Java Introduction

  • +
+ +
+ +
+
+ + +
+

Projects

+
+ +
+
+

Miss Direction

+
+
+ Team lead and Designer + at Smoogle +
+
-
-

Compression

-
    -
  • Mpeg
  • -
  • MP4
  • -
  • GIF
  • -
-
-
-
-
-

Languages

-
-
-

English

- Native speaker -
-
-
-
-

Interests

-
-
-

Wildlife

-
    -
  • Ferrets
  • -
  • Unicorns
  • -
-
-
-
-
-

References

-
-
-

It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company.

-

- Erlich Bachman -

-
-
-
- - - + +

A mapping engine that misguides you

+ + + + + + + + + +
+

Awards

+
+ +
+
+

Digital Compression Pioneer Award

+
+ +
+ Awarded by Techcrunch +
+ + +
+
+

There is no spoon.

+
+ +
+
+ + + +
+

Publications

+
+ +
+
+

Video compression for 3d media

+
+ +
+ Published by Hooli +
+ + +
+
+

Innovative middle-out compression algorithm that changes the way we store data.

+
+ +
+
+ + +
+

Skills

+
+ +
+

Web Development

+ +
    +
  • HTML
  • CSS
  • Javascript
  • +
+ +
+ +
+

Compression

+ +
    +
  • Mpeg
  • MP4
  • GIF
  • +
+ +
+ +
+
+ + +
+

Languages

+
+ +
+

English

+ Native speaker +
+ +
+
+ + +
+

Interests

+
+ +
+

Wildlife

+ +
    +
  • Ferrets
  • Unicorns
  • +
+ +
+ +
+
+ + +
+

References

+
+ +
+

It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company.

+ +

+ Erlich Bachman +

+ +
+ +
+
+ + + ` diff --git a/test/render.js b/test/render.js index 3086f8b..5f09b63 100644 --- a/test/render.js +++ b/test/render.js @@ -15,7 +15,10 @@ test('renders a resume', t => { test('renders valid HTML', t => { const htmlvalidate = new HtmlValidate({ extends: ['html-validate:recommended'], - rules: { 'tel-non-breaking': 'off' }, + rules: { + 'no-trailing-whitespace': 'off', + 'tel-non-breaking': 'off', + }, }) const { diff --git a/utils/html.js b/utils/html.js new file mode 100644 index 0000000..ef819ca --- /dev/null +++ b/utils/html.js @@ -0,0 +1,10 @@ +// Based on https://github.com/jimniels/html +export default function html(strings, ...values) { + return strings.reduce((acc, string, i) => { + const value = values[i] + + if (Array.isArray(value)) return acc + string + value.join('') + if (value != null && !!value !== value) return acc + string + value + return acc + string + }, '') +} diff --git a/utils/markdown.js b/utils/markdown.js new file mode 100644 index 0000000..54da36b --- /dev/null +++ b/utils/markdown.js @@ -0,0 +1,7 @@ +import micromark from 'micromark' +import striptags from 'striptags' + +export default function markdown(doc, stripTags = false) { + const html = micromark(doc) + return stripTags ? striptags(html) : html +}