From b965a4a4d6d13ab7454b1f8bc7ad88c45df5c678 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 9 Jul 2026 02:37:08 +0000 Subject: [PATCH 01/13] feat: upgrade to Node 24, pnpm 11 with workspace config - Add .nvmrc for Node 24 - Create pnpm-workspace.yaml with security overrides - Update engine constraints in all package.json files - Add packageManager field for pnpm 11.10.0 - Update GitHub Actions workflows to use Node 24 - Update install-cache-deps action for pnpm 11 - Update back.Dockerfile to use node:24-alpine Closes #1334, #1337 Co-authored-by: Dan Grebb --- .github/actions/install-cache-deps/action.yml | 2 +- .github/workflows/backstop-remote.yml | 2 +- .github/workflows/bd-fe.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/test-backstop.yml | 2 +- .github/workflows/test-lighthouse.yml | 2 +- .github/workflows/test-psi.yml | 2 +- .nvmrc | 1 + _ci/backstop/package.json | 6 +++--- _ci/perf/package.json | 6 +++--- _docker/back.Dockerfile | 4 ++-- back/package.json | 6 +++--- front/package.json | 6 +++--- pnpm-workspace.yaml | 20 +++++++++++++++++++ 14 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 .nvmrc create mode 100644 pnpm-workspace.yaml diff --git a/.github/actions/install-cache-deps/action.yml b/.github/actions/install-cache-deps/action.yml index 9ed70cc22..b9c729804 100644 --- a/.github/actions/install-cache-deps/action.yml +++ b/.github/actions/install-cache-deps/action.yml @@ -34,7 +34,7 @@ runs: - name: Install pnpm shell: bash - run: npm install -g pnpm@9 + run: npm install -g pnpm@11 - name: Get pnpm store directory shell: bash diff --git a/.github/workflows/backstop-remote.yml b/.github/workflows/backstop-remote.yml index cf4f7c5c0..75fbfdea3 100644 --- a/.github/workflows/backstop-remote.yml +++ b/.github/workflows/backstop-remote.yml @@ -11,7 +11,7 @@ permissions: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: backstop: diff --git a/.github/workflows/bd-fe.yml b/.github/workflows/bd-fe.yml index ec464b6af..03f30ff9c 100644 --- a/.github/workflows/bd-fe.yml +++ b/.github/workflows/bd-fe.yml @@ -68,7 +68,7 @@ permissions: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: build_deploy: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 945edd58e..7187f4323 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ on: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: lint: diff --git a/.github/workflows/test-backstop.yml b/.github/workflows/test-backstop.yml index 364f7dd2a..32b141be8 100644 --- a/.github/workflows/test-backstop.yml +++ b/.github/workflows/test-backstop.yml @@ -30,7 +30,7 @@ permissions: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: backstop: diff --git a/.github/workflows/test-lighthouse.yml b/.github/workflows/test-lighthouse.yml index c175ae778..3a7232f99 100644 --- a/.github/workflows/test-lighthouse.yml +++ b/.github/workflows/test-lighthouse.yml @@ -23,7 +23,7 @@ on: GH_WORKFLOW_TOKEN: required: true env: - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: lighthouse: diff --git a/.github/workflows/test-psi.yml b/.github/workflows/test-psi.yml index 6fa42cf72..97a87b2c8 100644 --- a/.github/workflows/test-psi.yml +++ b/.github/workflows/test-psi.yml @@ -21,7 +21,7 @@ permissions: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - NODE_VERSION: 20 + NODE_VERSION: 24 jobs: psi: diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..a45fd52cc --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/_ci/backstop/package.json b/_ci/backstop/package.json index 8b2442c06..7935b5931 100644 --- a/_ci/backstop/package.json +++ b/_ci/backstop/package.json @@ -35,10 +35,10 @@ "super-simple-web-server": "github:dgrebb/super-simple-web-server#0.0.2" }, "engines": { - "node": ">=16.0.0 <=20.x.x", - "npm": ">=6.0.0", - "pnpm": ">= 8.14.1" + "node": ">=22.0.0", + "pnpm": ">=11.0.0" }, + "packageManager": "pnpm@11.10.0", "pnpm": { "overrides": { "braces@<3.0.3": ">=3.0.3", diff --git a/_ci/perf/package.json b/_ci/perf/package.json index d7aa9fe61..77d75c700 100644 --- a/_ci/perf/package.json +++ b/_ci/perf/package.json @@ -29,10 +29,10 @@ "npm-check-updates": "^16.14.18" }, "engines": { - "node": ">=16.0.0 <=20.x.x", - "npm": ">=6.0.0", - "pnpm": ">= 8.14.1" + "node": ">=22.0.0", + "pnpm": ">=11.0.0" }, + "packageManager": "pnpm@11.10.0", "pnpm": { "overrides": { "braces@<3.0.3": ">=3.0.3", diff --git a/_docker/back.Dockerfile b/_docker/back.Dockerfile index 203ec5e15..0a4420c30 100644 --- a/_docker/back.Dockerfile +++ b/_docker/back.Dockerfile @@ -1,5 +1,5 @@ # -------- Base -------- # -FROM node:20-alpine AS base +FROM node:24-alpine AS base # Installing libvips-dev for sharp Compatibility RUN apk update && apk add --no-cache build-base \ gcc autoconf automake zlib-dev libpng-dev \ @@ -23,7 +23,7 @@ ENV NODE_ENV=${NODE_ENV} RUN pnpm run build # -------- Run -------- # -FROM node:20-alpine +FROM node:24-alpine COPY --from=build /app /app WORKDIR /app ENV PNPM_HOME="/pnpm" diff --git a/back/package.json b/back/package.json index a0e25a8b5..2ce7c7904 100644 --- a/back/package.json +++ b/back/package.json @@ -30,10 +30,10 @@ "strapi-plugin-config-sync": "^1.2.5" }, "engines": { - "node": ">=16.0.0 <=20.x.x", - "npm": ">=6.0.0", - "pnpm": ">= 8.14.1" + "node": ">=22.0.0", + "pnpm": ">=11.0.0" }, + "packageManager": "pnpm@11.10.0", "strapi": {}, "devDependencies": { "prop-types": "^15.8.1" diff --git a/front/package.json b/front/package.json index d31896469..bae0bdbc5 100644 --- a/front/package.json +++ b/front/package.json @@ -76,10 +76,10 @@ "vitest": "^2.0.5" }, "engines": { - "node": ">=16.0.0 <=20.x.x", - "npm": ">=6.0.0", - "pnpm": ">= 8.14.1" + "node": ">=22.0.0", + "pnpm": ">=11.0.0" }, + "packageManager": "pnpm@11.10.0", "type": "module", "pnpm": { "patchedDependencies": { diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..102d1ecca --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,20 @@ +packages: + - 'front' + - 'back' + - '_ci/*' + +onlyBuiltDependencies: + - '@rollup/rollup-linux-x64-gnu' + - '@swc/core' + - better-sqlite3 + - esbuild + - sharp + - '@img/sharp-linux-x64' + +pnpmOverrides: + braces@<3.0.3: '>=3.0.3' + follow-redirects@<1.15.6: '>=1.15.6' + sanitize-html@<2.12.1: '>=2.12.1' + tar@<6.2.1: '>=6.2.1' + vite@<5.1.7: '>=5.4.0' + webpack-dev-middleware@<6.1.2: '>=6.1.2' From 1d6ab8bdfe1f1db8aa84e3162ec54f904f468692 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 9 Jul 2026 02:43:59 +0000 Subject: [PATCH 02/13] feat: migrate to Svelte 5 with runes and snippets - Update Svelte to v5.56.4, SvelteKit to v2.69.1 - Update @sveltejs/vite-plugin-svelte to v5.0.3 - Update svelte-check to v4.2.1 Migration changes: - Convert all 'export let' to '$props()' rune - Convert '$:' reactive statements to '$derived' and '$effect' - Convert '' to '{@render children?.()}' - Convert named slots to snippet props - Update event handlers from 'on:' to callback syntax (onclick, etc) - Update '$state()' for component-level reactive variables Components migrated (51 files): - All route files (+layout, +page, +error) - All CV components (Award, Certification, Experience, etc) - All general components (Image, Links, Meta, PageNav, etc) - All posts components (Post, Code, Footnotes, etc) - Layout components (Header, Footer, NavBar, etc) Closes #1335 Co-authored-by: Dan Grebb --- front/package.json | 10 ++-- front/src/lib/components/cv/Award.svelte | 4 +- .../lib/components/cv/Certification.svelte | 4 +- .../lib/components/cv/Classification.svelte | 4 +- .../cv/Experience/Experience.svelte | 23 +++++---- front/src/lib/components/cv/Industry.svelte | 4 +- .../src/lib/components/cv/Organization.svelte | 4 +- front/src/lib/components/cv/Project.svelte | 23 +++++---- front/src/lib/components/cv/Skill.svelte | 4 +- .../cv/SkillBreakdown/SkillBreakdown.svelte | 2 +- front/src/lib/components/cv/Timeline.svelte | 2 +- .../lib/components/general/Aside/Aside.svelte | 3 +- .../general/Aside/AsideGroup.svelte | 2 +- front/src/lib/components/general/Image.svelte | 24 +++++----- front/src/lib/components/general/Links.svelte | 8 ++-- front/src/lib/components/general/Meta.svelte | 4 +- .../lib/components/general/MetaTags.svelte | 47 ++++++++++--------- .../general/PageNav/ClosePageNav.svelte | 2 +- .../components/general/PageNav/PageNav.svelte | 26 +++++----- .../components/general/PageTransition.svelte | 12 ++--- .../src/lib/components/general/Popover.svelte | 9 ++-- .../general/TransitionElasticFly.svelte | 11 ++--- .../components/general/TransitionFade.svelte | 32 ++----------- .../src/lib/components/icons/SkillIcon.svelte | 21 +++------ .../lib/components/posts/AnimatedImage.svelte | 9 ++-- .../lib/components/posts/BlockQuote.svelte | 5 +- .../src/lib/components/posts/Code/Code.svelte | 29 +++++++----- .../lib/components/posts/Code/CodeCopy.svelte | 11 +++-- .../src/lib/components/posts/Footnotes.svelte | 2 +- front/src/lib/components/posts/Post.svelte | 41 +++++++--------- .../src/lib/components/posts/PostHero.svelte | 27 +---------- .../src/lib/components/posts/PostText.svelte | 2 +- .../src/lib/components/posts/PostsGrid.svelte | 2 +- .../lib/components/posts/PostsGridItem.svelte | 4 +- .../components/posts/TableOfContents.svelte | 10 ++-- front/src/lib/layout/Footer.svelte | 4 +- front/src/lib/layout/Header.svelte | 4 +- front/src/lib/layout/NavBar.svelte | 4 +- front/src/lib/layout/NavHome.svelte | 3 +- front/src/lib/layout/ThemeToggle.svelte | 4 +- front/src/routes/(layouts)/Article.svelte | 7 +-- front/src/routes/+error.svelte | 4 +- front/src/routes/+layout.svelte | 17 +++---- front/src/routes/+page.svelte | 4 +- front/src/routes/cv/+page.svelte | 2 +- front/src/routes/cv/[collection]/+page.svelte | 21 ++++----- .../cv/[collection]/[slug]/+page.svelte | 14 +++--- front/src/routes/post/[slug]/+page.svelte | 44 ++++++++--------- front/src/routes/posts/+page.svelte | 2 +- .../posts/category/[...category]/+page.svelte | 18 ++++--- front/src/routes/privacy/+page.svelte | 2 +- 51 files changed, 262 insertions(+), 319 deletions(-) diff --git a/front/package.json b/front/package.json index bae0bdbc5..479d96f62 100644 --- a/front/package.json +++ b/front/package.json @@ -42,9 +42,9 @@ "@iconify-json/simple-icons": "^1.1.114", "@iconify-json/typcn": "^1.1.10", "@playwright/test": "^1.46.1", - "@sveltejs/adapter-static": "^3.0.4", - "@sveltejs/kit": "^2.5.24", - "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.69.1", + "@sveltejs/vite-plugin-svelte": "^5.0.3", "autoprefixer": "^10.4.20", "eslint": "^9.9.1", "eslint-config-prettier": "^9.1.0", @@ -64,8 +64,8 @@ "rollup-plugin-bundle-stats": "^4.14.2", "rollup-plugin-visualizer": "^5.12.0", "slugger": "^1.0.1", - "svelte": "^4.2.19", - "svelte-check": "^3.8.6", + "svelte": "^5.56.4", + "svelte-check": "^4.2.1", "svelte-highlight": "7.6.1", "svelte-meta-tags": "^3.1.3", "svelte-sitemap": "^2.6.0", diff --git a/front/src/lib/components/cv/Award.svelte b/front/src/lib/components/cv/Award.svelte index 4c574b764..3809d22fb 100644 --- a/front/src/lib/components/cv/Award.svelte +++ b/front/src/lib/components/cv/Award.svelte @@ -2,8 +2,8 @@ import { PATHS } from '$lib/CONSTANTS'; const { experience: exPath, project: projPath } = PATHS.one; - export let content; - let { + let { content } = $props(); + const { name, body, experiences: { data: experiences }, diff --git a/front/src/lib/components/cv/Certification.svelte b/front/src/lib/components/cv/Certification.svelte index 40e8853b6..886449bf0 100644 --- a/front/src/lib/components/cv/Certification.svelte +++ b/front/src/lib/components/cv/Certification.svelte @@ -1,8 +1,8 @@ -
-
+{#snippet headerSnippet()} +

Professional Experience

{name} @@ -32,15 +32,16 @@ {/if}

+{/snippet} -
+{/snippet} + +
diff --git a/front/src/lib/components/cv/Industry.svelte b/front/src/lib/components/cv/Industry.svelte index c70de7d00..4178771d0 100644 --- a/front/src/lib/components/cv/Industry.svelte +++ b/front/src/lib/components/cv/Industry.svelte @@ -7,8 +7,8 @@ skill: skillPath, } = PATHS.one; - export let content; - let { + let { content } = $props(); + const { name, skills: { data: skills }, organizations: { data: organizations }, diff --git a/front/src/lib/components/cv/Organization.svelte b/front/src/lib/components/cv/Organization.svelte index 9580ba986..cacba88e8 100644 --- a/front/src/lib/components/cv/Organization.svelte +++ b/front/src/lib/components/cv/Organization.svelte @@ -6,8 +6,8 @@ project: projPath, skill: skillPath, } = PATHS.one; - export let content; - let { + let { content } = $props(); + const { name, body, industries: { data: industries }, diff --git a/front/src/lib/components/cv/Project.svelte b/front/src/lib/components/cv/Project.svelte index 3cdd13a44..0d336d52d 100644 --- a/front/src/lib/components/cv/Project.svelte +++ b/front/src/lib/components/cv/Project.svelte @@ -4,9 +4,9 @@ import AsideGroup from '@components/general/Aside/AsideGroup.svelte'; import '@styles/pages/skills.css'; - export let content; - let collection = 'projects'; - let { + let { content } = $props(); + const collection = 'projects'; + const { name, body, artifacts, @@ -17,13 +17,15 @@ } = content.project; -
-
+{#snippet headerSnippet()} +

Projects

{name}

+{/snippet} -
+{/snippet} + +
diff --git a/front/src/lib/components/cv/Skill.svelte b/front/src/lib/components/cv/Skill.svelte index 866eebca0..e23e29fd4 100644 --- a/front/src/lib/components/cv/Skill.svelte +++ b/front/src/lib/components/cv/Skill.svelte @@ -10,9 +10,9 @@ classification: classPath, certification: certPath, } = PATHS.one; - export let content; + let { content } = $props(); - let { + const { name, body, hero, diff --git a/front/src/lib/components/cv/SkillBreakdown/SkillBreakdown.svelte b/front/src/lib/components/cv/SkillBreakdown/SkillBreakdown.svelte index 1799bcf61..caafe964a 100644 --- a/front/src/lib/components/cv/SkillBreakdown/SkillBreakdown.svelte +++ b/front/src/lib/components/cv/SkillBreakdown/SkillBreakdown.svelte @@ -3,7 +3,7 @@ import SkillIcon from '@components/icons/SkillIcon.svelte'; import { getHighContrastHexColor, getRGBFromHex } from '@utils'; - export let skills; + let { skills } = $props();
diff --git a/front/src/lib/components/cv/Timeline.svelte b/front/src/lib/components/cv/Timeline.svelte index 5c31f93df..6ae0800af 100644 --- a/front/src/lib/components/cv/Timeline.svelte +++ b/front/src/lib/components/cv/Timeline.svelte @@ -5,7 +5,7 @@ import Calendar from '@components/icons/Calendar.svelte'; import '@styles/pages/cv.css'; - export let items; + let { items } = $props(); const currentYear = new Date().getFullYear(); diff --git a/front/src/lib/components/general/Aside/Aside.svelte b/front/src/lib/components/general/Aside/Aside.svelte index bf92a8bd1..27ce1bb10 100644 --- a/front/src/lib/components/general/Aside/Aside.svelte +++ b/front/src/lib/components/general/Aside/Aside.svelte @@ -1,12 +1,13 @@