diff --git a/bun.lock b/bun.lock index 8deefe3..787e876 100644 --- a/bun.lock +++ b/bun.lock @@ -16,6 +16,7 @@ }, "devDependencies": { "@nuxtjs/color-mode": "^4.0.0", + "@types/bun": "^1.3.14", "playwright": "^1.62.0", "prettier": "^3.8.3", }, @@ -536,6 +537,8 @@ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], @@ -548,6 +551,8 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@types/parse-path": ["@types/parse-path@7.1.0", "", { "dependencies": { "parse-path": "*" } }, "sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q=="], "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], @@ -694,6 +699,8 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], "c12": ["c12@3.3.4", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.4", "defu": "^6.1.6", "dotenv": "^17.3.1", "exsolve": "^1.0.8", "giget": "^3.2.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "rc9": "^3.0.1" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA=="], @@ -1724,6 +1731,8 @@ "undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], "unhead": ["unhead@2.1.13", "", { "dependencies": { "hookable": "^6.0.1" } }, "sha512-jO9M1sI6b2h/1KpIu4Jeu+ptumLmUKboRRLxys5pYHFeT+lqTzfNHbYUX9bxVDhC1FBszAGuWcUVlmvIPsah8Q=="], diff --git a/package.json b/package.json index b388817..6583225 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "devDependencies": { "@nuxtjs/color-mode": "^4.0.0", + "@types/bun": "^1.3.14", "playwright": "^1.62.0", "prettier": "^3.8.3" } diff --git a/scripts/resume-to-pdf.ts b/scripts/resume-to-pdf.ts index e7af8d1..5c0ea28 100644 --- a/scripts/resume-to-pdf.ts +++ b/scripts/resume-to-pdf.ts @@ -1,24 +1,25 @@ -import { chromium } from 'playwright'; -import { mkdir } from 'node:fs/promises'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { chromium } from 'playwright' +import { mkdir } from 'node:fs/promises' +import { dirname, join, resolve } from 'node:path' -const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); -const resumeHtml = resolve(root, 'public/resume/index.html'); +const root = join(import.meta.dir, '..') +const resumeHtml = join(root, 'public/resume/index.html') const outputPath = resolve( - process.argv[2] ?? resolve(root, 'public/resume/paper.pdf'), -); + Bun.argv[2] ?? join(root, 'public/resume/paper.pdf'), +) async function main() { - await mkdir(dirname(outputPath), { recursive: true }); + await mkdir(dirname(outputPath), { recursive: true }) - const browser = await chromium.launch(); - const page = await browser.newPage(); + const browser = await chromium.launch() + const page = await browser.newPage() - await page.goto(`file://${resumeHtml}`, { waitUntil: 'networkidle' }); + await page.goto(Bun.pathToFileURL(resumeHtml).href, { + waitUntil: 'networkidle', + }) await page.evaluate(async () => { - await document.fonts.ready; - }); + await document.fonts.ready + }) await page.pdf({ path: outputPath, @@ -30,13 +31,13 @@ async function main() { bottom: '0', left: '0', }, - }); + }) - await browser.close(); - console.log(`Wrote ${outputPath}`); + await browser.close() + console.log(`Wrote ${outputPath}`) } main().catch((error) => { - console.error(error); - process.exit(1); -}); + console.error(error) + process.exit(1) +}) diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 0000000..bc26a5e --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["./**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index d35e728..4b24078 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,9 @@ }, { "path": "./.nuxt/tsconfig.node.json" + }, + { + "path": "./scripts/tsconfig.json" } ] }