From 9f04dbaaee0990f0dcdbca89d76308473dc449d2 Mon Sep 17 00:00:00 2001 From: Mario Vercellotti Date: Sat, 21 Mar 2026 09:41:12 +0200 Subject: [PATCH 01/12] NEX-200: Update node version to 22 --- .circleci/config.yml | 2 +- .ddev/config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a04ade0b..5761aebc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ orbs: executors: cicd82: docker: - - image: wunderio/silta-cicd:circleci-php8.3-node20-composer2-v1 + - image: circleci-php8.3-node22-composer2-sqlite3.45-v1 resource_class: small commands: diff --git a/.ddev/config.yaml b/.ddev/config.yaml index 7ef65a77..382f39c0 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -2,7 +2,7 @@ name: next-drupal-starterkit type: drupal docroot: drupal/web composer_root: drupal -nodejs_version: "20" +nodejs_version: "22" php_version: "8.3" webserver_type: nginx-fpm xdebug_enabled: false From 580d30df7d9bd3708948a46c3bc31f0ce113ad01 Mon Sep 17 00:00:00 2001 From: Mario Vercellotti Date: Sat, 21 Mar 2026 09:41:32 +0200 Subject: [PATCH 02/12] NEX-200: Add copilot-instructions.md file --- .github/copilot-instructions.md | 188 ++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..2ef24ad4 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,188 @@ +# Copilot Instructions + +## Architecture Overview + +This is a **decoupled (headless) Drupal + Next.js** multilingual starter template by Wunder. The repository contains two separate applications: + +- **`drupal/`** — Drupal 10.4 (PHP 8.3) backend: content management, GraphQL API, Elasticsearch indexing, OAuth authentication +- **`next/`** — Next.js 15 (App Router, TypeScript) frontend: consumes Drupal via GraphQL, handles routing, rendering, and user auth + +Supporting services: MariaDB 10.11, Elasticsearch 8.9, Redis 4.7. + +### Data Flow + +1. Next.js issues GraphQL queries to `NEXT_PUBLIC_DRUPAL_BASE_URL/graphql` using Simple OAuth credentials +2. Pages are statically generated with on-demand ISR — Drupal POSTs to `/api/revalidate` when content is saved +3. Search queries are proxied through Drupal's `wunder_search` module to Elasticsearch +4. Frontend user auth uses Auth.js (next-auth v5 beta); users are created in Drupal via REST + +### Custom Drupal Modules (`drupal/web/modules/custom/`) + +| Module | Purpose | +|---|---| +| `wunder_next` | Configures the next-drupal integration and environment setup | +| `wunder_search` | Elasticsearch indexing and search proxy | +| `wunder_democontent` | Demo content migration | +| `wunder_sitemap` | XML sitemap generation | + +--- + +## Local Development (DDEV) + +**All npm commands must be run with `ddev` prefix and from the `next/` directory.** + +```bash +# Initial setup (idempotent — safe to re-run; use -c flag for a clean slate) +./setup-ddev.sh +./setup-ddev.sh -c # drop everything and start fresh + +# URLs after setup +# Backend: https://next-drupal-starterkit.ddev.site +# Frontend: https://frontend.ddev.site +``` + +> `localhost:3000` does not work in DDEV — use the DDEV URL above. + +--- + +## Commands + +### Next.js (`cd next` first) + +```bash +ddev npm run dev # Dev server + GraphQL codegen in watch mode +ddev npm run dev:nocodegen # Dev server only +ddev npm run build # graphql-codegen + Next.js build +ddev npm run lint # ESLint check +ddev npm run lint:fix # ESLint auto-fix +ddev npm run graphql-codegen # Regenerate GraphQL types from Drupal schema +ddev npm run storybook # Storybook on port 6006 +``` + +### Cypress E2E Tests (`cd next` first) + +```bash +ddev npm run build && ddev npm run start # Required before running tests +ddev npm run cypress:run # Run all tests headlessly +ddev npm run cypress:run -- --spec "cypress/e2e/my.cy.ts" # Single spec +``` + +One-time Cypress setup inside DDEV: +```bash +ddev npx cypress install +ddev exec ./install-cypress-deps.sh +``` + +### Drupal + +```bash +ddev drush cr # Clear caches +ddev drush uli # One-time login link +ddev drush mim --group=demo_content # Import demo content +ddev drush eshd -y && ddev drush eshs # Reset and reindex Elasticsearch +ddev composer install # Install PHP dependencies +``` + +### PHP Code Quality (`cd drupal` first) + +```bash +ddev grumphp run # All checks: phpcs, phpstan, yaml/json lint, phpunit +ddev npm run lint # ESLint + Stylelint for custom modules/themes +ddev phpunit web/modules/custom/wunder_next/tests/ # Single module tests +``` + +PHP linting targets only `web/modules/custom/` and `web/themes/custom/` (configured in `grumphp.yml`). Standard: `WunderDrupal` + `WunderSecurity` (see `phpcs.xml`). PHPStan level 5 (see `phpstan.neon`). + +--- + +## Key Conventions + +### Environment Variables + +All Next.js env vars are declared in `next/env.ts` using `@t3-oss/env-nextjs` with Zod validation. **When adding a new env var**, you must register it in four places: + +1. `.ddev/config.yaml` (local dev) +2. `next/env.ts` — twice: in the `server`/`client` schema and in `runtimeEnv` +3. `.circleci/config.yml` +4. `silta/silta-next.yml` + +Import as: `import { env } from "@/env";` — never use `process.env` directly in app code. + +### GraphQL & TypeScript Types + +GraphQL queries live in `next/src/lib/graphql/` and `next/src/lib/gql/` (generated). **Never edit files in `src/lib/gql/`** — they are gitignored and regenerated by `graphql-codegen`. + +When you add or modify a query/fragment, the types regenerate automatically on `dev` and `build`. If the **Drupal schema itself changes**, stop and restart `dev` (or re-run `graphql-codegen`) to re-fetch the schema, then also run `ddev drush cr`. + +### TypeScript + +TypeScript is intentionally loose (`strict: false`, `strictNullChecks: false`) to lower the barrier for entry. The `@/*` alias resolves to `next/src/*`. + +### Multilingual + +The frontend supports three locales: `en` (default), `fi`, `sv`. All routes are nested under the `[locale]` segment in `next/src/app/[locale]/`. Translations are managed via `next-intl`. Middleware handles locale detection and route protection. + +### Tailwind & Components + +Styling uses Tailwind CSS 3 with shadcn/ui (Radix UI primitives + `class-variance-authority`). Theme tokens (colors, radius) are CSS custom properties defined via Tailwind's config (`next/tailwind.config.js`). Component config is at `next/components.json`. + +### Silta Deployment + +`silta/` contains Helm/Kubernetes values for Wunder's [Silta](https://wunderio.github.io/silta/) hosting. CircleCI handles CI/CD (`circleci/config.yml`). There are no GitHub Actions workflows — all CI runs on CircleCI. + +### Drupal Recipes + +Drupal setup is automated via a recipe in `drupal/recipes/`. Running `./setup-ddev.sh` applies it automatically. When modifying Drupal config, export with `ddev drush cex` — config is tracked in `drupal/config/`. + +### Redis Caching + +The cache handler package is `@fortedigital/nextjs-cache-handler` (`next/cache-handler.mjs`). It replaced `@neshca/cache-handler` during the Next.js 15 upgrade. It is **only active when `NODE_ENV=production`** — in development, no custom cache handler is used. + +**Behaviour:** +- Cache keys are prefixed with `cache-{buildId}:` so deploys don't serve stale entries from a previous build +- If Redis is unavailable or the connection times out (3 s), it **falls back silently to an in-memory LRU** handler — the app keeps working +- `cacheMaxMemorySize: 0` in `next.config.mjs` disables Next.js's own in-memory cache entirely when the custom handler is active +- **Flush Redis cache** when deploying between Next.js major versions — cache formats are incompatible + +**Required env vars** (both must be set for Redis to activate; uses `@redis/client` directly): +``` +REDIS_HOST= +REDIS_PASS= +``` + +**Cache TTL constants** (`next/src/lib/constants.ts`): +```ts +REVALIDATE_SHORT = 10 // 10 seconds — for frequently changing data +REVALIDATE_LONG = 600 // 10 minutes — must match defaultStaleAge in cache-handler.mjs +``` +> If you change `REVALIDATE_LONG`, update `defaultStaleAge` in `cache-handler.mjs` to match. + +**Local (DDEV):** Redis runs by default. Inspect the cache with: +```bash +ddev redis # Opens a redis-cli session +``` + +### Async params / draftMode (Next.js 15) + +In Next.js 15, `params`, `searchParams`, `cookies()`, `headers()`, and `draftMode()` are all **Promises** in Server Components and must be awaited: + +```tsx +// Page / layout (Server Component) +export default async function Page({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + const { isEnabled } = await draftMode(); +} + +// Client Component — use React.use() to unwrap +"use client"; +import { use } from "react"; +export default function Page({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = use(params); +} +``` + +This applies to `generateMetadata` and `generateStaticParams` too. + +### Auth + +The Drupal backend uses **Simple OAuth** (two consumers: one for the server-to-server Next.js integration, one for the viewer/public role). OAuth key pairs are generated fresh for each environment. On the frontend, **Auth.js** (NextAuth v5 beta) handles user sessions; protected routes are defined in `next/src/middleware.ts`. From 32c820e4574ed52d0f07ed025d5236de711203b7 Mon Sep 17 00:00:00 2001 From: Mario Vercellotti Date: Sat, 21 Mar 2026 09:44:11 +0200 Subject: [PATCH 03/12] NEX-200: Update next.js to version 15, switch to @fortedigital/nextjs-cache-handler --- next/.gitignore | 3 +- next/cache-handler.mjs | 12 +- next/next-env.d.ts | 3 +- next/next.config.mjs | 5 +- next/package-lock.json | 1249 ++++++++++++----- next/package.json | 19 +- .../[locale]/(dynamic)/[...slug]/layout.tsx | 5 +- .../app/[locale]/(dynamic)/[...slug]/page.tsx | 26 +- .../[locale]/(static)/all-articles/page.tsx | 20 +- .../app/[locale]/(static)/auth/login/page.tsx | 7 +- .../[locale]/(static)/auth/register/page.tsx | 7 +- .../app/[locale]/(static)/dashboard/page.tsx | 10 +- .../[webformSubmissionUuid]/page.tsx | 9 +- next/src/app/[locale]/(static)/layout.tsx | 7 +- .../[locale]/(static)/nodepreview/page.tsx | 11 +- next/src/app/[locale]/(static)/page.tsx | 16 +- .../src/app/[locale]/(static)/search/page.tsx | 9 +- next/src/app/[locale]/layout.tsx | 10 +- next/src/app/api/search/route.ts | 2 +- next/src/components/draft-alert.tsx | 2 +- next/src/instrumentation.ts | 2 +- next/src/lib/drupal/get-menus.ts | 19 +- next/src/lib/drupal/get-node.ts | 20 +- next/src/lib/hooks/use-event-listener.ts | 2 +- 24 files changed, 1011 insertions(+), 464 deletions(-) diff --git a/next/.gitignore b/next/.gitignore index 5a1ac4fd..beba9c02 100644 --- a/next/.gitignore +++ b/next/.gitignore @@ -49,4 +49,5 @@ lerna-debug.log* # Cypress gitignore /cypress/screenshots/ -/cypress/videos/ \ No newline at end of file +/cypress/videos/ +/tsconfig.tsbuildinfo diff --git a/next/cache-handler.mjs b/next/cache-handler.mjs index 7847fefb..48e74e40 100644 --- a/next/cache-handler.mjs +++ b/next/cache-handler.mjs @@ -1,17 +1,16 @@ // @ts-check -import { CacheHandler } from "@neshca/cache-handler"; -import createLruHandler from "@neshca/cache-handler/local-lru"; -import createRedisHandler from "@neshca/cache-handler/redis-strings"; -import { createClient } from "redis"; +import { CacheHandler } from "@fortedigital/nextjs-cache-handler"; +import createLruHandler from "@fortedigital/nextjs-cache-handler/local-lru"; +import createRedisHandler from "@fortedigital/nextjs-cache-handler/redis-strings"; +import { createClient } from "@redis/client"; // This should match the REVALIDATE_LONG value in src/lib/constants.ts const defaultStaleAge = 60 * 10; CacheHandler.onCreation(async ({ buildId }) => { - /** @type {import("redis").RedisClientType | undefined} */ let client; - /** @type {import("@neshca/cache-handler").Handler | undefined} */ + /** @type {any} */ let handler; if ( @@ -68,7 +67,6 @@ CacheHandler.onCreation(async ({ buildId }) => { } if (client?.isReady) { - /** @type {import("@neshca/cache-handler/redis-strings").CreateRedisStringsHandlerOptions} */ const redisHandlerOptions = { client, keyPrefix: `cache-${buildId}:`, diff --git a/next/next-env.d.ts b/next/next-env.d.ts index 40c3d680..830fb594 100644 --- a/next/next-env.d.ts +++ b/next/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next/next.config.mjs b/next/next.config.mjs index 42a55de0..54d5db63 100644 --- a/next/next.config.mjs +++ b/next/next.config.mjs @@ -35,10 +35,7 @@ const nextConfig = { }), }, - experimental: { - instrumentationHook: true, - swrDelta: 31536000, // 1 year - }, + expireTime: 31536000, // 1 year (formerly experimental.swrDelta) async generateBuildId() { return process.env.CIRCLECI diff --git a/next/package-lock.json b/next/package-lock.json index cd2893f7..0d917b48 100644 --- a/next/package-lock.json +++ b/next/package-lock.json @@ -9,8 +9,8 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@fortedigital/nextjs-cache-handler": "^2", "@hookform/resolvers": "^3.9.1", - "@neshca/cache-handler": "^1.9.0", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-dialog": "^1.1.4", @@ -19,6 +19,7 @@ "@radix-ui/react-navigation-menu": "^1.2.3", "@radix-ui/react-separator": "^1.1.1", "@radix-ui/react-slot": "^1.1.1", + "@redis/client": "^5", "@searchkit/api": "^4.13.0", "@searchkit/instantsearch-client": "^4.14.1", "@t3-oss/env-nextjs": "^0.11.1", @@ -32,18 +33,17 @@ "instantsearch.css": "^8.5.1", "jwt-decode": "^4.0.0", "lucide-react": "^0.469.0", - "next": "^14.2.30", + "next": "^15.2.4", "next-auth": "^5.0.0-beta.25", "next-drupal": "^2.0.0", "next-intl": "^3.26.3", "next-themes": "^0.4.4", "p-retry": "^6.2.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19", + "react-dom": "^19", "react-hook-form": "^7.54.2", "react-instantsearch": "^7.13.9", "react-youtube": "^10.1.0", - "redis": "^4.7.0", "server-only": "^0.0.1", "sharp": "^0.33.5", "sonner": "^1.7.1", @@ -55,7 +55,7 @@ "@graphql-codegen/cli": "^5.0.3", "@graphql-codegen/client-preset": "^4.5.1", "@graphql-codegen/schema-ast": "^4.1.0", - "@next/eslint-plugin-next": "^14.2.22", + "@next/eslint-plugin-next": "^15", "@parcel/watcher": "^2.5.0", "@storybook/addon-essentials": "^8.4.7", "@storybook/addon-interactions": "^8.4.7", @@ -67,8 +67,8 @@ "@svgr/webpack": "^8.1.0", "@tailwindcss/typography": "^0.5.15", "@types/node": "^20.17.10", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", + "@types/react": "^19", + "@types/react-dom": "^19", "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "autoprefixer": "^10.4.20", @@ -76,7 +76,7 @@ "cypress": "^13.17.0", "cypress-mailpit": "^1.4.0", "eslint": "^8.57.1", - "eslint-config-next": "^14.2.22", + "eslint-config-next": "^15", "eslint-config-prettier": "^9.1.0", "eslint-plugin-n": "^17.15.1", "eslint-plugin-prettier": "^5.2.1", @@ -99,42 +99,58 @@ "dev": true, "license": "MIT" }, + "node_modules/@algolia/abtesting": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", + "integrity": "sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-abtesting": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.3.tgz", - "integrity": "sha512-wPOzHYSsW+H97JkBLmnlOdJSpbb9mIiuNPycUCV5DgzSkJFaI/OFxXfZXAh1gqxK+hf0miKue1C9bltjWljrNA==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.2.tgz", + "integrity": "sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.3.tgz", - "integrity": "sha512-XE3iduH9lA7iTQacDGofBQyIyIgaX8qbTRRdj1bOCmfzc9b98CoiMwhNwdTifmmMewmN0EhVF3hP8KjKWwX7Yw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.2.tgz", + "integrity": "sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.3.tgz", - "integrity": "sha512-IYRd/A/R3BXeaQVT2805lZEdWo54v39Lqa7ABOxIYnUvX2vvOMW1AyzCuT0U7Q+uPdD4UW48zksUKRixShcWxA==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.2.tgz", + "integrity": "sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==", "license": "MIT", "peer": true, "engines": { @@ -142,64 +158,64 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.3.tgz", - "integrity": "sha512-QGc/bmDUBgzB71rDL6kihI2e1Mx6G6PxYO5Ks84iL3tDcIel1aFuxtRF14P8saGgdIe1B6I6QkpkeIddZ6vWQw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.2.tgz", + "integrity": "sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.3.tgz", - "integrity": "sha512-zuM31VNPDJ1LBIwKbYGz/7+CSm+M8EhlljDamTg8AnDilnCpKjBebWZR5Tftv/FdWSro4tnYGOIz1AURQgZ+tQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.2.tgz", + "integrity": "sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.3.tgz", - "integrity": "sha512-Nn872PuOI8qzi1bxMMhJ0t2AzVBqN01jbymBQOkypvZHrrjZPso3iTpuuLLo9gi3yc/08vaaWTAwJfPhxPwJUw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.2.tgz", + "integrity": "sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.3.tgz", - "integrity": "sha512-9+Fm1ahV8/2goSIPIqZnVitV5yHW5E5xTdKy33xnqGd45A9yVv5tTkudWzEXsbfBB47j9Xb3uYPZjAvV5RHbKA==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", + "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -212,87 +228,87 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.3.tgz", - "integrity": "sha512-5GHNTiZ3saLjTNyr6WkP5hzDg2eFFAYWomvPcm9eHWskjzXt8R0IOiW9kkTS6I6hXBwN5H9Zna5mZDSqqJdg+g==", + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.2.tgz", + "integrity": "sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.3.tgz", - "integrity": "sha512-KUWQbTPoRjP37ivXSQ1+lWMfaifCCMzTnEcEnXwAmherS5Tp7us6BAqQDMGOD4E7xyaS2I8pto6WlOzxH+CxmA==", + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.2.tgz", + "integrity": "sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.3.tgz", - "integrity": "sha512-oo/gG77xTTTclkrdFem0Kmx5+iSRFiwuRRdxZETDjwzCI7svutdbwBgV/Vy4D4QpYaX4nhY/P43k84uEowCE4Q==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.2.tgz", + "integrity": "sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.3.tgz", - "integrity": "sha512-BkkW7otbiI/Er1AiEPZs1h7lxbtSO9p09jFhv3/iT8/0Yz0CY79VJ9iq+Wv1+dq/l0OxnMpBy8mozrieGA3mXQ==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.2.tgz", + "integrity": "sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.3.tgz", - "integrity": "sha512-eAVlXz7UNzTsA1EDr+p0nlIH7WFxo7k3NMxYe8p38DH8YVWLgm2MgOVFUMNg9HCi6ZNOi/A2w/id2ZZ4sKgUOw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.2.tgz", + "integrity": "sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.3.tgz", - "integrity": "sha512-FqR3pQPfHfQyX1wgcdK6iyqu86yP76MZd4Pzj1y/YLMj9rRmRCY0E0AffKr//nrOFEwv6uY8BQY4fd9/6b0ZCg==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.2.tgz", + "integrity": "sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.20.3" + "@algolia/client-common": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -2212,9 +2228,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "license": "MIT", "optional": true, "dependencies": { @@ -2889,6 +2905,69 @@ "tslib": "2" } }, + "node_modules/@fortedigital/nextjs-cache-handler": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@fortedigital/nextjs-cache-handler/-/nextjs-cache-handler-2.5.3.tgz", + "integrity": "sha512-sK5DCa7EGdrBHzVo4EqWPKMwvIycyOHaAPu69QA6bn38lUzcTFqnYDV85DWiGFfLLy3NCd6jixkGcuv2XntB4A==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2", + "lru-cache": "11.2.6", + "p-limit": "^7.3.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.59.0" + }, + "peerDependencies": { + "@redis/client": ">= 5.5.6", + "ioredis": ">= 5.0.0", + "next": ">=15.2.4" + }, + "peerDependenciesMeta": { + "ioredis": { + "optional": true + } + } + }, + "node_modules/@fortedigital/nextjs-cache-handler/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@fortedigital/nextjs-cache-handler/node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@fortedigital/nextjs-cache-handler/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@graphql-codegen/add": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz", @@ -3836,6 +3915,16 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -3944,6 +4033,38 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", @@ -4052,6 +4173,50 @@ "@img/sharp-libvips-linux-arm64": "1.0.4" } }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, "node_modules/@img/sharp-linux-s390x": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", @@ -4159,6 +4324,25 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", @@ -4364,46 +4548,56 @@ "react": ">=16" } }, - "node_modules/@neshca/cache-handler": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@neshca/cache-handler/-/cache-handler-1.9.0.tgz", - "integrity": "sha512-dh0x4pdjDKvPRfZF5DZb8TtOUkbBfeTodOUdQsHDuv0oiuqQ3p7GLx38f6bPn8Sa4he8HsWo+rM4S20ZRqr7pA==", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.2", - "lru-cache": "10.4.3" - }, - "peerDependencies": { - "next": ">= 13.5.1 < 15", - "redis": ">= 4.6" - } - }, - "node_modules/@neshca/cache-handler/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, "node_modules/@next/env": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.30.tgz", - "integrity": "sha512-KBiBKrDY6kxTQWGzKjQB7QirL3PiiOkV7KW98leHFjtVRKtft76Ra5qSA/SL75xT44dp6hOcqiiJ6iievLOYug==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.14.tgz", + "integrity": "sha512-aXeirLYuASxEgi4X4WhfXsShCFxWDfNn/8ZeC5YXAS2BB4A8FJi1kwwGL6nvMVboE7fZCzmJPNdMvVHc8JpaiA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.24.tgz", - "integrity": "sha512-FDL3qs+5DML0AJz56DCVr+KnFYivxeAX73En8QbPw9GjJZ6zbfvqDy+HrarHFzbsIASn7y8y5ySJ/lllSruNVQ==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.14.tgz", + "integrity": "sha512-ogBjgsFrPPz19abP3VwcYSahbkUOMMvJjxCOYWYndw+PydeMuLuB4XrvNkNutFrTjC9St2KFULRdKID8Sd/CMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "license": "MIT", "dependencies": { - "glob": "10.3.10" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.30.tgz", - "integrity": "sha512-EAqfOTb3bTGh9+ewpO/jC59uACadRHM6TSA9DdxJB/6gxOpyV+zrbqeXiFTDy9uV6bmipFDkfpAskeaDcO+7/g==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.14.tgz", + "integrity": "sha512-Y9K6SPzobnZvrRDPO2s0grgzC+Egf0CqfbdvYmQVaztV890zicw8Z8+4Vqw8oPck8r1TjUHxVh8299Cg4TrxXg==", "cpu": [ "arm64" ], @@ -4417,9 +4611,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.30.tgz", - "integrity": "sha512-TyO7Wz1IKE2kGv8dwQ0bmPL3s44EKVencOqwIY69myoS3rdpO1NPg5xPM5ymKu7nfX4oYJrpMxv8G9iqLsnL4A==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.14.tgz", + "integrity": "sha512-aNnkSMjSFRTOmkd7qoNI2/rETQm/vKD6c/Ac9BZGa9CtoOzy3c2njgz7LvebQJ8iPxdeTuGnAjagyis8a9ifBw==", "cpu": [ "x64" ], @@ -4433,9 +4627,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.30.tgz", - "integrity": "sha512-I5lg1fgPJ7I5dk6mr3qCH1hJYKJu1FsfKSiTKoYwcuUf53HWTrEkwmMI0t5ojFKeA6Vu+SfT2zVy5NS0QLXV4Q==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.14.tgz", + "integrity": "sha512-tjlpia+yStPRS//6sdmlVwuO1Rioern4u2onafa5n+h2hCS9MAvMXqpVbSrjgiEOoCs0nJy7oPOmWgtRRNSM5Q==", "cpu": [ "arm64" ], @@ -4449,9 +4643,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.30.tgz", - "integrity": "sha512-8GkNA+sLclQyxgzCDs2/2GSwBc92QLMrmYAmoP2xehe5MUKBLB2cgo34Yu242L1siSkwQkiV4YLdCnjwc/Micw==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.14.tgz", + "integrity": "sha512-8B8cngBaLadl5lbDRdxGCP1Lef8ipD6KlxS3v0ElDAGil6lafrAM3B258p1KJOglInCVFUjk751IXMr2ixeQOQ==", "cpu": [ "arm64" ], @@ -4465,9 +4659,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.30.tgz", - "integrity": "sha512-8Ly7okjssLuBoe8qaRCcjGtcMsv79hwzn/63wNeIkzJVFVX06h5S737XNr7DZwlsbTBDOyI6qbL2BJB5n6TV/w==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.14.tgz", + "integrity": "sha512-bAS6tIAg8u4Gn3Nz7fCPpSoKAexEt2d5vn1mzokcqdqyov6ZJ6gu6GdF9l8ORFrBuRHgv3go/RfzYz5BkZ6YSQ==", "cpu": [ "x64" ], @@ -4481,9 +4675,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.30.tgz", - "integrity": "sha512-dBmV1lLNeX4mR7uI7KNVHsGQU+OgTG5RGFPi3tBJpsKPvOPtg9poyav/BYWrB3GPQL4dW5YGGgalwZ79WukbKQ==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.14.tgz", + "integrity": "sha512-mMxv/FcrT7Gfaq4tsR22l17oKWXZmH/lVqcvjX0kfp5I0lKodHYLICKPoX1KRnnE+ci6oIUdriUhuA3rBCDiSw==", "cpu": [ "x64" ], @@ -4497,9 +4691,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.30.tgz", - "integrity": "sha512-6MMHi2Qc1Gkq+4YLXAgbYslE1f9zMGBikKMdmQRHXjkGPot1JY3n5/Qrbg40Uvbi8//wYnydPnyvNhI1DMUW1g==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.14.tgz", + "integrity": "sha512-OTmiBlYThppnvnsqx0rBqjDRemlmIeZ8/o4zI7veaXoeO1PVHoyj2lfTfXTiiGjCyRDhA10y4h6ZvZvBiynr2g==", "cpu": [ "arm64" ], @@ -4512,26 +4706,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.30.tgz", - "integrity": "sha512-pVZMnFok5qEX4RT59mK2hEVtJX+XFfak+/rjHpyFh7juiT52r177bfFKhnlafm0UOSldhXjj32b+LZIOdswGTg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.30.tgz", - "integrity": "sha512-4KCo8hMZXMjpTzs3HOqOGYYwAXymXIy7PEPAXNEcEOyKqkjiDlECumrWziy+JEF0Oi4ILHGxzgQ3YiMGG2t/Lg==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.14.tgz", + "integrity": "sha512-+W7eFf3RS7m4G6tppVTOSyP9Y6FsJXfOuKzav1qKniiFm3KFByQfPEcouHdjlZmysl4zJGuGLQ/M9XyVeyeNEg==", "cpu": [ "x64" ], @@ -5755,69 +5933,24 @@ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", "license": "MIT" }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.11.0.tgz", + "integrity": "sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==", "license": "MIT", "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" + "cluster-key-slot": "1.1.2" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "license": "MIT", + "node": ">= 18" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@node-rs/xxhash": "^1.1.0" + }, + "peerDependenciesMeta": { + "@node-rs/xxhash": { + "optional": true + } } }, "node_modules/@repeaterjs/repeater": { @@ -5827,6 +5960,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.1.tgz", + "integrity": "sha512-NQ9KyU1Anuy59L8+HHOKM++CoUxrQWrZWXRik4BJFm+7i5NP6q/SW43xIBr80zzt+PDBJ7LeNmloQGfa0JGk0w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -6910,20 +7056,13 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@t3-oss/env-core": { @@ -7306,13 +7445,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "devOptional": true, - "license": "MIT" - }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", @@ -7320,24 +7452,23 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/resolve": { @@ -8124,25 +8255,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.3.tgz", - "integrity": "sha512-iNC6BGvipaalFfDfDnXUje8GUlW5asj0cTMsZJwO/0rhsyLx1L7GZFAY8wW+eQ6AM4Yge2p5GSE5hrBlfSD90Q==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", + "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-abtesting": "5.20.3", - "@algolia/client-analytics": "5.20.3", - "@algolia/client-common": "5.20.3", - "@algolia/client-insights": "5.20.3", - "@algolia/client-personalization": "5.20.3", - "@algolia/client-query-suggestions": "5.20.3", - "@algolia/client-search": "5.20.3", - "@algolia/ingestion": "1.20.3", - "@algolia/monitoring": "1.20.3", - "@algolia/recommend": "5.20.3", - "@algolia/requester-browser-xhr": "5.20.3", - "@algolia/requester-fetch": "5.20.3", - "@algolia/requester-node-http": "5.20.3" + "@algolia/abtesting": "1.15.2", + "@algolia/client-abtesting": "5.49.2", + "@algolia/client-analytics": "5.49.2", + "@algolia/client-common": "5.49.2", + "@algolia/client-insights": "5.49.2", + "@algolia/client-personalization": "5.49.2", + "@algolia/client-query-suggestions": "5.49.2", + "@algolia/client-search": "5.49.2", + "@algolia/ingestion": "1.49.2", + "@algolia/monitoring": "1.49.2", + "@algolia/recommend": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" }, "engines": { "node": ">= 14.0.0" @@ -9308,6 +9440,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, "dependencies": { "streamsearch": "^1.1.0" }, @@ -10397,9 +10530,9 @@ "license": "CC0-1.0" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, @@ -11596,25 +11729,25 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.24", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.24.tgz", - "integrity": "sha512-9r1ujK++Pgpfixr5+DQ6rXDIQmSzuDbBlAQYMkJRMz9KWqovX7ESUTC0EAyBfOCl3ubkoeplw+aoXDuih3A8fw==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.14.tgz", + "integrity": "sha512-lmJ5F8ZgOYogq0qtH4L5SpxuASY2SPdOzqUprN2/56+P3GPsIpXaUWIJC66kYIH+yZdsM4nkHE5MIBP6s1NiBw==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "14.2.24", - "@rushstack/eslint-patch": "^1.3.3", + "@next/eslint-plugin-next": "15.5.14", + "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "peerDependenciesMeta": { @@ -12031,16 +12164,16 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.0.0-canary-7118f5dd7-20230705", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", - "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { @@ -13033,15 +13166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -13296,6 +13420,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -15679,41 +15804,40 @@ "license": "MIT" }, "node_modules/next": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.30.tgz", - "integrity": "sha512-+COdu6HQrHHFQ1S/8BBsCag61jZacmvbuL2avHvQFbWa2Ox7bE+d8FyNgxRLjXQ5wtPyQwEmk85js/AuaG2Sbg==", + "version": "15.5.14", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.14.tgz", + "integrity": "sha512-M6S+4JyRjmKic2Ssm7jHUPkE6YUJ6lv4507jprsSZLulubz0ihO2E+S4zmQK3JZ2ov81JrugukKU4Tz0ivgqqQ==", "license": "MIT", "dependencies": { - "@next/env": "14.2.30", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", + "@next/env": "15.5.14", + "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1" + "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=18.17.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.30", - "@next/swc-darwin-x64": "14.2.30", - "@next/swc-linux-arm64-gnu": "14.2.30", - "@next/swc-linux-arm64-musl": "14.2.30", - "@next/swc-linux-x64-gnu": "14.2.30", - "@next/swc-linux-x64-musl": "14.2.30", - "@next/swc-win32-arm64-msvc": "14.2.30", - "@next/swc-win32-ia32-msvc": "14.2.30", - "@next/swc-win32-x64-msvc": "14.2.30" + "@next/swc-darwin-arm64": "15.5.14", + "@next/swc-darwin-x64": "15.5.14", + "@next/swc-linux-arm64-gnu": "15.5.14", + "@next/swc-linux-arm64-musl": "15.5.14", + "@next/swc-linux-x64-gnu": "15.5.14", + "@next/swc-linux-x64-musl": "15.5.14", + "@next/swc-win32-arm64-msvc": "15.5.14", + "@next/swc-win32-x64-msvc": "15.5.14", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { @@ -15723,6 +15847,9 @@ "@playwright/test": { "optional": true }, + "babel-plugin-react-compiler": { + "optional": true + }, "sass": { "optional": true } @@ -15800,19 +15927,390 @@ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, + "node_modules/next/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/next/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/next/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", "url": "https://github.com/sponsors/ai" @@ -15828,27 +16326,62 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/next/node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "license": "MIT", + "node_modules/next/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/next/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "client-only": "0.0.1" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { - "node": ">= 12.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "funding": { + "url": "https://opencollective.com/libvips" }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } + "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" } }, "node_modules/no-case": { @@ -17557,13 +18090,10 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -17601,16 +18131,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.4" } }, "node_modules/react-hook-form": { @@ -17888,23 +18417,6 @@ "node": ">=8" } }, - "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "license": "MIT", - "workspaces": [ - "./packages/*" - ], - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -18580,13 +19092,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.0", @@ -19231,6 +19740,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true, "engines": { "node": ">=10.0.0" } @@ -19519,7 +20029,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "dev": true, "license": "MIT", "dependencies": { "client-only": "0.0.1" diff --git a/next/package.json b/next/package.json index 09a389be..0d9bab25 100644 --- a/next/package.json +++ b/next/package.json @@ -21,7 +21,8 @@ }, "dependencies": { "@hookform/resolvers": "^3.9.1", - "@neshca/cache-handler": "^1.9.0", + "@fortedigital/nextjs-cache-handler": "^2", + "@redis/client": "^5", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-dialog": "^1.1.4", @@ -43,18 +44,18 @@ "instantsearch.css": "^8.5.1", "jwt-decode": "^4.0.0", "lucide-react": "^0.469.0", - "next": "^14.2.30", + "next": "^15.2.4", "next-auth": "^5.0.0-beta.25", "next-drupal": "^2.0.0", "next-intl": "^3.26.3", "next-themes": "^0.4.4", "p-retry": "^6.2.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19", + "react-dom": "^19", "react-hook-form": "^7.54.2", "react-instantsearch": "^7.13.9", "react-youtube": "^10.1.0", - "redis": "^4.7.0", + "server-only": "^0.0.1", "sharp": "^0.33.5", "sonner": "^1.7.1", @@ -66,7 +67,7 @@ "@graphql-codegen/cli": "^5.0.3", "@graphql-codegen/client-preset": "^4.5.1", "@graphql-codegen/schema-ast": "^4.1.0", - "@next/eslint-plugin-next": "^14.2.22", + "@next/eslint-plugin-next": "^15", "@parcel/watcher": "^2.5.0", "@storybook/addon-essentials": "^8.4.7", "@storybook/addon-interactions": "^8.4.7", @@ -78,8 +79,8 @@ "@svgr/webpack": "^8.1.0", "@tailwindcss/typography": "^0.5.15", "@types/node": "^20.17.10", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", + "@types/react": "^19", + "@types/react-dom": "^19", "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "autoprefixer": "^10.4.20", @@ -87,7 +88,7 @@ "cypress": "^13.17.0", "cypress-mailpit": "^1.4.0", "eslint": "^8.57.1", - "eslint-config-next": "^14.2.22", + "eslint-config-next": "^15", "eslint-config-prettier": "^9.1.0", "eslint-plugin-n": "^17.15.1", "eslint-plugin-prettier": "^5.2.1", diff --git a/next/src/app/[locale]/(dynamic)/[...slug]/layout.tsx b/next/src/app/[locale]/(dynamic)/[...slug]/layout.tsx index da7101f8..31db3c26 100644 --- a/next/src/app/[locale]/(dynamic)/[...slug]/layout.tsx +++ b/next/src/app/[locale]/(dynamic)/[...slug]/layout.tsx @@ -10,11 +10,12 @@ import { extractEntityFromRouteQueryResult } from "@/lib/graphql/utils"; export default async function DynamicLayout({ children, - params: { locale, slug }, + params, }: { children: React.ReactNode; - params: { locale: string; slug: string[] }; + params: Promise<{ locale: string; slug: string[] }>; }) { + const { locale, slug } = await params; setRequestLocale(locale); const path = "/" + slug.join("/"); diff --git a/next/src/app/[locale]/(dynamic)/[...slug]/page.tsx b/next/src/app/[locale]/(dynamic)/[...slug]/page.tsx index 46e4e9c3..b4f5b5d4 100644 --- a/next/src/app/[locale]/(dynamic)/[...slug]/page.tsx +++ b/next/src/app/[locale]/(dynamic)/[...slug]/page.tsx @@ -5,7 +5,6 @@ import { getDraftData } from "next-drupal/draft"; import { setRequestLocale } from "next-intl/server"; import { Node } from "@/components/node"; -import { REVALIDATE_LONG } from "@/lib/constants"; import { getNodeByPathQuery } from "@/lib/drupal/get-node"; import { getNodeMetadata } from "@/lib/drupal/get-node-metadata"; import { getNodeStaticParams } from "@/lib/drupal/get-node-static-params"; @@ -15,13 +14,14 @@ import { } from "@/lib/graphql/utils"; type NodePageParams = { - params: { slug: string[]; locale: string }; + params: Promise<{ slug: string[]; locale: string }>; }; // The metadata for the page is generated here. export async function generateMetadata({ - params: { locale, slug }, + params, }: NodePageParams): Promise { + const { locale, slug } = await params; const path = "/" + slug.join("/"); const metadata = await getNodeMetadata(path, locale); return metadata; @@ -29,27 +29,29 @@ export async function generateMetadata({ // Generates static paths for all node types. export async function generateStaticParams({ - params: { locale }, -}: NodePageParams) { + params, +}: { + params: { locale: string }; +}) { + const { locale } = params; // TODO: Add the node types you want to generate static paths in the array below. const nodeTypes = ["nodePages", "nodeArticles"]; - const params = await getNodeStaticParams(nodeTypes, locale, 10); - return params; + const staticParams = await getNodeStaticParams(nodeTypes, locale, 10); + return staticParams; } // We set the revalidate time to a long period because the content is not expected to change frequently. -export const revalidate = REVALIDATE_LONG; +export const revalidate = 600; // REVALIDATE_LONG — must be a static literal for Next.js build analysis -export default async function NodePage({ - params: { locale, slug }, -}: NodePageParams) { +export default async function NodePage({ params }: NodePageParams) { + const { locale, slug } = await params; setRequestLocale(locale); // Construct the path from the slug array. const path = "/" + slug.join("/"); // Are we in Next.js draft mode? - const isDraftMode = draftMode().isEnabled; + const { isEnabled: isDraftMode } = await draftMode(); // Get the node entity from Drupal. We tell the function if we are in draft mode so it can use the correct client // in the getNodeByPathQuery function. diff --git a/next/src/app/[locale]/(static)/all-articles/page.tsx b/next/src/app/[locale]/(static)/all-articles/page.tsx index f0f44550..8a75b102 100644 --- a/next/src/app/[locale]/(static)/all-articles/page.tsx +++ b/next/src/app/[locale]/(static)/all-articles/page.tsx @@ -1,7 +1,6 @@ import { Metadata } from "next"; import { getTranslations, setRequestLocale } from "next-intl/server"; -import { REVALIDATE_LONG } from "@/lib/constants"; import { getLatestArticlesItems } from "@/lib/drupal/get-articles"; import ArticlesPagination from "./_components/articles-pagination"; @@ -9,18 +8,19 @@ import ArticlesPagination from "./_components/articles-pagination"; import { getPathname } from "@/i18n/routing"; type ArticlesListingPageParams = { - params: { + params: Promise<{ locale: string; - }; - searchParams?: { + }>; + searchParams?: Promise<{ query?: string; page?: string; - }; + }>; }; export async function generateMetadata({ - params: { locale }, + params, }: ArticlesListingPageParams): Promise { + const { locale } = await params; const t = await getTranslations({ locale }); // Example: This page accepts search params like `?page=1`. @@ -42,16 +42,18 @@ export async function generateMetadata({ }; } -export const revalidate = REVALIDATE_LONG; +export const revalidate = 600; // REVALIDATE_LONG — must be a static literal for Next.js build analysis export default async function AllArticlesPage({ - params: { locale }, + params, searchParams, }: ArticlesListingPageParams) { + const { locale } = await params; setRequestLocale(locale); // Get the query and current page from the search params - const currentPage = Number(searchParams?.page) || 1; + const resolvedSearchParams = await searchParams; + const currentPage = Number(resolvedSearchParams?.page) || 1; // This has to match one of the allowed values in the article listing view // in Drupal. diff --git a/next/src/app/[locale]/(static)/auth/login/page.tsx b/next/src/app/[locale]/(static)/auth/login/page.tsx index 69b681c7..bc451890 100644 --- a/next/src/app/[locale]/(static)/auth/login/page.tsx +++ b/next/src/app/[locale]/(static)/auth/login/page.tsx @@ -11,11 +11,12 @@ export async function generateMetadata(): Promise { }; } -export default function LoginPage({ - params: { locale }, +export default async function LoginPage({ + params, }: { - params: { locale: string }; + params: Promise<{ locale: string }>; }) { + const { locale } = await params; setRequestLocale(locale); return ( diff --git a/next/src/app/[locale]/(static)/auth/register/page.tsx b/next/src/app/[locale]/(static)/auth/register/page.tsx index c837a5e6..b1f5f9b8 100644 --- a/next/src/app/[locale]/(static)/auth/register/page.tsx +++ b/next/src/app/[locale]/(static)/auth/register/page.tsx @@ -10,11 +10,12 @@ export async function generateMetadata(): Promise { }; } -export default function RegisterPage({ - params: { locale }, +export default async function RegisterPage({ + params, }: { - params: { locale: string }; + params: Promise<{ locale: string }>; }) { + const { locale } = await params; setRequestLocale(locale); return ; diff --git a/next/src/app/[locale]/(static)/dashboard/page.tsx b/next/src/app/[locale]/(static)/dashboard/page.tsx index c47e5006..858d8fe1 100644 --- a/next/src/app/[locale]/(static)/dashboard/page.tsx +++ b/next/src/app/[locale]/(static)/dashboard/page.tsx @@ -23,10 +23,11 @@ import { import { LinkWithLocale } from "@/i18n/routing"; export async function generateMetadata({ - params: { locale }, + params, }: { - params: { locale: string }; + params: Promise<{ locale: string }>; }): Promise { + const { locale } = await params; const t = await getTranslations({ locale }); return { @@ -35,10 +36,11 @@ export async function generateMetadata({ } export default async function DashboardPage({ - params: { locale }, + params, }: { - params: { locale: string }; + params: Promise<{ locale: string }>; }) { + const { locale } = await params; setRequestLocale(locale); const t = await getTranslations(); diff --git a/next/src/app/[locale]/(static)/dashboard/webforms/[webformName]/[webformSubmissionUuid]/page.tsx b/next/src/app/[locale]/(static)/dashboard/webforms/[webformName]/[webformSubmissionUuid]/page.tsx index 3d52bea6..ea57b5c4 100644 --- a/next/src/app/[locale]/(static)/dashboard/webforms/[webformName]/[webformSubmissionUuid]/page.tsx +++ b/next/src/app/[locale]/(static)/dashboard/webforms/[webformName]/[webformSubmissionUuid]/page.tsx @@ -21,11 +21,11 @@ import { import { LinkWithLocale } from "@/i18n/routing"; type DashboardPageParams = { - params: { + params: Promise<{ locale: string; webformName: string; webformSubmissionUuid: string; - }; + }>; }; export async function generateMetadata(): Promise { @@ -36,9 +36,8 @@ export async function generateMetadata(): Promise { }; } -export default async function DashboardPage({ - params: { locale, webformName, webformSubmissionUuid }, -}: DashboardPageParams) { +export default async function DashboardPage({ params }: DashboardPageParams) { + const { locale, webformName, webformSubmissionUuid } = await params; setRequestLocale(locale); const t = await getTranslations(); diff --git a/next/src/app/[locale]/(static)/layout.tsx b/next/src/app/[locale]/(static)/layout.tsx index 2c92d13f..014dbd30 100644 --- a/next/src/app/[locale]/(static)/layout.tsx +++ b/next/src/app/[locale]/(static)/layout.tsx @@ -2,13 +2,14 @@ import { setRequestLocale } from "next-intl/server"; import PageLayout from "@/components/page-layout"; -export default function StaticLayout({ +export default async function StaticLayout({ children, - params: { locale }, + params, }: { children: React.ReactNode; - params: { locale: string }; + params: Promise<{ locale: string }>; }) { + const { locale } = await params; setRequestLocale(locale); return {children}; diff --git a/next/src/app/[locale]/(static)/nodepreview/page.tsx b/next/src/app/[locale]/(static)/nodepreview/page.tsx index 7f7fff09..7b88809b 100644 --- a/next/src/app/[locale]/(static)/nodepreview/page.tsx +++ b/next/src/app/[locale]/(static)/nodepreview/page.tsx @@ -5,9 +5,16 @@ import NotFoundPage from "@/components/not-found-page"; import { fetchNodeByPathQuery } from "@/lib/drupal/get-node"; import { extractEntityFromRouteQueryResult } from "@/lib/graphql/utils"; -async function DrupalPreviewPage({ searchParams, params: { locale } }) { +async function DrupalPreviewPage({ + searchParams, + params, +}: { + searchParams: Promise<{ path?: string }>; + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + const { path: previewPath } = await searchParams; setRequestLocale(locale); - const previewPath = searchParams.path; const nodeByPathResult = await fetchNodeByPathQuery( previewPath, locale, diff --git a/next/src/app/[locale]/(static)/page.tsx b/next/src/app/[locale]/(static)/page.tsx index 5335a0e7..1b95b429 100644 --- a/next/src/app/[locale]/(static)/page.tsx +++ b/next/src/app/[locale]/(static)/page.tsx @@ -8,29 +8,28 @@ import { ContactForm } from "@/components/forms/contact-form"; import { LogoStrip } from "@/components/logo-strip"; import { Node } from "@/components/node"; import { Separator } from "@/components/ui/separator"; -import { REVALIDATE_LONG } from "@/lib/constants"; import { getArticleTeasers } from "@/lib/drupal/get-article-teasers"; import { getNodeByPathQuery } from "@/lib/drupal/get-node"; import { getNodeMetadata } from "@/lib/drupal/get-node-metadata"; import { extractEntityFromRouteQueryResult } from "@/lib/graphql/utils"; type FrontpageParams = { - params: { locale: string }; + params: Promise<{ locale: string }>; }; export async function generateMetadata({ - params: { locale }, + params, }: FrontpageParams): Promise { + const { locale } = await params; const path = `/frontpage-${locale}`; const metadata = await getNodeMetadata(path, locale); return metadata; } -export const revalidate = REVALIDATE_LONG; +export const revalidate = 600; // REVALIDATE_LONG — must be a static literal for Next.js build analysis -export default async function FrontPage({ - params: { locale }, -}: FrontpageParams) { +export default async function FrontPage({ params }: FrontpageParams) { + const { locale } = await params; setRequestLocale(locale); const t = await getTranslations(); @@ -53,7 +52,8 @@ export default async function FrontPage({ } // Unless we are in draftMode, we throw an error if the node is set to unpublished: - if (!draftMode().isEnabled && frontpage.status !== true) { + const { isEnabled: isDraftModeEnabled } = await draftMode(); + if (!isDraftModeEnabled && frontpage.status !== true) { throw new Error("Frontpage not published for locale " + locale); } diff --git a/next/src/app/[locale]/(static)/search/page.tsx b/next/src/app/[locale]/(static)/search/page.tsx index 957bb925..e9f63382 100644 --- a/next/src/app/[locale]/(static)/search/page.tsx +++ b/next/src/app/[locale]/(static)/search/page.tsx @@ -1,6 +1,7 @@ "use client"; import Link from "next/link"; import { useTranslations } from "next-intl"; +import { use } from "react"; import { Configure, DynamicWidgets, @@ -38,7 +39,12 @@ const Panel = ({ header, children }: any) => ( ); -export default function Web({ params: { locale } }) { +export default function Web({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = use(params); const t = useTranslations(); return (
@@ -52,6 +58,7 @@ export default function Web({ params: { locale } }) { }} routing > + {/* @ts-ignore react-instantsearch types not yet updated for React 19 */}