diff --git a/apps/demo/package.json b/apps/demo/package.json index ce27d6244b..544e4755b8 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -13,7 +13,7 @@ "dependencies": { "@formbricks/js": "workspace:*", "lucide-react": "0.468.0", - "next": "15.1.2", + "next": "15.2.3", "react": "19.0.0", "react-dom": "19.0.0" }, diff --git a/apps/web/modules/survey/components/template-list/lib/survey.ts b/apps/web/modules/survey/components/template-list/lib/survey.ts index 15562ed497..d8ae98fcc8 100644 --- a/apps/web/modules/survey/components/template-list/lib/survey.ts +++ b/apps/web/modules/survey/components/template-list/lib/survey.ts @@ -1,20 +1,18 @@ import { getIsAIEnabled } from "@/modules/ee/license-check/lib/utils"; import { subscribeOrganizationMembersToSurveyResponses } from "@/modules/survey/components/template-list/lib/organization"; -import { handleTriggerUpdates } from "@/modules/survey/components/template-list/lib/utils"; +import { TriggerUpdate } from "@/modules/survey/editor/types/survey-trigger"; import { getActionClasses } from "@/modules/survey/lib/action-class"; import { getOrganizationAIKeys, getOrganizationIdFromEnvironmentId } from "@/modules/survey/lib/organization"; import { selectSurvey } from "@/modules/survey/lib/survey"; -import { getInsightsEnabled } from "@/modules/survey/lib/utils"; -import { doesSurveyHasOpenTextQuestion } from "@/modules/survey/lib/utils"; -import { Prisma } from "@prisma/client"; +import { doesSurveyHasOpenTextQuestion, getInsightsEnabled } from "@/modules/survey/lib/utils"; +import { ActionClass, Prisma } from "@prisma/client"; import { prisma } from "@formbricks/database"; import { segmentCache } from "@formbricks/lib/cache/segment"; import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer"; import { surveyCache } from "@formbricks/lib/survey/cache"; import { logger } from "@formbricks/logger"; -import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors"; -import { TSurvey } from "@formbricks/types/surveys/types"; -import { TSurveyCreateInput } from "@formbricks/types/surveys/types"; +import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; +import { TSurvey, TSurveyCreateInput } from "@formbricks/types/surveys/types"; export const createSurvey = async ( environmentId: string, @@ -184,3 +182,69 @@ export const createSurvey = async ( throw error; } }; + +const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { + if (!triggers) return; + + // check if all the triggers are valid + triggers.forEach((trigger) => { + if (!actionClasses.find((actionClass) => actionClass.id === trigger.actionClass.id)) { + throw new InvalidInputError("Invalid trigger id"); + } + }); + + // check if all the triggers are unique + const triggerIds = triggers.map((trigger) => trigger.actionClass.id); + + if (new Set(triggerIds).size !== triggerIds.length) { + throw new InvalidInputError("Duplicate trigger id"); + } +}; + +export const handleTriggerUpdates = ( + updatedTriggers: TSurvey["triggers"], + currentTriggers: TSurvey["triggers"], + actionClasses: ActionClass[] +) => { + if (!updatedTriggers) return {}; + checkTriggersValidity(updatedTriggers, actionClasses); + + const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); + const updatedTriggerIds = updatedTriggers.map((trigger) => trigger.actionClass.id); + + // added triggers are triggers that are not in the current triggers and are there in the new triggers + const addedTriggers = updatedTriggers.filter( + (trigger) => !currentTriggerIds.includes(trigger.actionClass.id) + ); + + // deleted triggers are triggers that are not in the new triggers and are there in the current triggers + const deletedTriggers = currentTriggers.filter( + (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) + ); + + // Construct the triggers update object + const triggersUpdate: TriggerUpdate = {}; + + if (addedTriggers.length > 0) { + triggersUpdate.create = addedTriggers.map((trigger) => ({ + actionClassId: trigger.actionClass.id, + })); + } + + if (deletedTriggers.length > 0) { + // disconnect the public triggers from the survey + triggersUpdate.deleteMany = { + actionClassId: { + in: deletedTriggers.map((trigger) => trigger.actionClass.id), + }, + }; + } + + [...addedTriggers, ...deletedTriggers].forEach((trigger) => { + surveyCache.revalidate({ + actionClassId: trigger.actionClass.id, + }); + }); + + return triggersUpdate; +}; diff --git a/apps/web/modules/survey/components/template-list/lib/utils.ts b/apps/web/modules/survey/components/template-list/lib/utils.ts index 4f19a09b09..da5e3fa70e 100644 --- a/apps/web/modules/survey/components/template-list/lib/utils.ts +++ b/apps/web/modules/survey/components/template-list/lib/utils.ts @@ -1,12 +1,8 @@ -import { TriggerUpdate } from "@/modules/survey/editor/types/survey-trigger"; -import { ActionClass } from "@prisma/client"; import { TFnType } from "@tolgee/react"; import { getLocalizedValue } from "@formbricks/lib/i18n/utils"; import { structuredClone } from "@formbricks/lib/pollyfills/structuredClone"; -import { surveyCache } from "@formbricks/lib/survey/cache"; -import { InvalidInputError } from "@formbricks/types/errors"; import { TProject, TProjectConfigChannel, TProjectConfigIndustry } from "@formbricks/types/project"; -import { TSurvey, TSurveyQuestion } from "@formbricks/types/surveys/types"; +import { TSurveyQuestion } from "@formbricks/types/surveys/types"; import { TTemplate, TTemplateRole } from "@formbricks/types/templates"; export const replaceQuestionPresetPlaceholders = ( @@ -60,69 +56,3 @@ export const getRoleMapping = (t: TFnType): { value: TTemplateRole; label: strin { value: "sales", label: t("common.sales") }, { value: "peopleManager", label: t("common.people_manager") }, ]; - -const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { - if (!triggers) return; - - // check if all the triggers are valid - triggers.forEach((trigger) => { - if (!actionClasses.find((actionClass) => actionClass.id === trigger.actionClass.id)) { - throw new InvalidInputError("Invalid trigger id"); - } - }); - - // check if all the triggers are unique - const triggerIds = triggers.map((trigger) => trigger.actionClass.id); - - if (new Set(triggerIds).size !== triggerIds.length) { - throw new InvalidInputError("Duplicate trigger id"); - } -}; - -export const handleTriggerUpdates = ( - updatedTriggers: TSurvey["triggers"], - currentTriggers: TSurvey["triggers"], - actionClasses: ActionClass[] -) => { - if (!updatedTriggers) return {}; - checkTriggersValidity(updatedTriggers, actionClasses); - - const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); - const updatedTriggerIds = updatedTriggers.map((trigger) => trigger.actionClass.id); - - // added triggers are triggers that are not in the current triggers and are there in the new triggers - const addedTriggers = updatedTriggers.filter( - (trigger) => !currentTriggerIds.includes(trigger.actionClass.id) - ); - - // deleted triggers are triggers that are not in the new triggers and are there in the current triggers - const deletedTriggers = currentTriggers.filter( - (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) - ); - - // Construct the triggers update object - const triggersUpdate: TriggerUpdate = {}; - - if (addedTriggers.length > 0) { - triggersUpdate.create = addedTriggers.map((trigger) => ({ - actionClassId: trigger.actionClass.id, - })); - } - - if (deletedTriggers.length > 0) { - // disconnect the public triggers from the survey - triggersUpdate.deleteMany = { - actionClassId: { - in: deletedTriggers.map((trigger) => trigger.actionClass.id), - }, - }; - } - - [...addedTriggers, ...deletedTriggers].forEach((trigger) => { - surveyCache.revalidate({ - actionClassId: trigger.actionClass.id, - }); - }); - - return triggersUpdate; -}; diff --git a/apps/web/modules/survey/editor/lib/survey.ts b/apps/web/modules/survey/editor/lib/survey.ts index 2c99b6d9a8..17e3e4c809 100644 --- a/apps/web/modules/survey/editor/lib/survey.ts +++ b/apps/web/modules/survey/editor/lib/survey.ts @@ -1,11 +1,10 @@ import { getIsAIEnabled } from "@/modules/ee/license-check/lib/utils"; -import { handleTriggerUpdates } from "@/modules/survey/editor/lib/utils"; +import { TriggerUpdate } from "@/modules/survey/editor/types/survey-trigger"; import { getActionClasses } from "@/modules/survey/lib/action-class"; import { getOrganizationAIKeys, getOrganizationIdFromEnvironmentId } from "@/modules/survey/lib/organization"; import { getSurvey, selectSurvey } from "@/modules/survey/lib/survey"; -import { getInsightsEnabled } from "@/modules/survey/lib/utils"; -import { doesSurveyHasOpenTextQuestion } from "@/modules/survey/lib/utils"; -import { Prisma, Survey } from "@prisma/client"; +import { doesSurveyHasOpenTextQuestion, getInsightsEnabled } from "@/modules/survey/lib/utils"; +import { ActionClass, Prisma, Survey } from "@prisma/client"; import { prisma } from "@formbricks/database"; import { segmentCache } from "@formbricks/lib/cache/segment"; import { surveyCache } from "@formbricks/lib/survey/cache"; @@ -380,3 +379,69 @@ export const updateSurvey = async (updatedSurvey: TSurvey): Promise => throw error; } }; + +const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { + if (!triggers) return; + + // check if all the triggers are valid + triggers.forEach((trigger) => { + if (!actionClasses.find((actionClass) => actionClass.id === trigger.actionClass.id)) { + throw new InvalidInputError("Invalid trigger id"); + } + }); + + // check if all the triggers are unique + const triggerIds = triggers.map((trigger) => trigger.actionClass.id); + + if (new Set(triggerIds).size !== triggerIds.length) { + throw new InvalidInputError("Duplicate trigger id"); + } +}; + +const handleTriggerUpdates = ( + updatedTriggers: TSurvey["triggers"], + currentTriggers: TSurvey["triggers"], + actionClasses: ActionClass[] +) => { + if (!updatedTriggers) return {}; + checkTriggersValidity(updatedTriggers, actionClasses); + + const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); + const updatedTriggerIds = updatedTriggers.map((trigger) => trigger.actionClass.id); + + // added triggers are triggers that are not in the current triggers and are there in the new triggers + const addedTriggers = updatedTriggers.filter( + (trigger) => !currentTriggerIds.includes(trigger.actionClass.id) + ); + + // deleted triggers are triggers that are not in the new triggers and are there in the current triggers + const deletedTriggers = currentTriggers.filter( + (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) + ); + + // Construct the triggers update object + const triggersUpdate: TriggerUpdate = {}; + + if (addedTriggers.length > 0) { + triggersUpdate.create = addedTriggers.map((trigger) => ({ + actionClassId: trigger.actionClass.id, + })); + } + + if (deletedTriggers.length > 0) { + // disconnect the public triggers from the survey + triggersUpdate.deleteMany = { + actionClassId: { + in: deletedTriggers.map((trigger) => trigger.actionClass.id), + }, + }; + } + + [...addedTriggers, ...deletedTriggers].forEach((trigger) => { + surveyCache.revalidate({ + actionClassId: trigger.actionClass.id, + }); + }); + + return triggersUpdate; +}; diff --git a/apps/web/modules/survey/editor/lib/utils.tsx b/apps/web/modules/survey/editor/lib/utils.tsx index 5e06a1cf50..8f89c80dbe 100644 --- a/apps/web/modules/survey/editor/lib/utils.tsx +++ b/apps/web/modules/survey/editor/lib/utils.tsx @@ -1,15 +1,11 @@ -import { TriggerUpdate } from "@/modules/survey/editor/types/survey-trigger"; import { getQuestionTypes } from "@/modules/survey/lib/questions"; import { TComboboxGroupedOption, TComboboxOption } from "@/modules/ui/components/input-combo-box"; -import { ActionClass } from "@prisma/client"; import { TFnType } from "@tolgee/react"; import { EyeOffIcon, FileDigitIcon, FileType2Icon } from "lucide-react"; import { HTMLInputTypeAttribute } from "react"; import { getLocalizedValue } from "@formbricks/lib/i18n/utils"; -import { surveyCache } from "@formbricks/lib/survey/cache"; import { isConditionGroup } from "@formbricks/lib/surveyLogic/utils"; import { recallToHeadline } from "@formbricks/lib/utils/recall"; -import { InvalidInputError } from "@formbricks/types/errors"; import { TConditionGroup, TLeftOperand, @@ -1177,69 +1173,3 @@ export const findEndingCardUsedInLogic = (survey: TSurvey, endingCardId: string) (question) => question.logicFallback === endingCardId || question.logic?.some(isUsedInLogicRule) ); }; - -const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { - if (!triggers) return; - - // check if all the triggers are valid - triggers.forEach((trigger) => { - if (!actionClasses.find((actionClass) => actionClass.id === trigger.actionClass.id)) { - throw new InvalidInputError("Invalid trigger id"); - } - }); - - // check if all the triggers are unique - const triggerIds = triggers.map((trigger) => trigger.actionClass.id); - - if (new Set(triggerIds).size !== triggerIds.length) { - throw new InvalidInputError("Duplicate trigger id"); - } -}; - -export const handleTriggerUpdates = ( - updatedTriggers: TSurvey["triggers"], - currentTriggers: TSurvey["triggers"], - actionClasses: ActionClass[] -) => { - if (!updatedTriggers) return {}; - checkTriggersValidity(updatedTriggers, actionClasses); - - const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); - const updatedTriggerIds = updatedTriggers.map((trigger) => trigger.actionClass.id); - - // added triggers are triggers that are not in the current triggers and are there in the new triggers - const addedTriggers = updatedTriggers.filter( - (trigger) => !currentTriggerIds.includes(trigger.actionClass.id) - ); - - // deleted triggers are triggers that are not in the new triggers and are there in the current triggers - const deletedTriggers = currentTriggers.filter( - (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) - ); - - // Construct the triggers update object - const triggersUpdate: TriggerUpdate = {}; - - if (addedTriggers.length > 0) { - triggersUpdate.create = addedTriggers.map((trigger) => ({ - actionClassId: trigger.actionClass.id, - })); - } - - if (deletedTriggers.length > 0) { - // disconnect the public triggers from the survey - triggersUpdate.deleteMany = { - actionClassId: { - in: deletedTriggers.map((trigger) => trigger.actionClass.id), - }, - }; - } - - [...addedTriggers, ...deletedTriggers].forEach((trigger) => { - surveyCache.revalidate({ - actionClassId: trigger.actionClass.id, - }); - }); - - return triggersUpdate; -}; diff --git a/apps/web/package.json b/apps/web/package.json index 0b67048bac..ed460a07de 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -105,7 +105,7 @@ "lru-cache": "11.0.2", "lucide-react": "0.468.0", "mime": "4.0.4", - "next": "15.1.2", + "next": "15.2.3", "next-auth": "4.24.11", "next-safe-action": "7.10.2", "node-fetch": "3.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baabdb3df2..12f45034fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,8 +49,8 @@ importers: specifier: 0.468.0 version: 0.468.0(react@19.0.0) next: - specifier: 15.1.2 - version: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.3 + version: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -338,7 +338,7 @@ importers: version: 0.0.31(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@sentry/nextjs': specifier: 8.52.0 - version: 8.52.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1) + version: 8.52.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1) '@tailwindcss/forms': specifier: 0.5.9 version: 0.5.9(tailwindcss@3.4.16(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.8.2))) @@ -374,7 +374,7 @@ importers: version: 1.10.0(@opentelemetry/api-logs@0.56.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': specifier: 1.1.0 - version: 1.1.0(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + version: 1.1.0(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) ai: specifier: 4.1.17 version: 4.1.17(react@19.0.0)(zod@3.24.1) @@ -445,14 +445,14 @@ importers: specifier: 4.0.4 version: 4.0.4 next: - specifier: 15.1.2 - version: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.2.3 + version: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-auth: specifier: 4.24.11 - version: 4.24.11(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.24.11(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-safe-action: specifier: 7.10.2 - version: 7.10.2(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1) + version: 7.10.2(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1) node-fetch: specifier: 3.3.2 version: 3.3.2 @@ -558,7 +558,7 @@ importers: version: link:../../packages/config-eslint '@neshca/cache-handler': specifier: 1.9.0 - version: 1.9.0(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(redis@4.7.0) + version: 1.9.0(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(redis@4.7.0) '@testing-library/react': specifier: 16.2.0 version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.2(@types/react@19.0.1))(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -844,7 +844,7 @@ importers: version: 5.0.9 next-auth: specifier: 4.24.11 - version: 4.24.11(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.24.11(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) posthog-node: specifier: 4.4.1 version: 4.4.1 @@ -1454,6 +1454,11 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-environment-visitor@7.24.7': resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} @@ -3391,56 +3396,56 @@ packages: next: '>= 13.5.1 < 15' redis: '>= 4.6' - '@next/env@15.1.2': - resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} + '@next/env@15.2.3': + resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} '@next/eslint-plugin-next@15.1.0': resolution: {integrity: sha512-+jPT0h+nelBT6HC9ZCHGc7DgGVy04cv4shYdAe6tKlEbjQUtwU3LzQhzbDHQyY2m6g39m6B0kOFVuLGBrxxbGg==} - '@next/swc-darwin-arm64@15.1.2': - resolution: {integrity: sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==} + '@next/swc-darwin-arm64@15.2.3': + resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.2': - resolution: {integrity: sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==} + '@next/swc-darwin-x64@15.2.3': + resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.2': - resolution: {integrity: sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==} + '@next/swc-linux-arm64-gnu@15.2.3': + resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.2': - resolution: {integrity: sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==} + '@next/swc-linux-arm64-musl@15.2.3': + resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.2': - resolution: {integrity: sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==} + '@next/swc-linux-x64-gnu@15.2.3': + resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.2': - resolution: {integrity: sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==} + '@next/swc-linux-x64-musl@15.2.3': + resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.2': - resolution: {integrity: sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==} + '@next/swc-win32-arm64-msvc@15.2.3': + resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.2': - resolution: {integrity: sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==} + '@next/swc-win32-x64-msvc@15.2.3': + resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6811,6 +6816,11 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.11.1: resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: @@ -6821,6 +6831,11 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-react-native-web@0.19.13: resolution: {integrity: sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==} @@ -10578,6 +10593,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@5.0.9: resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} engines: {node: ^18 || >=20} @@ -10645,8 +10665,8 @@ packages: zod: optional: true - next@15.1.2: - resolution: {integrity: sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==} + next@15.2.3: + resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -15043,6 +15063,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-environment-visitor@7.24.7': dependencies: '@babel/types': 7.26.10 @@ -15814,9 +15845,9 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.0) core-js-compat: 3.41.0 semver: 6.3.1 transitivePeerDependencies: @@ -17371,41 +17402,41 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@neshca/cache-handler@1.9.0(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(redis@4.7.0)': + '@neshca/cache-handler@1.9.0(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(redis@4.7.0)': dependencies: cluster-key-slot: 1.1.2 lru-cache: 10.4.3 - next: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) redis: 4.7.0 - '@next/env@15.1.2': {} + '@next/env@15.2.3': {} '@next/eslint-plugin-next@15.1.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.2': + '@next/swc-darwin-arm64@15.2.3': optional: true - '@next/swc-darwin-x64@15.1.2': + '@next/swc-darwin-x64@15.2.3': optional: true - '@next/swc-linux-arm64-gnu@15.1.2': + '@next/swc-linux-arm64-gnu@15.2.3': optional: true - '@next/swc-linux-arm64-musl@15.1.2': + '@next/swc-linux-arm64-musl@15.2.3': optional: true - '@next/swc-linux-x64-gnu@15.1.2': + '@next/swc-linux-x64-gnu@15.2.3': optional: true - '@next/swc-linux-x64-musl@15.1.2': + '@next/swc-linux-x64-musl@15.2.3': optional: true - '@next/swc-win32-arm64-msvc@15.1.2': + '@next/swc-win32-arm64-msvc@15.2.3': optional: true - '@next/swc-win32-x64-msvc@15.1.2': + '@next/swc-win32-x64-msvc@15.2.3': optional: true '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': @@ -19537,7 +19568,7 @@ snapshots: '@sentry/core@8.52.0': {} - '@sentry/nextjs@8.52.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1)': + '@sentry/nextjs@8.52.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.30.0 @@ -19550,7 +19581,7 @@ snapshots: '@sentry/vercel-edge': 8.52.0 '@sentry/webpack-plugin': 2.22.7(encoding@0.1.13)(webpack@5.97.1) chalk: 3.0.0 - next: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.11 @@ -20962,9 +20993,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.1.0(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': + '@vercel/speed-insights@1.1.0(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': optionalDependencies: - next: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.1.0)(eslint@8.57.0)(prettier@3.4.2)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.10.2)(jiti@2.4.1)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': @@ -21825,6 +21856,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -21840,6 +21880,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + babel-plugin-react-native-web@0.19.13: {} babel-plugin-syntax-hermes-parser@0.23.1: @@ -26465,6 +26512,8 @@ snapshots: nanoid@3.3.10: {} + nanoid@3.3.11: {} + nanoid@5.0.9: {} napi-build-utils@2.0.0: {} @@ -26483,13 +26532,13 @@ snapshots: new-github-issue-url@0.2.1: {} - next-auth@4.24.11(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-auth@4.24.11(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nodemailer@6.9.16)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.26.10 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.25.2 @@ -26500,17 +26549,17 @@ snapshots: optionalDependencies: nodemailer: 6.9.16 - next-safe-action@7.10.2(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1): + next-safe-action@7.10.2(next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1): dependencies: - next: 15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: zod: 3.24.1 - next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.2.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.1.2 + '@next/env': 15.2.3 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -26520,14 +26569,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.2 - '@next/swc-darwin-x64': 15.1.2 - '@next/swc-linux-arm64-gnu': 15.1.2 - '@next/swc-linux-arm64-musl': 15.1.2 - '@next/swc-linux-x64-gnu': 15.1.2 - '@next/swc-linux-x64-musl': 15.1.2 - '@next/swc-win32-arm64-msvc': 15.1.2 - '@next/swc-win32-x64-msvc': 15.1.2 + '@next/swc-darwin-arm64': 15.2.3 + '@next/swc-darwin-x64': 15.2.3 + '@next/swc-linux-arm64-gnu': 15.2.3 + '@next/swc-linux-arm64-musl': 15.2.3 + '@next/swc-linux-x64-gnu': 15.2.3 + '@next/swc-linux-x64-musl': 15.2.3 + '@next/swc-win32-arm64-msvc': 15.2.3 + '@next/swc-win32-x64-msvc': 15.2.3 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.49.1 sharp: 0.33.5 @@ -27259,7 +27308,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.10 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1