From 082678444dce2fa3fea9b12b2409750457ed633f Mon Sep 17 00:00:00 2001 From: Rafael Bardini Date: Sun, 8 Oct 2023 01:23:03 +0200 Subject: [PATCH] style(prettier): format all files and add CI check --- .github/workflows/main.yml | 3 + .lintstagedrc.json | 2 +- .prettierrc.json | 1 + components/awards.js | 44 +-- components/certificates.js | 42 +-- components/education.js | 56 +-- components/header.js | 46 ++- components/interests.js | 40 ++- components/languages.js | 26 +- components/link.js | 4 +- components/meta.js | 2 +- components/projects.js | 87 +++-- components/publications.js | 45 +-- components/references.js | 40 ++- components/skills.js | 40 ++- components/volunteer.js | 54 +-- components/work.js | 76 +++-- editor.js | 4 +- package-lock.json | 37 +- package.json | 5 +- resume.js | 28 +- style.css | 9 +- test/__snapshots__/index.test.js.snap | 470 ++++++++++++-------------- test/index.test.js | 5 +- 24 files changed, 598 insertions(+), 568 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 084ec7c..acedc56 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,6 +26,9 @@ jobs: - name: Test run: npm test -- --coverage + - name: Format-check + run: npm run format -- --check + - name: Build run: npm run build diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 1775c3d..fae5673 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,4 +1,4 @@ { "*.js": ["eslint --fix", "prettier --write"], - "*.{css,json,md,yml}": "prettier --write" + "*.{css,html,json,md,yml}": "prettier --write" } diff --git a/.prettierrc.json b/.prettierrc.json index 004eaa8..bbda567 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,5 +1,6 @@ { "arrowParens": "avoid", + "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-packagejson"], "printWidth": 120, "semi": false, "singleQuote": true diff --git a/components/awards.js b/components/awards.js index 66e37a8..7c7a3ce 100644 --- a/components/awards.js +++ b/components/awards.js @@ -7,27 +7,27 @@ import Date from './date.js' * @returns {string | false} */ export default function Awards(awards = []) { - return awards.length > 0 && html` -
-

Awards

-
- ${awards.map(({ awarder, date, summary, title }) => html` -
-
-

${title}

-
- ${awarder && html` -
- Awarded by ${awarder} + return ( + awards.length > 0 && + html` +
+

Awards

+
+ ${awards.map( + ({ awarder, date, summary, title }) => html` +
+
+

${title}

+
+ ${awarder && html`
Awarded by ${awarder}
`} ${date && Date(date)}
- `} - ${date && Date(date)} -
-
- ${summary && markdown(summary)} -
- `)} -
-
- ` + + ${summary && markdown(summary)} + + `, + )} + + + ` + ) } diff --git a/components/certificates.js b/components/certificates.js index 935be56..aa2eaa5 100644 --- a/components/certificates.js +++ b/components/certificates.js @@ -7,26 +7,26 @@ import Link from './link.js' * @returns {string | false} */ 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} + return ( + certificates.length > 0 && + html` +
+

Certificates

+
+ ${certificates.map( + ({ date, issuer, name, url }) => html` +
+
+

${Link(url, name)}

+
+ ${issuer && html`
Issued by ${issuer}
`} ${date && Date(date)}
- `} - ${date && Date(date)} -
-
-
- `)} -
-
- ` + + + `, + )} + + + ` + ) } diff --git a/components/education.js b/components/education.js index 6333fbc..bb4d4ee 100644 --- a/components/education.js +++ b/components/education.js @@ -8,29 +8,35 @@ import Link from './link.js' * @returns {string | false} */ 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}`} - ${startDate && html`
${Duration(startDate, endDate)}
`} -
-
- ${studyType && markdown(studyType)} - ${courses.length > 0 && html` -
Courses
-
    - ${courses.map(course => html`
  • ${markdown(course)}
  • `)} -
- `} -
- `)} -
-
- ` + return ( + education.length > 0 && + html` +
+

Education

+
+ ${education.map( + ({ area, courses = [], institution, startDate, endDate, studyType, url }) => html` +
+
+

${Link(url, institution)}

+
+ ${area && html`${area}`} + ${startDate && html`
${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 index dbb961b..1685c07 100644 --- a/components/header.js +++ b/components/header.js @@ -7,9 +7,8 @@ import Link from './link.js' * @param {string} countryCode * @returns {string | undefined} */ -const formatCountry = countryCode => Intl.DisplayNames - ? new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode) - : countryCode +const formatCountry = countryCode => + Intl.DisplayNames ? new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode) : countryCode /** * @param {import('../schema.d.ts').ResumeSchema['basics']} basics @@ -20,44 +19,39 @@ export default function Header(basics = {}) { return html`
- ${image && html``} -
- ${name && html`

${name}

`} - ${label && html`

${label}

`} -
+ ${image && html``} +
${name && html`

${name}

`} ${label && html`

${label}

`}
${summary && html`
${markdown(summary)}
`}
` diff --git a/components/interests.js b/components/interests.js index b23b44f..3e854fd 100644 --- a/components/interests.js +++ b/components/interests.js @@ -5,21 +5,27 @@ import html from '../utils/html.js' * @returns {string | false} */ 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}
  • `)} -
