diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 57769ac..0ff9ec8 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -28,15 +28,15 @@ jobs: node-version: "20.5.0" - name: Install dependencies - run: npm install -g pnpm && pnpm install # Install dependencies + run: npm install -g pnpm && pnpm install - name: Generate PDF - run: pnpm build # Ensure this script generates the PDF from resume.md + run: pnpm build - name: Commit PDF run: | git config --global user.name "${{ github.actor }}" git config --global user.email "${{ github.actor}}@users.noreply.github.com" git add output/art_rosnovsky_software_engineer.pdf - git commit -am "update resume PDF" + git commit -am "feat: update resume PDF" git push diff --git a/.gitignore b/.gitignore index 3c3629e..e6aeab9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +output/*.pdf diff --git a/index.test.ts b/index.test.ts new file mode 100644 index 0000000..57b6506 --- /dev/null +++ b/index.test.ts @@ -0,0 +1,19 @@ +import assert from 'node:assert'; +import { describe, it } from "node:test"; + +export const markdownFilePath = "./resume.md"; +export const outputFilePath = "output/art_rosnovsky_software_engineer.pdf"; + +describe("generatePdf", () => { + it("should throw an error if the markdown file does not exist", async () => { + assert(true) + }); + + it("should throw an error if the mdToPdf function fails", async () => { + assert(true) + }); + + it("should successfully convert the markdown to a pdf and write it to the output file", async () => { + assert(true) + }); +}); diff --git a/index.ts b/index.ts index 27ea32f..070881d 100644 --- a/index.ts +++ b/index.ts @@ -1,10 +1,27 @@ import fs from "node:fs"; +import path from "node:path"; import { mdToPdf } from "md-to-pdf"; -(async () => { - const pdf = await mdToPdf({ path: "./resume.md" }).catch(console.error); +export const markdownFilePath = "./resume.md"; +export const outputFilePath = "output/art_rosnovsky_software_engineer.pdf"; - if (pdf) { - fs.writeFileSync("output/art_rosnovsky_software_engineer.pdf", pdf.content); +export async function generatePdf() { + if (!fs.existsSync(markdownFilePath)) { + console.error(`File ${markdownFilePath} does not exist.`); + throw new Error(`File ${markdownFilePath} does not exist.`); } -})(); + + try { + const pdf = await mdToPdf({ path: markdownFilePath }); + + if (pdf) { + fs.writeFileSync(path.resolve(__dirname, outputFilePath), pdf.content); + console.log(`PDF has been written to ${outputFilePath}`); + } + } catch (error: any) { + console.error(`Error occurred: ${error.message}`); + throw new Error(error.message); + } +} + +generatePdf(); diff --git a/output/.keep b/output/.keep new file mode 100644 index 0000000..e69de29 diff --git a/output/art_rosnovsky_software_engineer.pdf b/output/art_rosnovsky_software_engineer.pdf index d298673..764352d 100644 Binary files a/output/art_rosnovsky_software_engineer.pdf and b/output/art_rosnovsky_software_engineer.pdf differ diff --git a/package.json b/package.json index a902b99..459e51e 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "resume-manager", - "version": "1.0.0", - "description": "Converts Markdown resume to PDF and DOCX formats", + "version": "1.0.1", + "description": "Converts Markdown resume to PDF format.", "main": "dist/index.js", "scripts": { - "build": "ts-node index.ts" + "build": "ts-node index.ts", + "test": "NODE_ENV=\"test\" node --no-warnings --require \"ts-node/register\" --test **/**/*.test.ts" }, "keywords": [ "resume", @@ -21,8 +22,8 @@ "typescript": "^5.2.2" }, "devDependencies": { - "@types/node": "latest", "@types/markdown-pdf": "^9.0.5", + "@types/node": "latest", "ts-node": "latest", "typescript": "latest" }, diff --git a/resume.md b/resume.md index 8db7aa4..95e369a 100644 --- a/resume.md +++ b/resume.md @@ -14,53 +14,59 @@ pdf_options: > job@rosnovsky.us | [github.com/rosnovsky](https://github.com/rosnovsky) | Washington state | **Remote Only** | -Dedicated `JavaScript`/`TypeScript` Engineer with a knack for ` React`, `Kubernetes`, and CI/CD. I champion sustainable, ethical tech that makes a positive impact, and thrive in diverse, remote work environments. +Dedicated `JavaScript`/`TypeScript` Engineer with a knack for ` React`, `Kubernetes`, and CI/CD. I champion sustainable, ethical tech that makes a positive impact, by building stable, scalable, efficient, and maintainable software. ## Technical Skills -- **Front End**: `JavaScript`, `TypeScript`, `React`, `Tailwind CSS`, UX/UI Design -- **Back End**: `Node.js`, `Express`, `Next.js`, `MongoDB`, `PostgreSQL`, `gRPC`, RESTful APIs -- **Dev Tools/DevOps**: Git, `Kubernetes`, `Jira`, `AWS`, `Azure`, CI/CD (`GitHub Actions`, `Gitlab Pipelines`) +- **Front End**: `JavaScript`, `TypeScript`, `React`, `Svelte`, `Tailwind`, `CSS`, `HTML` +- **Back End**: `Node.js`, `Express`, `Next.js`, `MongoDB`, `PostgreSQL`, `tRPC`, RESTful APIs +- **Dev Tools/DevOps**: Git, `Docker`, `Kubernetes`, `Jira`, `AWS`, `Azure`, CI/CD (`GitHub Actions`, `Gitlab Pipelines`) +- **Other**: former frontline reporter, can fly single-engine aircraft ## Work Experience ### Software Engineer -> **[Okta](https://okta.com)**, Remote • Mar 2021 - Present +> **[Okta](https://okta.com)**, Remote • Mar 2021 - April 2024 - Delivered the [Quarterly Snapshot](https://auth0.com/docs/get-started/tenant-settings/auth0-teams/quarterly-snapshot) feature on schedule. -- Enhanced Technical Account Managers' workflow with internal tools for Quarterly Snapshots. -- Developed a data reconciliation subsystem for an internal ML tool, enhancing knowledge delivery within the Customer First team. -- Improved and delivered a multitude of internal tools +- Enhanced Technical Account Managers' workflow by building internal tools for Quarterly Snapshots covering **$20M** worth of ARR. +- Developed, deployed, and stabilized an internal AI/ML tool, enhancing knowledge sharing and delivery within the Customer First teams **saving over $10K** of SME productive time every year +- Saved **$20K** annually on AWS bills by strategically decommissioning idle resources +- Improved and delivered a multitude of high-profile company-wide internal tools +- Implemented critical security improvements to key in-house Customer Success tools ### Developer Support Engineer > **[Auth0](https://auth0.com)**, Remote • Dec 2019 - Mar 2021 -- Assisted hundreds of clients with various levels of Identity Management integrations, from simple setups to complex configurations. +- Successfully resolved over 2,000 support cases of various complexity with an average **cSAT of 99%** and **on-time SLA of 97%**. +- Assisted hundreds of major enterprise customers with complex CIAM integration use cases. +- Guided hundreds of developers through Identity Management implementations in every environment imaginable. ### Software Engineer > **[Microsoft](https://microsoft.com)**, Redmond, WA • Apr 2019 - Oct 2019 -- Crafted both the UI and server for an internal search application using `C#`, `.NET Core`, `MSSQL`, and `React`, scaling it from a prototype to a full-scale production app. -- Saved hundreds of hours of account managers' time by implementing a slick search UI and functionality +- Crafted both the UI and backend for an internal search application using `C#`, `.NET Core`, `MSSQL`, and `React`, scaling it from a prototype to a full-scale production app. +- Saved hundreds of hours of account managers' productive time by implementing a slick search UI and functionality -### Web Developer +
+ +### Software Engineer > **Transmark Logistics**, Kent, WA • Oct 2018 — Mar 2019 -- Pioneered an internal shipment and task management system, saving users an average of 40 minutes per day through UI enhancements. - Lead a small team from inception of the project to its MVP +- Pioneered an internal shipment and task management system, saving users an average of 40 minutes of productive time per day through UI enhancements. - ### Web Developer > **[AT&T](https://att.com)**, Bothell, WA • Apr 2017 - Sep 2018 -- Executed over 100 updates and rectified 100+ defects in the AT&T MyServices client portal. -- With primary focus on defect resolution, proactively researched and fixed issues +- Executed over 100 updates and rectified hundreds of defects in the AT&T MyServices client portal. +- With primary focus on defect resolution, proactively researched and fixed issues outside of the scope of daily responsibilities ### Web Producer @@ -76,11 +82,13 @@ Dedicated `JavaScript`/`TypeScript` Engineer with a knack for ` React`, `Kuberne > London, Canada • AA, Multimedia Design - Developed 'Hourglass', a student assignment management system. +- Produced a PSA for the local branch of Big Brothers Big Sisters ### RUDN University > Moscow, Russia • BA, Journalism +- Frontline reporter for country's largest news outlets - Reported live from significant events, including terrorist incidents. ### Udacity Nanodegree @@ -89,7 +97,7 @@ Dedicated `JavaScript`/`TypeScript` Engineer with a knack for ` React`, `Kuberne ## Languages -- Russian — Native (comprehends Belarusian, Ukrainian) +- Russian — Bilingual (comprehend Belarusian, Ukrainian) - Arabic — Basic ## Publications