mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-03 02:04:31 +10:00
* feat(import): add LinkedIn data export as a resume import source LinkedIn's "Get a copy of your data" export ships a ZIP of per-topic CSVs (Profile, Positions, Education, Skills, Languages, Certifications). Reading these directly gives structured data without needing a connected AI provider, unlike the existing PDF/DOCX import path. Also fixes a latent bug found while building this: parseJSONResume (and the new LinkedIn parser) built their result via a shallow spread of the shared `defaultResumeData` singleton, so assigning into `result.sections.x` mutated that singleton in place and leaked section data into the next unrelated import call in the same process. Both now start from a structuredClone. * fix(import): escape LinkedIn text, harden zip parsing and date handling Move escapeHtml and toHtml from the plain-text importer into html.ts and use them for LinkedIn summary, position descriptions and education notes, so CSV text is HTML-escaped and line breaks become paragraphs or bullet lists instead of collapsing into one run-on paragraph. Only an empty end date now marks an entry as ongoing. Date cells that are not "Mon YYYY" are kept verbatim, so a finished role with an unexpected date format no longer reads as "Present". Unzip only the six CSVs the importer reads, matched by exact file name, and reject any of them larger than 5 MB. This avoids inflating the rest of a complete LinkedIn export in the browser and stops Learning_Profile.csv being read as Profile.csv. Map LinkedIn's five language proficiency options onto levels 5 to 1, falling back to parseLevel for anything else. Drop the literal BOM strip, which TextDecoder already handles. The import dialog no longer mentions an AI provider in the loading toast for LinkedIn imports, which are parsed entirely in the browser. Add a regression test for the JSON Resume importer leaking section data through the shared defaultResumeData object, plus LinkedIn tests for HTML escaping, unrecognised end dates, BOM headers, exact file name matching, language levels and oversized entries. --------- Co-authored-by: Amruth Pillai <im.amruth@gmail.com>
33 lines
1.2 KiB
JSON
33 lines
1.2 KiB
JSON
{
|
|
"name": "@reactive-resume/import",
|
|
"version": "0.0.0",
|
|
"type": "module",
|
|
"private": true,
|
|
"exports": {
|
|
"./json-resume": "./src/json-resume.tsx",
|
|
"./linkedin": "./src/linkedin.ts",
|
|
"./plain-text": "./src/plain-text.ts",
|
|
"./reactive-resume-json": "./src/reactive-resume-json.tsx",
|
|
"./reactive-resume-v4-json": "./src/reactive-resume-v4-json.tsx"
|
|
},
|
|
"scripts": {
|
|
"typecheck": "tsgo --noEmit",
|
|
"test": "vitest run --passWithNoTests",
|
|
"test:coverage": "vitest run --coverage --passWithNoTests",
|
|
"test:ci": "vitest run --coverage --reporter=default --reporter=github-actions --reporter=json --reporter=junit --outputFile.json=reports/vitest-results.json --outputFile.junit=reports/vitest-junit.xml --passWithNoTests",
|
|
"test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests"
|
|
},
|
|
"dependencies": {
|
|
"@reactive-resume/resume": "workspace:*",
|
|
"@reactive-resume/schema": "workspace:*",
|
|
"@reactive-resume/utils": "workspace:*",
|
|
"fflate": "^0.8.3",
|
|
"zod": "^4.6.5"
|
|
},
|
|
"devDependencies": {
|
|
"@reactive-resume/config": "workspace:*",
|
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
"typescript": "^7.0.2"
|
|
}
|
|
}
|