From 86ecdca7f148f1281babf2eb1c63afcd58d0bffb Mon Sep 17 00:00:00 2001 From: Henry <30578846+hjball@users.noreply.github.com> Date: Sat, 13 Dec 2025 22:19:16 +0000 Subject: [PATCH] fix: enable sessions for API keys (#283) * fix: enable sessions for API keys * chore: remove old due date filters * chore: update lockfile * fix: temp ignore eslint errors on build --- apps/web/next.config.js | 3 + apps/web/package.json | 6 +- apps/web/public/logos/airbus.svg | 1 - apps/web/public/logos/bitwarden.svg | 1 - apps/web/public/logos/couchbase.svg | 1 - apps/web/public/logos/deloitte.svg | 1 - apps/web/public/logos/fast_company.svg | 1 - apps/web/public/logos/lego.svg | 1 - apps/web/public/logos/linkedin.svg | 1 - apps/web/public/logos/sana.svg | 1 - apps/web/public/logos/wakam.svg | 1 - apps/web/src/views/board/index.tsx | 18 +- apps/web/src/views/public/board/index.tsx | 5 +- packages/api/src/routers/board.ts | 72 ++++---- packages/auth/src/auth.ts | 9 +- packages/shared/package.json | 1 + .../shared}/src/utils/dueDateFilters.ts | 28 +-- packages/shared/src/utils/index.ts | 1 + pnpm-lock.yaml | 161 ++++++++++++++++-- 19 files changed, 220 insertions(+), 93 deletions(-) delete mode 100644 apps/web/public/logos/airbus.svg delete mode 100644 apps/web/public/logos/bitwarden.svg delete mode 100644 apps/web/public/logos/couchbase.svg delete mode 100644 apps/web/public/logos/deloitte.svg delete mode 100644 apps/web/public/logos/fast_company.svg delete mode 100644 apps/web/public/logos/lego.svg delete mode 100644 apps/web/public/logos/linkedin.svg delete mode 100644 apps/web/public/logos/sana.svg delete mode 100644 apps/web/public/logos/wakam.svg rename {apps/web => packages/shared}/src/utils/dueDateFilters.ts (60%) diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 7f93cf50..bd256b32 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -28,6 +28,9 @@ const config = { /** We already do linting and typechecking as separate tasks in CI */ typescript: { ignoreBuildErrors: true }, + // temporarily ignore eslint errors during build until we fix all the errors sigh + eslint: { ignoreDuringBuilds: true }, + images: { remotePatterns: (() => { /** @type {Array<{protocol: "http" | "https", hostname: string}>} */ diff --git a/apps/web/package.json b/apps/web/package.json index 3a489000..5594f274 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,9 +4,9 @@ "private": true, "type": "module", "scripts": { - "build": "pnpm with-env next build", + "build": "pnpm with-env next build --turbo", "clean": "git clean -xdf .cache .next .turbo node_modules", - "dev": "pnpm with-env next dev", + "dev": "pnpm with-env next dev --turbo", "format": "prettier --check . --ignore-path ../../.gitignore", "lint": "eslint", "start": "pnpm with-env next start", @@ -47,7 +47,7 @@ "date-fns": "^4.1.0", "geist": "^1.3.1", "jose": "^6.1.2", - "next": "^16.0.8", + "next": "15.5.9", "next-runtime-env": "^1.7.2", "next-themes": "^0.4.6", "nextjs-cors": "^2.2.0", diff --git a/apps/web/public/logos/airbus.svg b/apps/web/public/logos/airbus.svg deleted file mode 100644 index ead9071a..00000000 --- a/apps/web/public/logos/airbus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/bitwarden.svg b/apps/web/public/logos/bitwarden.svg deleted file mode 100644 index 684e368e..00000000 --- a/apps/web/public/logos/bitwarden.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/couchbase.svg b/apps/web/public/logos/couchbase.svg deleted file mode 100644 index 3b7c2136..00000000 --- a/apps/web/public/logos/couchbase.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/logos/deloitte.svg b/apps/web/public/logos/deloitte.svg deleted file mode 100644 index dd16f5c6..00000000 --- a/apps/web/public/logos/deloitte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/fast_company.svg b/apps/web/public/logos/fast_company.svg deleted file mode 100644 index 3708bcf1..00000000 --- a/apps/web/public/logos/fast_company.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/lego.svg b/apps/web/public/logos/lego.svg deleted file mode 100644 index 70cd0ee0..00000000 --- a/apps/web/public/logos/lego.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/linkedin.svg b/apps/web/public/logos/linkedin.svg deleted file mode 100644 index 7527803f..00000000 --- a/apps/web/public/logos/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/logos/sana.svg b/apps/web/public/logos/sana.svg deleted file mode 100644 index 719a7018..00000000 --- a/apps/web/public/logos/sana.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/logos/wakam.svg b/apps/web/public/logos/wakam.svg deleted file mode 100644 index 054771ea..00000000 --- a/apps/web/public/logos/wakam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/src/views/board/index.tsx b/apps/web/src/views/board/index.tsx index 2b3e24da..b8dbcf44 100644 --- a/apps/web/src/views/board/index.tsx +++ b/apps/web/src/views/board/index.tsx @@ -29,7 +29,6 @@ import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { useWorkspace } from "~/providers/workspace"; import { api } from "~/utils/api"; -import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters"; import { formatToArray } from "~/utils/helpers"; import BoardDropdown from "./components/BoardDropdown"; import Card from "./components/Card"; @@ -97,20 +96,17 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) { | "no-due-date" )[]; - const queryParams: { - boardPublicId: string; - members: string[]; - labels: string[]; - lists: string[]; - dueDate: ReturnType; - type: "regular" | "template"; - } = { + const boardType: "regular" | "template" = isTemplate ? "template" : "regular"; + + const queryParams = { boardPublicId: boardId ?? "", members: formatToArray(router.query.members), labels: formatToArray(router.query.labels), lists: formatToArray(router.query.lists), - dueDate: convertDueDateFiltersToRanges(semanticFilters), - type: isTemplate ? "template" : "regular", + ...(semanticFilters.length > 0 && { + dueDateFilters: semanticFilters, + }), + type: boardType, }; const { diff --git a/apps/web/src/views/public/board/index.tsx b/apps/web/src/views/public/board/index.tsx index 48bc8f47..d02c8085 100644 --- a/apps/web/src/views/public/board/index.tsx +++ b/apps/web/src/views/public/board/index.tsx @@ -15,7 +15,6 @@ import ThemeToggle from "~/components/ThemeToggle"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { api } from "~/utils/api"; -import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters"; import { formatToArray } from "~/utils/helpers"; import Card from "~/views/board/components/Card"; import Filters from "~/views/board/components/Filters"; @@ -55,7 +54,9 @@ export default function PublicBoardView() { members: formatToArray(router.query.members), labels: formatToArray(router.query.labels), lists: formatToArray(router.query.lists), - dueDate: convertDueDateFiltersToRanges(dueDateFilters), + ...(dueDateFilters.length > 0 && { + dueDateFilters: dueDateFilters, + }), }, { enabled: router.isReady && !!boardSlug, diff --git a/packages/api/src/routers/board.ts b/packages/api/src/routers/board.ts index ffb6a0c3..ef0197cd 100644 --- a/packages/api/src/routers/board.ts +++ b/packages/api/src/routers/board.ts @@ -8,17 +8,15 @@ import * as labelRepo from "@kan/db/repository/label.repo"; import * as listRepo from "@kan/db/repository/list.repo"; import * as workspaceRepo from "@kan/db/repository/workspace.repo"; import { colours } from "@kan/shared/constants"; -import { generateSlug, generateUID } from "@kan/shared/utils"; +import { + convertDueDateFiltersToRanges, + generateSlug, + generateUID, +} from "@kan/shared/utils"; import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; import { assertUserInWorkspace } from "../utils/auth"; -const dueDateFilterSchema = z.object({ - startDate: z.string().datetime().optional(), - endDate: z.string().datetime().optional(), - hasNoDueDate: z.boolean().optional(), -}); - export const boardRouter = createTRPCRouter({ all: protectedProcedure .meta({ @@ -85,7 +83,18 @@ export const boardRouter = createTRPCRouter({ members: z.array(z.string().min(12)).optional(), labels: z.array(z.string().min(12)).optional(), lists: z.array(z.string().min(12)).optional(), - dueDate: z.array(dueDateFilterSchema).optional(), + dueDateFilters: z + .array( + z.enum([ + "overdue", + "today", + "tomorrow", + "next-week", + "next-month", + "no-due-date", + ]), + ) + .optional(), type: z.enum(["regular", "template"]).optional(), }), ) @@ -112,6 +121,11 @@ export const boardRouter = createTRPCRouter({ await assertUserInWorkspace(ctx.db, userId, board.workspaceId); + // Convert semantic string filters to date ranges expected by the repo + const dueDateFilters = input.dueDateFilters + ? convertDueDateFiltersToRanges(input.dueDateFilters) + : []; + const result = await boardRepo.getByPublicId( ctx.db, input.boardPublicId, @@ -119,14 +133,7 @@ export const boardRouter = createTRPCRouter({ members: input.members ?? [], labels: input.labels ?? [], lists: input.lists ?? [], - dueDate: - input.dueDate?.map((filter) => ({ - startDate: filter.startDate - ? new Date(filter.startDate) - : undefined, - endDate: filter.endDate ? new Date(filter.endDate) : undefined, - hasNoDueDate: filter.hasNoDueDate, - })) ?? [], + dueDate: dueDateFilters, type: input.type, }, ); @@ -160,7 +167,18 @@ export const boardRouter = createTRPCRouter({ members: z.array(z.string().min(12)).optional(), labels: z.array(z.string().min(12)).optional(), lists: z.array(z.string().min(12)).optional(), - dueDate: z.array(dueDateFilterSchema).optional(), + dueDateFilters: z + .array( + z.enum([ + "overdue", + "today", + "tomorrow", + "next-week", + "next-month", + "no-due-date", + ]), + ) + .optional(), }), ) .output(z.custom>>()) @@ -176,6 +194,11 @@ export const boardRouter = createTRPCRouter({ code: "NOT_FOUND", }); + // Convert semantic string filters to date ranges expected by the repo + const dueDateFilters = input.dueDateFilters + ? convertDueDateFiltersToRanges(input.dueDateFilters) + : []; + const result = await boardRepo.getBySlug( ctx.db, input.boardSlug, @@ -184,14 +207,7 @@ export const boardRouter = createTRPCRouter({ members: input.members ?? [], labels: input.labels ?? [], lists: input.lists ?? [], - dueDate: - input.dueDate?.map((filter) => ({ - startDate: filter.startDate - ? new Date(filter.startDate) - : undefined, - endDate: filter.endDate ? new Date(filter.endDate) : undefined, - hasNoDueDate: filter.hasNoDueDate, - })) ?? [], + dueDate: dueDateFilters, }, ); @@ -306,12 +322,6 @@ export const boardRouter = createTRPCRouter({ sourceBoardId: sourceBoardInfo.id, }); - if (!result) - throw new TRPCError({ - message: `Failed to create board from source`, - code: "INTERNAL_SERVER_ERROR", - }); - return result; } diff --git a/packages/auth/src/auth.ts b/packages/auth/src/auth.ts index a55e5c0a..76e10a68 100644 --- a/packages/auth/src/auth.ts +++ b/packages/auth/src/auth.ts @@ -78,8 +78,7 @@ export const configuredProviders = socialProviderList.reduce< Object.keys(acc).includes("google") && acc[provider] ) { - const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS - ?.split(",") + const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS?.split(",") .map((d) => d.trim().toLowerCase()) .filter(Boolean); if (allowed && allowed.length > 0) { @@ -299,9 +298,8 @@ export const initAuth = (db: dbClient) => { }), ] : []), - // @todo: hasing is disabled due to a bug in the api key plugin apiKey({ - disableKeyHashing: true, + enableSessionForAPIKeys: true, rateLimit: { enabled: true, timeWindow: 1000 * 60, // 1 minute @@ -365,8 +363,7 @@ export const initAuth = (db: dbClient) => { // Fall through to any additional checks below } // Enforce allowed domains (OIDC/social) if configured - const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS - ?.split(",") + const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS?.split(",") .map((d) => d.trim().toLowerCase()) .filter(Boolean); if (allowed && allowed.length > 0) { diff --git a/packages/shared/package.json b/packages/shared/package.json index f5ccc71d..fa6f0012 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -36,6 +36,7 @@ }, "prettier": "@kan/prettier-config", "dependencies": { + "date-fns": "^4.1.0", "jose": "^6.1.2", "nanoid": "^5.0.9", "next-runtime-env": "^1.7.2" diff --git a/apps/web/src/utils/dueDateFilters.ts b/packages/shared/src/utils/dueDateFilters.ts similarity index 60% rename from apps/web/src/utils/dueDateFilters.ts rename to packages/shared/src/utils/dueDateFilters.ts index fc8f68ea..2a80daad 100644 --- a/apps/web/src/utils/dueDateFilters.ts +++ b/packages/shared/src/utils/dueDateFilters.ts @@ -1,6 +1,6 @@ import { addDays, endOfDay, startOfDay } from "date-fns"; -type DueDateFilterKey = +export type DueDateFilterKey = | "overdue" | "today" | "tomorrow" @@ -9,8 +9,8 @@ type DueDateFilterKey = | "no-due-date"; export interface DueDateFilter { - startDate?: string; - endDate?: string; + startDate?: Date; + endDate?: Date; hasNoDueDate?: boolean; } @@ -21,35 +21,35 @@ export const convertDueDateFiltersToRanges = ( const today = startOfDay(new Date()); const tomorrow = addDays(today, 1); - const nextWeekEnd = addDays(today, 8); // 7 days ahead - const nextMonthEnd = addDays(today, 31); // 30 days ahead + const nextWeekEnd = addDays(today, 8); + const nextMonthEnd = addDays(today, 31); return filters.map((filter) => { switch (filter) { case "overdue": return { - endDate: today.toISOString(), + endDate: today, }; case "today": return { - startDate: today.toISOString(), - endDate: endOfDay(today).toISOString(), + startDate: today, + endDate: endOfDay(today), }; case "tomorrow": return { - startDate: tomorrow.toISOString(), - endDate: endOfDay(tomorrow).toISOString(), + startDate: tomorrow, + endDate: endOfDay(tomorrow), }; case "next-week": { return { - startDate: today.toISOString(), - endDate: nextWeekEnd.toISOString(), + startDate: today, + endDate: nextWeekEnd, }; } case "next-month": { return { - startDate: nextWeekEnd.toISOString(), - endDate: nextMonthEnd.toISOString(), + startDate: nextWeekEnd, + endDate: nextMonthEnd, }; } case "no-due-date": diff --git a/packages/shared/src/utils/index.ts b/packages/shared/src/utils/index.ts index 4d1f8470..f108497f 100644 --- a/packages/shared/src/utils/index.ts +++ b/packages/shared/src/utils/index.ts @@ -2,3 +2,4 @@ export * from "./generateUID"; export * from "./generateSlug"; export * from "./subscriptions"; export * from "./email"; +export * from "./dueDateFilters"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ed2b92d..4629c91f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: version: 11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2) '@trpc/next': specifier: ^11.0.0-rc.660 - version: 11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) + version: 11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) '@trpc/react-query': specifier: 'catalog:' version: 11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) @@ -165,13 +165,13 @@ importers: version: 4.1.0 geist: specifier: ^1.3.1 - version: 1.4.2(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 1.4.2(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) jose: specifier: ^6.1.2 version: 6.1.2 next: - specifier: ^16.0.8 - version: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 15.5.9 + version: 15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-runtime-env: specifier: ^1.7.2 version: 1.8.0 @@ -180,7 +180,7 @@ importers: version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextjs-cors: specifier: ^2.2.0 - version: 2.2.0(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.2.0(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) posthog-js: specifier: ^1.254.0 version: 1.261.0 @@ -250,7 +250,7 @@ importers: version: 5.4.1(typescript@5.9.2)(webpack@5.101.3) '@lingui/swc-plugin': specifier: ^5.5.2 - version: 5.6.1(@lingui/core@5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2)))(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 5.6.1(@lingui/core@5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2)))(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.9.2) @@ -471,6 +471,9 @@ importers: packages/shared: dependencies: + date-fns: + specifier: ^4.1.0 + version: 4.1.0 jose: specifier: ^6.1.2 version: 6.1.2 @@ -2591,54 +2594,105 @@ packages: '@mintlify/models': 0.0.25 openapi-types: 12.x + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + '@next/env@16.0.8': resolution: {integrity: sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ==} '@next/eslint-plugin-next@14.2.32': resolution: {integrity: sha512-tyZMX8g4cWg/uPW4NxiJK13t62Pab47SKGJGVZJa6YtFwtfrXovH4j1n9tdpRdXW03PGQBugYEVGM7OhWfytdA==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-arm64@16.0.8': resolution: {integrity: sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-darwin-x64@16.0.8': resolution: {integrity: sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-gnu@16.0.8': resolution: {integrity: sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@16.0.8': resolution: {integrity: sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-gnu@16.0.8': resolution: {integrity: sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@16.0.8': resolution: {integrity: sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-arm64-msvc@16.0.8': resolution: {integrity: sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@next/swc-win32-x64-msvc@16.0.8': resolution: {integrity: sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA==} engines: {node: '>= 10'} @@ -6202,9 +6256,31 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.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: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + next@16.0.8: resolution: {integrity: sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==} engines: {node: '>=20.9.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -10071,11 +10147,11 @@ snapshots: optionalDependencies: '@lingui/babel-plugin-lingui-macro': 5.4.1(typescript@5.9.2) - '@lingui/swc-plugin@5.6.1(@lingui/core@5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2)))(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@lingui/swc-plugin@5.6.1(@lingui/core@5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2)))(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@lingui/core': 5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2)) optionalDependencies: - next: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@messageformat/parser@5.1.1': dependencies: @@ -10185,33 +10261,60 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) - '@next/env@16.0.8': {} + '@next/env@15.5.9': {} + + '@next/env@16.0.8': + optional: true '@next/eslint-plugin-next@14.2.32': dependencies: glob: 10.3.10 + '@next/swc-darwin-arm64@15.5.7': + optional: true + '@next/swc-darwin-arm64@16.0.8': optional: true + '@next/swc-darwin-x64@15.5.7': + optional: true + '@next/swc-darwin-x64@16.0.8': optional: true + '@next/swc-linux-arm64-gnu@15.5.7': + optional: true + '@next/swc-linux-arm64-gnu@16.0.8': optional: true + '@next/swc-linux-arm64-musl@15.5.7': + optional: true + '@next/swc-linux-arm64-musl@16.0.8': optional: true + '@next/swc-linux-x64-gnu@15.5.7': + optional: true + '@next/swc-linux-x64-gnu@16.0.8': optional: true + '@next/swc-linux-x64-musl@15.5.7': + optional: true + '@next/swc-linux-x64-musl@16.0.8': optional: true + '@next/swc-win32-arm64-msvc@15.5.7': + optional: true + '@next/swc-win32-arm64-msvc@16.0.8': optional: true + '@next/swc-win32-x64-msvc@15.5.7': + optional: true + '@next/swc-win32-x64-msvc@16.0.8': optional: true @@ -11175,11 +11278,11 @@ snapshots: '@trpc/server': 11.5.0(typescript@5.9.2) typescript: 5.9.2 - '@trpc/next@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@trpc/next@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.5.0(@tanstack/react-query@5.85.6(react@18.3.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': dependencies: '@trpc/client': 11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.5.0(typescript@5.9.2) - next: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) typescript: 5.9.2 @@ -11845,7 +11948,7 @@ snapshots: nanostores: 1.1.0 zod: 4.1.13 optionalDependencies: - next: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 16.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13089,9 +13192,9 @@ snapshots: gcd@0.0.1: {} - geist@1.4.2(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + geist@1.4.2(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - next: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) gensync@1.0.0-beta.2: {} @@ -14619,7 +14722,30 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@16.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 16.0.8 '@swc/helpers': 0.5.15 @@ -14641,11 +14767,12 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + optional: true - nextjs-cors@2.2.0(next@16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + nextjs-cors@2.2.0(next@15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: cors: 2.8.5 - next: 16.0.8(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.5.9(@babel/core@7.28.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) no-case@2.3.2: dependencies: