From 77bcef55c8471b1d7ae1bec834d54421dfaa5f78 Mon Sep 17 00:00:00 2001 From: AeroBytesNL Date: Tue, 26 Aug 2025 16:00:49 +0200 Subject: [PATCH 01/26] Fixed Package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9990155..bf319fe 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "dev": "next dev --turbopack", "build": "next build --turbopack", "export": "next export", - "start": "next start", + "start": "next start -H 0.0.0.0 -p 3000", "lint": "eslint" }, "dependencies": { From cc225bf2d65933b5506d1d2cba9e7ea0ca8593eb Mon Sep 17 00:00:00 2001 From: AeroBytesNL Date: Tue, 26 Aug 2025 19:45:51 +0200 Subject: [PATCH 02/26] Added ads.txt --- .idea/workspace.xml | 76 +++++++++++++++++---------------------------- public/ads.txt | 1 + 2 files changed, 30 insertions(+), 47 deletions(-) create mode 100644 public/ads.txt diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 99616d3..80792d6 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,15 +4,9 @@ - - @@ -698,21 +693,8 @@ - - - - - - file://$PROJECT_DIR$/inertia/pages/home.tsx - 13 - - - file://$PROJECT_DIR$/inertia/pages/about-us/page.tsx - - - + + + \ No newline at end of file diff --git a/public/ads.txt b/public/ads.txt new file mode 100644 index 0000000..c208c76 --- /dev/null +++ b/public/ads.txt @@ -0,0 +1 @@ +google.com, pub-4182887018676693, DIRECT, f08c47fec0942fa0 From 1830c49872a3dab0a7291cc6ab8e5f434884b906 Mon Sep 17 00:00:00 2001 From: AeroBytesNL Date: Tue, 26 Aug 2025 21:14:01 +0200 Subject: [PATCH 03/26] Fixed path, added FAQ's --- .idea/workspace.xml | 97 +++++++++++++------ src/app/page.tsx | 11 ++- src/{app => }/content/about-us.md | 0 .../content/blog/how-to-make-a-good-cv.md | 0 .../how-to-make-a-good-job-apply-letter.md | 0 .../content/blog/prepare-for-job-interview.md | 0 .../content/blog/why-i-created-this.md | 0 .../content/faq/can-i-add-my-linkedin.md | 0 src/content/faq/can-i-edit-my-cv.md | 8 ++ src/content/faq/can-i-make-multiple-cvs.md | 7 ++ src/content/faq/do-i-need-to-a-account.md | 7 ++ .../faq/do-i-need-to-have-an-selfie.md | 8 ++ .../does-klikcv-support-multiple-languages.md | 0 .../faq/how-does-this-free-cv-maker-work.md | 7 ++ .../faq/how-does-this-website-get-paid.md | 8 ++ src/content/faq/how-long-may-my-cv-be.md | 8 ++ src/content/faq/is-my-data-safe.md | 7 ++ src/content/faq/tips-to-improve-cv.md | 7 ++ .../faq/what-are-the-most-common-mistakes.md | 7 ++ .../what-if-the-best-format-to-store-cv.md | 8 ++ .../faq/what-info-needs-to-be-in-my-cv.md | 7 ++ src/{app => }/content/privacy.md | 0 src/utils/getAndParseFaqs.ts | 2 +- src/utils/getandParseMarkup.ts | 4 +- 24 files changed, 167 insertions(+), 36 deletions(-) rename src/{app => }/content/about-us.md (100%) rename src/{app => }/content/blog/how-to-make-a-good-cv.md (100%) rename src/{app => }/content/blog/how-to-make-a-good-job-apply-letter.md (100%) rename src/{app => }/content/blog/prepare-for-job-interview.md (100%) rename src/{app => }/content/blog/why-i-created-this.md (100%) rename src/{app => }/content/faq/can-i-add-my-linkedin.md (100%) create mode 100644 src/content/faq/can-i-edit-my-cv.md create mode 100644 src/content/faq/can-i-make-multiple-cvs.md create mode 100644 src/content/faq/do-i-need-to-a-account.md create mode 100644 src/content/faq/do-i-need-to-have-an-selfie.md create mode 100644 src/content/faq/does-klikcv-support-multiple-languages.md create mode 100644 src/content/faq/how-does-this-free-cv-maker-work.md create mode 100644 src/content/faq/how-does-this-website-get-paid.md create mode 100644 src/content/faq/how-long-may-my-cv-be.md create mode 100644 src/content/faq/is-my-data-safe.md create mode 100644 src/content/faq/tips-to-improve-cv.md create mode 100644 src/content/faq/what-are-the-most-common-mistakes.md create mode 100644 src/content/faq/what-if-the-best-format-to-store-cv.md create mode 100644 src/content/faq/what-info-needs-to-be-in-my-cv.md rename src/{app => }/content/privacy.md (100%) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 80792d6..cbec56c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,31 @@ - @@ -702,7 +698,8 @@ - diff --git a/src/app/page.tsx b/src/app/page.tsx index c9c79a4..8880372 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,6 +3,7 @@ import MakeCvButton from "@/components/buttons/makeCvButton"; import FAQClient from "@/components/core/faqClient"; import type {FaqType} from "@/types/faq"; import getAndParseFaqs from "@/utils/getAndParseFaqs"; +import Image from "next/image"; export default async function Home() { const allFaqs: FaqType[] = await getAndParseFaqs(); @@ -30,9 +31,11 @@ export default async function Home() {
- Luna template

@@ -41,9 +44,11 @@ export default async function Home() {

- Nova template

@@ -52,9 +57,11 @@ export default async function Home() {

- Orion template

From b0ab4e2f71f704e8d13eedb00fbe822691451440 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 28 Aug 2025 14:11:46 +0200 Subject: [PATCH 09/26] Added add to homepage --- .idea/workspace.xml | 38 +++++++++++++++++++------------------- src/app/page.tsx | 4 ++++ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3971075..c9a9f5b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -65,26 +65,26 @@

+
+
); From bdace658cdcca57850e75f6a7b4cc44636880372 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 09:40:55 +0200 Subject: [PATCH 10/26] Fixed layout issue --- .idea/workspace.xml | 73 ++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c9a9f5b..7a1bd2d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,9 @@ - @@ -699,7 +703,8 @@ - From a74665bea2b22c63c40b84faa37cc586fb16f9b5 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 09:41:01 +0200 Subject: [PATCH 11/26] Fixed layout issue --- src/app/cv/bouw/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/cv/bouw/page.tsx b/src/app/cv/bouw/page.tsx index 4648c76..289e842 100644 --- a/src/app/cv/bouw/page.tsx +++ b/src/app/cv/bouw/page.tsx @@ -208,7 +208,7 @@ export default function CvBuilder() {
updateListItem('educations', index, 'name', value)} /> -
+
updateListItem('educations', index, 'institution', value)} /> updateListItem('educations', index, 'place', value)} /> @@ -264,7 +264,7 @@ export default function CvBuilder() { updateListItem('workExperiences', index, 'jobTitle', value)} /> -
+
updateListItem('workExperiences', index, 'employer', value)} /> From a0504a0c38ad7cee258dc0745a7790c7f754c657 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 09:52:48 +0200 Subject: [PATCH 12/26] Removed font-bold from isActive navbar --- .idea/workspace.xml | 43 +++++++++++++++++----------------- src/app/cv/bouw/page.tsx | 6 ++--- src/components/core/navbar.tsx | 2 +- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7a1bd2d..37c2507 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,10 @@ - @@ -704,7 +704,8 @@ - diff --git a/src/app/cv/bouw/page.tsx b/src/app/cv/bouw/page.tsx index 289e842..8b9b370 100644 --- a/src/app/cv/bouw/page.tsx +++ b/src/app/cv/bouw/page.tsx @@ -236,7 +236,7 @@ export default function CvBuilder() {
-

Omschrijving

+

Omschrijving

updateListItem('educations', index, 'description', val)} />
@@ -292,7 +292,7 @@ export default function CvBuilder() {
-

Omschrijving

+

Omschrijving

updateListItem('workExperiences', index, 'description', val)} />
@@ -377,7 +377,7 @@ export default function CvBuilder() { {/* Description */}
-

Omschrijving

+

Omschrijving

diff --git a/src/components/core/navbar.tsx b/src/components/core/navbar.tsx index e11d244..6c7f861 100644 --- a/src/components/core/navbar.tsx +++ b/src/components/core/navbar.tsx @@ -40,7 +40,7 @@ export default function Navbar() { if (!currentPath) return "text-gray-700 dark:text-white hover:text-orange-600"; return currentPath === path - ? "text-orange-600 font-semibold" + ? "text-orange-600" : "text-gray-700 hover:text-orange-600 dark:text-white"; }; From ba750423da0fe618acf807b38c68ba241549f5e4 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 10:07:07 +0200 Subject: [PATCH 13/26] Updated about us --- src/content/about-us.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/about-us.md b/src/content/about-us.md index 8202b42..62acd44 100644 --- a/src/content/about-us.md +++ b/src/content/about-us.md @@ -11,3 +11,5 @@ Onze missie is om jou te helpen je carrièrekansen te vergroten door een profess KlikCV is dan ook gratis, omdat we vinden dat een goed cv geen luxe mag zijn, maar een recht voor iedereen. Maak vandaag nog je gratis cv en zet de eerste stap naar jouw droombaan! + +Vragen? Mail naar contact@klikcv.nl. \ No newline at end of file From 5cedd33d984b758eb7812db32e428f5ed048cd3c Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 10:08:00 +0200 Subject: [PATCH 14/26] Updated sitemap --- .idea/workspace.xml | 47 ++++++++++++++++++++++----------------------- public/sitemap.xml | 2 +- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 37c2507..4b23599 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,10 +4,9 @@ - - @@ -705,7 +702,9 @@ - diff --git a/public/sitemap.xml b/public/sitemap.xml index 33c0f48..132d863 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,7 +1,7 @@ https://klikcv.nl/ - 2025-08-26 + 2025-09-17 monthly 1.0 From 3aeed8931fa60f98a5d2d78c13d5217b92dccca0 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Wed, 17 Sep 2025 10:29:22 +0200 Subject: [PATCH 15/26] Fixed layout --- .idea/workspace.xml | 29 +++++++++++++++-------------- src/app/cv/bouw/page.tsx | 28 +++++++++++++++++++--------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4b23599..89d5caf 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,9 @@ - + - + @@ -679,7 +680,6 @@ - @@ -704,7 +704,8 @@ - diff --git a/src/app/cv/bouw/page.tsx b/src/app/cv/bouw/page.tsx index 8b9b370..050891d 100644 --- a/src/app/cv/bouw/page.tsx +++ b/src/app/cv/bouw/page.tsx @@ -401,7 +401,7 @@ export default function CvBuilder() { {collapsedSections.skills && ( -
+
{cvData.skills.map((skill: any, index: number) => (
@@ -425,7 +425,7 @@ export default function CvBuilder() { {collapsedSections.languages && ( -
+
{cvData.languages.map((lang: any, index: number) => (
@@ -465,24 +465,34 @@ export default function CvBuilder() { {collapsedSections.hobbies && ( -
+
{cvData.hobbies.map((hobby: any, index: number) => ( -
-
- addListItem('hobbies', { language: '', level: '' })} /> - removeListItem('hobbies', index)} /> +
+
+ addListItem('hobbies', { name: '' })} + /> + removeListItem('hobbies', index)} + />
updateListItem('hobbies', index, 'name', value)} + onChange={value => + updateListItem('hobbies', index, 'name', value) + } />
))}
)} +
-
- ) + + + ); } diff --git a/src/components/core/Spinner.tsx b/src/components/core/Spinner.tsx new file mode 100644 index 0000000..a30cf47 --- /dev/null +++ b/src/components/core/Spinner.tsx @@ -0,0 +1,16 @@ +export default function Spinner() { + return ( +
+ + Loading... +
+ ); +} \ No newline at end of file diff --git a/src/utils/exporttoPdf.ts b/src/utils/exporttoPdf.ts index b6643db..faf4bff 100644 --- a/src/utils/exporttoPdf.ts +++ b/src/utils/exporttoPdf.ts @@ -1,32 +1,37 @@ -import html2canvas from 'html2canvas-pro'; -import jsPDF from 'jspdf'; - -export const exportToPdf = async (elementId: string) => { - const input = document.getElementById(elementId); - if (!input) return console.error('Input element not found.'); - - const canvas = await html2canvas(input, { scale: 2, useCORS: true }); - const imgData: string = canvas.toDataURL('image/jpeg', 1.0); - const pdf = new jsPDF('p', 'mm', 'a4'); - - const a4Width: number = pdf.internal.pageSize.getWidth(); - const a4Height: number = pdf.internal.pageSize.getHeight(); - - const pxPerMm: number = canvas.width / a4Width; - const imgWidth: number = a4Width; - const imgHeight: number = canvas.height / pxPerMm; - - let totalPages: number = Math.ceil(imgHeight / a4Height); - - // Hacky workaround - if (totalPages > 2) totalPages -= 1; - - for (let i: number = 0; i < totalPages; i++) { - if (i > 0) pdf.addPage(); - - const position: number = -i * a4Height; - pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight); - } - - pdf.save('cv.pdf'); -}; +export async function exportToPdf() { + console.log("Generating PDF..."); + + const element = document.getElementById("pdf"); + + if (!element) return; + + const content = element.outerHTML; + + const html = ` + + + + + + + ${content} + + + `; + + const res = await fetch("/api/generate-pdf", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ html }), + }); + + const blob = await res.blob(); + const url = window.URL.createObjectURL(blob); + + const link = document.createElement("a"); + link.href = url; + link.download = "download.pdf"; + link.click(); + + window.URL.revokeObjectURL(url); +} From 40153a9b0d506b8a80f6d0b403b4920540f87427 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 09:53:53 +0200 Subject: [PATCH 18/26] Added Puppeteer --- package-lock.json | 869 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 851 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 376fc51..34c3c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "marked": "^16.2.0", "next": "15.5.0", "pell": "^1.0.6", + "puppeteer": "^24.22.0", "react": "19.1.0", "react-dom": "19.1.0" }, @@ -62,6 +63,29 @@ "lru-cache": "^10.4.3" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/runtime": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", @@ -1107,6 +1131,27 @@ "node": ">=12.4.0" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.2", + "tar-fs": "^3.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1421,6 +1466,12 @@ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", @@ -1464,7 +1515,7 @@ "version": "20.19.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1511,6 +1562,16 @@ "license": "MIT", "optional": true }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.40.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", @@ -2117,11 +2178,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2137,7 +2206,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/aria-query": { @@ -2310,6 +2378,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -2375,6 +2455,20 @@ "node": ">= 0.4" } }, + "node_modules/b4a": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2382,6 +2476,90 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -2391,6 +2569,15 @@ "node": ">= 0.6.0" } }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2427,6 +2614,15 @@ "node": ">= 0.4.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2481,7 +2677,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2554,12 +2749,39 @@ "node": ">=18" } }, + "node_modules/chromium-bidi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", + "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -2578,7 +2800,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2591,7 +2812,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -2624,6 +2844,32 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/croppie": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz", @@ -2693,6 +2939,15 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -2761,9 +3016,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2826,6 +3081,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -2836,6 +3105,12 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", + "license": "BSD-3-Clause" + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2880,6 +3155,15 @@ "dev": true, "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -2906,6 +3190,30 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -3083,6 +3391,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3096,6 +3413,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "9.33.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", @@ -3519,7 +3857,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3529,12 +3866,31 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3542,6 +3898,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", @@ -3596,6 +3958,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -3754,6 +4125,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -3793,6 +4173,21 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -3824,6 +4219,20 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4079,7 +4488,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4117,6 +4525,15 @@ "node": ">= 0.4" } }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4295,6 +4712,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", @@ -4599,14 +5025,12 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4661,6 +5085,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5005,6 +5435,12 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5160,6 +5596,12 @@ "node": ">= 18" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -5223,6 +5665,15 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/next": { "version": "15.5.0", "resolved": "https://registry.npmjs.org/next/-/next-15.5.0.tgz", @@ -5432,6 +5883,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5500,11 +5960,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -5513,6 +6004,24 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", @@ -5558,6 +6067,12 @@ "integrity": "sha512-wuackvgjFCHmVABy7ACSmY2u53w+TlYFrVL2hN6V3rGL/iWWwVXMw2uphpZSXNnqFQTI8nMpD3UNNX8+R4BAYw==", "license": "MIT" }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5646,6 +6161,15 @@ "node": ">= 0.8.0" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -5658,6 +6182,50 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5667,6 +6235,45 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.0.tgz", + "integrity": "sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "8.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1495869", + "puppeteer-core": "24.22.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.0.tgz", + "integrity": "sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "8.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1495869", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5777,6 +6384,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -5802,7 +6418,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -5952,7 +6567,6 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6162,6 +6776,54 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6208,6 +6870,39 @@ "node": ">= 0.4" } }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6321,6 +7016,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6443,6 +7150,40 @@ "node": ">=18" } }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", @@ -6678,11 +7419,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6715,7 +7462,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -6790,6 +7537,12 @@ "node": ">=18" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -6948,6 +7701,29 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -6984,6 +7760,15 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", @@ -6994,6 +7779,43 @@ "node": ">=18" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -7006,6 +7828,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index bf319fe..c938efd 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "marked": "^16.2.0", "next": "15.5.0", "pell": "^1.0.6", + "puppeteer": "^24.22.0", "react": "19.1.0", "react-dom": "19.1.0" }, From 95024a8931f99ddeb624c78abf4f8b837fa00569 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 09:59:04 +0200 Subject: [PATCH 19/26] Fixed typo --- .idea/workspace.xml | 47 +++++++++++++++---------------- src/app/api/generate-pdf/route.ts | 4 ++- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 05eb9cc..e8b4419 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,12 +4,9 @@ - - @@ -708,7 +703,9 @@ - diff --git a/src/app/api/generate-pdf/route.ts b/src/app/api/generate-pdf/route.ts index 6a9e4de..52e16b2 100644 --- a/src/app/api/generate-pdf/route.ts +++ b/src/app/api/generate-pdf/route.ts @@ -9,7 +9,7 @@ export async function POST(req: Request) { } const browser = await puppeteer.launch({ - headless: "new", + headless: true, args: ["--no-sandbox", "--disable-setuid-sandbox"], }); const page = await browser.newPage(); @@ -19,6 +19,8 @@ export async function POST(req: Request) { const pdfBuffer = await page.pdf({ format: "A4" }); await browser.close(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error return new NextResponse(pdfBuffer, { headers: { "Content-Type": "application/pdf", From bd2bfc27fd2c34740db733fccf2851fb4074493b Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 10:07:21 +0200 Subject: [PATCH 20/26] Fixed bug --- .idea/workspace.xml | 4 +++- src/app/cv/bouw/page.tsx | 2 +- src/components/buttons/button.tsx | 4 ++-- src/types/button.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e8b4419..636d67d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,7 +6,9 @@ - + + +
diff --git a/src/components/buttons/button.tsx b/src/components/buttons/button.tsx index bb32753..89106da 100644 --- a/src/components/buttons/button.tsx +++ b/src/components/buttons/button.tsx @@ -3,7 +3,7 @@ import type { ButtonType } from "@/types/button"; import { useState } from "react"; -export default function Button({ id, label, type, onClick }: ButtonType) { +export default function Button({ id, label, type, onClickAction }: ButtonType) { const [loading, setLoading] = useState(false); return ( @@ -13,7 +13,7 @@ export default function Button({ id, label, type, onClick }: ButtonType) { className="bg-orange-500 hover:bg-orange-600 text-white font-semibold px-6 py-3 rounded-xl transform transition-transform duration-150 active:scale-95 flex items-center gap-3" onClick={() => { setLoading(true); - onClick?.(); + onClickAction?.(); }} > {loading && ( diff --git a/src/types/button.ts b/src/types/button.ts index dca661b..cf0218b 100644 --- a/src/types/button.ts +++ b/src/types/button.ts @@ -2,5 +2,5 @@ export type ButtonType = { id?: string; label: string; type: 'button' | 'submit' | 'reset'; - onClick: () => void; + onClickAction?: () => void; } From afe3bf42b0c269658e6c148737148e2ab071ae48 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 10:13:08 +0200 Subject: [PATCH 21/26] Added chromium for puppeteer in Dockerfile --- .idea/workspace.xml | 28 +++++++++++++--------------- Dockerfile | 22 ++++++++++++++++------ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 636d67d..baa013d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,11 +4,9 @@ - @@ -707,7 +704,8 @@ - diff --git a/Dockerfile b/Dockerfile index 29f4afb..3fec9f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,33 @@ -# ------------------------ -# Builder -# ------------------------ FROM oven/bun:1 AS builder WORKDIR /app +RUN apt-get update && \ + apt-get install -y wget ca-certificates fonts-liberation libnss3 lsb-release \ + xdg-utils libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcomposite1 libxdamage1 \ + libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libxshmfence1 libdrm2 \ + libxfixes3 libxcb1 libxext6 --no-install-recommends && \ + rm -rf /var/lib/apt/lists/* + +RUN apt-get update && \ + apt-get install -y chromium && \ + rm -rf /var/lib/apt/lists/* + COPY package*.json bun.lockb* ./ RUN bun install --frozen-lockfile COPY . . RUN bun run build -# ------------------------ -# Runner -# ------------------------ + FROM oven/bun:1 AS runner WORKDIR /app +RUN apt-get update && \ + apt-get install -y chromium && \ + rm -rf /var/lib/apt/lists/* + COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package*.json ./ From eb38628b0fd9111039d1a10ce422e107b3b43d25 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 10:22:54 +0200 Subject: [PATCH 22/26] Updated Dockerfile --- .idea/workspace.xml | 24 ++++++++++++------------ Dockerfile | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index baa013d..9cbd94b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,7 +4,7 @@ - + @@ -267,14 +267,6 @@ - - - @@ -680,7 +680,6 @@ - @@ -705,7 +704,8 @@ - diff --git a/Dockerfile b/Dockerfile index 3fec9f2..f597796 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,9 @@ COPY package*.json bun.lockb* ./ RUN bun install --frozen-lockfile COPY . . + +RUN bunx puppeteer install chrome + RUN bun run build From e2d97ca144ccbb274067d9454bf945a97ebcf459 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 10:30:16 +0200 Subject: [PATCH 23/26] Updated path chromium --- .idea/workspace.xml | 26 +++++++++++++------------- src/app/api/generate-pdf/route.ts | 2 ++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9cbd94b..14c3596 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,9 @@ - + - + @@ -680,7 +680,6 @@ - @@ -705,7 +704,8 @@ - diff --git a/src/app/api/generate-pdf/route.ts b/src/app/api/generate-pdf/route.ts index 52e16b2..002f19f 100644 --- a/src/app/api/generate-pdf/route.ts +++ b/src/app/api/generate-pdf/route.ts @@ -10,8 +10,10 @@ export async function POST(req: Request) { const browser = await puppeteer.launch({ headless: true, + executablePath: '/usr/bin/chromium', args: ["--no-sandbox", "--disable-setuid-sandbox"], }); + const page = await browser.newPage(); await page.setContent(html, { waitUntil: "networkidle0" }); From 6152e63fa7058c5d3f2eca9456d0d19ffe70211e Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 10:30:25 +0200 Subject: [PATCH 24/26] Updated path chromium --- src/app/api/generate-pdf/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/generate-pdf/route.ts b/src/app/api/generate-pdf/route.ts index 002f19f..b3dae4a 100644 --- a/src/app/api/generate-pdf/route.ts +++ b/src/app/api/generate-pdf/route.ts @@ -10,7 +10,7 @@ export async function POST(req: Request) { const browser = await puppeteer.launch({ headless: true, - executablePath: '/usr/bin/chromium', + executablePath: "/usr/bin/chromium", args: ["--no-sandbox", "--disable-setuid-sandbox"], }); From 170c91cb8510e45818907fb65f68d611c4819854 Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 14:14:19 +0200 Subject: [PATCH 25/26] Added Saturnus template --- .idea/workspace.xml | 58 +++++---- next.config.ts | 1 + src/app/cv/bouw/page.tsx | 1 - src/templates/Orion.tsx | 48 +++---- src/templates/Saturnus.tsx | 252 +++++++++++++++++++++++++++++++++++++ src/utils/getTemplates.ts | 14 ++- 6 files changed, 320 insertions(+), 54 deletions(-) create mode 100644 src/templates/Saturnus.tsx diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 14c3596..5b0962c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,13 @@ - + + - + + + + @@ -680,7 +688,6 @@ - @@ -705,7 +712,8 @@ - @@ -714,6 +722,10 @@ file://$PROJECT_DIR$/src/app/faq/page.tsx diff --git a/next.config.ts b/next.config.ts index f917d61..fa30191 100644 --- a/next.config.ts +++ b/next.config.ts @@ -3,6 +3,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { eslint: { ignoreDuringBuilds: true, + }, }; diff --git a/src/app/cv/bouw/page.tsx b/src/app/cv/bouw/page.tsx index c8e2ca9..e035339 100644 --- a/src/app/cv/bouw/page.tsx +++ b/src/app/cv/bouw/page.tsx @@ -52,7 +52,6 @@ export default function CvBuilder() { getCroppedImage, } = useCropper(); - return (
{/* Builder Form */} diff --git a/src/templates/Orion.tsx b/src/templates/Orion.tsx index 9275274..f76940c 100644 --- a/src/templates/Orion.tsx +++ b/src/templates/Orion.tsx @@ -1,9 +1,9 @@ -import type { CvBuilderType } from '@/types/templates'; -import { fontMap} from '@/config/fonts'; -import { formatDate } from '@/utils/formatDate'; +import type { CvBuilderType } from "@/types/templates"; +import { fontMap} from "@/config/fonts"; +import { formatDate } from "@/utils/formatDate"; export const settings = { - padding: '0' as const, + padding: "0" as const, }; export default function Orion({ @@ -34,17 +34,17 @@ export default function Orion({ style={{ backgroundColor: primaryColor }} > Profielfoto
- {name || 'John Doe'} + {name || "John Doe"}
- {preferredFunction || 'Web developer'} + {preferredFunction || "Web developer"}
@@ -59,7 +59,7 @@ export default function Orion({ Telefoonnummer
- {phone || '06-12345678'} + {phone || "06-12345678"}
  • @@ -67,7 +67,7 @@ export default function Orion({ E-mailadres
  • - {email || 'john.doe@example.com'} + {email || "john.doe@example.com"}
  • @@ -75,7 +75,7 @@ export default function Orion({ Woonplaats
  • - {city || 'Amsterdam'} + {city || "Amsterdam"}
  • @@ -83,13 +83,13 @@ export default function Orion({ Geboortedatum
  • - {formatDate(birthdate) || '01-01-2000'} + {formatDate(birthdate) || "01-01-2000"}
    - {skills.length > 0 && skills[0].skill !== '' && ( + {skills.length > 0 && skills[0].skill !== "" && (

    Skills @@ -104,7 +104,7 @@ export default function Orion({

    )} - {languages.length > 0 && languages[0].language !== '' && ( + {languages.length > 0 && languages[0].language !== "" && (

    Talen

      @@ -117,10 +117,10 @@ export default function Orion({
    )} - {hobbies.length > 0 && hobbies[0].name !== '' && ( + {hobbies.length > 0 && hobbies[0].name !== "" && (

    - Hobby's + Hobby"s

      {hobbies.map((hobby, i) => ( @@ -149,7 +149,7 @@ export default function Orion({ Curriculum Vitae

      - {name || 'John Doe'} + {name || "John Doe"}

      - {edu.name || 'Bachelor of Computer Science'} + {edu.name || "Bachelor of Computer Science"}

      - ({`${edu.startYear}-${edu.current ? 'Huidig' : edu.endYear}`}) + ({`${edu.startYear}-${edu.current ? "Huidig" : edu.endYear}`})

      - {edu.institution || 'Uni Amsterdam'} + {edu.institution || "Uni Amsterdam"}

        @@ -195,14 +195,14 @@ export default function Orion({

        - {exp.jobTitle || 'Developer'} + {exp.jobTitle || "Developer"}

        - ({`${exp.startYear}-${exp.current ? 'Huidig' : exp.endYear}`}) + ({`${exp.startYear}-${exp.current ? "Huidig" : exp.endYear}`})

        - {exp.employer || 'Example Tech'} + {exp.employer || "Example Tech"}

    - {certifications.length > 0 && certifications[0].name !== '' && ( + {certifications.length > 0 && certifications[0].name !== "" && (

    Certificaten @@ -226,7 +226,7 @@ export default function Orion({ {cert.name}

    - ({cert.current ? 'Huidig' : `${cert.month?.slice(0, 3)}-${cert.year}`}) + ({cert.current ? "Huidig" : `${cert.month?.slice(0, 3)}-${cert.year}`})

    Betrokken bij de jeugdtraining, administratieve bijhoudingen en in diff --git a/src/templates/Saturnus.tsx b/src/templates/Saturnus.tsx new file mode 100644 index 0000000..53e4d8d --- /dev/null +++ b/src/templates/Saturnus.tsx @@ -0,0 +1,252 @@ +import type { CvBuilderType } from "@/types/templates"; +import { fontMap} from "@/config/fonts"; +import { formatDate } from "@/utils/formatDate"; + +export const settings = { + padding: "0" as const, +}; + +export default function Saturnus({ + name, + email, + phone, + city, + birthdate, + preferredFunction, + aboutMeDescription, + profilePicture, + primaryColor, + secondaryColor, + fontFamily, + skills, + languages, + workExperiences, + educations, + certifications, + hobbies +}: CvBuilderType) { + return ( +

    +
    +
    + + +
    +
    +
    +

    Cv

    +

    + Curriculum Vitae +

    +

    + {name || "John Doe"} +

    +

    +

    +
    +
    + +
    +
    +

    + Opleidingen +

    +
    + {educations.map((edu, index) => ( +
    +
    +

    + {edu.name || "Bachelor of Computer Science"} +

    + + ({`${edu.startYear}-${edu.current ? "Huidig" : edu.endYear}`}) + +
    +

    + {edu.institution || "Uni Amsterdam"} +

    +
      +

      +

      +
    +
    + ))} +
    +
    + +
    +

    + Werkervaring +

    +
    + {workExperiences.map((exp, index) => ( +
    +
    +

    + {exp.jobTitle || "Developer"} +

    + + ({`${exp.startYear}-${exp.current ? "Huidig" : exp.endYear}`}) + +
    +

    + {exp.employer || "Example Tech"} +

    +

    +

    +
    + ))} +
    +
    + + {certifications.length > 0 && certifications[0].name !== "" && ( +
    +

    + Certificaten +

    +
    + {certifications.map((cert: any, index: any) => ( +
    +
    +

    + {cert.name} +

    + + ({cert.current ? "Huidig" : `${cert.month?.slice(0, 3)}-${cert.year}`}) + +
    +

    Betrokken bij de jeugdtraining, administratieve bijhoudingen en in + bijzonder bestuursondersteuning.

    +
    + ))} +
    +
    + )} +
    + +

    + {name || "John Doe"} © {new Date().getFullYear()} +

    +
    +
    +
    +
    + ); +} diff --git a/src/utils/getTemplates.ts b/src/utils/getTemplates.ts index c8f2351..5b1f215 100644 --- a/src/utils/getTemplates.ts +++ b/src/utils/getTemplates.ts @@ -1,12 +1,14 @@ -import Luna, { settings as lunaSettings } from '@/templates/Luna'; -import Nova, { settings as novaSettings } from '@/templates/Nova'; -import Orion, { settings as orionSettings } from '@/templates/Orion'; +import Luna, { settings as lunaSettings } from "@/templates/Luna"; +import Nova, { settings as novaSettings } from "@/templates/Nova"; +import Orion, { settings as orionSettings } from "@/templates/Orion"; +import Saturnus, { settings as saturnusSettings } from "@/templates/Saturnus"; export function getTemplates(onlyNames = false) { const templates: Record = { - Luna: onlyNames ? 'Luna' : { component: Luna, settings: lunaSettings }, - Nova: onlyNames ? 'Nova' : { component: Nova, settings: novaSettings }, - Orion: onlyNames ? 'Orion' : { component: Orion, settings: orionSettings }, + Luna: onlyNames ? "Luna" : { component: Luna, settings: lunaSettings }, + Nova: onlyNames ? "Nova" : { component: Nova, settings: novaSettings }, + Orion: onlyNames ? "Orion" : { component: Orion, settings: orionSettings }, + Saturnus: onlyNames ? "Saturnus" : { component: Saturnus, settings: saturnusSettings }, }; return templates; From 87d380ef5c3cf095769517b05535d39bbd3f0f4d Mon Sep 17 00:00:00 2001 From: HeapReaper Date: Thu, 18 Sep 2025 14:17:41 +0200 Subject: [PATCH 26/26] Small fixes --- .idea/workspace.xml | 33 +++++++++++------------ src/components/selects/templateSelect.tsx | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 5b0962c..dd6f9d7 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,13 +4,10 @@ - @@ -713,7 +709,8 @@ - diff --git a/src/components/selects/templateSelect.tsx b/src/components/selects/templateSelect.tsx index e8eb676..21f031a 100644 --- a/src/components/selects/templateSelect.tsx +++ b/src/components/selects/templateSelect.tsx @@ -13,7 +13,7 @@ export default function TemplateSelect({ value, onChange }: InputType) { name="template" value={value} onChange={(e) => onChange((e.currentTarget as unknown as HTMLInputElement).value)} - className="bg-white border border-solid border-orange-500 text-gray-700 dark:text-white dark:bg-gray-950 text-sm rounded-lg focus:ring-2 focus:ring-orange-500 focus:border-orange-500 block w-full p-2.5" + className="bg-white border border-solid border-orange-500 text-gray-700 dark:text-white dark:bg-gray-950 text-sm rounded-lg focus:ring-2 focus:ring-orange-500 focus:border-orange-500 p-2.5" > {Object.keys(templateNames).map((key: string) => (