diff --git a/.env.example b/.env.example index 792eac7..133ccb0 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,8 @@ POSTGRES_URI=postgres://postgres:postgres@localhost:5432/tegonal-cv PAYLOAD_SECRET=secret PRINTER_SECRET=secret +# Use this flag with caution. This will prevent checking existence of PRINTER_SECRET in header. Use for local debug mode only +ALLOW_UNSECURED_CV_ACCESS=false S3_ENDPOINT=http://localhost:9000 S3_BUCKET=tegonal-cv diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index d501f00..dede11b 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -33,7 +33,7 @@ services: MINIO_ROOT_PASSWORD: secret1234 volumes: - minio-data:/data - command: server /data --console-address ":9001" + command: server --console-address ":9001" /data createbucket: image: minio/mc @@ -73,15 +73,17 @@ services: - "--prometheus-disable-collect=true" - "--webhook-disable=true" - "--pdfengines-disable-routes=true" + - "--api-port=3030" environment: - "TZ=Europe/Zurich" ports: - - "3030:3000" + - "3030:3030" healthcheck: - test: [ "CMD", "curl", "-f", "http://localhost:3000/health" ] + test: [ "CMD", "curl", "-f", "http://localhost:3030/health" ] interval: 30s timeout: 20s retries: 3 + network_mode: "host" volumes: mailpit-data: diff --git a/next.config.mjs b/next.config.mjs index 3c4ec1c..d47706f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -12,6 +12,22 @@ const nextConfig = { }, ]; }, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "cvman-prod.jcloud.ik-server.com", + port: "", + pathname: "/api/media/file/**", + }, + { + protocol: "http", + hostname: "localhost", + port: "3000", + pathname: "/api/media/file/**", + }, + ], + } }; export default withPayload(nextConfig); diff --git a/package.json b/package.json index 4af3741..8803adb 100644 --- a/package.json +++ b/package.json @@ -40,22 +40,21 @@ "jsonwebtoken": "^9.0.2", "ky": "^1.7.3", "lodash-es": "^4.17.21", - "next": "15.1.3", + "next": "15.1.4", "nodemailer": "^6.9.16", "payload": "3.15.1", "payload-oauth2": "^1.0.7", "react": "19.0.0", "react-dom": "19.0.0", - "react-i18next": "^15.2.0", - "react-router-dom": "7.0.2", + "react-i18next": "^15.4.0", + "react-router-dom": "7.1.1", "sharp": "0.33.5", - "swr": "^2.2.5", "tslog": "^4.9.3" }, "devDependencies": { "@payloadcms/graphql": "3.15.1", "@swc/core": "1.10.6", - "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/typography": "^0.5.16", "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.7", "@types/lodash-es": "^4.17.12", @@ -64,12 +63,12 @@ "@types/react": "^19.0.1", "@types/react-dom": "^19.0.2", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "8.18.1", - "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/eslint-plugin": "8.19.1", + "@typescript-eslint/parser": "8.19.1", "autoprefixer": "^10.4.20", "dotenv": "^16.4.7", "eslint": "^9.0.0", - "eslint-config-next": "15.1.3", + "eslint-config-next": "15.1.4", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsonc": "^2.18.2", "eslint-plugin-prettier": "^5.2.1", @@ -77,7 +76,7 @@ "prettier": "^3.4.2", "prettier-plugin-tailwindcss": "^0.6.9", "tailwindcss": "^3.4.16", - "typescript": "5.7.2" + "typescript": "5.7.3" }, "overrides": { "@types/react": "npm:types-react@19.0.0", diff --git a/src/app/cv/[id]/page.tsx b/src/app/cv/[id]/page.tsx index f83b743..5386e4f 100644 --- a/src/app/cv/[id]/page.tsx +++ b/src/app/cv/[id]/page.tsx @@ -9,6 +9,10 @@ import { PayloadLexicalReactRendererContent } from '@/payload/utilities/lexical- import { HighlightEntry } from '@/app/cv/[id]/(lib)/components/highlight'; import { capitalize, isEmpty } from 'lodash-es'; import { getPayload } from 'payload'; +import ky from 'ky'; +import { headers } from 'next/headers'; +import * as process from 'node:process'; +import { PRINTER_HEADER_KEY } from '@/payload/utilities/constants'; type Args = { params: Promise<{ @@ -63,12 +67,25 @@ const hasLexicalNodes = (data: PayloadLexicalReactRendererContent) => { }; const Page = async ({ params, searchParams }: Args) => { + if (!process.env.PRINTER_SECRET) { + throw new Error('PDF Printer: Printer secret not found. Aborting..'); + } + const query = { params: await params, searchParams: await searchParams, }; const locale = 'de'; + const headersList = await headers(); + const printerSecret = headersList.get(PRINTER_HEADER_KEY); + if ( + process.env.ALLOW_UNSECURED_CV_ACCESS != 'true' && + (!printerSecret || printerSecret !== process.env.PRINTER_SECRET) + ) { + throw new Error('Unable to access cv printer data'); + } + const payload = await getPayload({ config: configPromise }); if (!query.searchParams.p) { @@ -88,10 +105,24 @@ const Page = async ({ params, searchParams }: Args) => { }, }, locale: decodedParams.locale, + depth: 1, }) .then((data) => data.docs[0]); - const profileImage = (cv.image as Media)?.url || ''; + const profileImage = (cv.image as Media)?.url; + + const kyHeaders: Record = {}; + kyHeaders[PRINTER_HEADER_KEY] = process.env.PRINTER_SECRET; + const loadImage = async (url: string) => { + const response = await ky.get(url, { + headers: kyHeaders, + }); + const blob = await response.blob(); + let buffer = Buffer.from(await blob.arrayBuffer()); + return 'data:' + blob.type + ';base64,' + buffer.toString('base64'); + }; + + const profileImageDataUrl: string = profileImage ? await loadImage(profileImage) : ''; const hasOverride = (key: string) => { return key in exportOverride && exportOverride[key]; @@ -120,7 +151,7 @@ const Page = async ({ params, searchParams }: Args) => { className={'circle-mask relative flex size-48 flex-row items-center justify-center'}> {cv.fullName} { - const printerSecret = args.req.headers.get('x-http-pdfprinter'); + const printerSecret = args.req.headers.get(PRINTER_HEADER_KEY); if (printerSecret === process.env.PRINTER_SECRET) { return true; } diff --git a/src/payload/plugins/cv-pdf-generator/handler.ts b/src/payload/plugins/cv-pdf-generator/handler.ts index d727c79..5c45fad 100644 --- a/src/payload/plugins/cv-pdf-generator/handler.ts +++ b/src/payload/plugins/cv-pdf-generator/handler.ts @@ -6,6 +6,7 @@ import { CvPdfConfig } from '@/payload/plugins/cv-pdf-generator/types'; import { Chromiumly, UrlConverter } from 'chromiumly'; import * as process from 'node:process'; import { encodeToBase64 } from 'next/dist/build/webpack/loaders/utils'; +import { PRINTER_HEADER_KEY } from '@/payload/utilities/constants'; type Props = { id: string; @@ -47,14 +48,14 @@ export const requestHandler = async ( }; const searchParamString = encodeToBase64(searchParams); + const extraHeaders: Record = {}; + extraHeaders[PRINTER_HEADER_KEY] = process.env.PRINTER_SECRET || ''; try { const url = `${host}/cv/${id}?p=${searchParamString}`; if (process.env.NODE_ENV !== 'production') console.log({ url }); return urlConverter.convert({ - extraHttpHeaders: { - 'x-http-pdfprinter': process.env.PRINTER_SECRET || '', - }, + extraHttpHeaders: extraHeaders, url, waitDelay: '2s', properties: { diff --git a/src/payload/utilities/constants.ts b/src/payload/utilities/constants.ts index aa729be..574d860 100644 --- a/src/payload/utilities/constants.ts +++ b/src/payload/utilities/constants.ts @@ -1,2 +1,4 @@ export const ROLE_SUPER_ADMIN = 'admin'; export const ROLE_USER = 'user'; + +export const PRINTER_HEADER_KEY = 'x-http-pdfprinter'; diff --git a/yarn.lock b/yarn.lock index 55e3cb7..29cf13e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2277,10 +2277,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.1.3": - version: 15.1.3 - resolution: "@next/env@npm:15.1.3" - checksum: 10/27d64cc0ceec63652f6579389483822b4b694efe6c69fb842385aff6da99618720bf76a1a20b173f98216d5dbac9a08395ad49a136d87941ba99ccd0f19faac2 +"@next/env@npm:15.1.4": + version: 15.1.4 + resolution: "@next/env@npm:15.1.4" + checksum: 10/b93e08227566191f0dff25f0a00bc6437e3be91afe12c371d3dcee5e4e1c2df41f51413d18068d2026b3b06b2f5586a5cb636a83bb9b78bf2e8fc8019747cfe8 languageName: node linkType: hard @@ -2291,67 +2291,67 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.1.3": - version: 15.1.3 - resolution: "@next/eslint-plugin-next@npm:15.1.3" +"@next/eslint-plugin-next@npm:15.1.4": + version: 15.1.4 + resolution: "@next/eslint-plugin-next@npm:15.1.4" dependencies: fast-glob: "npm:3.3.1" - checksum: 10/13dbf968c33715f048913a96967cbe42ba19703b711e003a0b7ec58fca641584632218036d07289e35a34cea2a5b752a9cba9335df4e96fa4317a65ee2b19e04 + checksum: 10/71d3ddb238c6aa5a73c37e92c3550b803fa0c9fe5ab5893f4a9742667c1ec109b0fb8492dfcbc58fb99252d815fafce637e5e4efe7d85519ca777be2beda63d8 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-darwin-arm64@npm:15.1.3" +"@next/swc-darwin-arm64@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-darwin-arm64@npm:15.1.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-darwin-x64@npm:15.1.3" +"@next/swc-darwin-x64@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-darwin-x64@npm:15.1.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-linux-arm64-gnu@npm:15.1.3" +"@next/swc-linux-arm64-gnu@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-linux-arm64-gnu@npm:15.1.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-linux-arm64-musl@npm:15.1.3" +"@next/swc-linux-arm64-musl@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-linux-arm64-musl@npm:15.1.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-linux-x64-gnu@npm:15.1.3" +"@next/swc-linux-x64-gnu@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-linux-x64-gnu@npm:15.1.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-linux-x64-musl@npm:15.1.3" +"@next/swc-linux-x64-musl@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-linux-x64-musl@npm:15.1.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-win32-arm64-msvc@npm:15.1.3" +"@next/swc-win32-arm64-msvc@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-win32-arm64-msvc@npm:15.1.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.1.3": - version: 15.1.3 - resolution: "@next/swc-win32-x64-msvc@npm:15.1.3" +"@next/swc-win32-x64-msvc@npm:15.1.4": + version: 15.1.4 + resolution: "@next/swc-win32-x64-msvc@npm:15.1.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3385,9 +3385,9 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/typography@npm:^0.5.15": - version: 0.5.15 - resolution: "@tailwindcss/typography@npm:0.5.15" +"@tailwindcss/typography@npm:^0.5.16": + version: 0.5.16 + resolution: "@tailwindcss/typography@npm:0.5.16" dependencies: lodash.castarray: "npm:^4.4.0" lodash.isplainobject: "npm:^4.0.6" @@ -3395,7 +3395,7 @@ __metadata: postcss-selector-parser: "npm:6.0.10" peerDependencies: tailwindcss: "*" - checksum: 10/8c677e4de25a5362d757c3c0b9d594b63c789ab287cad846a082ca227e0d3435145793301ced8f32d5215d5c21537195e7d87ca08a6e7a8facf47a11e7f07d22 + checksum: 10/ca6cca2c824b4124223dd28d4bd5cc21dd261fe53a9654b9802bb958badd637313118d8e81978c3509df7dac1826317050fb034bc4357085b451371e31adff6d languageName: node linkType: hard @@ -3659,24 +3659,24 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.18.1" +"@typescript-eslint/eslint-plugin@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.19.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.18.1" - "@typescript-eslint/type-utils": "npm:8.18.1" - "@typescript-eslint/utils": "npm:8.18.1" - "@typescript-eslint/visitor-keys": "npm:8.18.1" + "@typescript-eslint/scope-manager": "npm:8.19.1" + "@typescript-eslint/type-utils": "npm:8.19.1" + "@typescript-eslint/utils": "npm:8.19.1" + "@typescript-eslint/visitor-keys": "npm:8.19.1" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^1.3.0" + ts-api-utils: "npm:^2.0.0" peerDependencies: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/ec061a9c64477260d1ef0fc6283d8754838181e17aa90b3b8b9a70936a2ca4bae11607070917a7701e13f5301ced2b6da4b4b6e5cf525c484f97481e540b5111 + checksum: 10/c9a6d3181ec01068075b85ad3ac454910b4452281d60c775cc7229827f6d6a076b7336f5f07a7ad89bf08b3224f6a49aa20342b9438702393bee0aa7315d23b2 languageName: node linkType: hard @@ -3701,19 +3701,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/parser@npm:8.18.1" +"@typescript-eslint/parser@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/parser@npm:8.19.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.18.1" - "@typescript-eslint/types": "npm:8.18.1" - "@typescript-eslint/typescript-estree": "npm:8.18.1" - "@typescript-eslint/visitor-keys": "npm:8.18.1" + "@typescript-eslint/scope-manager": "npm:8.19.1" + "@typescript-eslint/types": "npm:8.19.1" + "@typescript-eslint/typescript-estree": "npm:8.19.1" + "@typescript-eslint/visitor-keys": "npm:8.19.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/09a601ef8b837962e5bb2687358520f337f9d0bbac5c6d5e159654faa5caaffb24d990e8d6bc4dc51ff5008dd9e182315c35bc5e9e3789090ccef8b8040e7659 + checksum: 10/da3db63ff655cf0fb91745ba8e52d853386f601cf6106d36f4541efcb9e2c6c3b82c6743b15680eff9eafeccaf31c9b26191a955e66ae19de9172f67335463ab languageName: node linkType: hard @@ -3743,13 +3743,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/scope-manager@npm:8.18.1" +"@typescript-eslint/scope-manager@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/scope-manager@npm:8.19.1" dependencies: - "@typescript-eslint/types": "npm:8.18.1" - "@typescript-eslint/visitor-keys": "npm:8.18.1" - checksum: 10/14f7c09924c3a006b20752e5204b33c2b6974fc00bea16c23f471e65f2fb089fcbd3fb5296bcfd6727ac95c32ba24ebb15ba84fbf1deadc17b4cc5ca7f41c72a + "@typescript-eslint/types": "npm:8.19.1" + "@typescript-eslint/visitor-keys": "npm:8.19.1" + checksum: 10/6ffc78b15367f211eb6650459ca2bb6bfe4c1fa95a3474adc08ee9a20c250b2e0e02fd99be36bd3dad74967ecd9349e792b5d818d85735cba40f1b5c236074d1 languageName: node linkType: hard @@ -3768,18 +3768,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/type-utils@npm:8.18.1" +"@typescript-eslint/type-utils@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/type-utils@npm:8.19.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.18.1" - "@typescript-eslint/utils": "npm:8.18.1" + "@typescript-eslint/typescript-estree": "npm:8.19.1" + "@typescript-eslint/utils": "npm:8.19.1" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.3.0" + ts-api-utils: "npm:^2.0.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/cde53d05f4ca6e172239918cba2b560b9f837aa1fc7d5220784b1a6af9c8c525db020a5160822087e320305492fe359b7fb191420789b5f1e47a01e0cda21ac9 + checksum: 10/123ecda88b057d6a4b68226701f435661440a420fda88cba60b49d7fb3e4f49483164ff174f259e28c0beabb0ed04500462a20faefd78331ba202bf54b01e3ef languageName: node linkType: hard @@ -3790,10 +3790,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/types@npm:8.18.1" - checksum: 10/57a6141ba17be929291a644991f3a76f94fce330376f6a079decb20fb53378d636ad6878f8f9b6fcb8244cf1ca8b118f9e8901ae04cf3de2aa9f9ff57791d97a +"@typescript-eslint/types@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/types@npm:8.19.1" + checksum: 10/5833a5f8fdac4a490dd3906a0243a0713fbf138fabb451870c70b0b089c539a9624b467b0913ddc0a225a8284342e7fd31cd506dec53c1a6d8f3c8c8902b9cae languageName: node linkType: hard @@ -3815,21 +3815,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.18.1" +"@typescript-eslint/typescript-estree@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.19.1" dependencies: - "@typescript-eslint/types": "npm:8.18.1" - "@typescript-eslint/visitor-keys": "npm:8.18.1" + "@typescript-eslint/types": "npm:8.19.1" + "@typescript-eslint/visitor-keys": "npm:8.19.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" + ts-api-utils: "npm:^2.0.0" peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 10/8ecc1b50b9fc32116eee1b3b00f3fb29cf18026c0bbb50ab5f6e01db58ef62b8ac01824f2950f132479be6e1b82466a2bfd1e2cb4525aa8dbce4c27fc2494cfc + checksum: 10/5de467452d5ef1a380d441b06cd0134652a0c98cdb4ce31b93eb589f7dc75ef60364d03fd80ca0a48d0c8b268f7258d4f6528b16fe1b89442d60a4bc960fe5f5 languageName: node linkType: hard @@ -3848,18 +3848,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/utils@npm:8.18.1" +"@typescript-eslint/utils@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/utils@npm:8.19.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.18.1" - "@typescript-eslint/types": "npm:8.18.1" - "@typescript-eslint/typescript-estree": "npm:8.18.1" + "@typescript-eslint/scope-manager": "npm:8.19.1" + "@typescript-eslint/types": "npm:8.19.1" + "@typescript-eslint/typescript-estree": "npm:8.19.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/7b33d2ac273ad606a3dcb776bcf02c901812952550cdc93d4ece272b3b0e5d2a4e05fa92f9bd466f4a296ddd5992902d3b6623aa1c29d09e8e392897103e42a8 + checksum: 10/bb92116a53fe143ee87e830941afb21d4222a64ca3f2b6dac5c2d9984f981408e60e52b04c32d95208896075ac222fb4ee631c5b0c4826b87d4bd8091c421ab1 languageName: node linkType: hard @@ -3873,13 +3873,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.18.1": - version: 8.18.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.18.1" +"@typescript-eslint/visitor-keys@npm:8.19.1": + version: 8.19.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.19.1" dependencies: - "@typescript-eslint/types": "npm:8.18.1" + "@typescript-eslint/types": "npm:8.19.1" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/00e88b1640a68c3afea08731395eb09a8216892248fee819cb7526e99093256743239d6b9e880a499f1c0ddfe2ffa4d1ad895d9e778b5d42e702d5880db1a594 + checksum: 10/510eb196e7b7d59d3981d672a75454615159e931fe78e2a64b09607c3cfa45110709b0eb5ac3dd271d757a0d98cf4868ad2f45bf9193f96e9efec3efa92a19c1 languageName: node linkType: hard @@ -4508,7 +4508,7 @@ __metadata: languageName: node linkType: hard -"client-only@npm:0.0.1, client-only@npm:^0.0.1": +"client-only@npm:0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" checksum: 10/0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 @@ -4712,7 +4712,7 @@ __metadata: "@payloadcms/storage-s3": "npm:3.15.1" "@payloadcms/ui": "npm:3.15.1" "@swc/core": "npm:1.10.6" - "@tailwindcss/typography": "npm:^0.5.15" + "@tailwindcss/typography": "npm:^0.5.16" "@types/jsdom": "npm:^21.1.7" "@types/jsonwebtoken": "npm:^9.0.7" "@types/lodash-es": "npm:^4.17.12" @@ -4721,15 +4721,15 @@ __metadata: "@types/react": "npm:^19.0.1" "@types/react-dom": "npm:^19.0.2" "@types/react-router-dom": "npm:^5.3.3" - "@typescript-eslint/eslint-plugin": "npm:8.18.1" - "@typescript-eslint/parser": "npm:8.18.1" + "@typescript-eslint/eslint-plugin": "npm:8.19.1" + "@typescript-eslint/parser": "npm:8.19.1" autoprefixer: "npm:^10.4.20" babel-plugin-react-compiler: "npm:19.0.0-beta-df7b47d-20241124" chromiumly: "npm:^3.10.1" cross-env: "npm:^7.0.3" dotenv: "npm:^16.4.7" eslint: "npm:^9.0.0" - eslint-config-next: "npm:15.1.3" + eslint-config-next: "npm:15.1.4" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-jsonc: "npm:^2.18.2" eslint-plugin-prettier: "npm:^5.2.1" @@ -4737,7 +4737,7 @@ __metadata: jsonwebtoken: "npm:^9.0.2" ky: "npm:^1.7.3" lodash-es: "npm:^4.17.21" - next: "npm:15.1.3" + next: "npm:15.1.4" nodemailer: "npm:^6.9.16" payload: "npm:3.15.1" payload-oauth2: "npm:^1.0.7" @@ -4746,13 +4746,12 @@ __metadata: prettier-plugin-tailwindcss: "npm:^0.6.9" react: "npm:19.0.0" react-dom: "npm:19.0.0" - react-i18next: "npm:^15.2.0" - react-router-dom: "npm:7.0.2" + react-i18next: "npm:^15.4.0" + react-router-dom: "npm:7.1.1" sharp: "npm:0.33.5" - swr: "npm:^2.2.5" tailwindcss: "npm:^3.4.16" tslog: "npm:^4.9.3" - typescript: "npm:5.7.2" + typescript: "npm:5.7.3" languageName: unknown linkType: soft @@ -5605,11 +5604,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.1.3": - version: 15.1.3 - resolution: "eslint-config-next@npm:15.1.3" +"eslint-config-next@npm:15.1.4": + version: 15.1.4 + resolution: "eslint-config-next@npm:15.1.4" dependencies: - "@next/eslint-plugin-next": "npm:15.1.3" + "@next/eslint-plugin-next": "npm:15.1.4" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -5625,7 +5624,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/006b629f4308a469d66c7c673fd5664ca5a4987ec2278ebf2058d60efcd01709a9a9a64a31dffe29e27eaed7bce1d06b16e68094ed58ddfbfc146276be2cd074 + checksum: 10/0b0ffa584083acfa276b2fb22a2f1d6bbb23aba5158ebe0a6309ad879bc9e727a1bc800cd6cd50e1e5eb3b9ca20ed3743a546839a57720d7b19bf2da2bed2aa5 languageName: node linkType: hard @@ -8034,19 +8033,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.1.3": - version: 15.1.3 - resolution: "next@npm:15.1.3" +"next@npm:15.1.4": + version: 15.1.4 + resolution: "next@npm:15.1.4" dependencies: - "@next/env": "npm:15.1.3" - "@next/swc-darwin-arm64": "npm:15.1.3" - "@next/swc-darwin-x64": "npm:15.1.3" - "@next/swc-linux-arm64-gnu": "npm:15.1.3" - "@next/swc-linux-arm64-musl": "npm:15.1.3" - "@next/swc-linux-x64-gnu": "npm:15.1.3" - "@next/swc-linux-x64-musl": "npm:15.1.3" - "@next/swc-win32-arm64-msvc": "npm:15.1.3" - "@next/swc-win32-x64-msvc": "npm:15.1.3" + "@next/env": "npm:15.1.4" + "@next/swc-darwin-arm64": "npm:15.1.4" + "@next/swc-darwin-x64": "npm:15.1.4" + "@next/swc-linux-arm64-gnu": "npm:15.1.4" + "@next/swc-linux-arm64-musl": "npm:15.1.4" + "@next/swc-linux-x64-gnu": "npm:15.1.4" + "@next/swc-linux-x64-musl": "npm:15.1.4" + "@next/swc-win32-arm64-msvc": "npm:15.1.4" + "@next/swc-win32-x64-msvc": "npm:15.1.4" "@swc/counter": "npm:0.1.3" "@swc/helpers": "npm:0.5.15" busboy: "npm:1.6.0" @@ -8091,7 +8090,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/d9f63a6f5a92d80aa3b57dda700d655303dc7217c6a2598385b055ffa65c82988f60bce6aabdb9861a01c71437e65551ff2f399a5b5e098f470d04ee516838f6 + checksum: 10/c486ba1b4cae0e11c6ad233d1ec72d0b045be9c9215aaff9f518f4f58a7c47354682f24bf7e7419a892371bc29dd077f8a71ae95e0163ee6d708922b6bcab277 languageName: node linkType: hard @@ -9130,9 +9129,9 @@ __metadata: languageName: node linkType: hard -"react-i18next@npm:^15.2.0": - version: 15.2.0 - resolution: "react-i18next@npm:15.2.0" +"react-i18next@npm:^15.4.0": + version: 15.4.0 + resolution: "react-i18next@npm:15.4.0" dependencies: "@babel/runtime": "npm:^7.25.0" html-parse-stringify: "npm:^3.0.1" @@ -9144,7 +9143,7 @@ __metadata: optional: true react-native: optional: true - checksum: 10/9b2937f7beab763c494d55a801f21bfdbfe98e9509994c350d24fa404ded573f41e8607eeba290c686d5877d34f0ddefe48e9d6876720d5ed0e1243bcdd5dda6 + checksum: 10/4b3666d819f01cf96a256af4419b26938d314e33c6388eafccc29f67ad02994e5d53e7bf82eac656cade7f7bcd04f4a237f0b293165d7eda91d62e3fde605a38 languageName: node linkType: hard @@ -9164,21 +9163,21 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:7.0.2": - version: 7.0.2 - resolution: "react-router-dom@npm:7.0.2" +"react-router-dom@npm:7.1.1": + version: 7.1.1 + resolution: "react-router-dom@npm:7.1.1" dependencies: - react-router: "npm:7.0.2" + react-router: "npm:7.1.1" peerDependencies: react: ">=18" react-dom: ">=18" - checksum: 10/7b7768c91bc19018278d05b7be2e959c4e47ffadfb81aeaa450efbd0dabc15bb3004e0c938da2a01eb4839c9f8decb5e42b85d81ee85584f47b5cbd4d958c112 + checksum: 10/d7b978959f89051cf6705cdc0907d92167e39f2835b20b78508cc69e46ebecdbb0b7b95c4d2f954b60c01cdfc70ffc842ee261c0b7b22507a51990e4cebc41ee languageName: node linkType: hard -"react-router@npm:7.0.2": - version: 7.0.2 - resolution: "react-router@npm:7.0.2" +"react-router@npm:7.1.1": + version: 7.1.1 + resolution: "react-router@npm:7.1.1" dependencies: "@types/cookie": "npm:^0.6.0" cookie: "npm:^1.0.1" @@ -9190,7 +9189,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: 10/f8bf5f7810388d4da81444d5e816135306aadd0340a26d645eb171e2b4c4a6d7f5a810f1d27e25ae0f006b949f7cf66fcf399f2af79f48341752a6651b2b30cb + checksum: 10/f12e229d79bd6de561e697b64556959361365610450c12bfd89116fccca8428728d7c372a096eff570a917ef02473ef4f5145beb6a2881d6935f69fe25bebcfd languageName: node linkType: hard @@ -10084,18 +10083,6 @@ __metadata: languageName: node linkType: hard -"swr@npm:^2.2.5": - version: 2.2.5 - resolution: "swr@npm:2.2.5" - dependencies: - client-only: "npm:^0.0.1" - use-sync-external-store: "npm:^1.2.0" - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 10/f02b3bd5a198a0f62f9a53d7c0528c4a58aa61a43310bea169614b6e873dadb52599e856ef0775405b6aa7409835343da0cf328948aa892aa309bf4b7e7d6902 - languageName: node - linkType: hard - "synckit@npm:^0.6.0": version: 0.6.2 resolution: "synckit@npm:0.6.2" @@ -10282,6 +10269,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "ts-api-utils@npm:2.0.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10/485bdf8bbba98d58712243d958f4fd44742bbe49e559cd77882fb426d866eec6dd05c67ef91935dc4f8a3c776f235859735e1f05be399e4dc9e7ffd580120974 + languageName: node + linkType: hard + "ts-essentials@npm:10.0.3": version: 10.0.3 resolution: "ts-essentials@npm:10.0.3" @@ -10412,23 +10408,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.7.2": - version: 5.7.2 - resolution: "typescript@npm:5.7.2" +"typescript@npm:5.7.3": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/4caa3904df69db9d4a8bedc31bafc1e19ffb7b24fbde2997a1633ae1398d0de5bdbf8daf602ccf3b23faddf1aeeb9b795223a2ed9c9a4fdcaf07bfde114a401a + checksum: 10/6a7e556de91db3d34dc51cd2600e8e91f4c312acd8e52792f243c7818dfadb27bae677175fad6947f9c81efb6c57eb6b2d0c736f196a6ee2f1f7d57b74fc92fa languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.7.2#optional!builtin": - version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=5786d5" +"typescript@patch:typescript@npm%3A5.7.3#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/d75ca10141afc64fd3474b41a8b082b640555bed388d237558aed64e5827ddadb48f90932c7f4205883f18f5bcab8b6a739a2cfac95855604b0dfeb34bc2f3eb + checksum: 10/dc58d777eb4c01973f7fbf1fd808aad49a0efdf545528dab9b07d94fdcb65b8751742804c3057e9619a4627f2d9cc85547fdd49d9f4326992ad0181b49e61d81 languageName: node linkType: hard @@ -10569,15 +10565,6 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0": - version: 1.4.0 - resolution: "use-sync-external-store@npm:1.4.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/08bf581a8a2effaefc355e9d18ed025d436230f4cc973db2f593166df357cf63e47b9097b6e5089b594758bde322e1737754ad64905e030d70f8ff7ee671fd01 - languageName: node - linkType: hard - "utf8-byte-length@npm:^1.0.1": version: 1.0.5 resolution: "utf8-byte-length@npm:1.0.5"