diff --git a/next.config.mjs b/next.config.mjs index ac9f0f8..bc3a2f4 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + cacheComponents: true, images: { minimumCacheTTL: 1200, }, diff --git a/package.json b/package.json index a9749b5..44b39e1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@egoist/tailwindcss-icons": "^1.8.1", - "@next/third-parties": "^16.1.6", + "@next/third-parties": "16.3.0", "chart.js": "^4.4.4", "gray-matter": "^4.0.3", "jsdom": "^25.0.1", @@ -24,12 +24,12 @@ "lodash": "^4.17.21", "lru-cache": "^11.0.1", "markdown-to-txt": "^2.0.1", - "next": "16.1.6", + "next": "16.3.0", "next-auth": "5.0.0-beta.30", "nextjs-toploader": "^1.6.12", - "react": "^19.2.4", + "react": "19.2.8", "react-chartjs-2": "^5.2.0", - "react-dom": "^19.2.4", + "react-dom": "19.2.8", "react-google-recaptcha-v3": "^1.10.1", "react-markdown": "^9.0.1", "rehype-katex": "^7.0.1", @@ -51,16 +51,22 @@ "@types/jsdom": "^21.1.7", "@types/lodash": "^4.17.10", "@types/node": "^20.16.11", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4", "@types/rss": "^0.0.32", - "eslint": "^9.39.3", - "eslint-config-next": "16.1.6", + "eslint": "9.39.3", + "eslint-config-next": "16.3.0", "eslint-config-prettier": "^10.1.8", "postcss": "^8.4.47", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.8", "tailwindcss": "^3.4.13", "typescript": "^5.6.3" + }, + "pnpm": { + "overrides": { + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b60325..5a8d522 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,25 +4,29 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4 + importers: .: dependencies: '@dnd-kit/core': specifier: ^6.1.0 - version: 6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 6.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@dnd-kit/sortable': specifier: ^8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.4) + version: 3.2.2(react@19.2.8) '@egoist/tailwindcss-icons': specifier: ^1.8.1 version: 1.8.1(tailwindcss@3.4.13) '@next/third-parties': - specifier: ^16.1.6 - version: 16.1.6(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + specifier: 16.3.0 + version: 16.3.0(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) chart.js: specifier: ^4.4.4 version: 4.4.4 @@ -45,29 +49,29 @@ importers: specifier: ^2.0.1 version: 2.0.1 next: - specifier: 16.1.6 - version: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.3.0 + version: 16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next-auth: specifier: 5.0.0-beta.30 - version: 5.0.0-beta.30(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + version: 5.0.0-beta.30(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) nextjs-toploader: specifier: ^1.6.12 - version: 1.6.12(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.6.12(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: - specifier: ^19.2.4 - version: 19.2.4 + specifier: 19.2.8 + version: 19.2.8 react-chartjs-2: specifier: ^5.2.0 - version: 5.2.0(chart.js@4.4.4)(react@19.2.4) + version: 5.2.0(chart.js@4.4.4)(react@19.2.8) react-dom: - specifier: ^19.2.4 - version: 19.2.4(react@19.2.4) + specifier: 19.2.8 + version: 19.2.8(react@19.2.8) react-google-recaptcha-v3: specifier: ^1.10.1 - version: 1.10.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react-markdown: specifier: ^9.0.1 - version: 9.0.1(@types/react@19.2.14)(react@19.2.4) + version: 9.0.1(@types/react@19.2.18)(react@19.2.8) rehype-katex: specifier: ^7.0.1 version: 7.0.1 @@ -103,7 +107,7 @@ importers: version: 11.1.14 zustand: specifier: 5.0.0-rc.2 - version: 5.0.0-rc.2(@types/react@19.2.14)(react@19.2.4) + version: 5.0.0-rc.2(@types/react@19.2.18)(react@19.2.8) devDependencies: '@iconify/json': specifier: ^2.2.258 @@ -121,20 +125,20 @@ importers: specifier: ^20.16.11 version: 20.16.11 '@types/react': - specifier: ^19.2.14 - version: 19.2.14 + specifier: 19.2.18 + version: 19.2.18 '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + specifier: 19.2.4 + version: 19.2.4(@types/react@19.2.18) '@types/rss': specifier: ^0.0.32 version: 0.0.32 eslint: - specifier: ^9.39.3 + specifier: 9.39.3 version: 9.39.3(jiti@1.21.6) eslint-config-next: - specifier: 16.1.6 - version: 16.1.6(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3) + specifier: 16.3.0 + version: 16.3.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3) eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@9.39.3(jiti@1.21.6)) @@ -277,6 +281,9 @@ packages: '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/runtime@1.3.0': resolution: {integrity: sha512-XMBySMuNZs3DM96xcJmLW4EfGnf+uGmFNjzpehMjuX5PLB5j87ar2Zc4e3PVeZ3I5g3tYtAqskB28manlF69Zw==} @@ -296,8 +303,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -308,8 +315,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.4': - resolution: {integrity: sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==} + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.3': @@ -349,8 +356,8 @@ packages: '@iconify/utils@2.1.33': resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.33.5': @@ -359,9 +366,9 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-arm64@0.35.3': + resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] @@ -371,19 +378,24 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.3': + resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] + '@img/sharp-freebsd-wasm32@0.35.3': + resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + engines: {node: '>=20.9.0'} + os: [freebsd] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + '@img/sharp-libvips-darwin-arm64@1.3.2': + resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} cpu: [arm64] os: [darwin] @@ -392,8 +404,8 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + '@img/sharp-libvips-darwin-x64@1.3.2': + resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} cpu: [x64] os: [darwin] @@ -402,8 +414,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + '@img/sharp-libvips-linux-arm64@1.3.2': + resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] os: [linux] @@ -412,18 +424,18 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + '@img/sharp-libvips-linux-arm@1.3.2': + resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + '@img/sharp-libvips-linux-ppc64@1.3.2': + resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + '@img/sharp-libvips-linux-riscv64@1.3.2': + resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] os: [linux] @@ -432,8 +444,8 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + '@img/sharp-libvips-linux-s390x@1.3.2': + resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] os: [linux] @@ -442,8 +454,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + '@img/sharp-libvips-linux-x64@1.3.2': + resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] os: [linux] @@ -452,8 +464,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] os: [linux] @@ -462,8 +474,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] os: [linux] @@ -473,9 +485,9 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.3': + resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] @@ -485,21 +497,21 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.3': + resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-ppc64@0.35.3': + resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.3': + resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] @@ -509,9 +521,9 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-s390x@0.35.3': + resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] @@ -521,9 +533,9 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.3': + resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] @@ -533,9 +545,9 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.3': + resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] @@ -545,9 +557,9 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.3': + resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] @@ -556,14 +568,18 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-wasm32@0.35.3': + resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.3': + resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.3': + resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] @@ -573,9 +589,9 @@ packages: cpu: [ia32] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-ia32@0.35.3': + resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] @@ -585,9 +601,9 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.3': + resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -631,62 +647,62 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/env@16.1.6': - resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + '@next/env@16.3.0': + resolution: {integrity: sha512-o9r1S0BNiNreHP9Vs+Qnqd9kviDkJh8xIACY7UFZSmiGbbQRzPBBosvHzAU4TULHOIuOj/18RSsyz2qrREmIFw==} - '@next/eslint-plugin-next@16.1.6': - resolution: {integrity: sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==} + '@next/eslint-plugin-next@16.3.0': + resolution: {integrity: sha512-OqgJ8PN0d04KcPhDX/PTY5tJUJZxlbrt7O7FBsm4XE0XW2JDrKnDXsc9uo9WUimJGPoo2j+JRGhyXApC//mvbw==} - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + '@next/swc-darwin-arm64@16.3.0': + resolution: {integrity: sha512-55hpqq18bEVAlxedlTt3tFqZmKg2nUXT1kn1G/BGEy0R13h3LwtwHPVzzjG6P4LLeOHE32PFDQUVaJEWvBEZBw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + '@next/swc-darwin-x64@16.3.0': + resolution: {integrity: sha512-SOi96kSaF5T+0wW4koiM1bWzSPwjzTesC1p3df+FjdOi5LIQkBK/blxh7HdoKnNuI4PURF1OO7TZqtfnbWDSgw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + '@next/swc-linux-arm64-gnu@16.3.0': + resolution: {integrity: sha512-P0gZAoPMF4dyTRzhmkV4PrqVzSOB6t4mC1oI3c4dqijJ+OVEVx5clIXAKR4/uQpsqw2KKM/0D5tVumcR2r5blg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + '@next/swc-linux-arm64-musl@16.3.0': + resolution: {integrity: sha512-tXXGKJw0m37O0eKJARVTX/TheKPhz0QFVtVVZXmOig+9YKLQOSP6hvf2pxv5DO7CLEJyTHx3Pg043CDQkv1G4Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + '@next/swc-linux-x64-gnu@16.3.0': + resolution: {integrity: sha512-pjGxK5EY7yWml78ALejFkWmgHsU7wbFQrISiugpH6FbUJhgEvw3xFZ/EBAtLl7QtL0WdQKiG9eWJ3mOKGTukHw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + '@next/swc-linux-x64-musl@16.3.0': + resolution: {integrity: sha512-sjo++Xx+lomlPs3HRsHWhVDyGG6ms1kGW5EtHLERdII8AyG1i+f6aq68xHREO6AEMlhjTNEWBSmfJfqm9orf7g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + '@next/swc-win32-arm64-msvc@16.3.0': + resolution: {integrity: sha512-C5JSgiO54wURdaxdEUIXqkz04uMqC9UmPX1gtDrV/5Tf1UowdWYI8uA5hfFbPolTlp0q4KZ60xlHePNibf0VIw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + '@next/swc-win32-x64-msvc@16.3.0': + resolution: {integrity: sha512-fDOggsweNb5SSw0ZKVk6U+gxSyGFFlIBY/LBc1r8GUj4u/6t6oArL+Pmkg0MBnsgR+KkdsURilVH4F3GXUGepA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/third-parties@16.1.6': - resolution: {integrity: sha512-/cLY1egaH529ylSMSK+C8dA3nWDLL4hOFR4fca9OLWWxjcNwzsbuq2pPb/tmdWL9Zj3K1nTjd1pWQoSlaDQ0VA==} + '@next/third-parties@16.3.0': + resolution: {integrity: sha512-cAA96hSI9NC7083b6sEsKjgyvM/YJ2eqXs4HWv8a/z5LE12CL1sUJS+cmcTwNMY4yAFpLyyuZHrMBEfh/4Xupw==} peerDependencies: next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -788,13 +804,13 @@ packages: '@types/node@20.16.11': resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/react-dom@19.2.4': + resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} peerDependencies: - '@types/react': ^19.2.0 + '@types/react': 19.2.18 - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} '@types/rss@0.0.32': resolution: {integrity: sha512-2oKNqKyUY4RSdvl5eZR1n2Q9yvw3XTe3mQHsFPn9alaNBxfPnbXBtGP8R0SV8pK1PrVnLul0zx7izbm5/gF5Qw==} @@ -1377,8 +1393,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-next@16.1.6: - resolution: {integrity: sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==} + eslint-config-next@16.3.0: + resolution: {integrity: sha512-lPrf1kHsMJEZqO0uXkNB400c5MGrhrTk3BNX7P0ol4gt61+iUlQfjy9TyIOEA9eOXrf+5+mYbT/JsY8+zqUByQ==} peerDependencies: eslint: '>=9.0.0' typescript: '>=3.3.1' @@ -1942,8 +1958,8 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} hasBin: true jsdom@25.0.1: @@ -2242,6 +2258,9 @@ packages: minimatch@3.1.3: resolution: {integrity: sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2262,8 +2281,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2296,8 +2315,8 @@ packages: nodemailer: optional: true - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + next@16.3.0: + resolution: {integrity: sha512-NEdGOzH+08eTXMUp9UYkA99Nhi5N6Thrhc1jgFOQgfgnGK/dA2hRwBpXep+exdFQrnwlRf/3Wixyp8lLBUpE2A==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -2506,14 +2525,14 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + engines: {node: ^10 || ^12 || >=14} + preact-render-to-string@6.5.11: resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} peerDependencies: @@ -2608,10 +2627,10 @@ packages: chart.js: ^4.1.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} peerDependencies: - react: ^19.2.4 + react: ^19.2.8 react-google-recaptcha-v3@1.10.1: resolution: {integrity: sha512-K3AYzSE0SasTn+XvV2tq+6YaxM+zQypk9rbCgG4OVUt7Rh4ze9basIKefoBz9sC0CNslJj9N1uwTTgRMJQbQJQ==} @@ -2625,11 +2644,11 @@ packages: react-markdown@9.0.1: resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} peerDependencies: - '@types/react': '>=18' + '@types/react': 19.2.18 react: '>=18' - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -2762,6 +2781,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2778,9 +2802,14 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.35.3: + resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3181,7 +3210,7 @@ packages: resolution: {integrity: sha512-o2Nwuvnk8vQBX7CcHL8WfFkZNJdxB/VKeWw0tNglw8p4cypsZ3tRT7rTRTDNeUPFS0qaMBRSKe+fVwL5xpcE3A==} engines: {node: '>=12.20.0'} peerDependencies: - '@types/react': '>=18.0.0' + '@types/react': 19.2.18 immer: '>=9.0.6' react: '>=18.0.0' use-sync-external-store: '>=1.2.0' @@ -3317,29 +3346,29 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@dnd-kit/accessibility@3.1.0(react@19.2.4)': + '@dnd-kit/accessibility@3.1.0(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 tslib: 2.7.0 - '@dnd-kit/core@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@dnd-kit/core@6.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.2.4) - '@dnd-kit/utilities': 3.2.2(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@dnd-kit/accessibility': 3.1.0(react@19.2.8) + '@dnd-kit/utilities': 3.2.2(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) tslib: 2.7.0 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@dnd-kit/utilities': 3.2.2(react@19.2.4) - react: 19.2.4 + '@dnd-kit/core': 6.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/utilities': 3.2.2(react@19.2.8) + react: 19.2.8 tslib: 2.7.0 - '@dnd-kit/utilities@3.2.2(react@19.2.4)': + '@dnd-kit/utilities@3.2.2(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 tslib: 2.7.0 '@egoist/tailwindcss-icons@1.8.1(tailwindcss@3.4.13)': @@ -3355,6 +3384,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.3.0': dependencies: tslib: 2.8.1 @@ -3377,11 +3411,11 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 3.1.3 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -3393,7 +3427,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.4': + '@eslint/eslintrc@3.3.6': dependencies: ajv: 6.14.0 debug: 4.4.3 @@ -3401,8 +3435,8 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.3 + js-yaml: 4.3.1 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -3446,7 +3480,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/colour@1.0.0': + '@img/colour@1.1.0': optional: true '@img/sharp-darwin-arm64@0.33.5': @@ -3454,9 +3488,9 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.5': + '@img/sharp-darwin-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-arm64': 1.3.2 optional: true '@img/sharp-darwin-x64@0.33.5': @@ -3464,63 +3498,68 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.5': + '@img/sharp-darwin-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.3.2 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 optional: true '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@img/sharp-libvips-darwin-arm64@1.3.2': optional: true '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@img/sharp-libvips-darwin-x64@1.3.2': optional: true '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@img/sharp-libvips-linux-arm64@1.3.2': optional: true '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@img/sharp-libvips-linux-s390x@1.3.2': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@img/sharp-libvips-linux-x64@1.3.2': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@img/sharp-libvips-linuxmusl-x64@1.3.2': optional: true '@img/sharp-linux-arm64@0.33.5': @@ -3528,9 +3567,9 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.5': + '@img/sharp-linux-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.3.2 optional: true '@img/sharp-linux-arm@0.33.5': @@ -3538,19 +3577,19 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.5': + '@img/sharp-linux-arm@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@img/sharp-linux-ppc64@0.34.5': + '@img/sharp-linux-ppc64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@img/sharp-linux-riscv64@0.34.5': + '@img/sharp-linux-riscv64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.3.2 optional: true '@img/sharp-linux-s390x@0.33.5': @@ -3558,9 +3597,9 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-s390x@0.34.5': + '@img/sharp-linux-s390x@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.3.2 optional: true '@img/sharp-linux-x64@0.33.5': @@ -3568,9 +3607,9 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.5': + '@img/sharp-linux-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.3.2 optional: true '@img/sharp-linuxmusl-arm64@0.33.5': @@ -3578,9 +3617,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + '@img/sharp-linuxmusl-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 optional: true '@img/sharp-linuxmusl-x64@0.33.5': @@ -3588,9 +3627,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 optional: true '@img/sharp-wasm32@0.33.5': @@ -3598,24 +3637,29 @@ snapshots: '@emnapi/runtime': 1.3.0 optional: true - '@img/sharp-wasm32@0.34.5': + '@img/sharp-wasm32@0.35.3': dependencies: - '@emnapi/runtime': 1.8.1 + '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-win32-arm64@0.34.5': + '@img/sharp-webcontainers-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 + optional: true + + '@img/sharp-win32-arm64@0.35.3': optional: true '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-ia32@0.34.5': + '@img/sharp-win32-ia32@0.35.3': optional: true '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.5': + '@img/sharp-win32-x64@0.35.3': optional: true '@isaacs/cliui@8.0.2': @@ -3670,40 +3714,43 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.1.6': {} + '@next/env@16.3.0': {} - '@next/eslint-plugin-next@16.1.6': + '@next/eslint-plugin-next@16.3.0(eslint@9.39.3(jiti@1.21.6))': dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@1.21.6)) fast-glob: 3.3.1 + transitivePeerDependencies: + - eslint - '@next/swc-darwin-arm64@16.1.6': + '@next/swc-darwin-arm64@16.3.0': optional: true - '@next/swc-darwin-x64@16.1.6': + '@next/swc-darwin-x64@16.3.0': optional: true - '@next/swc-linux-arm64-gnu@16.1.6': + '@next/swc-linux-arm64-gnu@16.3.0': optional: true - '@next/swc-linux-arm64-musl@16.1.6': + '@next/swc-linux-arm64-musl@16.3.0': optional: true - '@next/swc-linux-x64-gnu@16.1.6': + '@next/swc-linux-x64-gnu@16.3.0': optional: true - '@next/swc-linux-x64-musl@16.1.6': + '@next/swc-linux-x64-musl@16.3.0': optional: true - '@next/swc-win32-arm64-msvc@16.1.6': + '@next/swc-win32-arm64-msvc@16.3.0': optional: true - '@next/swc-win32-x64-msvc@16.1.6': + '@next/swc-win32-x64-msvc@16.3.0': optional: true - '@next/third-parties@16.1.6(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': + '@next/third-parties@16.3.0(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': dependencies: - next: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 + next: 16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 third-party-capital: 1.0.20 '@nodelib/fs.scandir@2.1.5': @@ -3783,7 +3830,7 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree@1.0.6': {} @@ -3817,11 +3864,11 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.4(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.18 - '@types/react@19.2.14': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 @@ -4452,9 +4499,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.1.6(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3): + eslint-config-next@16.3.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.3(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@next/eslint-plugin-next': 16.1.6 + '@next/eslint-plugin-next': 16.3.0(eslint@9.39.3(jiti@1.21.6)) eslint: 9.39.3(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.3(jiti@1.21.6)) @@ -4606,10 +4653,10 @@ snapshots: dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.4 + '@eslint/eslintrc': 3.3.6 '@eslint/js': 9.39.3 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 @@ -5201,7 +5248,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: + js-yaml@4.3.1: dependencies: argparse: 2.0.1 @@ -5678,7 +5725,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -5722,6 +5769,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -5745,7 +5796,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.17: {} nanoid@3.3.8: {} @@ -5753,43 +5804,44 @@ snapshots: natural-compare@1.4.0: {} - next-auth@5.0.0-beta.30(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4): + next-auth@5.0.0-beta.30(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8): dependencies: '@auth/core': 0.41.0 - next: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 + next: 16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 - next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@next/env': 16.1.6 + '@next/env': 16.3.0 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.0 caniuse-lite: 1.0.30001774 - postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) + postcss: 8.5.23 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.8) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 - sharp: 0.34.5 + '@next/swc-darwin-arm64': 16.3.0 + '@next/swc-darwin-x64': 16.3.0 + '@next/swc-linux-arm64-gnu': 16.3.0 + '@next/swc-linux-arm64-musl': 16.3.0 + '@next/swc-linux-x64-gnu': 16.3.0 + '@next/swc-linux-x64-musl': 16.3.0 + '@next/swc-win32-arm64-msvc': 16.3.0 + '@next/swc-win32-x64-msvc': 16.3.0 + sharp: 0.35.3(@types/node@20.16.11) transitivePeerDependencies: - '@babel/core' + - '@types/node' - babel-plugin-macros - nextjs-toploader@1.6.12(next@16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + nextjs-toploader@1.6.12(next@16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - next: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: 16.3.0(@babel/core@7.29.0)(@types/node@20.16.11)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) nprogress: 0.2.0 prop-types: 15.8.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) node-exports-info@1.6.0: dependencies: @@ -5975,18 +6027,18 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.31: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.4.47: dependencies: nanoid: 3.3.8 picocolors: 1.1.0 source-map-js: 1.2.1 + postcss@8.5.23: + dependencies: + nanoid: 3.3.17 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact-render-to-string@6.5.11(preact@10.24.3): dependencies: preact: 10.24.3 @@ -6015,33 +6067,33 @@ snapshots: queue-microtask@1.2.3: {} - react-chartjs-2@5.2.0(chart.js@4.4.4)(react@19.2.4): + react-chartjs-2@5.2.0(chart.js@4.4.4)(react@19.2.8): dependencies: chart.js: 4.4.4 - react: 19.2.4 + react: 19.2.8 - react-dom@19.2.4(react@19.2.4): + react-dom@19.2.8(react@19.2.8): dependencies: - react: 19.2.4 + react: 19.2.8 scheduler: 0.27.0 - react-google-recaptcha-v3@1.10.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-google-recaptcha-v3@1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: hoist-non-react-statics: 3.3.2 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) react-is@16.13.1: {} - react-markdown@9.0.1(@types/react@19.2.14)(react@19.2.4): + react-markdown@9.0.1(@types/react@19.2.18)(react@19.2.8): dependencies: '@types/hast': 3.0.4 - '@types/react': 19.2.14 + '@types/react': 19.2.18 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.0 - react: 19.2.4 + react: 19.2.8 remark-parse: 11.0.0 remark-rehype: 11.1.1 unified: 11.0.5 @@ -6050,7 +6102,7 @@ snapshots: transitivePeerDependencies: - supports-color - react@19.2.4: {} + react@19.2.8: {} read-cache@1.0.0: dependencies: @@ -6243,6 +6295,9 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: + optional: true + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -6291,36 +6346,38 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - sharp@0.34.5: + sharp@0.35.3(@types/node@20.16.11): dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 + '@img/sharp-darwin-arm64': 0.35.3 + '@img/sharp-darwin-x64': 0.35.3 + '@img/sharp-freebsd-wasm32': 0.35.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-linux-arm': 0.35.3 + '@img/sharp-linux-arm64': 0.35.3 + '@img/sharp-linux-ppc64': 0.35.3 + '@img/sharp-linux-riscv64': 0.35.3 + '@img/sharp-linux-s390x': 0.35.3 + '@img/sharp-linux-x64': 0.35.3 + '@img/sharp-linuxmusl-arm64': 0.35.3 + '@img/sharp-linuxmusl-x64': 0.35.3 + '@img/sharp-webcontainers-wasm32': 0.35.3 + '@img/sharp-win32-arm64': 0.35.3 + '@img/sharp-win32-ia32': 0.35.3 + '@img/sharp-win32-x64': 0.35.3 + '@types/node': 20.16.11 optional: true shebang-command@2.0.0: @@ -6472,10 +6529,10 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4): + styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.8): dependencies: client-only: 0.0.1 - react: 19.2.4 + react: 19.2.8 optionalDependencies: '@babel/core': 7.29.0 @@ -6835,9 +6892,9 @@ snapshots: zod@4.3.6: {} - zustand@5.0.0-rc.2(@types/react@19.2.14)(react@19.2.4): + zustand@5.0.0-rc.2(@types/react@19.2.18)(react@19.2.8): optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.4 + '@types/react': 19.2.18 + react: 19.2.8 zwitch@2.0.4: {} diff --git a/src/app/(common)/feed/route.ts b/src/app/(common)/feed/route.ts index 6420584..29eb551 100644 --- a/src/app/(common)/feed/route.ts +++ b/src/app/(common)/feed/route.ts @@ -1,13 +1,18 @@ +import { cacheLife, cacheTag } from 'next/cache'; import Rss from 'rss'; +import { BLOG_INDEX_CACHE_TAG } from '@/lib/blogCache'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; import { lastModified } from '@/static/constant'; -export const revalidate = 1200; - const baseURL = process.env.NEXT_PUBLIC_URL!; +const feedRevalidateSeconds = 1200; + +async function getFeedXml() { + 'use cache'; + cacheLife({ revalidate: feedRevalidateSeconds }); + cacheTag(BLOG_INDEX_CACHE_TAG); -export async function GET() { const feed = new Rss({ title: `${siteName}の新着投稿`, description: `「${siteName}」の投稿フィード`, @@ -27,11 +32,17 @@ export async function GET() { }), ); - return new Response(feed.xml(), { + return feed.xml(); +} + +export async function GET() { + const feedXml = await getFeedXml(); + + return new Response(feedXml, { status: 200, headers: { 'Content-Type': 'application/xml', - 'Cache-Control': `s-maxage=${revalidate}, stale-while-revalidate`, + 'Cache-Control': `s-maxage=${feedRevalidateSeconds}, stale-while-revalidate`, 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', }, diff --git a/src/app/(common)/layout.tsx b/src/app/(common)/layout.tsx index 50fd9cf..d11cc2d 100644 --- a/src/app/(common)/layout.tsx +++ b/src/app/(common)/layout.tsx @@ -5,6 +5,10 @@ import Footer from '@/components/layout/Footer'; import Header from '@/components/layout/Header'; import Menu from '@/components/layout/Menu'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export default function Layout({ children }: Readonly<{ children: React.ReactNode }>) { return ( <> diff --git a/src/app/(common)/page.tsx b/src/app/(common)/page.tsx index f6792ed..315d438 100644 --- a/src/app/(common)/page.tsx +++ b/src/app/(common)/page.tsx @@ -14,6 +14,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getPostsProps } from '@/lib/getPosts'; import { headerMovPath, siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(): Promise { return generateMetadataTemplate({ url: `/`, diff --git a/src/app/(common)/post/[...slug]/page.tsx b/src/app/(common)/post/[...slug]/page.tsx index 182df7e..0213a76 100644 --- a/src/app/(common)/post/[...slug]/page.tsx +++ b/src/app/(common)/post/[...slug]/page.tsx @@ -1,6 +1,7 @@ -import React, { cache } from 'react'; +import React from 'react'; import '@/styles/post/style.css'; import { Metadata } from 'next'; +import { cacheLife, cacheTag } from 'next/cache'; import { BlogPosting, WithContext } from 'schema-dts'; import JsonLd from '@/components/JsonLd'; import ShareButtons from '@/components/ShareButtons'; @@ -8,16 +9,22 @@ import Article from '@/components/layout/ArticlePage'; import { Main, SideMDShown } from '@/components/layout/PageLayout'; import PostIndex from '@/components/post/PostIndex'; import { generateMetadataTemplate } from '@/lib/SEO'; +import { getBlogPostCacheTag } from '@/lib/blogCache'; import { getPost, getPostsProps } from '@/lib/getPosts'; import { author } from '@/static/constant'; -export const revalidate = 300; -export const dynamicParams = true; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + +async function getFileContent(path: string) { + 'use cache'; + cacheLife({ revalidate: 300 }); + cacheTag(getBlogPostCacheTag(path)); -const getFileContent = cache(async (path: string) => { const postPath = `${process.env.GIT_POSTS_DIR!}/${path}.md`; return await getPost(postPath); -}); +} export async function generateStaticParams(): Promise<{ slug: string[] }[]> { const posts = await getPostsProps(); diff --git a/src/app/(common)/post/page.tsx b/src/app/(common)/post/page.tsx index eccdefe..a4aa8c8 100644 --- a/src/app/(common)/post/page.tsx +++ b/src/app/(common)/post/page.tsx @@ -8,6 +8,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(): Promise { return generateMetadataTemplate({ title: `投稿一覧`, diff --git a/src/app/(common)/profile/page.tsx b/src/app/(common)/profile/page.tsx index 2655822..c7403ca 100644 --- a/src/app/(common)/profile/page.tsx +++ b/src/app/(common)/profile/page.tsx @@ -8,6 +8,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getPost } from '@/lib/getPosts'; import { author, siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + const getFileContent = cache(async () => { const postPath = `${process.env.GIT_PROFILE_PATH!}`; return await getPost(postPath); diff --git a/src/app/(common)/search/page.tsx b/src/app/(common)/search/page.tsx index ad55517..203f156 100644 --- a/src/app/(common)/search/page.tsx +++ b/src/app/(common)/search/page.tsx @@ -7,6 +7,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(props: { searchParams: Promise<{ [key: string]: string }> }): Promise { const searchParams = await props.searchParams; const query = searchParams['q'] ?? ''; diff --git a/src/app/(common)/series/[slug]/feed/route.ts b/src/app/(common)/series/[slug]/feed/route.ts index 8ba8c7a..47fa27d 100644 --- a/src/app/(common)/series/[slug]/feed/route.ts +++ b/src/app/(common)/series/[slug]/feed/route.ts @@ -1,21 +1,25 @@ +import { cacheLife, cacheTag } from 'next/cache'; import { NextRequest } from 'next/server'; import Rss from 'rss'; +import { BLOG_INDEX_CACHE_TAG, getBlogSeriesCacheTag } from '@/lib/blogCache'; import { getSeries } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; import { lastModified } from '@/static/constant'; -export const revalidate = 1200; - const baseURL = process.env.NEXT_PUBLIC_URL!; +const feedRevalidateSeconds = 1200; + +async function getFeedXml(slug: string, encodedSlug: string) { + 'use cache'; + cacheLife({ revalidate: feedRevalidateSeconds }); + cacheTag(BLOG_INDEX_CACHE_TAG, getBlogSeriesCacheTag(slug)); -export async function GET(req: NextRequest, context: { params: Promise<{ slug: string }> }) { - const slug = decodeURIComponent((await context.params).slug); const seriesPosts = await getSeries(slug); const feed = new Rss({ title: `${siteName}のシリーズ「${seriesPosts.meta.name}」の新着投稿`, description: `「${siteName}」のシリーズ${seriesPosts.meta.description ? ': ' + seriesPosts.meta.description : ''}`, - feed_url: `${baseURL}/series/${(await context.params).slug}/feed`, + feed_url: `${baseURL}/series/${encodedSlug}/feed`, site_url: baseURL, language: 'ja', }); @@ -29,10 +33,18 @@ export async function GET(req: NextRequest, context: { params: Promise<{ slug: s }), ); - return new Response(feed.xml(), { + return feed.xml(); +} + +export async function GET(_req: NextRequest, context: { params: Promise<{ slug: string }> }) { + const { slug: encodedSlug } = await context.params; + const slug = decodeURIComponent(encodedSlug); + const feedXml = await getFeedXml(slug, encodedSlug); + + return new Response(feedXml, { headers: { 'Content-Type': 'application/xml', - 'Cache-Control': `s-maxage=${revalidate}, stale-while-revalidate`, + 'Cache-Control': `s-maxage=${feedRevalidateSeconds}, stale-while-revalidate`, }, }); } diff --git a/src/app/(common)/series/[slug]/page.tsx b/src/app/(common)/series/[slug]/page.tsx index bb1c82b..c9b992d 100644 --- a/src/app/(common)/series/[slug]/page.tsx +++ b/src/app/(common)/series/[slug]/page.tsx @@ -10,6 +10,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getSeries } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + const getContents = cache(async (slug: string) => { return getSeries(slug); }); diff --git a/src/app/(common)/series/page.tsx b/src/app/(common)/series/page.tsx index 2d758d2..a167e13 100644 --- a/src/app/(common)/series/page.tsx +++ b/src/app/(common)/series/page.tsx @@ -6,6 +6,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getSeriesProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(): Promise { return generateMetadataTemplate({ title: `シリーズ一覧`, diff --git a/src/app/(common)/tags/[slug]/feed/route.ts b/src/app/(common)/tags/[slug]/feed/route.ts index a351496..c75d1a0 100644 --- a/src/app/(common)/tags/[slug]/feed/route.ts +++ b/src/app/(common)/tags/[slug]/feed/route.ts @@ -1,19 +1,23 @@ +import { cacheLife, cacheTag } from 'next/cache'; import { NextRequest } from 'next/server'; import Rss from 'rss'; +import { BLOG_INDEX_CACHE_TAG } from '@/lib/blogCache'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; import { lastModified } from '@/static/constant'; -export const revalidate = 1200; - const baseURL = process.env.NEXT_PUBLIC_URL!; +const feedRevalidateSeconds = 1200; + +async function getFeedXml(slug: string, encodedSlug: string) { + 'use cache'; + cacheLife({ revalidate: feedRevalidateSeconds }); + cacheTag(BLOG_INDEX_CACHE_TAG); -export async function GET(req: NextRequest, context: { params: Promise<{ slug: string }> }) { - const slug = decodeURIComponent((await context.params).slug); const feed = new Rss({ title: `${siteName}のタグ「#${slug}」の新着投稿`, description: `「${siteName}」のタグ「#${slug}」の投稿フィード`, - feed_url: `${baseURL}/tags/${(await context.params).slug}/feed`, + feed_url: `${baseURL}/tags/${encodedSlug}/feed`, site_url: baseURL, language: 'ja', }); @@ -30,10 +34,18 @@ export async function GET(req: NextRequest, context: { params: Promise<{ slug: s }), ); - return new Response(feed.xml(), { + return feed.xml(); +} + +export async function GET(_req: NextRequest, context: { params: Promise<{ slug: string }> }) { + const { slug: encodedSlug } = await context.params; + const slug = decodeURIComponent(encodedSlug); + const feedXml = await getFeedXml(slug, encodedSlug); + + return new Response(feedXml, { headers: { 'Content-Type': 'application/xml', - 'Cache-Control': `s-maxage=${revalidate}, stale-while-revalidate`, + 'Cache-Control': `s-maxage=${feedRevalidateSeconds}, stale-while-revalidate`, }, }); } diff --git a/src/app/(common)/tags/[slug]/page.tsx b/src/app/(common)/tags/[slug]/page.tsx index c1aa1ef..8dcd303 100644 --- a/src/app/(common)/tags/[slug]/page.tsx +++ b/src/app/(common)/tags/[slug]/page.tsx @@ -9,6 +9,10 @@ import { generateMetadataTemplate } from '@/lib/SEO'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(props: { params: Promise<{ slug: string }> }): Promise { const params = await props.params; const slug = decodeURIComponent(params.slug); diff --git a/src/app/(common)/tags/page.tsx b/src/app/(common)/tags/page.tsx index 23b9923..0ead64e 100644 --- a/src/app/(common)/tags/page.tsx +++ b/src/app/(common)/tags/page.tsx @@ -8,6 +8,10 @@ import { getPostsProps } from '@/lib/getPosts'; import { getTags } from '@/lib/postSorter'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(): Promise { return generateMetadataTemplate({ title: `タグ一覧`, diff --git a/src/app/(dashboard)/dashboard/page.tsx b/src/app/(dashboard)/dashboard/page.tsx index a86f288..b430ef9 100644 --- a/src/app/(dashboard)/dashboard/page.tsx +++ b/src/app/(dashboard)/dashboard/page.tsx @@ -12,6 +12,10 @@ import { getHeaders, getNext } from '@/lib/fetchingFunc'; import { getPostsProps } from '@/lib/getPosts'; import { siteName } from '@/static/constant'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export async function generateMetadata(): Promise { return generateMetadataTemplate({ title: `ダッシュボード`, diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index dff1026..ff3233f 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -4,6 +4,10 @@ import NextTopLoader from 'nextjs-toploader'; import DashboardMenu from '@/components/layout/DashboardMenu'; import Header from '@/components/layout/Header'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export default function Layout({ children }: Readonly<{ children: React.ReactNode }>) { return (
diff --git a/src/app/api/ogp-posts/[...slug]/route.tsx b/src/app/api/ogp-posts/[...slug]/route.tsx index bb49841..3924c57 100644 --- a/src/app/api/ogp-posts/[...slug]/route.tsx +++ b/src/app/api/ogp-posts/[...slug]/route.tsx @@ -1,18 +1,31 @@ import { promises as fs } from 'fs'; import path from 'path'; +import { cacheLife, cacheTag } from 'next/cache'; import { ImageResponse } from 'next/og'; import { NextRequest, NextResponse } from 'next/server'; +import { getBlogPostCacheTag } from '@/lib/blogCache'; import { getImage, getPost } from '@/lib/getPosts'; import { getImageMimeType } from '@/lib/mime-getter'; -export const revalidate = 1200; +const imageRevalidateSeconds = 1200; + +async function getImageData(slug: string) { + 'use cache'; + cacheLife({ revalidate: imageRevalidateSeconds }); + cacheTag(getBlogPostCacheTag(slug)); -export async function GET(req: NextRequest, context: { params: Promise<{ slug: string[] }> }) { - const slug = decodeURIComponent((await context.params).slug.join('/')); const { data } = await getPost(`${process.env.GIT_POSTS_DIR!}/${slug}.md`); const font = await fs.readFile(path.join(process.cwd(), 'assets', 'NotoSansJP-ExtraBold-Sub.ttf')); const base64Image = data.thumbnail ? await getImage(data.thumbnail) : ''; + return { data, font: font.toString('base64'), base64Image }; +} + +export async function GET(_req: NextRequest, context: { params: Promise<{ slug: string[] }> }) { + const slug = decodeURIComponent((await context.params).slug.join('/')); + const { data, font: fontBase64, base64Image } = await getImageData(slug); + const font = Buffer.from(fontBase64, 'base64'); + if ((data.thumbnail && base64Image === '') || !data.thumbnail) return new ImageResponse( ( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index ec3b078..7773c82 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -4,6 +4,10 @@ import { GoogleTagManager } from '@next/third-parties/google'; import { notoSansJp } from '@/lib/font'; import { preloadTheme } from '@/lib/themeManager'; +// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed. +// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components +export const instant = false; + export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 5d2597d..9d59dcd 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -1,12 +1,16 @@ import { MetadataRoute } from 'next'; +import { cacheLife, cacheTag } from 'next/cache'; +import { BLOG_INDEX_CACHE_TAG } from '@/lib/blogCache'; import { getPostsProps } from '@/lib/getPosts'; import { lastModified } from '@/static/constant'; -export const revalidate = 1200; - const staticPaths = ['/post', '/profile', '/series', '/tags']; export default async function sitemap(): Promise { + 'use cache'; + cacheLife({ revalidate: 1200 }); + cacheTag(BLOG_INDEX_CACHE_TAG); + const posts = await getPostsProps(); const baseURL = process.env.NEXT_PUBLIC_URL!; diff --git a/src/components/layout/ArticlePage.tsx b/src/components/layout/ArticlePage.tsx index 3ab4bfe..27bb520 100644 --- a/src/components/layout/ArticlePage.tsx +++ b/src/components/layout/ArticlePage.tsx @@ -9,8 +9,8 @@ import { getSeries } from '@/lib/getPosts'; import { PostData } from '@/static/postType'; import LoadingCircle from '../LoadingCircle'; import { ExplainingBanner } from '../UserBanner'; +import CachedPostMarkdown from '../post/CachedPostMarkdown'; import { CommentForm, CommentFormNoPosting } from '../post/CommentForm'; -import { PostMarkdown } from '../post/MarkdownElements'; import SeriesCard from '../post/SeriesCard'; export default async function Article({ data, content, slug }: { data: PostData; content: string; slug?: string }) { @@ -53,7 +53,7 @@ export default async function Article({ data, content, slug }: { data: PostData; ) : ( <> )} - + }> {issue && slug ? ( issue.state === 'closed' ? ( diff --git a/src/components/post/CachedPostMarkdown.tsx b/src/components/post/CachedPostMarkdown.tsx new file mode 100644 index 0000000..baeca50 --- /dev/null +++ b/src/components/post/CachedPostMarkdown.tsx @@ -0,0 +1,9 @@ +import { cacheLife } from 'next/cache'; +import { PostMarkdown } from './MarkdownElements'; + +export default async function CachedPostMarkdown({ content }: { content: string }) { + 'use cache'; + cacheLife('max'); + + return ; +}