- `} -
- `)} -
-
- ` + 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 index e2d0506..50f63b4 100644 --- a/components/languages.js +++ b/components/languages.js @@ -5,17 +5,17 @@ import html from '../utils/html.js' * @returns {string | false} */ export default function Languages(languages = []) { - return languages.length > 0 && html` -
-

Languages

-
- ${languages.map(({ fluency, language }) => html` -
- ${language && html`

${language}

`} - ${fluency} -
- `)} -
-
- ` + 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 index b5bf20c..e19c67a 100644 --- a/components/link.js +++ b/components/link.js @@ -12,7 +12,5 @@ const formatURL = url => url.replace(/^(https?:|)\/\//, '').replace(/\/$/, '') * @returns {string | undefined} */ export default function Link(url, name) { - return name - ? (url ? html`${name}` : name) - : url && html`${formatURL(url)}` + return name ? (url ? html`${name}` : name) : url && html`${formatURL(url)}` } diff --git a/components/meta.js b/components/meta.js index 9b65d8a..394280f 100644 --- a/components/meta.js +++ b/components/meta.js @@ -10,6 +10,6 @@ export default function Meta(basics = {}) { return html` ${name && html`${name}`} - ${summary && html``} + ${summary && html``} ` } diff --git a/components/projects.js b/components/projects.js index 373e7c3..66de84b 100644 --- a/components/projects.js +++ b/components/projects.js @@ -7,46 +7,61 @@ import Link from './link.js' * @param {string[]} roles * @returns {string} */ -const formatRoles = roles => Intl.ListFormat - ? new Intl.ListFormat('en').format(roles) - : roles.join(', ') +const formatRoles = roles => (Intl.ListFormat ? new Intl.ListFormat('en').format(roles) : roles.join(', ')) /** * @param {import('../schema.d.ts').ResumeSchema['projects']} projects * @returns {string | false} */ export default function Projects(projects = []) { - return projects.length > 0 && html` -
-

Projects

-
- ${projects.map(({ description, entity, highlights = [], keywords = [], name, startDate, endDate, roles = [], type, url }) => html` -
-
-

${Link(url, name)}

-
-
- ${roles.length > 0 && html`${formatRoles(roles)}`} - ${entity && html`at ${entity}`} -
- ${startDate && html`
${Duration(startDate, endDate)}
`} - ${type && html`
${type}
`} -
-
- ${description && markdown(description)} - ${highlights.length > 0 && html` -
    - ${highlights.map(highlight => html`
  • ${markdown(highlight)}
  • `)} -
- `} - ${keywords.length > 0 && html` -
    - ${keywords.map(keyword => html`
  • ${keyword}
  • `)} -
- `} -
- `)} -
-
- ` + return ( + projects.length > 0 && + html` +
+

Projects

