diff --git a/public/andrea-lisi-cv-it.pdf b/public/andrea-lisi-cv-it.pdf index e7cb431..54bb423 100644 Binary files a/public/andrea-lisi-cv-it.pdf and b/public/andrea-lisi-cv-it.pdf differ diff --git a/public/andrea-lisi-cv.pdf b/public/andrea-lisi-cv.pdf index 3087b8a..fe2ea35 100644 Binary files a/public/andrea-lisi-cv.pdf and b/public/andrea-lisi-cv.pdf differ diff --git a/scripts/cv-en.json b/scripts/cv-en.json index 058bec1..ae1f635 100644 --- a/scripts/cv-en.json +++ b/scripts/cv-en.json @@ -8,14 +8,14 @@ { "role": "Senior Software Engineer", "company": "Tricentis", - "context": "Work on Tosca Cloud", + "context": "Experience across Tosca Cloud, Tosca Road and qTest", "location": "Vienna, Austria", "dates": "2023 - present", "bullet_labels": ["Collaboration", "Development", "Migrations", "Repository & CI", "AI"], "bullets": [ - "I defined shared solutions for the monorepo with developers, engineering managers, principal engineers and product stakeholders.", + "On Tosca Cloud, spanning 16 projects and 12+ teams, I defined monorepo solutions with developers, engineering managers, principal engineers and product stakeholders.", "I built shared libraries and tools and resolved cross-project issues; product teams owned their features. I wrote ADRs and automated checks for repository rules.", - "I built the infrastructure for design system upgrades, supported teams through migrations and updated shared components and themes myself.", + "I built infrastructure for Tosca Cloud and NeoLoad design system upgrades, supported migrations and updated shared components and themes.", "I administered the GitHub repository and automated GitHub Actions and Azure Pipelines. I optimized builds and caching and modernized developer tools.", "I evaluated Claude, Cursor and other tools on real tasks, maintained repository context and checked the resulting code through review and tests." ] @@ -26,7 +26,7 @@ "location": "Florence, Italy", "dates": "2019 - 2023", "bullets": [ - "I contributed to moving the storefront out of the monolith using React, Vue and GraphQL.", + "I worked on the Vue website and CMS, helped migrate the storefront from a PHP monolith to React and contributed to the Node.js/GraphQL BFF alongside the backend team.", "I built interfaces for high-traffic campaigns, working with design and design system teams to match mockups and shared standards.", "For the final two years, I was the only frontend developer alongside the backend team, building the back-office from scratch with the people running forestry operations." ] @@ -55,28 +55,28 @@ "skills": [ [ "Web development", - "TypeScript | JavaScript | HTML | Modern CSS | DOM & Web APIs | Responsive UI" + "TypeScript | JavaScript | HTML | Modern CSS | DOM & Web APIs | Responsive UI | Canvas | SVG | PixiJS/WebGL" ], [ "Frontend systems & architecture", - "React | Vue | Zustand | Micro-frontends | Shared libraries | Module boundaries | Frontend standards | RFC | ADR" + "React | Vue | Zustand | Redux Toolkit | TanStack Query | MUI | Micro-frontends | Shared libraries | Module boundaries | RFC | ADR" ], - ["Data & APIs", "GraphQL/Apollo | REST | WebSockets/Socket.io | Node.js | MongoDB"], [ - "Integrations & observability", - "Frontend integration after Okta login | JWT | HTTP interceptors | OpenTelemetry | Shared frontend integrations" + "Data & APIs", + "GraphQL/Apollo | REST | WebSockets/Socket.io | Node.js | MongoDB | PostgreSQL | MySQL" ], [ - "Monorepos & package management", - "Nx | pnpm workspaces | Dependency rules | Shared packages | Repository governance" + "Integrations & observability", + "Frontend integration after Okta login | JWT | HTTP interceptors | OpenTelemetry" ], [ - "Build & bundling", - "Vite | Webpack | Build configuration | Build caching | Build performance" + "Monorepos & package management", + "Nx | Turborepo | pnpm workspaces | Governance & dependencies" ], + ["Build & bundling", "Vite | Webpack | Build caching | Build performance"], [ "Testing & code quality", - "Vitest | Jest | Testing Library | Playwright | Storybook | ESLint | Prettier" + "Vitest | Jest | Testing Library | Playwright | Storybook | ESLint | Biome | Oxlint | Prettier" ], [ "Delivery & repository operations", @@ -92,7 +92,7 @@ ], [ "AI-assisted development", - "Claude | Cursor | MCP-based tooling | Tool evaluation | Repository context and rules | Review and tests" + "Codex | Claude Code | Cursor | GitHub Copilot | MCP-based tooling | Tool evaluation | Repository context and rules | Review and tests" ], [ "Platforms & infrastructure", @@ -109,13 +109,13 @@ { "name": "Deepfield", "label": "Discontinued experiment", - "body": "A space exploration prototype: simulation, maps and ship panels in TypeScript and PixiJS. Interaction design and data visualization." + "body": "A space simulation in TypeScript and PixiJS: maps, ship panels, interaction design and data visualization." }, { "name": "lockhound", "url": "https://github.com/karedas/lockhound", "label": "github.com/karedas/lockhound", - "body": "A zero-dependency Windows CLI that identifies processes locking a folder through the Restart Manager API. Termination requires an explicit action." + "body": "A zero-dependency Windows CLI to find processes locking a folder. Terminating them requires an explicit action." } ], "education": [ diff --git a/scripts/cv-it.json b/scripts/cv-it.json index f1db43f..1a23780 100644 --- a/scripts/cv-it.json +++ b/scripts/cv-it.json @@ -8,14 +8,14 @@ { "role": "Senior Software Engineer", "company": "Tricentis", - "context": "Esperienza su Tosca Cloud", + "context": "Esperienza su Tosca Cloud, Tosca Road e qTest", "location": "Vienna, Austria", "dates": "2023 - oggi", "bullet_labels": ["Collaborazione", "Sviluppo", "Migrazioni", "Repository e CI", "AI"], "bullets": [ - "Ho definito soluzioni per la monorepo con sviluppatori, engineering manager, principal engineer e referenti di prodotto.", + "Su Tosca Cloud, 16 progetti e oltre 12 team, ho definito soluzioni per la monorepo con sviluppatori, engineering manager, principal engineer e product.", "Ho sviluppato librerie e strumenti comuni e risolto problemi trasversali; le feature erano dei team di prodotto. Ho scritto ADR e automatizzato i controlli sulle regole.", - "Ho creato l’infrastruttura per aggiornare il design system, supportato i team e aggiornato direttamente componenti e temi condivisi.", + "Ho creato l’infrastruttura per aggiornare il design system di Tosca Cloud e NeoLoad, supportato le migrazioni e aggiornato componenti e temi.", "Ho amministrato il repository GitHub e automatizzato GitHub Actions e Azure Pipelines. Ho ottimizzato build e cache e modernizzato gli strumenti.", "Ho valutato Claude, Cursor e altri strumenti su attività reali, curando il contesto del repository e verificando il codice con review e test." ] @@ -26,7 +26,7 @@ "location": "Firenze, Italia", "dates": "2019 - 2023", "bullets": [ - "Ho partecipato alla migrazione dello storefront fuori dal monolite con React, Vue e GraphQL.", + "Dal sito e CMS in Vue ho partecipato alla migrazione dello storefront dal monolite PHP a React e al BFF Node.js/GraphQL, collaborando con il team backend.", "Ho sviluppato interfacce per campagne ad alto traffico, collaborando con design e design system per rispettare mockup e standard condivisi.", "Negli ultimi due anni ero l’unico frontend developer nel team backend: ho sviluppato da zero il back-office con gli utenti delle operazioni forestali." ] @@ -55,28 +55,28 @@ "skills": [ [ "Sviluppo web", - "TypeScript | JavaScript | HTML | CSS moderno | DOM e Web API | Interfacce responsive" + "TypeScript | JavaScript | HTML | CSS moderno | DOM e Web API | Interfacce responsive | Canvas | SVG | PixiJS/WebGL" ], [ "Sistemi frontend e architettura", - "React | Vue | Zustand | Micro-frontend | Librerie condivise | Confini tra moduli | Standard frontend | RFC | ADR" + "React | Vue | Zustand | Redux Toolkit | TanStack Query | MUI | Micro-frontend | Librerie condivise | Confini tra moduli | RFC | ADR" ], - ["Dati e API", "GraphQL/Apollo | REST | WebSocket/Socket.io | Node.js | MongoDB"], [ - "Integrazioni e osservabilità", - "Integrazione frontend dopo il login Okta | JWT | Interceptor HTTP | OpenTelemetry | Integrazioni condivise lato frontend" + "Dati e API", + "GraphQL/Apollo | REST | WebSocket/Socket.io | Node.js | MongoDB | PostgreSQL | MySQL" ], [ - "Monorepo e gestione dei pacchetti", - "Nx | pnpm workspaces | Regole sulle dipendenze | Pacchetti condivisi | Governance del repository" + "Integrazioni e osservabilità", + "Integrazione frontend dopo il login Okta | JWT | Interceptor HTTP | OpenTelemetry" ], [ - "Build e bundling", - "Vite | Webpack | Configurazione build | Cache delle build | Performance delle build" + "Monorepo e gestione dei pacchetti", + "Nx | Turborepo | pnpm workspaces | Governance e dipendenze" ], + ["Build e bundling", "Vite | Webpack | Cache delle build | Performance delle build"], [ "Test e qualità del codice", - "Vitest | Jest | Testing Library | Playwright | Storybook | ESLint | Prettier" + "Vitest | Jest | Testing Library | Playwright | Storybook | ESLint | Biome | Oxlint | Prettier" ], [ "Rilascio e gestione repository", @@ -92,7 +92,7 @@ ], [ "Sviluppo assistito da AI", - "Claude | Cursor | Strumenti basati su MCP | Valutazione strumenti | Contesto e regole del repository | Review e test" + "Codex | Claude Code | Cursor | GitHub Copilot | MCP | Valutazione tool | Contesto repository | Review e test" ], [ "Piattaforme e infrastruttura", @@ -109,22 +109,19 @@ { "name": "Deepfield", "label": "Esperimento interrotto", - "body": "Prototipo di esplorazione spaziale: simulazione, mappe e pannelli di bordo in TypeScript e PixiJS. Design delle interazioni e visualizzazione dei dati." + "body": "Simulazione spaziale in TypeScript e PixiJS: mappe, pannelli di bordo, design delle interazioni e visualizzazione dei dati." }, { "name": "lockhound", "url": "https://github.com/karedas/lockhound", "label": "github.com/karedas/lockhound", - "body": "CLI Windows senza dipendenze: identifica i processi che bloccano una cartella tramite la Restart Manager API. La terminazione richiede un’azione esplicita." + "body": "CLI Windows senza dipendenze per trovare i processi che bloccano una cartella. Terminarli richiede un’azione esplicita." } ], "education": [ - [ - "Certificato tecnico superiore IFTS", - "Sviluppo software - diploma di programmatore di applicazioni web Java." - ], + ["Certificato tecnico superiore IFTS", "Programmazione di applicazioni web Java."], ["Diploma in Arte", "Istituto Statale d’Arte di Firenze - Arte e Design."] ], - "languages": "Italiano: madrelingua | Inglese: professionale | Tedesco: elementare, in corso di studio", + "languages": "Italiano: madrelingua | Inglese: professionale | Tedesco: base, in studio", "privacy": "Autorizzo il trattamento dei dati personali ai sensi del Regolamento UE 2016/679 (GDPR)." } diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 1286d38..340b12f 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -93,21 +93,37 @@ export const en: Copy = { 'TypeScript', 'Vue', 'Zustand', + 'Redux Toolkit', + 'TanStack Query', + 'MUI', 'GraphQL', 'Node.js', + 'REST', + 'MongoDB', + 'PostgreSQL / MySQL', 'JavaScript', 'HTML & CSS', ], }, { title: 'Build systems & monorepos', - items: ['Nx', 'pnpm workspaces', 'Vite', 'Webpack', 'Build caching', 'Dependency boundaries'], + items: [ + 'Nx', + 'Turborepo', + 'pnpm workspaces', + 'Vite', + 'Webpack', + 'Build caching', + 'Dependency boundaries', + ], }, { title: 'Testing & delivery', items: [ 'Vitest', 'Jest', + 'Testing Library', + 'ESLint / Biome', 'Playwright', 'GitHub Actions', 'Azure Pipelines', @@ -122,6 +138,8 @@ export const en: Copy = { 'Design systems', 'Design tokens', 'Storybook', + 'PixiJS / WebGL', + 'Canvas / SVG', 'Accessibility', ], }, @@ -141,10 +159,10 @@ export const en: Copy = { ai: { heading: 'How I use AI in development', summary: - 'Evaluation of Claude, Cursor and other assistants on real development tasks. Repository instructions, documentation and shared tools to help them navigate the code. Recurring mistakes are a starting point for improving that setup, alongside correcting the code.', + 'Evaluation of Codex, Claude Code, Cursor and other assistants on real development tasks. Repository instructions, documentation and shared tools to help them navigate the code. Recurring mistakes are a starting point for improving that setup, alongside correcting the code.', moreLabel: 'Read about my workflow', paragraphs: [ - 'The work starts with real tasks in a repository shared by several teams: trying Claude, Cursor and other assistants, checking where they struggle, and maintaining the instructions, documentation and tools they use to navigate the code.', + 'The work starts with real tasks in a repository shared by several teams: trying Codex, Claude Code, Cursor and other assistants, checking where they struggle, and maintaining the instructions, documentation and tools they use to navigate the code.', 'A missed library or lost context between modules is a reason to look beyond the individual response. What is missing in the repository? Does the problem recur after the correction? Those checks guide changes that other teams can use too.', ], rulesLead: 'What I work on:', @@ -163,14 +181,15 @@ export const en: Copy = { title: 'Senior Software Engineer', company: 'Tricentis', specialization: 'Frontend Platform, Governance & Design Systems', - context: 'Work on Tosca Cloud', + context: 'Experience across Tosca Cloud, Tosca Road and qTest', tags: ['React', 'TypeScript', 'Micro-frontends', '16 projects', '12+ teams', 'Quality gates'], current: true, paragraphs: [ - 'Cross-team decisions. Point of contact alongside the team’s architect for Tosca Cloud initiatives spanning the monorepo. Definition of shared solutions with developers, engineering managers, principal engineers from other platforms and product stakeholders.', - 'Platform development. Development and maintenance of shared libraries, tools and configurations; resolution of cross-project issues and support for adoption across teams. Product features remained with their respective teams.', - 'Migrations and design system. Infrastructure for updates, coordination with teams and hands-on migration work when needed. Updates to shared components and themes to resolve inconsistencies between products.', - 'Performance and tooling. Build and pipeline optimization, development tool updates, and documentation of decisions in ADRs. Definition of monorepo rules and support for teams applying them.', + 'Platform and governance. On Tosca Cloud, I worked on a React and TypeScript monorepo shared by 16 projects and over 12 teams. I defined solutions for shared initiatives with developers, engineering managers, principal engineers and product stakeholders.', + 'Development and maintenance. I built shared libraries, tools and configurations, resolved cross-project issues and helped colleagues implement migrations. I defined module and dependency boundaries, wrote ADRs and automated checks for repository rules.', + 'Repository, pipelines and performance. I administered the Tosca Cloud GitHub repository and worked on GitHub Actions and Azure Pipelines for builds, tests and releases. I optimized builds and caching and modernized development and testing tools.', + 'Design system. I worked with designers on the system shared by Tosca Cloud and NeoLoad, building the infrastructure for upgrades. I coordinated migrations with teams and updated shared components and themes myself to resolve inconsistencies between products.', + 'AI in development. I evaluated assistants on real tasks, maintained repository instructions and context, and verified changes through review and tests. Product features remained with their respective teams, where I could also contribute.', ], }, { @@ -181,10 +200,10 @@ export const en: Copy = { context: 'E-commerce platform for tree planting', tags: ['React', 'Vue', 'GraphQL', 'Storefront migration'], paragraphs: [ - 'Contribution to the storefront migration out of the monolith, as part of the frontend team, using React, Vue and GraphQL.', - 'Storefront redevelopment during the company’s growth from around 20 to more than 150 people.', - 'Interfaces for high-traffic campaigns, with regular input from the design and design system teams to incorporate requests and follow mockups and shared standards.', - 'Development of the internal back-office frontend from scratch during the final two years. Sole frontend developer on the project, working with the backend team and the forestry operations staff using the tools.', + 'I worked on the website and CMS in Vue, then helped migrate the storefront from a PHP monolith to React as the company grew from around 20 to over 150 people.', + 'As the applications moved towards microservices, I contributed to the backend-for-frontend (BFF) with Node.js and GraphQL, working alongside the backend developers.', + 'I built customer features and campaign pages, working regularly with the design and design system teams to follow mockups and shared standards.', + 'For the final two years, I was the only frontend developer on the back-office team. I built its frontend from scratch with backend developers and the forestry operations staff who used it.', ], }, { @@ -210,7 +229,7 @@ export const en: Copy = { paragraphs: [ 'A role that started in design and expanded into web development, backend systems and infrastructure at client sites.', 'Design of websites, interfaces, visual identities and print material from scratch for clients.', - 'Development and maintenance of frontend and backend applications.', + 'I took websites and applications from design through development and deployment, including maintenance and troubleshooting at client sites.', 'On-site installation of servers, networks and firewalls, including for manufacturers in Tuscany’s leather and fashion district.', ], }, @@ -227,7 +246,7 @@ export const en: Copy = { name: 'Lumina', kind: 'Game development & web design', description: 'A personal project: a text-based multiplayer fantasy game.', - tags: ['Node.js', 'MongoDB', 'React', 'Cloudflare'], + tags: ['Node.js', 'MongoDB', 'Socket.io', 'React', 'Cloudflare'], href: 'https://luminamud.com/', linkLabel: 'Explore Lumina', detail: diff --git a/src/i18n/it.ts b/src/i18n/it.ts index c32bc66..1f9eb0a 100644 --- a/src/i18n/it.ts +++ b/src/i18n/it.ts @@ -94,8 +94,14 @@ export const it: Copy = { 'TypeScript', 'Vue', 'Zustand', + 'Redux Toolkit', + 'TanStack Query', + 'MUI', 'GraphQL', 'Node.js', + 'REST', + 'MongoDB', + 'PostgreSQL / MySQL', 'JavaScript', 'HTML e CSS', ], @@ -104,6 +110,7 @@ export const it: Copy = { title: 'Build system e monorepo', items: [ 'Nx', + 'Turborepo', 'pnpm workspaces', 'Vite', 'Webpack', @@ -116,6 +123,8 @@ export const it: Copy = { items: [ 'Vitest', 'Jest', + 'Testing Library', + 'ESLint / Biome', 'Playwright', 'GitHub Actions', 'Azure Pipelines', @@ -130,6 +139,8 @@ export const it: Copy = { 'Design system', 'Design token', 'Storybook', + 'PixiJS / WebGL', + 'Canvas / SVG', 'Accessibilità', ], }, @@ -149,10 +160,10 @@ export const it: Copy = { ai: { heading: 'Come uso l’AI nello sviluppo', summary: - 'Valutazione di Claude, Cursor e altri assistenti su attività reali di sviluppo. Istruzioni del repository, documentazione e strumenti condivisi per orientarli nel codice. Gli errori ricorrenti sono il punto di partenza per migliorare questo contesto, oltre a correggere il codice.', + 'Valutazione di Codex, Claude Code, Cursor e altri assistenti su attività reali di sviluppo. Istruzioni del repository, documentazione e strumenti condivisi per orientarli nel codice. Gli errori ricorrenti sono il punto di partenza per migliorare questo contesto, oltre a correggere il codice.', moreLabel: 'Come li uso nel lavoro quotidiano', paragraphs: [ - 'Il lavoro parte da attività reali in un repository condiviso tra più team: prove con Claude, Cursor e altri assistenti, analisi delle difficoltà e manutenzione delle istruzioni, della documentazione e degli strumenti usati per orientarsi nel codice.', + 'Il lavoro parte da attività reali in un repository condiviso tra più team: prove con Codex, Claude Code, Cursor e altri assistenti, analisi delle difficoltà e manutenzione delle istruzioni, della documentazione e degli strumenti usati per orientarsi nel codice.', 'Una libreria ignorata o la perdita di contesto tra moduli richiedono uno sguardo oltre la singola risposta. Cosa manca nel repository? Il problema si ripresenta dopo la correzione? Da queste verifiche nascono modifiche utili anche agli altri team.', ], rulesLead: 'Su cosa intervengo:', @@ -171,14 +182,15 @@ export const it: Copy = { title: 'Senior Software Engineer', company: 'Tricentis', specialization: 'Piattaforma frontend, governance e design system', - context: 'Esperienza su Tosca Cloud', + context: 'Esperienza su Tosca Cloud, Tosca Road e qTest', tags: ['React', 'TypeScript', 'Microfrontend', '16 progetti', '12+ team', 'Quality gates'], current: true, paragraphs: [ - 'Decisioni tra team. Punto di riferimento insieme all’architetto del team per le iniziative di Tosca Cloud sull’intera monorepo. Definizione di soluzioni condivise con sviluppatori, engineering manager, principal engineer di altre piattaforme e referenti di prodotto.', - 'Sviluppo della piattaforma. Sviluppo e manutenzione di librerie, strumenti e configurazioni condivise; risoluzione di problemi trasversali e supporto all’adozione nei team. Le feature di prodotto restavano ai rispettivi team.', - 'Migrazioni e design system. Infrastruttura per gli aggiornamenti, coordinamento con i team ed esecuzione delle migrazioni quando necessario. Interventi su componenti e temi condivisi per correggere le differenze tra prodotti.', - 'Performance e strumenti. Ottimizzazione di build e pipeline, aggiornamento degli strumenti di sviluppo e documentazione delle decisioni negli ADR. Definizione delle regole della monorepo e supporto ai team nell’applicarle.', + 'Piattaforma e governance. Su Tosca Cloud ho lavorato alla monorepo React e TypeScript condivisa da 16 progetti e oltre 12 team. Con sviluppatori, engineering manager, principal engineer e referenti di prodotto definivo le soluzioni per le iniziative comuni.', + 'Sviluppo e manutenzione. Ho sviluppato librerie, strumenti e configurazioni condivise, risolto problemi trasversali e affiancato i colleghi nelle migrazioni. Ho definito confini tra moduli e dipendenze, scritto ADR e automatizzato i controlli sulle regole della repository.', + 'Repository, pipeline e performance. Ho amministrato la repository GitHub di Tosca Cloud e lavorato su GitHub Actions e Azure Pipelines per build, test e rilasci. Ho ottimizzato build e cache e modernizzato gli strumenti di sviluppo e test.', + 'Design system. Ho collaborato con i designer sul sistema condiviso da Tosca Cloud e NeoLoad, creando l’infrastruttura per gli aggiornamenti. Ho concordato le migrazioni con i team e aggiornato anche direttamente componenti e temi per risolvere le incoerenze tra prodotti.', + 'AI nel lavoro di sviluppo. Ho valutato gli assistenti su attività reali, curato istruzioni e contesto della repository e verificato le modifiche con review e test. Le feature di prodotto restavano di competenza dei rispettivi team, ai quali potevo contribuire.', ], }, { @@ -189,10 +201,10 @@ export const it: Copy = { context: 'Piattaforma e-commerce per piantare alberi', tags: ['React', 'Vue', 'GraphQL', 'Migrazione storefront'], paragraphs: [ - 'Contributo alla migrazione dello storefront fuori dal monolite, nel team frontend, con React, Vue e GraphQL.', - 'Ricostruzione dello storefront durante la crescita dell’azienda da circa 20 a più di 150 persone.', - 'Interfacce per campagne ad alto traffico, con il confronto regolare con i team di design e design system per integrare le richieste e rispettare mockup e standard condivisi.', - 'Sviluppo da zero del frontend del back-office interno negli ultimi due anni. Unico frontend developer del progetto, insieme al team backend e alle persone delle operazioni forestali che usavano gli strumenti.', + 'Ho lavorato al sito e al CMS in Vue, poi ho partecipato alla migrazione dello storefront dal monolite PHP a React, durante la crescita dell’azienda da circa 20 a oltre 150 persone.', + 'Nel passaggio verso i microservizi ho contribuito al backend-for-frontend (BFF) con Node.js e GraphQL, collaborando con i colleghi che seguivano il backend.', + 'Ho sviluppato funzionalità e pagine per le campagne, confrontandomi regolarmente con i team di design e design system per rispettare mockup e standard condivisi.', + 'Negli ultimi due anni ero l’unico frontend developer nel team del back-office: l’ho costruito da zero insieme agli sviluppatori backend e alle persone delle operazioni forestali che lo usavano.', ], }, { @@ -218,7 +230,7 @@ export const it: Copy = { paragraphs: [ 'Un ruolo iniziato nel design e ampliato negli anni allo sviluppo web, ai sistemi backend e all’infrastruttura presso i clienti.', 'Progettazione da zero di siti, interfacce, identità visive e materiali per la stampa per i clienti.', - 'Sviluppo e manutenzione di applicazioni frontend e backend.', + 'Ho seguito siti e applicazioni dalla progettazione allo sviluppo e al rilascio, occupandomi anche della manutenzione e della risoluzione dei problemi presso i clienti.', 'Installazione di server, reti e firewall presso i clienti, comprese le manifatture del distretto toscano della pelle e della moda.', ], }, @@ -235,7 +247,7 @@ export const it: Copy = { name: 'Lumina', kind: 'Sviluppo di giochi e web design', description: 'Un progetto personale: un gioco fantasy multiplayer basato sul testo.', - tags: ['Node.js', 'MongoDB', 'React', 'Cloudflare'], + tags: ['Node.js', 'MongoDB', 'Socket.io', 'React', 'Cloudflare'], href: 'https://luminamud.com/', linkLabel: 'Esplora Lumina', detail: diff --git a/tests/e2e/homepage.spec.ts b/tests/e2e/homepage.spec.ts index c54b744..3f0f419 100644 --- a/tests/e2e/homepage.spec.ts +++ b/tests/e2e/homepage.spec.ts @@ -176,7 +176,14 @@ for (const locale of ['en', 'it'] as const) { .evaluateAll((nodes) => nodes.map((node) => node.id)); expect(sections.indexOf('experience')).toBeGreaterThan(sections.indexOf('top')); expect(sections.indexOf('experience')).toBeLessThan(sections.indexOf('projects')); - await expect(page.locator('.work .job').first().locator('.duty b')).toHaveCount(4); + const duties = page.locator('.work .job').first().locator('.duty'); + const paragraphs = copy.work[0]?.paragraphs ?? []; + expect(paragraphs.length).toBeGreaterThan(0); + await expect(duties).toHaveCount(paragraphs.length); + for (const [index, paragraph] of paragraphs.entries()) { + await expect(duties.nth(index).locator('p')).toHaveText(plain(paragraph)); + await expect(duties.nth(index).locator('b')).toHaveCount(1); + } }); test('closes on an invitation and a labelled email action', async ({ page }) => { diff --git a/tests/unit/i18n.test.ts b/tests/unit/i18n.test.ts index e26bfec..cccfe26 100644 --- a/tests/unit/i18n.test.ts +++ b/tests/unit/i18n.test.ts @@ -80,7 +80,7 @@ describe('the work history', () => { expect(leafPaths(cvEn).sort()).toEqual(leafPaths(cvIt).sort()); expect(cvEn.title).toBe(cvIt.title); expect(cvEn.jobs.map((job) => job.company)).toEqual(cvIt.jobs.map((job) => job.company)); - expect(cvEn.jobs[0]?.context).toBe('Work on Tosca Cloud'); + expect(cvEn.jobs[0]?.context).toBe(getCopy('en').work[0]?.context); expect(cvEn.jobs[0]?.dates).toBe('2023 - present'); expect(cvEn.profile).not.toMatch(/Tricentis|Staff Engineer|full.stack/i); expect(cvEn.skills.map(([, entries]) => entries?.split('|').length)).toEqual( @@ -115,7 +115,7 @@ describe('the work history', () => { 'azione esplicita', ); expect(cvIt.jobs[0]?.company).toBe('Tricentis'); - expect(cvIt.jobs[0]?.context).toBe('Esperienza su Tosca Cloud'); + expect(cvIt.jobs[0]?.context).toBe(getCopy('it').work[0]?.context); expect(cvIt.jobs[0]?.dates).toBe('2023 - oggi'); expect(cvIt.jobs[0]?.bullet_labels).toHaveLength(cvIt.jobs[0]?.bullets.length ?? 0); }); @@ -144,7 +144,7 @@ describe('focus and personal projects', () => { const copy = getCopy(locale); const currentRole = copy.work[0]?.paragraphs.join(' ') ?? ''; expect(currentRole).toContain('ADR'); - expect(currentRole).toContain('design system'); + expect(currentRole).toMatch(/design system/i); expect(currentRole).not.toContain('Playwright'); expect(copy.focus.flatMap((group) => group.items)).toContain('Playwright'); expect(copy.focus.flatMap((group) => group.items)).toContain('Zustand');