+
+ ${projects.map( + ({ + description, + entity, + highlights = [], + keywords = [], + name, + startDate, + endDate, + roles = [], + type, + url, + }) => html` +
+
+

${Link(url, name)}

+
+
+ ${roles.length > 0 && html`${formatRoles(roles)}`} + ${entity && html`at ${entity}`} +
+ ${startDate && html`
${Duration(startDate, endDate)}
`} ${type && html`
${type}
`} +
+
+ ${description && markdown(description)} + ${highlights.length > 0 && + html` +
    + ${highlights.map(highlight => html`
  • ${markdown(highlight)}
  • `)} +
+ `} + ${keywords.length > 0 && + html` +
    + ${keywords.map(keyword => html`
  • ${keyword}
  • `)} +
+ `} +
+ `, + )} +
+
+ ` + ) } diff --git a/components/publications.js b/components/publications.js index f3f1f56..97be752 100644 --- a/components/publications.js +++ b/components/publications.js @@ -8,27 +8,28 @@ import Link from './link.js' * @returns {string | false} */ 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} + 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)}
- `} - ${releaseDate && Date(releaseDate)} -
-
- ${summary && markdown(summary)} -
- `)} -
-
- ` + + ${summary && markdown(summary)} + + `, + )} + + + ` + ) } diff --git a/components/references.js b/components/references.js index de53fd9..de85e0e 100644 --- a/components/references.js +++ b/components/references.js @@ -6,21 +6,27 @@ import markdown from '../utils/markdown.js' * @returns {string | false} */ export default function References(references = []) { - return references.length > 0 && html` -
-

References

-
- ${references.map(({ name, reference }) => html` -
- ${reference && markdown(reference)} - ${name && html` -

- ${name} -

- `} -
- `)} -
-
- ` + 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 index b8e38e6..5ef68fe 100644 --- a/components/skills.js +++ b/components/skills.js @@ -5,21 +5,27 @@ import html from '../utils/html.js' * @returns {string | false} */ 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}
  • `)} -
- `} -
- `)} -
-
- ` + 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 index 36790d6..d24ab36 100644 --- a/components/volunteer.js +++ b/components/volunteer.js @@ -8,28 +8,34 @@ import Link from './link.js' * @returns {string | false} */ export default function Volunteer(volunteer = []) { - return volunteer.length > 0 && html` -
-

Volunteer

-
- ${volunteer.map(({ highlights = [], organization, position, startDate, endDate, summary, url }) => html` -
-
-

${Link(url, organization)}

-
- ${position} - ${startDate && html`
${Duration(startDate, endDate)}
`} -
-
- ${summary && markdown(summary)} - ${highlights.length > 0 && html` -
    - ${highlights.map(highlight => html`
  • ${markdown(highlight)}
  • `)} -
- `} -
- `)} -
-
- ` + return ( + volunteer.length > 0 && + html` +
+

Volunteer

+
+ ${volunteer.map( + ({ highlights = [], organization, position, startDate, endDate, summary, url }) => html` +
+
+

${Link(url, organization)}

+
+ ${position} + ${startDate && html`
${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 index 3ce131b..6da9eb3 100644 --- a/components/work.js +++ b/components/work.js @@ -19,40 +19,46 @@ export default function Work(work = []) { return acc }, /** @type {NestedWork[]} */ ([])) - return work.length > 0 && html` -
-

Work

-
- ${nestedWork.map(({ description, name, url, items = [] }) => html` -
-
-

${Link(url, name)}

-
- ${description && html`
${description}
`} -
-
-
- ${items.map(({highlights = [], location, position, startDate, endDate, summary }) => html` -
-
-
${position}
-
- ${startDate && html`
${Duration(startDate, endDate)}
`} - ${location && html`
${location}
`} -
-
- ${summary && markdown(summary)} - ${highlights.length > 0 && html` -
    - ${highlights.map(highlight => html`
  • ${markdown(highlight)}
  • `)} -
- `} + return ( + work.length > 0 && + html` +
+

Work

+
+ ${nestedWork.map( + ({ description, name, url, items = [] }) => html` +
+
+

${Link(url, name)}

+
${description && html`
${description}
`}
+
+
+ ${items.map( + ({ highlights = [], location, position, startDate, endDate, summary }) => html` +
+
+
${position}
+
+ ${startDate && html`
${Duration(startDate, endDate)}
`} + ${location && html`
${location}
`} +
+
+ ${summary && markdown(summary)} + ${highlights.length > 0 && + html` +
    + ${highlights.map(highlight => html`
  • ${markdown(highlight)}
  • `)} +
+ `} +
+ `, + )}
- `)} -
-
- `)} -
-
- ` + + `, + )} + + + ` + ) } diff --git a/editor.js b/editor.js index 787b892..33426fc 100644 --- a/editor.js +++ b/editor.js @@ -1,13 +1,13 @@ import { indentWithTab } from '@codemirror/commands' import { json } from '@codemirror/lang-json' -import { EditorView, keymap } from '@codemirror/view' import { oneDark } from '@codemirror/theme-one-dark' +import { EditorView, keymap } from '@codemirror/view' import { basicSetup } from 'codemirror' import { debounce } from 'debounce' import resume from 'resume-schema/sample.resume.json' assert { type: 'json' } -import { render } from './index.js' import './editor.css' +import { render } from './index.js' const preview = document.querySelector('iframe') const printButton = document.querySelector('button[name=print]') diff --git a/package-lock.json b/package-lock.json index 73441f5..ef3ddb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,8 @@ "json-schema-to-typescript": "13.1.1", "lint-staged": "14.0.1", "prettier": "3.0.3", - "prettier-plugin-packagejson": "2.4.5", + "prettier-plugin-organize-imports": "3.2.3", + "prettier-plugin-packagejson": "2.4.6", "resume-schema": "1.0.0", "typescript": "5.2.2", "vite": "4.4.9", @@ -4248,13 +4249,33 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-organize-imports": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.3.tgz", + "integrity": "sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==", + "dev": true, + "peerDependencies": { + "@volar/vue-language-plugin-pug": "^1.0.4", + "@volar/vue-typescript": "^1.0.4", + "prettier": ">=2.0", + "typescript": ">=2.9" + }, + "peerDependenciesMeta": { + "@volar/vue-language-plugin-pug": { + "optional": true + }, + "@volar/vue-typescript": { + "optional": true + } + } + }, "node_modules/prettier-plugin-packagejson": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.5.tgz", - "integrity": "sha512-glG71jE1gO3y5+JNAhC8X+4yrlN28rub6Aj461SKbaPie9RgMiHKcInH2Moi2VGOfkTXaEHBhg4uVMBqa+kBUA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.6.tgz", + "integrity": "sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==", "dev": true, "dependencies": { - "sort-package-json": "2.5.1", + "sort-package-json": "2.6.0", "synckit": "0.8.5" }, "peerDependencies": { @@ -4773,9 +4794,9 @@ "dev": true }, "node_modules/sort-package-json": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.5.1.tgz", - "integrity": "sha512-vx/KoZxm8YNMUqdlw7SGTfqR5pqZ/sUfgOuRtDILiOy/3AvzhAibyUe2cY3OpLs3oRSow9up4yLVtQaM24rbDQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.6.0.tgz", + "integrity": "sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==", "dev": true, "dependencies": { "detect-indent": "^7.0.1", diff --git a/package.json b/package.json index bb7373a..27b268b 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ "main": "./dist/index.cjs", "unpkg": "./dist/index.umd.cjs", "module": "./dist/index.js", - "typings": "./dist/index.d.ts", "source": "index.js", + "typings": "./dist/index.d.ts", "bin": { "jsonresume-theme-even": "bin/cli.js" }, @@ -67,7 +67,8 @@ "json-schema-to-typescript": "13.1.1", "lint-staged": "14.0.1", "prettier": "3.0.3", - "prettier-plugin-packagejson": "2.4.5", + "prettier-plugin-organize-imports": "3.2.3", + "prettier-plugin-packagejson": "2.4.6", "resume-schema": "1.0.0", "typescript": "5.2.2", "vite": "4.4.9", diff --git a/resume.js b/resume.js index b2d523c..e609ee5 100644 --- a/resume.js +++ b/resume.js @@ -20,28 +20,22 @@ import html from './utils/html.js' * @returns */ export default function Resume(resume, css) { - return html` + 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)} + ${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/style.css b/style.css index 9295dde..6f43334 100644 --- a/style.css +++ b/style.css @@ -52,7 +52,9 @@ body { background: var(--color-background); color: var(--color-primary); display: grid; - font: 1em/1.5 Lato, sans-serif; + font: + 1em/1.5 Lato, + sans-serif; gap: 2em; grid-template-columns: [full-start] @@ -283,9 +285,6 @@ blockquote > * + *, } .grid-list { - grid-template-columns: repeat( - auto-fit, - minmax(calc((100% - 1em) / 2), 1fr) - ); + grid-template-columns: repeat(auto-fit, minmax(calc((100% - 1em) / 2), 1fr)); } } diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap index 85a41bf..fc04342 100644 --- a/test/__snapshots__/index.test.js.snap +++ b/test/__snapshots__/index.test.js.snap @@ -1,32 +1,30 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`renders a resume 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

-
- -
-
-

Pied Piper

-
-
Awesome compression company
-
-
-
- -
-
-
CEO/President
-
-
-
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

+
+ +
+
+

Pied Piper

+
Awesome compression company
+
+
+
+
+
CEO/President
+
+
+
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

-
- -
-
-

CoderDojo

-
- Teacher -
-
-
-

Global movement of free coding clubs for young people.

+
-
    -
  • Awarded 'Teacher of the Month'

  • -
+
+
+ +
+

Volunteer

+
+ +
+
+

CoderDojo

+
+ Teacher +
+
+
+

Global movement of free coding clubs for young people.

+ +
    +
  • Awarded 'Teacher of the Month'

  • +
+ +
- - -
-
- - -
-

Education

-
- -
+
+ +
+

Education

+
+ +
+
+

University of Oklahoma

+
+ Information Technology +
+
+
+

Bachelor

+ +
Courses
+
    +
  • DB1101 - Basic SQL

  • CS2011 - Java Introduction

  • +
+ +
-
Courses
-
    -
  • DB1101 - Basic SQL

  • CS2011 - Java Introduction

  • -
+
+
+ + +
+

Projects

+
+ +
+
+

Miss Direction

+
+
+ Team lead and Designer + at Smoogle +
+
application
+
+
+

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

  • +
+ + +
    +
  • GoogleMaps
  • Chrome Extension
  • Javascript
  • +
+ +
- +
+
+ +
+

Awards

+
+ +
+
+

Digital Compression Pioneer Award

+
+
Awarded by Techcrunch
+
+
+

There is no spoon.

+
+ +
+
+ - - - - -
-

Projects

-
- -
-
-

Miss Direction

-
+
+

Publications

+
+ +
+
+

Video compression for 3d media

+
+
Published by Hooli
+ +
+
+

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

+
+ +
+
+ +
+

Skills

+
+
- Team lead and Designer - at Smoogle +

Web Development

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

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

  • -
- - -
    -
  • GoogleMaps
  • Chrome Extension
  • Javascript
  • -
- -
- -
-
- - -
-

Awards

-
- -
-
-

Digital Compression Pioneer Award

-
+ +
+

Compression

-
- Awarded by Techcrunch -
+
    +
  • Mpeg
  • MP4
  • GIF
  • +
-
-
-

There is no spoon.

-
+ +
+
+ +
+

Languages

+
+

English

Native speaker
+
+
+ - - - - - -
-

Publications

-
- -
-
-

Video compression for 3d media

-
+
+

Interests

+
+ +
+

Wildlife

-
- Published by Hooli -
+
    +
  • Ferrets
  • Unicorns
  • +
-
-
-

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

-
- -
-
- - -
-

Skills

-
- -
-

Web Development

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

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 +

+ +
-
- -
-

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/index.test.js b/test/index.test.js index 6b319c0..6ce91b6 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1,8 +1,8 @@ import { HtmlValidate } from 'html-validate' import { expect, it } from 'vitest' -import { render } from '../index.js' import sampleResume from 'resume-schema/sample.resume.json' assert { type: 'json' } +import { render } from '../index.js' const resume = { ...sampleResume, @@ -26,8 +26,9 @@ it('renders a resume', () => { it('renders valid HTML', async () => { const htmlvalidate = new HtmlValidate({ - extends: ['html-validate:recommended'], + extends: ['html-validate:recommended', 'html-validate:prettier'], rules: { + 'doctype-style': 'off', 'no-inline-style': 'off', 'no-trailing-whitespace': 'off', 'tel-non-breaking': 'off',