diff --git a/apps/storybook/package.json b/apps/storybook/package.json index 0dca3377ff..cace03b330 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -12,18 +12,18 @@ }, "devDependencies": { "@chromatic-com/storybook": "^5.0.1", - "@storybook/addon-a11y": "10.2.14", - "@storybook/addon-links": "10.2.14", - "@storybook/addon-onboarding": "10.2.14", - "@storybook/react-vite": "10.2.14", + "@storybook/addon-a11y": "10.2.15", + "@storybook/addon-links": "10.2.15", + "@storybook/addon-onboarding": "10.2.15", + "@storybook/react-vite": "10.2.15", "@typescript-eslint/eslint-plugin": "8.56.1", "@tailwindcss/vite": "4.2.1", "@typescript-eslint/parser": "8.56.1", "@vitejs/plugin-react": "5.1.4", "eslint-plugin-react-refresh": "0.4.26", "eslint-plugin-storybook": "10.2.14", - "storybook": "10.2.14", + "storybook": "10.2.15", "vite": "7.3.1", - "@storybook/addon-docs": "10.2.14" + "@storybook/addon-docs": "10.2.15" } } diff --git a/apps/web/app/(app)/(onboarding)/types/onboarding.ts b/apps/web/app/(app)/(onboarding)/types/onboarding.ts index ead024f3ba..65b1b2aaba 100644 --- a/apps/web/app/(app)/(onboarding)/types/onboarding.ts +++ b/apps/web/app/(app)/(onboarding)/types/onboarding.ts @@ -1,7 +1,7 @@ import { z } from "zod"; export const ZOrganizationTeam = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), name: z.string(), }); diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/actions.ts b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/actions.ts index a248082239..2b6734939d 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/actions.ts +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/actions.ts @@ -110,8 +110,8 @@ export const getResponseCountAction = authenticatedActionClient const ZGetDisplaysWithContactAction = z.object({ surveyId: ZId, - limit: z.number().int().min(1).max(100), - offset: z.number().int().nonnegative(), + limit: z.int().min(1).max(100), + offset: z.int().nonnegative(), }); export const getDisplaysWithContactAction = authenticatedActionClient diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/surveySummary.ts b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/surveySummary.ts index 66b3de58b0..788aa33d79 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/surveySummary.ts +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/surveySummary.ts @@ -1095,7 +1095,7 @@ export const getResponsesForSummary = reactCache( [limit, ZOptionalNumber], [offset, ZOptionalNumber], [filterCriteria, ZResponseFilterCriteria.optional()], - [cursor, z.string().cuid2().optional()] + [cursor, z.cuid2().optional()] ); const queryLimit = limit ?? RESPONSES_PER_PAGE; diff --git a/apps/web/app/api/v1/client/[environmentId]/environment/route.ts b/apps/web/app/api/v1/client/[environmentId]/environment/route.ts index 3bd491bf2e..ba4ff51de3 100644 --- a/apps/web/app/api/v1/client/[environmentId]/environment/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/environment/route.ts @@ -50,7 +50,7 @@ export const GET = withV1ApiWrapper({ { environmentId: params.environmentId, url: req.url, - validationError: cuidValidation.error.errors[0]?.message, + validationError: cuidValidation.error.issues[0]?.message, }, "Invalid CUID v1 format detected" ); diff --git a/apps/web/app/api/v1/management/surveys/[surveyId]/lib/surveys.ts b/apps/web/app/api/v1/management/surveys/[surveyId]/lib/surveys.ts index bf27eb98f9..c8fb7b19cb 100644 --- a/apps/web/app/api/v1/management/surveys/[surveyId]/lib/surveys.ts +++ b/apps/web/app/api/v1/management/surveys/[surveyId]/lib/surveys.ts @@ -6,7 +6,7 @@ import { DatabaseError } from "@formbricks/types/errors"; import { validateInputs } from "@/lib/utils/validate"; export const deleteSurvey = async (surveyId: string) => { - validateInputs([surveyId, z.string().cuid2()]); + validateInputs([surveyId, z.cuid2()]); try { const deletedSurvey = await prisma.survey.delete({ diff --git a/apps/web/app/api/v2/client/[environmentId]/responses/lib/recaptcha.test.ts b/apps/web/app/api/v2/client/[environmentId]/responses/lib/recaptcha.test.ts index b16d137757..8a0471e115 100644 --- a/apps/web/app/api/v2/client/[environmentId]/responses/lib/recaptcha.test.ts +++ b/apps/web/app/api/v2/client/[environmentId]/responses/lib/recaptcha.test.ts @@ -101,7 +101,9 @@ describe("verifyRecaptchaToken", () => { }, signal: {}, }; - vi.spyOn(global, "AbortController").mockImplementation(() => abortController as any); + vi.spyOn(global, "AbortController").mockImplementation(function AbortController() { + return abortController as any; + }); (global.fetch as any).mockImplementation(() => new Promise(() => {})); verifyRecaptchaToken("token", 0.5); vi.advanceTimersByTime(5000); diff --git a/apps/web/app/lib/singleUseSurveys.test.ts b/apps/web/app/lib/singleUseSurveys.test.ts index a2cc700c9f..701e48dbc7 100644 --- a/apps/web/app/lib/singleUseSurveys.test.ts +++ b/apps/web/app/lib/singleUseSurveys.test.ts @@ -1,4 +1,4 @@ -import cuid2 from "@paralleldrive/cuid2"; +import * as cuid2 from "@paralleldrive/cuid2"; import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import * as crypto from "@/lib/crypto"; import { generateSurveySingleUseId, validateSurveySingleUseId } from "./singleUseSurveys"; @@ -20,10 +20,6 @@ vi.mock("@paralleldrive/cuid2", () => { const isCuidMock = vi.fn(); return { - default: { - createId: createIdMock, - isCuid: isCuidMock, - }, createId: createIdMock, isCuid: isCuidMock, }; diff --git a/apps/web/app/lib/singleUseSurveys.ts b/apps/web/app/lib/singleUseSurveys.ts index add2d0c811..3661dc36e1 100644 --- a/apps/web/app/lib/singleUseSurveys.ts +++ b/apps/web/app/lib/singleUseSurveys.ts @@ -1,10 +1,10 @@ -import cuid2 from "@paralleldrive/cuid2"; +import { createId, isCuid } from "@paralleldrive/cuid2"; import { ENCRYPTION_KEY } from "@/lib/constants"; import { symmetricDecrypt, symmetricEncrypt } from "@/lib/crypto"; // generate encrypted single use id for the survey export const generateSurveySingleUseId = (isEncrypted: boolean): string => { - const cuid = cuid2.createId(); + const cuid = createId(); if (!isEncrypted) { return cuid; } @@ -30,7 +30,7 @@ export const validateSurveySingleUseId = (surveySingleUseId: string): string | u return undefined; } - if (cuid2.isCuid(decryptedCuid)) { + if (isCuid(decryptedCuid)) { return decryptedCuid; } else { return undefined; diff --git a/apps/web/lib/constants.ts b/apps/web/lib/constants.ts index 6b8368f08a..2d6492c24f 100644 --- a/apps/web/lib/constants.ts +++ b/apps/web/lib/constants.ts @@ -159,7 +159,7 @@ export const BREVO_LIST_ID = env.BREVO_LIST_ID; export const UNSPLASH_ACCESS_KEY = env.UNSPLASH_ACCESS_KEY; export const UNSPLASH_ALLOWED_DOMAINS = ["api.unsplash.com"]; -export const STRIPE_API_VERSION = "2024-06-20"; +export const STRIPE_API_VERSION = "2026-02-25.clover"; // Maximum number of attribute classes allowed: export const MAX_ATTRIBUTE_CLASSES_PER_ENVIRONMENT = 150; diff --git a/apps/web/lib/display/service.ts b/apps/web/lib/display/service.ts index 7b14127a04..b827b9e160 100644 --- a/apps/web/lib/display/service.ts +++ b/apps/web/lib/display/service.ts @@ -71,8 +71,8 @@ export const getDisplaysBySurveyIdWithContact = reactCache( async (surveyId: string, limit?: number, offset?: number): Promise => { validateInputs( [surveyId, ZId], - [limit, z.number().int().min(1).optional()], - [offset, z.number().int().nonnegative().optional()] + [limit, z.int().min(1).optional()], + [offset, z.int().nonnegative().optional()] ); try { diff --git a/apps/web/lib/env.ts b/apps/web/lib/env.ts index fd403eb742..8ff796bdd4 100644 --- a/apps/web/lib/env.ts +++ b/apps/web/lib/env.ts @@ -14,7 +14,7 @@ export const env = createEnv({ CRON_SECRET: z.string().optional(), BREVO_API_KEY: z.string().optional(), BREVO_LIST_ID: z.string().optional(), - DATABASE_URL: z.string().url(), + DATABASE_URL: z.url(), DEBUG: z.enum(["1", "0"]).optional(), AUTH_DEFAULT_TEAM_ID: z.string().optional(), AUTH_SKIP_INVITE_FOR_SSO: z.enum(["1", "0"]).optional(), @@ -23,7 +23,7 @@ export const env = createEnv({ EMAIL_VERIFICATION_DISABLED: z.enum(["1", "0"]).optional(), ENCRYPTION_KEY: z.string(), ENTERPRISE_LICENSE_KEY: z.string().optional(), - ENVIRONMENT: z.enum(["production", "staging"]).default("production"), + ENVIRONMENT: z.enum(["production", "staging"]).prefault("production"), GITHUB_ID: z.string().optional(), GITHUB_SECRET: z.string().optional(), GOOGLE_CLIENT_ID: z.string().optional(), @@ -31,21 +31,20 @@ export const env = createEnv({ GOOGLE_SHEETS_CLIENT_ID: z.string().optional(), GOOGLE_SHEETS_CLIENT_SECRET: z.string().optional(), GOOGLE_SHEETS_REDIRECT_URL: z.string().optional(), - HTTP_PROXY: z.string().url().optional(), - HTTPS_PROXY: z.string().url().optional(), + HTTP_PROXY: z.url().optional(), + HTTPS_PROXY: z.url().optional(), IMPRINT_URL: z - .string() .url() .optional() .or(z.string().refine((str) => str === "")), IMPRINT_ADDRESS: z.string().optional(), INVITE_DISABLED: z.enum(["1", "0"]).optional(), CHATWOOT_WEBSITE_TOKEN: z.string().optional(), - CHATWOOT_BASE_URL: z.string().url().optional(), + CHATWOOT_BASE_URL: z.url().optional(), IS_FORMBRICKS_CLOUD: z.enum(["1", "0"]).optional(), LOG_LEVEL: z.enum(["debug", "info", "warn", "error", "fatal"]).optional(), - MAIL_FROM: z.string().email().optional(), - NEXTAUTH_URL: z.string().url().optional(), + MAIL_FROM: z.email().optional(), + NEXTAUTH_URL: z.url().optional(), NEXTAUTH_SECRET: z.string().optional(), MAIL_FROM_NAME: z.string().optional(), NOTION_OAUTH_CLIENT_ID: z.string().optional(), @@ -58,10 +57,9 @@ export const env = createEnv({ REDIS_URL: process.env.NODE_ENV === "test" ? z.string().optional() - : z.string().url("REDIS_URL is required for caching, rate limiting, and audit logging"), + : z.url("REDIS_URL is required for caching, rate limiting, and audit logging"), PASSWORD_RESET_DISABLED: z.enum(["1", "0"]).optional(), PRIVACY_URL: z - .string() .url() .optional() .or(z.string().refine((str) => str === "")), @@ -86,7 +84,6 @@ export const env = createEnv({ STRIPE_SECRET_KEY: z.string().optional(), STRIPE_WEBHOOK_SECRET: z.string().optional(), PUBLIC_URL: z - .string() .url() .refine( (url) => { @@ -98,12 +95,11 @@ export const env = createEnv({ } }, { - message: "PUBLIC_URL must be a valid URL with a proper host (e.g., https://example.com)", + error: "PUBLIC_URL must be a valid URL with a proper host (e.g., https://example.com)", } ) .optional(), TERMS_URL: z - .string() .url() .optional() .or(z.string().refine((str) => str === "")), @@ -112,7 +108,7 @@ export const env = createEnv({ RECAPTCHA_SITE_KEY: z.string().optional(), RECAPTCHA_SECRET_KEY: z.string().optional(), VERCEL_URL: z.string().optional(), - WEBAPP_URL: z.string().url().optional(), + WEBAPP_URL: z.url().optional(), UNSPLASH_ACCESS_KEY: z.string().optional(), NODE_ENV: z.enum(["development", "production", "test"]).optional(), diff --git a/apps/web/lib/response/service.ts b/apps/web/lib/response/service.ts index badf46d715..e2a1187c17 100644 --- a/apps/web/lib/response/service.ts +++ b/apps/web/lib/response/service.ts @@ -267,7 +267,7 @@ export const getResponses = reactCache( [limit, ZOptionalNumber], [offset, ZOptionalNumber], [filterCriteria, ZResponseFilterCriteria.optional()], - [cursor, z.string().cuid2().optional()] + [cursor, z.cuid2().optional()] ); limit = limit ?? RESPONSES_PER_PAGE; diff --git a/apps/web/lib/survey/service.ts b/apps/web/lib/survey/service.ts index 5b52ce9799..243110f015 100644 --- a/apps/web/lib/survey/service.ts +++ b/apps/web/lib/survey/service.ts @@ -1,5 +1,5 @@ import "server-only"; -import { ActionClass, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import { cache as reactCache } from "react"; import { prisma } from "@formbricks/database"; import { logger } from "@formbricks/logger"; @@ -114,7 +114,12 @@ export const selectSurvey = { slug: true, } satisfies Prisma.SurveySelect; -export const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { +type TriggerWithActionClassId = { actionClass: { id: string } }; + +export const checkTriggersValidity = ( + triggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> +) => { if (!triggers) return; // check if all the triggers are valid @@ -133,14 +138,14 @@ export const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClass }; export const handleTriggerUpdates = ( - updatedTriggers: TSurvey["triggers"], - currentTriggers: TSurvey["triggers"], - actionClasses: ActionClass[] + updatedTriggers: TriggerWithActionClassId[] | null | undefined, + currentTriggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> ) => { if (!updatedTriggers) return {}; checkTriggersValidity(updatedTriggers, actionClasses); - const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); + 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 @@ -149,7 +154,7 @@ export const handleTriggerUpdates = ( ); // deleted triggers are triggers that are not in the new triggers and are there in the current triggers - const deletedTriggers = currentTriggers.filter( + const deletedTriggers = (currentTriggers ?? []).filter( (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) ); diff --git a/apps/web/lib/user/service.ts b/apps/web/lib/user/service.ts index 239e3849b2..fa41936ed4 100644 --- a/apps/web/lib/user/service.ts +++ b/apps/web/lib/user/service.ts @@ -52,7 +52,7 @@ export const getUser = reactCache(async (id: string): Promise => { }); export const getUserByEmail = reactCache(async (email: string): Promise => { - validateInputs([email, z.string().email()]); + validateInputs([email, z.email()]); try { const user = await prisma.user.findFirst({ diff --git a/apps/web/lib/utils/single-use-surveys.test.ts b/apps/web/lib/utils/single-use-surveys.test.ts index 40c50a1d3e..3c1c596e45 100644 --- a/apps/web/lib/utils/single-use-surveys.test.ts +++ b/apps/web/lib/utils/single-use-surveys.test.ts @@ -1,4 +1,4 @@ -import cuid2 from "@paralleldrive/cuid2"; +import * as cuid2 from "@paralleldrive/cuid2"; import { beforeEach, describe, expect, test, vi } from "vitest"; import * as crypto from "@/lib/crypto"; import { env } from "@/lib/env"; diff --git a/apps/web/lib/utils/single-use-surveys.ts b/apps/web/lib/utils/single-use-surveys.ts index 8a7cf4a96c..2dff81fc75 100644 --- a/apps/web/lib/utils/single-use-surveys.ts +++ b/apps/web/lib/utils/single-use-surveys.ts @@ -1,10 +1,10 @@ -import cuid2 from "@paralleldrive/cuid2"; +import { createId } from "@paralleldrive/cuid2"; import { symmetricEncrypt } from "@/lib/crypto"; import { env } from "@/lib/env"; // generate encrypted single use id for the survey export const generateSurveySingleUseId = (isEncrypted: boolean): string => { - const cuid = cuid2.createId(); + const cuid = createId(); if (!isEncrypted) { return cuid; } diff --git a/apps/web/modules/analysis/components/SingleResponseCard/actions.ts b/apps/web/modules/analysis/components/SingleResponseCard/actions.ts index a6f3dea0fd..e0ce534d56 100644 --- a/apps/web/modules/analysis/components/SingleResponseCard/actions.ts +++ b/apps/web/modules/analysis/components/SingleResponseCard/actions.ts @@ -154,7 +154,7 @@ export const deleteTagOnResponseAction = authenticatedActionClient.schema(ZDelet const ZDeleteResponseAction = z.object({ responseId: ZId, - decrementQuotas: z.boolean().default(false), + decrementQuotas: z.boolean().prefault(false), }); export const deleteResponseAction = authenticatedActionClient.schema(ZDeleteResponseAction).action( diff --git a/apps/web/modules/api/v2/health/types/health-status.ts b/apps/web/modules/api/v2/health/types/health-status.ts index 7f8a49b87d..a42c7de45e 100644 --- a/apps/web/modules/api/v2/health/types/health-status.ts +++ b/apps/web/modules/api/v2/health/types/health-status.ts @@ -1,22 +1,23 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZOverallHealthStatus = z .object({ - main_database: z.boolean().openapi({ - description: "Main database connection status - true if database is reachable and running", - example: true, - }), - cache_database: z.boolean().openapi({ - description: "Cache database connection status - true if cache database is reachable and running", - example: true, - }), + main_database: z + .boolean() + .meta({ + example: true, + }) + .describe("Main database connection status - true if database is reachable and running"), + cache_database: z + .boolean() + .meta({ + example: true, + }) + .describe("Cache database connection status - true if cache database is reachable and running"), }) - .openapi({ + .meta({ title: "Health Check Response", - description: "Health check status for critical application dependencies", - }); + }) + .describe("Health check status for critical application dependencies"); export type OverallHealthStatus = z.infer; diff --git a/apps/web/modules/api/v2/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts b/apps/web/modules/api/v2/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts index b2a106cde0..d4719beab3 100644 --- a/apps/web/modules/api/v2/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts +++ b/apps/web/modules/api/v2/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts @@ -1,26 +1,22 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZContactAttributeKey } from "@formbricks/database/zod/contact-attribute-keys"; -extendZodWithOpenApi(z); - export const ZContactAttributeKeyIdSchema = z - .string() .cuid2() - .openapi({ - ref: "contactAttributeKeyId", - description: "The ID of the contact attribute key", + .meta({ + id: "contactAttributeKeyId", param: { name: "id", in: "path", }, - }); + }) + .describe("The ID of the contact attribute key"); export const ZContactAttributeKeyUpdateSchema = ZContactAttributeKey.pick({ name: true, description: true, -}).openapi({ - ref: "contactAttributeKeyUpdate", +}).meta({ + id: "contactAttributeKeyUpdate", description: "A contact attribute key to update. Key cannot be changed.", }); diff --git a/apps/web/modules/api/v2/management/contact-attribute-keys/lib/openapi.ts b/apps/web/modules/api/v2/management/contact-attribute-keys/lib/openapi.ts index c2b6c66328..a1d72e496a 100644 --- a/apps/web/modules/api/v2/management/contact-attribute-keys/lib/openapi.ts +++ b/apps/web/modules/api/v2/management/contact-attribute-keys/lib/openapi.ts @@ -17,7 +17,7 @@ export const getContactAttributeKeysEndpoint: ZodOpenApiOperationObject = { description: "Gets contact attribute keys from the database.", tags: ["Management API - Contact Attribute Keys"], requestParams: { - query: ZGetContactAttributeKeysFilter.sourceType(), + query: ZGetContactAttributeKeysFilter, }, responses: { "200": { diff --git a/apps/web/modules/api/v2/management/contact-attribute-keys/route.ts b/apps/web/modules/api/v2/management/contact-attribute-keys/route.ts index 6d25d2b5c0..5ee4fcb41b 100644 --- a/apps/web/modules/api/v2/management/contact-attribute-keys/route.ts +++ b/apps/web/modules/api/v2/management/contact-attribute-keys/route.ts @@ -17,7 +17,7 @@ export const GET = async (request: NextRequest) => authenticatedApiClient({ request, schemas: { - query: ZGetContactAttributeKeysFilter.sourceType(), + query: ZGetContactAttributeKeysFilter, }, handler: async ({ authentication, parsedInput }) => { const { query } = parsedInput; @@ -49,7 +49,7 @@ export const POST = async (request: NextRequest) => authenticatedApiClient({ request, schemas: { - body: ZContactAttributeKeyInput.sourceType(), + body: ZContactAttributeKeyInput, }, handler: async ({ authentication, parsedInput, auditLog }) => { const { body } = parsedInput; diff --git a/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts b/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts index b9382a7306..e0a21d7fa9 100644 --- a/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts +++ b/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts @@ -1,13 +1,10 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZContactAttributeKey } from "@formbricks/database/zod/contact-attribute-keys"; import { isSafeIdentifier } from "@/lib/utils/safe-identifier"; import { ZGetFilter } from "@/modules/api/v2/types/api-filter"; -extendZodWithOpenApi(z); - export const ZGetContactAttributeKeysFilter = ZGetFilter.extend({ - environmentId: z.string().cuid2().optional().describe("The environment ID to filter by"), + environmentId: z.cuid2().optional().describe("The environment ID to filter by"), }) .refine( (data) => { @@ -37,15 +34,15 @@ export const ZContactAttributeKeyInput = ZContactAttributeKey.pick({ // Enforce safe identifier format for key if (!isSafeIdentifier(data.key)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Key must be a safe identifier: only lowercase letters, numbers, and underscores, and must start with a letter", path: ["key"], }); } }) - .openapi({ - ref: "contactAttributeKeyInput", + .meta({ + id: "contactAttributeKeyInput", description: "Input data for creating or updating a contact attribute", }); diff --git a/apps/web/modules/api/v2/management/responses/[responseId]/types/responses.ts b/apps/web/modules/api/v2/management/responses/[responseId]/types/responses.ts index 8115c028b3..f7bc6c368c 100644 --- a/apps/web/modules/api/v2/management/responses/[responseId]/types/responses.ts +++ b/apps/web/modules/api/v2/management/responses/[responseId]/types/responses.ts @@ -1,25 +1,21 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZResponse } from "@formbricks/database/zod/responses"; -extendZodWithOpenApi(z); - export const ZResponseIdSchema = z - .string() .cuid2() - .openapi({ - ref: "responseId", - description: "The ID of the response", + .meta({ + id: "responseId", param: { name: "id", in: "path", }, - }); + }) + .describe("The ID of the response"); export const ZResponseUpdateSchema = ZResponse.omit({ id: true, surveyId: true, -}).openapi({ - ref: "responseUpdate", +}).meta({ + id: "responseUpdate", description: "A response to update.", }); diff --git a/apps/web/modules/api/v2/management/responses/lib/openapi.ts b/apps/web/modules/api/v2/management/responses/lib/openapi.ts index e2307c2676..b16b374fb9 100644 --- a/apps/web/modules/api/v2/management/responses/lib/openapi.ts +++ b/apps/web/modules/api/v2/management/responses/lib/openapi.ts @@ -13,7 +13,7 @@ export const getResponsesEndpoint: ZodOpenApiOperationObject = { summary: "Get responses", description: "Gets responses from the database.", requestParams: { - query: ZGetResponsesFilter.sourceType(), + query: ZGetResponsesFilter, }, tags: ["Management API - Responses"], responses: { diff --git a/apps/web/modules/api/v2/management/responses/route.ts b/apps/web/modules/api/v2/management/responses/route.ts index 84f5a3c319..57717d39af 100644 --- a/apps/web/modules/api/v2/management/responses/route.ts +++ b/apps/web/modules/api/v2/management/responses/route.ts @@ -19,7 +19,7 @@ export const GET = async (request: NextRequest) => authenticatedApiClient({ request, schemas: { - query: ZGetResponsesFilter.sourceType(), + query: ZGetResponsesFilter, }, handler: async ({ authentication, parsedInput }) => { const { query } = parsedInput; diff --git a/apps/web/modules/api/v2/management/responses/types/responses.ts b/apps/web/modules/api/v2/management/responses/types/responses.ts index e59808b4dc..98fce48512 100644 --- a/apps/web/modules/api/v2/management/responses/types/responses.ts +++ b/apps/web/modules/api/v2/management/responses/types/responses.ts @@ -3,7 +3,7 @@ import { ZResponse } from "@formbricks/database/zod/responses"; import { ZGetFilter } from "@/modules/api/v2/types/api-filter"; export const ZGetResponsesFilter = ZGetFilter.extend({ - surveyId: z.string().cuid2().optional(), + surveyId: z.cuid2().optional(), contactId: z.string().optional(), }).refine( (data) => { diff --git a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/lib/openapi.ts b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/lib/openapi.ts index 78ef76a2aa..21f29fef7c 100644 --- a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/lib/openapi.ts +++ b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/lib/openapi.ts @@ -23,7 +23,7 @@ export const getPersonalizedSurveyLink: ZodOpenApiOperationObject = { schema: makePartialSchema( z.object({ data: z.object({ - surveyUrl: z.string().url(), + surveyUrl: z.url(), expiresAt: z .string() .nullable() diff --git a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/types/survey.ts b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/types/survey.ts index d3dbfb619f..df4e04f0b6 100644 --- a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/types/survey.ts +++ b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/contacts/[contactId]/types/survey.ts @@ -1,23 +1,18 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZContactLinkParams = z.object({ surveyId: z - .string() .cuid2() - .openapi({ - description: "The ID of the survey", + .meta({ param: { name: "surveyId", in: "path" }, - }), + }) + .describe("The ID of the survey"), contactId: z - .string() .cuid2() - .openapi({ - description: "The ID of the contact", + .meta({ param: { name: "contactId", in: "path" }, - }), + }) + .describe("The ID of the contact"), }); export const ZContactLinkQuery = z.object({ diff --git a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/segments/[segmentId]/types/contact.ts b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/segments/[segmentId]/types/contact.ts index 4094ba1681..68c16846a7 100644 --- a/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/segments/[segmentId]/types/contact.ts +++ b/apps/web/modules/api/v2/management/surveys/[surveyId]/contact-links/segments/[segmentId]/types/contact.ts @@ -1,24 +1,19 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZGetFilter } from "@/modules/api/v2/types/api-filter"; -extendZodWithOpenApi(z); - export const ZContactLinksBySegmentParams = z.object({ surveyId: z - .string() .cuid2() - .openapi({ - description: "The ID of the survey", + .meta({ param: { name: "surveyId", in: "path" }, - }), + }) + .describe("The ID of the survey"), segmentId: z - .string() .cuid2() - .openapi({ - description: "The ID of the segment", + .meta({ param: { name: "segmentId", in: "path" }, - }), + }) + .describe("The ID of the segment"), }); export const ZContactLinksBySegmentQuery = ZGetFilter.pick({ @@ -30,7 +25,7 @@ export const ZContactLinksBySegmentQuery = ZGetFilter.pick({ .min(1) .max(365) .nullish() - .default(null) + .prefault(null) .describe("Number of days until the generated JWT expires. If not provided, there is no expiration."), attributeKeys: z .string() @@ -52,7 +47,7 @@ export type TContactWithAttributes = { export const ZContactLinkResponse = z.object({ contactId: z.string().describe("The ID of the contact"), - surveyUrl: z.string().url().describe("Personalized survey link"), + surveyUrl: z.url().describe("Personalized survey link"), expiresAt: z.string().nullable().describe("The date and time the link expires, null if no expiration"), attributes: z.record(z.string(), z.string()).describe("The attributes of the contact"), }); diff --git a/apps/web/modules/api/v2/management/surveys/[surveyId]/types/survey.ts b/apps/web/modules/api/v2/management/surveys/[surveyId]/types/survey.ts index d4fc5ecf8e..4f1dfdb0ab 100644 --- a/apps/web/modules/api/v2/management/surveys/[surveyId]/types/survey.ts +++ b/apps/web/modules/api/v2/management/surveys/[surveyId]/types/survey.ts @@ -1,16 +1,12 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const surveyIdSchema = z - .string() .cuid2() - .openapi({ - ref: "surveyId", - description: "The ID of the survey", + .meta({ + id: "surveyId", param: { name: "id", in: "path", }, - }); + }) + .describe("The ID of the survey"); diff --git a/apps/web/modules/api/v2/management/surveys/types/surveys.ts b/apps/web/modules/api/v2/management/surveys/types/surveys.ts index aa3f96bd5d..1a3c83415d 100644 --- a/apps/web/modules/api/v2/management/surveys/types/surveys.ts +++ b/apps/web/modules/api/v2/management/surveys/types/surveys.ts @@ -1,15 +1,12 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZSurveyWithoutQuestionType } from "@formbricks/database/zod/surveys"; -extendZodWithOpenApi(z); - export const ZGetSurveysFilter = z .object({ - limit: z.coerce.number().positive().min(1).max(100).optional().default(10), - skip: z.coerce.number().nonnegative().optional().default(0), - sortBy: z.enum(["createdAt", "updatedAt"]).optional().default("createdAt"), - order: z.enum(["asc", "desc"]).optional().default("desc"), + limit: z.coerce.number().positive().min(1).max(100).optional().prefault(10), + skip: z.coerce.number().nonnegative().optional().prefault(0), + sortBy: z.enum(["createdAt", "updatedAt"]).optional().prefault("createdAt"), + order: z.enum(["asc", "desc"]).optional().prefault("desc"), startDate: z.coerce.date().optional(), endDate: z.coerce.date().optional(), surveyType: z.enum(["link", "app"]).optional(), @@ -23,7 +20,7 @@ export const ZGetSurveysFilter = z return true; }, { - message: "startDate must be before endDate", + error: "startDate must be before endDate", } ); @@ -69,8 +66,8 @@ export const ZSurveyInput = ZSurveyWithoutQuestionType.pick({ inlineTriggers: true, displayPercentage: true, }) - .openapi({ - ref: "surveyInput", + .meta({ + id: "surveyInput", description: "A survey input object for creating or updating surveys", }); diff --git a/apps/web/modules/api/v2/management/webhooks/[webhookId]/types/webhooks.ts b/apps/web/modules/api/v2/management/webhooks/[webhookId]/types/webhooks.ts index b514a45642..7b654350cb 100644 --- a/apps/web/modules/api/v2/management/webhooks/[webhookId]/types/webhooks.ts +++ b/apps/web/modules/api/v2/management/webhooks/[webhookId]/types/webhooks.ts @@ -1,20 +1,16 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZWebhook } from "@formbricks/database/zod/webhooks"; -extendZodWithOpenApi(z); - export const ZWebhookIdSchema = z - .string() .cuid2() - .openapi({ - ref: "webhookId", - description: "The ID of the webhook", + .meta({ + id: "webhookId", param: { name: "id", in: "path", }, - }); + }) + .describe("The ID of the webhook"); export const ZWebhookUpdateSchema = ZWebhook.omit({ id: true, @@ -22,7 +18,7 @@ export const ZWebhookUpdateSchema = ZWebhook.omit({ updatedAt: true, environmentId: true, secret: true, -}).openapi({ - ref: "webhookUpdate", +}).meta({ + id: "webhookUpdate", description: "A webhook to update.", }); diff --git a/apps/web/modules/api/v2/management/webhooks/lib/openapi.ts b/apps/web/modules/api/v2/management/webhooks/lib/openapi.ts index 126681fdea..7739be47af 100644 --- a/apps/web/modules/api/v2/management/webhooks/lib/openapi.ts +++ b/apps/web/modules/api/v2/management/webhooks/lib/openapi.ts @@ -13,7 +13,7 @@ export const getWebhooksEndpoint: ZodOpenApiOperationObject = { summary: "Get webhooks", description: "Gets webhooks from the database.", requestParams: { - query: ZGetWebhooksFilter.sourceType(), + query: ZGetWebhooksFilter, }, tags: ["Management API - Webhooks"], responses: { diff --git a/apps/web/modules/api/v2/management/webhooks/route.ts b/apps/web/modules/api/v2/management/webhooks/route.ts index 9da53017d9..b73ec7ea4c 100644 --- a/apps/web/modules/api/v2/management/webhooks/route.ts +++ b/apps/web/modules/api/v2/management/webhooks/route.ts @@ -11,7 +11,7 @@ export const GET = async (request: NextRequest) => authenticatedApiClient({ request, schemas: { - query: ZGetWebhooksFilter.sourceType(), + query: ZGetWebhooksFilter, }, handler: async ({ authentication, parsedInput }) => { const { query } = parsedInput; diff --git a/apps/web/modules/api/v2/management/webhooks/types/webhooks.ts b/apps/web/modules/api/v2/management/webhooks/types/webhooks.ts index f441fbf25d..2093875541 100644 --- a/apps/web/modules/api/v2/management/webhooks/types/webhooks.ts +++ b/apps/web/modules/api/v2/management/webhooks/types/webhooks.ts @@ -3,7 +3,7 @@ import { ZWebhook } from "@formbricks/database/zod/webhooks"; import { ZGetFilter } from "@/modules/api/v2/types/api-filter"; export const ZGetWebhooksFilter = ZGetFilter.extend({ - surveyIds: z.array(z.string().cuid2()).optional(), + surveyIds: z.array(z.cuid2()).optional(), }).refine( (data) => { if (data.startDate && data.endDate && data.startDate > data.endDate) { diff --git a/apps/web/modules/api/v2/openapi-document.ts b/apps/web/modules/api/v2/openapi-document.ts index 464aff67f0..180170735c 100644 --- a/apps/web/modules/api/v2/openapi-document.ts +++ b/apps/web/modules/api/v2/openapi-document.ts @@ -1,6 +1,5 @@ import * as yaml from "yaml"; -import { z } from "zod"; -import { createDocument, extendZodWithOpenApi } from "zod-openapi"; +import { createDocument } from "zod-openapi"; import { ZApiKeyData } from "@formbricks/database/zod/api-keys"; import { ZContact } from "@formbricks/database/zod/contact"; import { ZContactAttributeKey } from "@formbricks/database/zod/contact-attribute-keys"; @@ -27,8 +26,6 @@ import { rolePaths } from "@/modules/api/v2/roles/lib/openapi"; import { bulkContactPaths } from "@/modules/ee/contacts/api/v2/management/contacts/bulk/lib/openapi"; import { contactPaths } from "@/modules/ee/contacts/api/v2/management/contacts/lib/openapi"; -extendZodWithOpenApi(z); - const document = createDocument({ openapi: "3.1.0", info: { diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/lib/openapi.ts b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/lib/openapi.ts index 6302e50c80..578a73a2fa 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/lib/openapi.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/lib/openapi.ts @@ -14,7 +14,7 @@ export const getProjectTeamsEndpoint: ZodOpenApiOperationObject = { summary: "Get project teams", description: "Gets projectTeams from the database.", requestParams: { - query: ZGetProjectTeamsFilter.sourceType(), + query: ZGetProjectTeamsFilter, path: z.object({ organizationId: ZOrganizationIdSchema, }), diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/route.ts b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/route.ts index a370e5641e..0dbc62f270 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/route.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/route.ts @@ -24,7 +24,7 @@ export async function GET(request: Request, props: { params: Promise<{ organizat return authenticatedApiClient({ request, schemas: { - query: ZGetProjectTeamsFilter.sourceType(), + query: ZGetProjectTeamsFilter, params: z.object({ organizationId: ZOrganizationIdSchema }), }, externalParams: props.params, diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/types/project-teams.ts b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/types/project-teams.ts index 78ab7c9fa4..3f2547319a 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/types/project-teams.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/project-teams/types/project-teams.ts @@ -3,8 +3,8 @@ import { ZProjectTeam } from "@formbricks/database/zod/project-teams"; import { ZGetFilter } from "@/modules/api/v2/types/api-filter"; export const ZGetProjectTeamsFilter = ZGetFilter.extend({ - teamId: z.string().cuid2().optional(), - projectId: z.string().cuid2().optional(), + teamId: z.cuid2().optional(), + projectId: z.cuid2().optional(), }).refine( (data) => { if (data.startDate && data.endDate && data.startDate > data.endDate) { @@ -28,8 +28,8 @@ export const ZProjectTeamInput = ZProjectTeam.pick({ export type TProjectTeamInput = z.infer; export const ZGetProjectTeamUpdateFilter = z.object({ - teamId: z.string().cuid2(), - projectId: z.string().cuid2(), + teamId: z.cuid2(), + projectId: z.cuid2(), }); export const ZProjectZTeamUpdateSchema = ZProjectTeam.pick({ diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/teams/[teamId]/types/teams.ts b/apps/web/modules/api/v2/organizations/[organizationId]/teams/[teamId]/types/teams.ts index 10f6a16dc8..f137ac916a 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/teams/[teamId]/types/teams.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/teams/[teamId]/types/teams.ts @@ -1,20 +1,16 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZTeam } from "@formbricks/database/zod/teams"; -extendZodWithOpenApi(z); - export const ZTeamIdSchema = z - .string() .cuid2() - .openapi({ - ref: "teamId", - description: "The ID of the team", + .meta({ + id: "teamId", param: { name: "id", in: "path", }, - }); + }) + .describe("The ID of the team"); export const ZTeamUpdateSchema = ZTeam.omit({ id: true, diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/teams/lib/openapi.ts b/apps/web/modules/api/v2/organizations/[organizationId]/teams/lib/openapi.ts index b62e6324fb..87233a294d 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/teams/lib/openapi.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/teams/lib/openapi.ts @@ -21,7 +21,7 @@ export const getTeamsEndpoint: ZodOpenApiOperationObject = { path: z.object({ organizationId: ZOrganizationIdSchema, }), - query: ZGetTeamsFilter.sourceType(), + query: ZGetTeamsFilter, }, tags: ["Organizations API - Teams"], responses: { diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/teams/route.ts b/apps/web/modules/api/v2/organizations/[organizationId]/teams/route.ts index 3dd0cc3d71..355a2ec1bb 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/teams/route.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/teams/route.ts @@ -16,7 +16,7 @@ export const GET = async (request: NextRequest, props: { params: Promise<{ organ authenticatedApiClient({ request, schemas: { - query: ZGetTeamsFilter.sourceType(), + query: ZGetTeamsFilter, params: z.object({ organizationId: ZOrganizationIdSchema }), }, externalParams: props.params, diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/types/organizations.ts b/apps/web/modules/api/v2/organizations/[organizationId]/types/organizations.ts index 60bc18ab45..313d50f6a4 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/types/organizations.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/types/organizations.ts @@ -1,16 +1,12 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZOrganizationIdSchema = z - .string() .cuid2() - .openapi({ - ref: "organizationId", - description: "The ID of the organization", + .meta({ + id: "organizationId", param: { name: "organizationId", in: "path", }, - }); + }) + .describe("The ID of the organization"); diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/users/lib/openapi.ts b/apps/web/modules/api/v2/organizations/[organizationId]/users/lib/openapi.ts index 4d4adea760..a7cab7a310 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/users/lib/openapi.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/users/lib/openapi.ts @@ -17,7 +17,7 @@ export const getUsersEndpoint: ZodOpenApiOperationObject = { path: z.object({ organizationId: ZOrganizationIdSchema, }), - query: ZGetUsersFilter.sourceType(), + query: ZGetUsersFilter, }, tags: ["Organizations API - Users"], responses: { diff --git a/apps/web/modules/api/v2/organizations/[organizationId]/users/route.ts b/apps/web/modules/api/v2/organizations/[organizationId]/users/route.ts index 927fb19ec5..fdf75ef6a6 100644 --- a/apps/web/modules/api/v2/organizations/[organizationId]/users/route.ts +++ b/apps/web/modules/api/v2/organizations/[organizationId]/users/route.ts @@ -24,7 +24,7 @@ export const GET = async (request: NextRequest, props: { params: Promise<{ organ authenticatedApiClient({ request, schemas: { - query: ZGetUsersFilter.sourceType(), + query: ZGetUsersFilter, params: z.object({ organizationId: ZOrganizationIdSchema }), }, externalParams: props.params, diff --git a/apps/web/modules/api/v2/types/api-filter.ts b/apps/web/modules/api/v2/types/api-filter.ts index 66ceda186e..a44a0ecc90 100644 --- a/apps/web/modules/api/v2/types/api-filter.ts +++ b/apps/web/modules/api/v2/types/api-filter.ts @@ -1,10 +1,10 @@ import { z } from "zod"; export const ZGetFilter = z.object({ - limit: z.coerce.number().min(1).max(250).optional().default(50).describe("Number of items to return"), - skip: z.coerce.number().min(0).optional().default(0).describe("Number of items to skip"), - sortBy: z.enum(["createdAt", "updatedAt"]).optional().default("createdAt").describe("Sort by field"), - order: z.enum(["asc", "desc"]).optional().default("desc").describe("Sort order"), + limit: z.coerce.number().min(1).max(250).optional().prefault(50).describe("Number of items to return"), + skip: z.coerce.number().min(0).optional().prefault(0).describe("Number of items to skip"), + sortBy: z.enum(["createdAt", "updatedAt"]).optional().prefault("createdAt").describe("Sort by field"), + order: z.enum(["asc", "desc"]).optional().prefault("desc").describe("Sort order"), startDate: z.coerce.date().optional().describe("Start date"), endDate: z.coerce.date().optional().describe("End date"), filterDateField: z.enum(["createdAt", "updatedAt"]).optional().describe("Date field to filter by"), diff --git a/apps/web/modules/api/v2/types/openapi-response.ts b/apps/web/modules/api/v2/types/openapi-response.ts index 50c2e8445a..2198949346 100644 --- a/apps/web/modules/api/v2/types/openapi-response.ts +++ b/apps/web/modules/api/v2/types/openapi-response.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -export function responseWithMetaSchema(contentSchema: T) { +export function responseWithMetaSchema(contentSchema: T) { return z.object({ data: z.array(contentSchema).optional(), meta: z diff --git a/apps/web/modules/auth/actions.ts b/apps/web/modules/auth/actions.ts index 4dc9b7cf80..114316b751 100644 --- a/apps/web/modules/auth/actions.ts +++ b/apps/web/modules/auth/actions.ts @@ -7,7 +7,12 @@ import { getUserByEmail } from "@/lib/user/service"; import { actionClient } from "@/lib/utils/action-client"; const ZCreateEmailTokenAction = z.object({ - email: z.string().min(5).max(255).email({ message: "Invalid email" }), + email: z + .email({ + error: "Invalid email", + }) + .min(5) + .max(255), }); export const createEmailTokenAction = actionClient diff --git a/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx b/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx index 39bcd13aa2..7b58b780c3 100644 --- a/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx +++ b/apps/web/modules/auth/forgot-password/components/forgot-password-form.tsx @@ -13,7 +13,7 @@ import { Button } from "@/modules/ui/components/button"; import { FormControl, FormError, FormField, FormItem } from "@/modules/ui/components/form"; const ZForgotPasswordForm = z.object({ - email: z.string().email(), + email: z.email(), }); type TForgotPasswordForm = z.infer; diff --git a/apps/web/modules/auth/lib/totp.test.ts b/apps/web/modules/auth/lib/totp.test.ts index fe4167534e..2b6b11d4b6 100644 --- a/apps/web/modules/auth/lib/totp.test.ts +++ b/apps/web/modules/auth/lib/totp.test.ts @@ -1,63 +1,62 @@ -import { Authenticator } from "@otplib/core"; -import type { AuthenticatorOptions } from "@otplib/core/authenticator"; -import { createDigest, createRandomBytes } from "@otplib/plugin-crypto"; -import { keyDecoder, keyEncoder } from "@otplib/plugin-thirty-two"; +import { OTP } from "otplib"; import { describe, expect, test, vi } from "vitest"; import { totpAuthenticatorCheck } from "./totp"; -vi.mock("@otplib/core"); -vi.mock("@otplib/plugin-crypto"); -vi.mock("@otplib/plugin-thirty-two"); +vi.mock("otplib", () => ({ + OTP: vi.fn(), +})); describe("totpAuthenticatorCheck", () => { const token = "123456"; const secret = "JBSWY3DPEHPK3PXP"; - const opts: Partial = { window: [1, 0] }; + const opts = { window: [1, 0] as [number, number] }; test("should check a TOTP token with a base32-encoded secret", () => { - const checkMock = vi.fn().mockReturnValue(true); - (Authenticator as unknown as vi.Mock).mockImplementation(() => ({ - check: checkMock, - })); + const verifySyncMock = vi.fn().mockReturnValue({ valid: true }); + (OTP as unknown as vi.Mock).mockImplementation(function OTP() { + return { + verifySync: verifySyncMock, + }; + }); const result = totpAuthenticatorCheck(token, secret, opts); - expect(Authenticator).toHaveBeenCalledWith({ - createDigest, - createRandomBytes, - keyDecoder, - keyEncoder, - window: [1, 0], + expect(verifySyncMock).toHaveBeenCalledWith({ + token, + secret, + period: 30, + epochTolerance: [30, 0], }); - expect(checkMock).toHaveBeenCalledWith(token, secret); expect(result).toBe(true); }); test("should use default window if none is provided", () => { - const checkMock = vi.fn().mockReturnValue(true); - (Authenticator as unknown as vi.Mock).mockImplementation(() => ({ - check: checkMock, - })); + const verifySyncMock = vi.fn().mockReturnValue({ valid: true }); + (OTP as unknown as vi.Mock).mockImplementation(function OTP() { + return { + verifySync: verifySyncMock, + }; + }); const result = totpAuthenticatorCheck(token, secret); - expect(Authenticator).toHaveBeenCalledWith({ - createDigest, - createRandomBytes, - keyDecoder, - keyEncoder, - window: [1, 0], + expect(verifySyncMock).toHaveBeenCalledWith({ + token, + secret, + period: 30, + epochTolerance: [30, 0], }); - expect(checkMock).toHaveBeenCalledWith(token, secret); expect(result).toBe(true); }); test("should throw an error for invalid token format", () => { - (Authenticator as unknown as vi.Mock).mockImplementation(() => ({ - check: () => { - throw new Error("Invalid token format"); - }, - })); + (OTP as unknown as vi.Mock).mockImplementation(function OTP() { + return { + verifySync: () => { + throw new Error("Invalid token format"); + }, + }; + }); expect(() => { totpAuthenticatorCheck("invalidToken", secret); @@ -65,11 +64,13 @@ describe("totpAuthenticatorCheck", () => { }); test("should throw an error for invalid secret format", () => { - (Authenticator as unknown as vi.Mock).mockImplementation(() => ({ - check: () => { - throw new Error("Invalid secret format"); - }, - })); + (OTP as unknown as vi.Mock).mockImplementation(function OTP() { + return { + verifySync: () => { + throw new Error("Invalid secret format"); + }, + }; + }); expect(() => { totpAuthenticatorCheck(token, "invalidSecret"); @@ -77,10 +78,12 @@ describe("totpAuthenticatorCheck", () => { }); test("should return false if token verification fails", () => { - const checkMock = vi.fn().mockReturnValue(false); - (Authenticator as unknown as vi.Mock).mockImplementation(() => ({ - check: checkMock, - })); + const verifySyncMock = vi.fn().mockReturnValue({ valid: false }); + (OTP as unknown as vi.Mock).mockImplementation(function OTP() { + return { + verifySync: verifySyncMock, + }; + }); const result = totpAuthenticatorCheck(token, secret); expect(result).toBe(false); diff --git a/apps/web/modules/auth/lib/totp.ts b/apps/web/modules/auth/lib/totp.ts index e79a8197c3..2be6d71c6f 100644 --- a/apps/web/modules/auth/lib/totp.ts +++ b/apps/web/modules/auth/lib/totp.ts @@ -1,7 +1,15 @@ -import { Authenticator } from "@otplib/core"; -import type { AuthenticatorOptions } from "@otplib/core/authenticator"; -import { createDigest, createRandomBytes } from "@otplib/plugin-crypto"; -import { keyDecoder, keyEncoder } from "@otplib/plugin-thirty-two"; +import { OTP, type OTPVerifyOptions } from "otplib"; + +type TOTPAuthenticatorOptions = { + window?: number | [number, number]; + period?: OTPVerifyOptions["period"]; + epoch?: OTPVerifyOptions["epoch"]; + t0?: OTPVerifyOptions["t0"]; + algorithm?: OTPVerifyOptions["algorithm"]; + digits?: OTPVerifyOptions["digits"]; +}; + +const createTotp = () => new OTP({ strategy: "totp" }); /** * Checks the validity of a TOTP token using a base32-encoded secret. @@ -14,16 +22,19 @@ import { keyDecoder, keyEncoder } from "@otplib/plugin-thirty-two"; export const totpAuthenticatorCheck = ( token: string, secret: string, - opts: Partial = {} + opts: TOTPAuthenticatorOptions = {} ) => { - const { window = [1, 0], ...rest } = opts; - const authenticator = new Authenticator({ - createDigest, - createRandomBytes, - keyDecoder, - keyEncoder, - window, + const { window = [1, 0], period = 30, ...rest } = opts; + const [pastWindow, futureWindow] = Array.isArray(window) ? window : [window, window]; + const totp = createTotp(); + + const result = totp.verifySync({ + token, + secret, + period, + epochTolerance: [pastWindow * period, futureWindow * period], ...rest, }); - return authenticator.check(token, secret); + + return result.valid; }; diff --git a/apps/web/modules/auth/login/components/login-form.tsx b/apps/web/modules/auth/login/components/login-form.tsx index f9533fd9c3..d94cb65ca7 100644 --- a/apps/web/modules/auth/login/components/login-form.tsx +++ b/apps/web/modules/auth/login/components/login-form.tsx @@ -21,11 +21,15 @@ import { FormControl, FormError, FormField, FormItem } from "@/modules/ui/compon import { PasswordInput } from "@/modules/ui/components/password-input"; const ZLoginForm = z.object({ - email: z.string().email(), + email: z.email(), password: z .string() - .min(8, { message: "Password must be at least 8 characters long" }) - .max(128, { message: "Password must be 128 characters or less" }), + .min(8, { + error: "Password must be at least 8 characters long", + }) + .max(128, { + error: "Password must be 128 characters or less", + }), totpCode: z.string().optional(), backupCode: z.string().optional(), }); diff --git a/apps/web/modules/auth/signup/components/signup-form.tsx b/apps/web/modules/auth/signup/components/signup-form.tsx index 0741c07d7c..b994550b5d 100644 --- a/apps/web/modules/auth/signup/components/signup-form.tsx +++ b/apps/web/modules/auth/signup/components/signup-form.tsx @@ -24,7 +24,7 @@ import { PasswordChecks } from "./password-checks"; const ZSignupInput = z.object({ name: ZUserName, - email: z.string().email(), + email: z.email(), password: ZUserPassword, }); diff --git a/apps/web/modules/core/rate-limit/types/rate-limit.ts b/apps/web/modules/core/rate-limit/types/rate-limit.ts index 2a5e7d4e78..9a5ee930d4 100644 --- a/apps/web/modules/core/rate-limit/types/rate-limit.ts +++ b/apps/web/modules/core/rate-limit/types/rate-limit.ts @@ -2,9 +2,9 @@ import { z } from "zod"; export const ZRateLimitConfig = z.object({ /** Rate limit window in seconds */ - interval: z.number().int().positive().describe("Rate limit window in seconds"), + interval: z.int().positive().describe("Rate limit window in seconds"), /** Maximum allowed requests per interval */ - allowedPerInterval: z.number().int().positive().describe("Maximum allowed requests per interval"), + allowedPerInterval: z.int().positive().describe("Maximum allowed requests per interval"), /** Namespace for grouping rate limit per feature */ namespace: z.string().min(1).describe("Namespace for grouping rate limit per feature"), }); diff --git a/apps/web/modules/ee/audit-logs/types/audit-log.ts b/apps/web/modules/ee/audit-logs/types/audit-log.ts index b88d3804ef..ac86cf61d0 100644 --- a/apps/web/modules/ee/audit-logs/types/audit-log.ts +++ b/apps/web/modules/ee/audit-logs/types/audit-log.ts @@ -73,12 +73,12 @@ export const ZAuditLogEventSchema = z.object({ type: ZAuditTarget, }), status: ZAuditStatus, - timestamp: z.string().datetime(), + timestamp: z.iso.datetime(), organizationId: z.string(), ipAddress: z.string().optional(), // Not using the .ip() here because if we don't enabled it we want to put UNKNOWN_DATA string, to keep the same pattern as the other fields - changes: z.record(z.any()).optional(), + changes: z.record(z.string(), z.any()).optional(), eventId: z.string().optional(), - apiUrl: z.string().url().optional(), + apiUrl: z.url().optional(), }); export type TAuditLogEvent = z.infer; diff --git a/apps/web/modules/ee/billing/actions.ts b/apps/web/modules/ee/billing/actions.ts index ad1d7d92b9..7a228ed7f4 100644 --- a/apps/web/modules/ee/billing/actions.ts +++ b/apps/web/modules/ee/billing/actions.ts @@ -16,7 +16,7 @@ import { isSubscriptionCancelled } from "@/modules/ee/billing/api/lib/is-subscri const ZUpgradePlanAction = z.object({ environmentId: ZId, - priceLookupKey: z.nativeEnum(STRIPE_PRICE_LOOKUP_KEYS), + priceLookupKey: z.enum(STRIPE_PRICE_LOOKUP_KEYS), }); export const upgradePlanAction = authenticatedActionClient.schema(ZUpgradePlanAction).action( diff --git a/apps/web/modules/ee/billing/api/lib/invoice-finalized.ts b/apps/web/modules/ee/billing/api/lib/invoice-finalized.ts index f01948b01f..02d964ca3e 100644 --- a/apps/web/modules/ee/billing/api/lib/invoice-finalized.ts +++ b/apps/web/modules/ee/billing/api/lib/invoice-finalized.ts @@ -8,7 +8,8 @@ import { getOrganization, updateOrganization } from "@/lib/organization/service" export const handleInvoiceFinalized = async (event: Stripe.Event) => { const invoice = event.data.object as Stripe.Invoice; - const subscriptionId = invoice.subscription as string; + const subscription = invoice.parent?.subscription_details?.subscription; + const subscriptionId = typeof subscription === "string" ? subscription : subscription?.id; if (!subscriptionId) { logger.warn({ invoiceId: invoice.id }, "Invoice finalized without subscription ID"); return { status: 400, message: "No subscription ID found in invoice" }; diff --git a/apps/web/modules/ee/billing/api/lib/is-subscription-cancelled.ts b/apps/web/modules/ee/billing/api/lib/is-subscription-cancelled.ts index 0dff1b77a6..80556927c3 100644 --- a/apps/web/modules/ee/billing/api/lib/is-subscription-cancelled.ts +++ b/apps/web/modules/ee/billing/api/lib/is-subscription-cancelled.ts @@ -34,9 +34,11 @@ export const isSubscriptionCancelled = async ( for (const subscription of subscriptions.data) { if (subscription.cancel_at_period_end) { + const cancellationTimestamp = + subscription.cancel_at ?? subscription.ended_at ?? subscription.canceled_at; return { cancelled: true, - date: new Date(subscription.current_period_end * 1000), + date: cancellationTimestamp ? new Date(cancellationTimestamp * 1000) : null, }; } } diff --git a/apps/web/modules/ee/contacts/actions.ts b/apps/web/modules/ee/contacts/actions.ts index 6cb400fe7f..71f511a9fb 100644 --- a/apps/web/modules/ee/contacts/actions.ts +++ b/apps/web/modules/ee/contacts/actions.ts @@ -23,7 +23,7 @@ import { const ZGetContactsAction = z.object({ environmentId: ZId, - offset: z.number().int().nonnegative(), + offset: z.int().nonnegative(), searchValue: z.string().optional(), }); diff --git a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/route.ts b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/route.ts index 7cccf236a7..6e2ff97531 100644 --- a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/route.ts +++ b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/route.ts @@ -64,7 +64,7 @@ export const POST = withV1ApiWrapper({ { environmentId: params.environmentId, url: req.url, - validationError: cuidValidation.error.errors[0]?.message, + validationError: cuidValidation.error.issues[0]?.message, }, "Invalid CUID v1 format detected" ); diff --git a/apps/web/modules/ee/contacts/api/v1/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts b/apps/web/modules/ee/contacts/api/v1/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts index 4c28d00a50..8476a1fcee 100644 --- a/apps/web/modules/ee/contacts/api/v1/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts +++ b/apps/web/modules/ee/contacts/api/v1/management/contact-attribute-keys/[contactAttributeKeyId]/types/contact-attribute-keys.ts @@ -4,7 +4,7 @@ import { isSafeIdentifier } from "@/lib/utils/safe-identifier"; export const ZContactAttributeKeyCreateInput = z.object({ key: z.string().refine((val) => isSafeIdentifier(val), { - message: + error: "Key must be a safe identifier: only lowercase letters, numbers, and underscores, and must start with a letter", }), description: z.string().optional(), @@ -21,7 +21,7 @@ export const ZContactAttributeKeyUpdateInput = z.object({ key: z .string() .refine((val) => isSafeIdentifier(val), { - message: + error: "Key must be a safe identifier: only lowercase letters, numbers, and underscores, and must start with a letter", }) .optional(), diff --git a/apps/web/modules/ee/contacts/attributes/actions.ts b/apps/web/modules/ee/contacts/attributes/actions.ts index 9772fd86b4..4a13a3c4d9 100644 --- a/apps/web/modules/ee/contacts/attributes/actions.ts +++ b/apps/web/modules/ee/contacts/attributes/actions.ts @@ -20,7 +20,7 @@ import { const ZCreateContactAttributeKeyAction = z.object({ environmentId: ZId, key: z.string().refine((val) => isSafeIdentifier(val), { - message: + error: "Key must be a safe identifier: only lowercase letters, numbers, and underscores, and must start with a letter", }), name: z.string().optional(), diff --git a/apps/web/modules/ee/contacts/components/upload-contacts-button.tsx b/apps/web/modules/ee/contacts/components/upload-contacts-button.tsx index a12f80a9f8..5ab384d3d4 100644 --- a/apps/web/modules/ee/contacts/components/upload-contacts-button.tsx +++ b/apps/web/modules/ee/contacts/components/upload-contacts-button.tsx @@ -84,7 +84,7 @@ export const UploadContactsCSVButton = ({ const parsedRecords = ZContactCSVUploadResponse.safeParse(records); if (!parsedRecords.success) { console.error("Error parsing CSV:", parsedRecords.error); - setError(parsedRecords.error.errors[0].message); + setError(parsedRecords.error.issues[0].message); return; } diff --git a/apps/web/modules/ee/contacts/types/contact.ts b/apps/web/modules/ee/contacts/types/contact.ts index 4a70145bb8..5d25cf236b 100644 --- a/apps/web/modules/ee/contacts/types/contact.ts +++ b/apps/web/modules/ee/contacts/types/contact.ts @@ -6,10 +6,10 @@ import { } from "@formbricks/types/contact-attribute-key"; export const ZContact = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), }); const ZContactTableAttributeData = z.object({ @@ -29,7 +29,7 @@ export const ZContactTableData = z.object({ }); export const ZContactWithAttributes = ZContact.extend({ - attributes: z.record(z.string()), + attributes: z.record(z.string(), z.string()), }); export type TContactWithAttributes = z.infer; @@ -60,22 +60,26 @@ export const ZContactCSVDuplicateAction = z.enum(["skip", "update", "overwrite"] export type TContactCSVDuplicateAction = z.infer; export const ZContactCSVUploadResponse = z - .array(z.record(z.string())) - .max(10000, { message: "Maximum 10000 records allowed at a time." }) + .array(z.record(z.string(), z.string())) + .max(10000, { + error: "Maximum 10000 records allowed at a time.", + }) .superRefine((data, ctx) => { for (const record of data) { if (!Object.keys(record).includes("email")) { - return ctx.addIssue({ - code: z.ZodIssueCode.custom, + ctx.addIssue({ + code: "custom", message: "Missing email field for one or more records", }); + return; } if (!record.email) { - return ctx.addIssue({ - code: z.ZodIssueCode.custom, + ctx.addIssue({ + code: "custom", message: "Email field is empty for one or more records", }); + return; } } @@ -84,10 +88,11 @@ export const ZContactCSVUploadResponse = z const emailSet = new Set(emails); if (emails.length !== emailSet.size) { - return ctx.addIssue({ - code: z.ZodIssueCode.custom, + ctx.addIssue({ + code: "custom", message: "Duplicate emails found in the records", }); + return; } // check for duplicate userIds if present @@ -95,10 +100,11 @@ export const ZContactCSVUploadResponse = z if (userIds?.length > 0) { const userIdSet = new Set(userIds); if (userIds.length !== userIdSet.size) { - return ctx.addIssue({ - code: z.ZodIssueCode.custom, + ctx.addIssue({ + code: "custom", message: "Duplicate userIds found in the records", }); + return; } } }); @@ -109,10 +115,11 @@ export const ZContactCSVAttributeMap = z.record(z.string(), z.string()).superRef const values = Object.values(attributeMap); if (new Set(values).size !== values.length) { - return ctx.addIssue({ - code: z.ZodIssueCode.custom, + ctx.addIssue({ + code: "custom", message: "Attribute map contains duplicate values", }); + return; } }); export type TContactCSVAttributeMap = z.infer; @@ -142,17 +149,17 @@ export const validateEmailAttribute = ( if (!emailAttr?.value) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Email attribute is required${indexSuffix}`, }); return { isValid: false }; } // Check email format - const parsedEmail = z.string().email().safeParse(emailAttr.value); + const parsedEmail = z.email().safeParse(emailAttr.value); if (!parsedEmail.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Invalid email format${indexSuffix}`, }); return { emailAttr, isValid: false }; @@ -183,7 +190,7 @@ export const validateUniqueAttributeKeys = ( if (duplicateKeys.length > 0) { const indexSuffix = contactIndex !== undefined ? ` for contact at index ${contactIndex}` : ""; ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Duplicate attribute keys found${indexSuffix}. Please ensure each attribute key is unique`, params: { duplicateKeys, @@ -194,10 +201,12 @@ export const validateUniqueAttributeKeys = ( }; export const ZContactBulkUploadRequest = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), contacts: z .array(ZContactBulkUploadContact) - .max(250, { message: "Maximum 250 contacts allowed at a time." }) + .max(250, { + error: "Maximum 250 contacts allowed at a time.", + }) .superRefine((contacts, ctx) => { // Track all data in a single pass const seenEmails = new Set(); @@ -236,7 +245,7 @@ export const ZContactBulkUploadRequest = z.object({ // Report all validation issues after the single pass if (duplicateEmails.size > 0) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Duplicate emails found in the records, please ensure each email is unique.", params: { duplicateEmails: Array.from(duplicateEmails), @@ -246,7 +255,7 @@ export const ZContactBulkUploadRequest = z.object({ if (duplicateUserIds.size > 0) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Duplicate userIds found in the records, please ensure each userId is unique.", params: { duplicateUserIds: Array.from(duplicateUserIds), @@ -276,21 +285,21 @@ export type TContactBulkUploadResponseSuccess = TContactBulkUploadResponseBase & // Schema for single contact creation - simplified with flat attributes export const ZContactCreateRequest = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), attributes: z.record(z.string(), z.string()).superRefine((attributes, ctx) => { // Check if email attribute exists and is valid const email = attributes.email; if (!email) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Email attribute is required", }); } else { // Check email format - const parsedEmail = z.string().email().safeParse(email); + const parsedEmail = z.email().safeParse(email); if (!parsedEmail.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Invalid email format", }); } @@ -302,9 +311,9 @@ export type TContactCreateRequest = z.infer; // Type for contact response with flattened attributes export const ZContactResponse = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), attributes: z.record(z.string(), z.string()), }); @@ -336,7 +345,7 @@ export const ZEditContactAttributesForm = z.object({ if (indices.length > 1) { indices.forEach((index) => { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Duplicate key: ${key}`, path: [index, "key"], }); @@ -358,13 +367,13 @@ export const ZEditContactAttributesForm = z.object({ // When both are empty, show "Either email or userId is required" on both fields if (emailIndex !== -1 && userIdIndex !== -1) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Either email or userId is required", path: [emailIndex, "value"], }); ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Either email or userId is required", path: [userIdIndex, "value"], }); @@ -374,10 +383,10 @@ export const ZEditContactAttributesForm = z.object({ // Validate email format if key is "email" and has a value attributes.forEach((attr, index) => { if (attr.key === "email" && attr.value && attr.value.trim() !== "") { - const emailResult = z.string().email().safeParse(attr.value); + const emailResult = z.email().safeParse(attr.value); if (!emailResult.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Invalid email format", path: [index, "value"], }); @@ -416,7 +425,7 @@ export const createEditContactAttributesSchema = ( if (dataType === "date") { if (!hasValue) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: t("environments.contacts.date_value_required"), path: ["attributes", index, "value"], }); @@ -426,7 +435,7 @@ export const createEditContactAttributesSchema = ( const date = new Date(attr.value); if (Number.isNaN(date.getTime())) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: t("environments.contacts.invalid_date_format"), path: ["attributes", index, "value"], }); @@ -434,7 +443,7 @@ export const createEditContactAttributesSchema = ( } else if (dataType === "number") { if (!hasValue) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: t("environments.contacts.number_value_required"), path: ["attributes", index, "value"], }); @@ -443,7 +452,7 @@ export const createEditContactAttributesSchema = ( // Validate number format if (Number.isNaN(Number(attr.value))) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: t("environments.contacts.invalid_number_format"), path: ["attributes", index, "value"], }); diff --git a/apps/web/modules/ee/quotas/components/quota-modal.tsx b/apps/web/modules/ee/quotas/components/quota-modal.tsx index d521ab1508..ec251cae62 100644 --- a/apps/web/modules/ee/quotas/components/quota-modal.tsx +++ b/apps/web/modules/ee/quotas/components/quota-modal.tsx @@ -120,14 +120,16 @@ export const QuotaModal = ({ defaultValues, resolver: zodResolver( quotaResponseCount > 0 - ? ZSurveyQuotaInput.innerType().extend({ - limit: z.number().min(quotaResponseCount, { - message: t( - "environments.surveys.edit.quotas.limit_must_be_greater_than_or_equal_to_the_number_of_responses", - { value: quotaResponseCount } - ), - }), - }) + ? ZSurveyQuotaInput.and( + z.object({ + limit: z.number().min(quotaResponseCount, { + message: t( + "environments.surveys.edit.quotas.limit_must_be_greater_than_or_equal_to_the_number_of_responses", + { value: quotaResponseCount } + ), + }), + }) + ) : ZSurveyQuotaInput ), mode: "onSubmit", diff --git a/apps/web/modules/ee/sso/lib/team.ts b/apps/web/modules/ee/sso/lib/team.ts index 8433ace980..c17b33e5ea 100644 --- a/apps/web/modules/ee/sso/lib/team.ts +++ b/apps/web/modules/ee/sso/lib/team.ts @@ -10,7 +10,7 @@ import { validateInputs } from "@/lib/utils/validate"; import { createTeamMembership } from "@/modules/auth/signup/lib/team"; export const getOrganizationByTeamId = reactCache(async (teamId: string): Promise => { - validateInputs([teamId, z.string().cuid2()]); + validateInputs([teamId, z.cuid2()]); try { const team = await prisma.team.findUnique({ diff --git a/apps/web/modules/ee/teams/team-list/actions.ts b/apps/web/modules/ee/teams/team-list/actions.ts index 447e6a8b31..9a1b18731f 100644 --- a/apps/web/modules/ee/teams/team-list/actions.ts +++ b/apps/web/modules/ee/teams/team-list/actions.ts @@ -18,7 +18,7 @@ import { import { ZTeamSettingsFormSchema } from "@/modules/ee/teams/team-list/types/team"; const ZCreateTeamAction = z.object({ - organizationId: z.string().cuid(), + organizationId: z.cuid(), name: z.string().trim().min(1, "Team name is required"), }); diff --git a/apps/web/modules/ee/teams/team-list/types/team.ts b/apps/web/modules/ee/teams/team-list/types/team.ts index 2678f137cb..9c4b6d7bfc 100644 --- a/apps/web/modules/ee/teams/team-list/types/team.ts +++ b/apps/web/modules/ee/teams/team-list/types/team.ts @@ -24,7 +24,7 @@ export const ZOtherTeam = z.object({ export type TOtherTeam = z.infer; export const ZOrganizationTeam = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), name: z.string(), }); @@ -69,7 +69,9 @@ export const ZTeamSettingsFormSchema = z.object({ role: ZTeamRole, }) ) - .min(1, { message: "Please add at least one member" }), + .min(1, { + error: "Please add at least one member", + }), projects: z .array( z.object({ @@ -77,7 +79,9 @@ export const ZTeamSettingsFormSchema = z.object({ permission: ZTeamPermission, }) ) - .min(1, { message: "Please add at least one project" }), + .min(1, { + error: "Please add at least one project", + }), }); export type TTeamSettingsFormSchema = z.infer; @@ -94,9 +98,14 @@ export type TTeamMember = z.infer; export const ZTeam = z.object({ id: z.string(), - name: z.string({ message: "Team name is required" }).trim().min(1, { - message: "Team name must be at least 1 character long", - }), + name: z + .string({ + error: "Team name is required", + }) + .trim() + .min(1, { + error: "Team name must be at least 1 character long", + }), teamUsers: z.array(ZTeamMember), }); diff --git a/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx b/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx index 5ece8bd615..666098c098 100644 --- a/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx +++ b/apps/web/modules/ee/two-factor-auth/components/disable-two-factor-modal.tsx @@ -32,8 +32,8 @@ const ZDisableTwoFactorFormState = z backupCode: z.string().optional(), }) .refine((data) => (!!data.code && !data.backupCode) || (!data.code && !!data.backupCode), { - message: "Please provide either the code OR the backup code", path: ["code"], + error: "Please provide either the code OR the backup code", }); type TDisableTwoFactorFormState = z.infer; diff --git a/apps/web/modules/ee/two-factor-auth/lib/two-factor-auth.ts b/apps/web/modules/ee/two-factor-auth/lib/two-factor-auth.ts index 8543c5c314..144fed7f1e 100644 --- a/apps/web/modules/ee/two-factor-auth/lib/two-factor-auth.ts +++ b/apps/web/modules/ee/two-factor-auth/lib/two-factor-auth.ts @@ -1,5 +1,5 @@ import crypto from "crypto"; -import { authenticator } from "otplib"; +import { generateSecret, generateURI } from "otplib"; import qrcode from "qrcode"; import { prisma } from "@formbricks/database"; import { InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; @@ -19,7 +19,7 @@ export const setupTwoFactorAuth = async ( }> => { // This generates a secret 32 characters in length. Do not modify the number of // bytes without updating the sanity checks in the enable and login endpoints. - const secret = authenticator.generateSecret(20); + const secret = generateSecret({ length: 20 }); // generate backup codes with 10 character length const backupCodes = Array.from(Array(10), () => crypto.randomBytes(5).toString("hex")); @@ -64,7 +64,7 @@ export const setupTwoFactorAuth = async ( }); const name = user.email || user.name || user.id.toString(); - const keyUri = authenticator.keyuri(name, "Formbricks", secret); + const keyUri = generateURI({ label: name, issuer: "Formbricks", secret }); const dataUri = await qrcode.toDataURL(keyUri); return { secret, keyUri, dataUri, backupCodes }; diff --git a/apps/web/modules/ee/whitelabel/remove-branding/lib/project.ts b/apps/web/modules/ee/whitelabel/remove-branding/lib/project.ts index 5930a1af7a..f8478fcac2 100644 --- a/apps/web/modules/ee/whitelabel/remove-branding/lib/project.ts +++ b/apps/web/modules/ee/whitelabel/remove-branding/lib/project.ts @@ -37,7 +37,7 @@ export const updateProjectBranding = async ( return true; } catch (error) { if (error instanceof z.ZodError) { - logger.error(error.errors, "Error updating project branding"); + logger.error(error.issues, "Error updating project branding"); } throw new ValidationError("Data validation of project failed"); } diff --git a/apps/web/modules/organization/settings/api-keys/types/api-keys.ts b/apps/web/modules/organization/settings/api-keys/types/api-keys.ts index f6c9b7f748..1376daa99c 100644 --- a/apps/web/modules/organization/settings/api-keys/types/api-keys.ts +++ b/apps/web/modules/organization/settings/api-keys/types/api-keys.ts @@ -7,7 +7,7 @@ import { ZProject } from "@formbricks/types/project"; export const ZApiKeyEnvironmentPermission = z.object({ environmentId: z.string(), - permission: z.nativeEnum(ApiKeyPermission), + permission: z.enum(ApiKeyPermission), }); export const ZApiKeyCreateInput = ZApiKey.required({ @@ -45,7 +45,7 @@ export type TOrganizationProject = z.infer; export const TApiKeyEnvironmentPermission = z.object({ environmentId: z.string(), - permission: z.nativeEnum(ApiKeyPermission), + permission: z.enum(ApiKeyPermission), }); export type TApiKeyEnvironmentPermission = z.infer; diff --git a/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx b/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx index e9f9af16c6..12b4711e07 100644 --- a/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx +++ b/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx @@ -43,10 +43,18 @@ export const IndividualInviteTab = ({ }: IndividualInviteTabProps) => { const ZFormSchema = z.object({ name: ZUserName, - email: z.string().min(1, { message: "Email is required" }).email({ message: "Invalid email" }), + email: z + .email({ + error: "Invalid email", + }) + .min(1, { + error: "Email is required", + }), role: ZOrganizationRole, teamIds: showTeamAdminRestrictions - ? z.array(ZId).min(1, { message: "Team admins must select at least one team" }) + ? z.array(ZId).min(1, { + error: "Team admins must select at least one team", + }) : z.array(ZId), }); diff --git a/apps/web/modules/projects/settings/lib/project.ts b/apps/web/modules/projects/settings/lib/project.ts index 2410f5ea50..4137567faf 100644 --- a/apps/web/modules/projects/settings/lib/project.ts +++ b/apps/web/modules/projects/settings/lib/project.ts @@ -64,7 +64,7 @@ export const updateProject = async ( return project; } catch (error) { if (error instanceof z.ZodError) { - logger.error(error.errors, "Error updating project"); + logger.error(error.issues, "Error updating project"); } throw new ValidationError("Data validation of project failed"); } diff --git a/apps/web/modules/projects/settings/look/lib/project.ts b/apps/web/modules/projects/settings/look/lib/project.ts index 504956f5f3..fa8602bc94 100644 --- a/apps/web/modules/projects/settings/look/lib/project.ts +++ b/apps/web/modules/projects/settings/look/lib/project.ts @@ -8,7 +8,7 @@ import { validateInputs } from "@/lib/utils/validate"; export const getProjectByEnvironmentId = reactCache( async (environmentId: string): Promise => { - validateInputs([environmentId, z.string().cuid2()]); + validateInputs([environmentId, z.cuid2()]); let projectPrisma; diff --git a/apps/web/modules/setup/organization/[organizationId]/invite/types/invites.ts b/apps/web/modules/setup/organization/[organizationId]/invite/types/invites.ts index e28ac58e24..f39f7dd011 100644 --- a/apps/web/modules/setup/organization/[organizationId]/invite/types/invites.ts +++ b/apps/web/modules/setup/organization/[organizationId]/invite/types/invites.ts @@ -12,11 +12,12 @@ export const ZInvitee = ZInvite.pick({ export type TInvitee = z.infer; export const ZInviteMembersFormSchema = z.record( + z.string(), ZInvite.pick({ email: true, name: true, }).extend({ - email: z.string().email("Invalid email address"), + email: z.email("Invalid email address"), name: ZUserName, }) ); diff --git a/apps/web/modules/storage/file-upload.test.ts b/apps/web/modules/storage/file-upload.test.ts index 13823ed37e..4be9f5df3c 100644 --- a/apps/web/modules/storage/file-upload.test.ts +++ b/apps/web/modules/storage/file-upload.test.ts @@ -30,7 +30,9 @@ describe("fileUpload", () => { beforeEach(() => { vi.clearAllMocks(); // Mock FileReader - global.FileReader = vi.fn(() => mockFileReader) as any; + global.FileReader = vi.fn(function FileReader() { + return mockFileReader; + }) as any; global.atob = (base64) => Buffer.from(base64, "base64").toString("binary"); }); @@ -191,7 +193,9 @@ describe("fileUploadModule.toBase64", () => { result: "data:text/plain;base64,aGVsbG8=", }; - globalThis.FileReader = vi.fn(() => mockFileReaderInstance as unknown as FileReader) as any; + globalThis.FileReader = vi.fn(function FileReader() { + return mockFileReaderInstance as unknown as FileReader; + }) as any; const promise = fileUploadModule.toBase64(dummyFile); @@ -213,7 +217,9 @@ describe("fileUploadModule.toBase64", () => { result: null, }; - globalThis.FileReader = vi.fn(() => mockFileReaderInstance as unknown as FileReader) as any; + globalThis.FileReader = vi.fn(function FileReader() { + return mockFileReaderInstance as unknown as FileReader; + }) as any; const promise = fileUploadModule.toBase64(dummyFile); diff --git a/apps/web/modules/survey/components/template-list/actions.ts b/apps/web/modules/survey/components/template-list/actions.ts index 53f611aa9c..563dd5ad1e 100644 --- a/apps/web/modules/survey/components/template-list/actions.ts +++ b/apps/web/modules/survey/components/template-list/actions.ts @@ -15,7 +15,7 @@ import { checkSpamProtectionPermission } from "@/modules/survey/lib/permission"; import { getOrganizationBilling } from "@/modules/survey/lib/survey"; const ZCreateSurveyAction = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), surveyBody: ZSurveyCreateInput, }); 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 816a31ef61..dffc8875d0 100644 --- a/apps/web/modules/survey/components/template-list/lib/survey.ts +++ b/apps/web/modules/survey/components/template-list/lib/survey.ts @@ -1,4 +1,4 @@ -import { ActionClass, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import { prisma } from "@formbricks/database"; import { logger } from "@formbricks/logger"; import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; @@ -134,7 +134,12 @@ export const createSurvey = async ( } }; -const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { +type TriggerWithActionClassId = { actionClass: { id: string } }; + +const checkTriggersValidity = ( + triggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> +) => { if (!triggers) return; // check if all the triggers are valid @@ -153,14 +158,14 @@ const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: Act }; export const handleTriggerUpdates = ( - updatedTriggers: TSurvey["triggers"], - currentTriggers: TSurvey["triggers"], - actionClasses: ActionClass[] + updatedTriggers: TriggerWithActionClassId[] | null | undefined, + currentTriggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> ) => { if (!updatedTriggers) return {}; checkTriggersValidity(updatedTriggers, actionClasses); - const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); + 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 @@ -169,7 +174,7 @@ export const handleTriggerUpdates = ( ); // deleted triggers are triggers that are not in the new triggers and are there in the current triggers - const deletedTriggers = currentTriggers.filter( + const deletedTriggers = (currentTriggers ?? []).filter( (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) ); diff --git a/apps/web/modules/survey/editor/actions.ts b/apps/web/modules/survey/editor/actions.ts index e44c17235b..3187317357 100644 --- a/apps/web/modules/survey/editor/actions.ts +++ b/apps/web/modules/survey/editor/actions.ts @@ -155,7 +155,7 @@ export const updateSurveyAction = authenticatedActionClient.schema(ZSurvey).acti ); const ZRefetchProjectAction = z.object({ - projectId: z.string().cuid2(), + projectId: z.cuid2(), }); export const refetchProjectAction = authenticatedActionClient @@ -236,7 +236,7 @@ const isValidUnsplashUrl = (url: string): boolean => { }; const ZTriggerDownloadUnsplashImageAction = z.object({ - downloadUrl: z.string().url(), + downloadUrl: z.url(), }); export const triggerDownloadUnsplashImageAction = actionClient diff --git a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx index df8dbf6a26..2fb66c0e1e 100644 --- a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx +++ b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx @@ -191,7 +191,7 @@ export const SurveyMenuBar = ({ const validateSurveyWithZod = (): boolean => { const localSurveyValidation = ZSurvey.safeParse(localSurvey); if (!localSurveyValidation.success) { - const currentError = localSurveyValidation.error.errors[0]; + const currentError = localSurveyValidation.error.issues[0]; if (currentError.path[0] === "blocks") { const blockIdx = currentError.path[1]; diff --git a/apps/web/modules/survey/editor/lib/action-utils.test.ts b/apps/web/modules/survey/editor/lib/action-utils.test.ts index 05a95760b7..32286ab554 100644 --- a/apps/web/modules/survey/editor/lib/action-utils.test.ts +++ b/apps/web/modules/survey/editor/lib/action-utils.test.ts @@ -168,7 +168,7 @@ describe("action-utils", () => { validateActionNameUniqueness(data, ["existingAction"], ctx, mockT); expect(ctx.addIssue).toHaveBeenCalledWith({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["name"], message: 'Action with name "existingAction" already exists', }); @@ -201,7 +201,7 @@ describe("action-utils", () => { validateActionKeyUniqueness(data, ["existingKey"], ctx, mockT); expect(ctx.addIssue).toHaveBeenCalledWith({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["key"], message: 'Action with key "existingKey" already exists', }); @@ -251,7 +251,7 @@ describe("action-utils", () => { validateCssSelector(data, ctx, mockT); expect(ctx.addIssue).toHaveBeenCalledWith({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["noCodeConfig", "elementSelector", "cssSelector"], message: "Invalid CSS selector", }); @@ -309,7 +309,7 @@ describe("action-utils", () => { validateUrlFilterRegex(data, ctx, mockT); expect(ctx.addIssue).toHaveBeenCalledWith({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["noCodeConfig", "urlFilters", 0, "value"], message: "Invalid regex pattern", }); @@ -368,7 +368,7 @@ describe("action-utils", () => { expect(ctx.addIssue).toHaveBeenCalledTimes(1); expect(ctx.addIssue).toHaveBeenCalledWith({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["noCodeConfig", "urlFilters", 1, "value"], message: "Invalid regex pattern", }); diff --git a/apps/web/modules/survey/editor/lib/action-utils.ts b/apps/web/modules/survey/editor/lib/action-utils.ts index 2f88898b8f..c6c35ace6b 100644 --- a/apps/web/modules/survey/editor/lib/action-utils.ts +++ b/apps/web/modules/survey/editor/lib/action-utils.ts @@ -36,7 +36,7 @@ export const validateActionNameUniqueness = ( ) => { if (data.name && actionClassNames.includes(data.name)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["name"], message: t("environments.actions.action_with_name_already_exists", { name: data.name }), }); @@ -54,7 +54,7 @@ export const validateActionKeyUniqueness = ( ) => { if (data.type === "code" && data.key && actionClassKeys.includes(data.key)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["key"], message: t("environments.actions.action_with_key_already_exists", { key: data.key }), }); @@ -72,7 +72,7 @@ export const validateCssSelector = (data: TActionClassInput, ctx: z.RefinementCt !isValidCssSelector(data.noCodeConfig.elementSelector.cssSelector) ) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["noCodeConfig", "elementSelector", "cssSelector"], message: t("environments.actions.invalid_css_selector"), }); @@ -91,7 +91,7 @@ export const validateUrlFilterRegex = (data: TActionClassInput, ctx: z.Refinemen new RegExp(urlFilter.value); } catch { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["noCodeConfig", "urlFilters", i, "value"], message: t("environments.actions.invalid_regex"), }); diff --git a/apps/web/modules/survey/editor/lib/logic-rule-engine.test.ts b/apps/web/modules/survey/editor/lib/logic-rule-engine.test.ts index 170ca24343..c6c7dec228 100644 --- a/apps/web/modules/survey/editor/lib/logic-rule-engine.test.ts +++ b/apps/web/modules/survey/editor/lib/logic-rule-engine.test.ts @@ -40,43 +40,43 @@ describe("getLogicRules", () => { expect(openTextTextRules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.contains)", - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: "mockTranslate(environments.surveys.edit.does_not_contain)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: "mockTranslate(environments.surveys.edit.starts_with)", - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_start_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: "mockTranslate(environments.surveys.edit.ends_with)", - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_end_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -85,19 +85,19 @@ describe("getLogicRules", () => { const openTextNumberRules = logicRules.element[TSurveyQuestionTypeEnum.OpenText + ".number"]; expect(openTextNumberRules).toBeDefined(); expect(openTextNumberRules.options).toEqual([ - { label: "=", value: ZSurveyLogicConditionsOperator.Enum.equals }, - { label: "!=", value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual }, - { label: ">", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan }, - { label: "<", value: ZSurveyLogicConditionsOperator.Enum.isLessThan }, - { label: ">=", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual }, - { label: "<=", value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual }, + { label: "=", value: ZSurveyLogicConditionsOperator.enum.equals }, + { label: "!=", value: ZSurveyLogicConditionsOperator.enum.doesNotEqual }, + { label: ">", value: ZSurveyLogicConditionsOperator.enum.isGreaterThan }, + { label: "<", value: ZSurveyLogicConditionsOperator.enum.isLessThan }, + { label: ">=", value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual }, + { label: "<=", value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -108,23 +108,23 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.equals_one_of)", - value: ZSurveyLogicConditionsOperator.Enum.equalsOneOf, + value: ZSurveyLogicConditionsOperator.enum.equalsOneOf, }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -135,35 +135,35 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.does_not_include_one_of)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeOneOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeOneOf, }, { label: "mockTranslate(environments.surveys.edit.does_not_include_all_of)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeAllOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeAllOf, }, { label: "mockTranslate(environments.surveys.edit.includes_all_of)", - value: ZSurveyLogicConditionsOperator.Enum.includesAllOf, + value: ZSurveyLogicConditionsOperator.enum.includesAllOf, }, { label: "mockTranslate(environments.surveys.edit.includes_one_of)", - value: ZSurveyLogicConditionsOperator.Enum.includesOneOf, + value: ZSurveyLogicConditionsOperator.enum.includesOneOf, }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -174,35 +174,35 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.does_not_include_one_of)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeOneOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeOneOf, }, { label: "mockTranslate(environments.surveys.edit.does_not_include_all_of)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeAllOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeAllOf, }, { label: "mockTranslate(environments.surveys.edit.includes_all_of)", - value: ZSurveyLogicConditionsOperator.Enum.includesAllOf, + value: ZSurveyLogicConditionsOperator.enum.includesAllOf, }, { label: "mockTranslate(environments.surveys.edit.includes_one_of)", - value: ZSurveyLogicConditionsOperator.Enum.includesOneOf, + value: ZSurveyLogicConditionsOperator.enum.includesOneOf, }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -211,19 +211,19 @@ describe("getLogicRules", () => { const rules = logicRules.element[TSurveyQuestionTypeEnum.Rating]; expect(rules).toBeDefined(); expect(rules.options).toEqual([ - { label: "=", value: ZSurveyLogicConditionsOperator.Enum.equals }, - { label: "!=", value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual }, - { label: ">", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan }, - { label: "<", value: ZSurveyLogicConditionsOperator.Enum.isLessThan }, - { label: ">=", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual }, - { label: "<=", value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual }, + { label: "=", value: ZSurveyLogicConditionsOperator.enum.equals }, + { label: "!=", value: ZSurveyLogicConditionsOperator.enum.doesNotEqual }, + { label: ">", value: ZSurveyLogicConditionsOperator.enum.isGreaterThan }, + { label: "<", value: ZSurveyLogicConditionsOperator.enum.isLessThan }, + { label: ">=", value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual }, + { label: "<=", value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -232,19 +232,19 @@ describe("getLogicRules", () => { const rules = logicRules.element[TSurveyQuestionTypeEnum.NPS]; expect(rules).toBeDefined(); expect(rules.options).toEqual([ - { label: "=", value: ZSurveyLogicConditionsOperator.Enum.equals }, - { label: "!=", value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual }, - { label: ">", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan }, - { label: "<", value: ZSurveyLogicConditionsOperator.Enum.isLessThan }, - { label: ">=", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual }, - { label: "<=", value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual }, + { label: "=", value: ZSurveyLogicConditionsOperator.enum.equals }, + { label: "!=", value: ZSurveyLogicConditionsOperator.enum.doesNotEqual }, + { label: ">", value: ZSurveyLogicConditionsOperator.enum.isGreaterThan }, + { label: "<", value: ZSurveyLogicConditionsOperator.enum.isLessThan }, + { label: ">=", value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual }, + { label: "<=", value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -255,11 +255,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_clicked)", - value: ZSurveyLogicConditionsOperator.Enum.isClicked, + value: ZSurveyLogicConditionsOperator.enum.isClicked, }, { label: "mockTranslate(environments.surveys.edit.is_not_clicked)", - value: ZSurveyLogicConditionsOperator.Enum.isNotClicked, + value: ZSurveyLogicConditionsOperator.enum.isNotClicked, }, ]); }); @@ -270,11 +270,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_accepted)", - value: ZSurveyLogicConditionsOperator.Enum.isAccepted, + value: ZSurveyLogicConditionsOperator.enum.isAccepted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -285,27 +285,27 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.is_before)", - value: ZSurveyLogicConditionsOperator.Enum.isBefore, + value: ZSurveyLogicConditionsOperator.enum.isBefore, }, { label: "mockTranslate(environments.surveys.edit.is_after)", - value: ZSurveyLogicConditionsOperator.Enum.isAfter, + value: ZSurveyLogicConditionsOperator.enum.isAfter, }, { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -316,11 +316,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -331,11 +331,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -346,11 +346,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_booked)", - value: ZSurveyLogicConditionsOperator.Enum.isBooked, + value: ZSurveyLogicConditionsOperator.enum.isBooked, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -361,15 +361,15 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_partially_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isPartiallySubmitted, + value: ZSurveyLogicConditionsOperator.enum.isPartiallySubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_completely_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isCompletelySubmitted, + value: ZSurveyLogicConditionsOperator.enum.isCompletelySubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -380,23 +380,23 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.is_empty)", - value: ZSurveyLogicConditionsOperator.Enum.isEmpty, + value: ZSurveyLogicConditionsOperator.enum.isEmpty, }, { label: "mockTranslate(environments.surveys.edit.is_not_empty)", - value: ZSurveyLogicConditionsOperator.Enum.isNotEmpty, + value: ZSurveyLogicConditionsOperator.enum.isNotEmpty, }, { label: "mockTranslate(environments.surveys.edit.is_any_of)", - value: ZSurveyLogicConditionsOperator.Enum.isAnyOf, + value: ZSurveyLogicConditionsOperator.enum.isAnyOf, }, ]); }); @@ -407,11 +407,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -422,11 +422,11 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.is_submitted)", - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: "mockTranslate(environments.surveys.edit.is_skipped)", - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ]); }); @@ -439,35 +439,35 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.contains)", - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: "mockTranslate(environments.surveys.edit.does_not_contain)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: "mockTranslate(environments.surveys.edit.starts_with)", - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_start_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: "mockTranslate(environments.surveys.edit.ends_with)", - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_end_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, ]); }); @@ -476,12 +476,12 @@ describe("getLogicRules", () => { const rules = logicRules["variable.number"]; expect(rules).toBeDefined(); expect(rules.options).toEqual([ - { label: "=", value: ZSurveyLogicConditionsOperator.Enum.equals }, - { label: "!=", value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual }, - { label: ">", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan }, - { label: "<", value: ZSurveyLogicConditionsOperator.Enum.isLessThan }, - { label: ">=", value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual }, - { label: "<=", value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual }, + { label: "=", value: ZSurveyLogicConditionsOperator.enum.equals }, + { label: "!=", value: ZSurveyLogicConditionsOperator.enum.doesNotEqual }, + { label: ">", value: ZSurveyLogicConditionsOperator.enum.isGreaterThan }, + { label: "<", value: ZSurveyLogicConditionsOperator.enum.isLessThan }, + { label: ">=", value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual }, + { label: "<=", value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual }, ]); }); }); @@ -493,43 +493,43 @@ describe("getLogicRules", () => { expect(rules.options).toEqual([ { label: "mockTranslate(environments.surveys.edit.equals)", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "mockTranslate(environments.surveys.edit.does_not_equal)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: "mockTranslate(environments.surveys.edit.contains)", - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: "mockTranslate(environments.surveys.edit.does_not_contain)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: "mockTranslate(environments.surveys.edit.starts_with)", - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_start_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: "mockTranslate(environments.surveys.edit.ends_with)", - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: "mockTranslate(environments.surveys.edit.does_not_end_with)", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, { label: "mockTranslate(environments.surveys.edit.is_set)", - value: ZSurveyLogicConditionsOperator.Enum.isSet, + value: ZSurveyLogicConditionsOperator.enum.isSet, }, { label: "mockTranslate(environments.surveys.edit.is_not_set)", - value: ZSurveyLogicConditionsOperator.Enum.isNotSet, + value: ZSurveyLogicConditionsOperator.enum.isNotSet, }, ]); }); @@ -540,10 +540,10 @@ describe("TLogicRuleOption type", () => { test("should be compatible with the options structure", () => { const sampleOption: TLogicRuleOption[number] = { label: "Test Label", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }; // This test mainly serves as a type check during compilation expect(sampleOption.label).toBe("Test Label"); - expect(sampleOption.value).toBe(ZSurveyLogicConditionsOperator.Enum.equals); + expect(sampleOption.value).toBe(ZSurveyLogicConditionsOperator.enum.equals); }); }); diff --git a/apps/web/modules/survey/editor/lib/logic-rule-engine.ts b/apps/web/modules/survey/editor/lib/logic-rule-engine.ts index b76bb8213e..c4485e99ce 100644 --- a/apps/web/modules/survey/editor/lib/logic-rule-engine.ts +++ b/apps/web/modules/survey/editor/lib/logic-rule-engine.ts @@ -9,43 +9,43 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.contains"), - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: t("environments.surveys.edit.does_not_contain"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: t("environments.surveys.edit.starts_with"), - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: t("environments.surveys.edit.does_not_start_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: t("environments.surveys.edit.ends_with"), - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: t("environments.surveys.edit.does_not_end_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -53,35 +53,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: "=", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "!=", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: ">", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThan, }, { label: "<", - value: ZSurveyLogicConditionsOperator.Enum.isLessThan, + value: ZSurveyLogicConditionsOperator.enum.isLessThan, }, { label: ">=", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual, }, { label: "<=", - value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -89,23 +89,23 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.equals_one_of"), - value: ZSurveyLogicConditionsOperator.Enum.equalsOneOf, + value: ZSurveyLogicConditionsOperator.enum.equalsOneOf, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -113,35 +113,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.does_not_include_one_of"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeOneOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeOneOf, }, { label: t("environments.surveys.edit.does_not_include_all_of"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeAllOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeAllOf, }, { label: t("environments.surveys.edit.includes_all_of"), - value: ZSurveyLogicConditionsOperator.Enum.includesAllOf, + value: ZSurveyLogicConditionsOperator.enum.includesAllOf, }, { label: t("environments.surveys.edit.includes_one_of"), - value: ZSurveyLogicConditionsOperator.Enum.includesOneOf, + value: ZSurveyLogicConditionsOperator.enum.includesOneOf, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -149,35 +149,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.does_not_include_one_of"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeOneOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeOneOf, }, { label: t("environments.surveys.edit.does_not_include_all_of"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotIncludeAllOf, + value: ZSurveyLogicConditionsOperator.enum.doesNotIncludeAllOf, }, { label: t("environments.surveys.edit.includes_all_of"), - value: ZSurveyLogicConditionsOperator.Enum.includesAllOf, + value: ZSurveyLogicConditionsOperator.enum.includesAllOf, }, { label: t("environments.surveys.edit.includes_one_of"), - value: ZSurveyLogicConditionsOperator.Enum.includesOneOf, + value: ZSurveyLogicConditionsOperator.enum.includesOneOf, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -185,35 +185,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: "=", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "!=", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: ">", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThan, }, { label: "<", - value: ZSurveyLogicConditionsOperator.Enum.isLessThan, + value: ZSurveyLogicConditionsOperator.enum.isLessThan, }, { label: ">=", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual, }, { label: "<=", - value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -221,35 +221,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: "=", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "!=", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: ">", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThan, }, { label: "<", - value: ZSurveyLogicConditionsOperator.Enum.isLessThan, + value: ZSurveyLogicConditionsOperator.enum.isLessThan, }, { label: ">=", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual, }, { label: "<=", - value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -257,11 +257,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_clicked"), - value: ZSurveyLogicConditionsOperator.Enum.isClicked, + value: ZSurveyLogicConditionsOperator.enum.isClicked, }, { label: t("environments.surveys.edit.is_not_clicked"), - value: ZSurveyLogicConditionsOperator.Enum.isNotClicked, + value: ZSurveyLogicConditionsOperator.enum.isNotClicked, }, ], }, @@ -269,11 +269,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_accepted"), - value: ZSurveyLogicConditionsOperator.Enum.isAccepted, + value: ZSurveyLogicConditionsOperator.enum.isAccepted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -281,27 +281,27 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.is_before"), - value: ZSurveyLogicConditionsOperator.Enum.isBefore, + value: ZSurveyLogicConditionsOperator.enum.isBefore, }, { label: t("environments.surveys.edit.is_after"), - value: ZSurveyLogicConditionsOperator.Enum.isAfter, + value: ZSurveyLogicConditionsOperator.enum.isAfter, }, { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -309,11 +309,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -321,11 +321,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -333,11 +333,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_booked"), - value: ZSurveyLogicConditionsOperator.Enum.isBooked, + value: ZSurveyLogicConditionsOperator.enum.isBooked, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -345,15 +345,15 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_partially_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isPartiallySubmitted, + value: ZSurveyLogicConditionsOperator.enum.isPartiallySubmitted, }, { label: t("environments.surveys.edit.is_completely_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isCompletelySubmitted, + value: ZSurveyLogicConditionsOperator.enum.isCompletelySubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -361,24 +361,24 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.is_empty"), - value: ZSurveyLogicConditionsOperator.Enum.isEmpty, + value: ZSurveyLogicConditionsOperator.enum.isEmpty, }, { label: t("environments.surveys.edit.is_not_empty"), - value: ZSurveyLogicConditionsOperator.Enum.isNotEmpty, + value: ZSurveyLogicConditionsOperator.enum.isNotEmpty, }, { label: t("environments.surveys.edit.is_any_of"), - value: ZSurveyLogicConditionsOperator.Enum.isAnyOf, + value: ZSurveyLogicConditionsOperator.enum.isAnyOf, }, ], }, @@ -386,11 +386,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -398,11 +398,11 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.is_submitted"), - value: ZSurveyLogicConditionsOperator.Enum.isSubmitted, + value: ZSurveyLogicConditionsOperator.enum.isSubmitted, }, { label: t("environments.surveys.edit.is_skipped"), - value: ZSurveyLogicConditionsOperator.Enum.isSkipped, + value: ZSurveyLogicConditionsOperator.enum.isSkipped, }, ], }, @@ -411,35 +411,35 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.contains"), - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: t("environments.surveys.edit.does_not_contain"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: t("environments.surveys.edit.starts_with"), - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: t("environments.surveys.edit.does_not_start_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: t("environments.surveys.edit.ends_with"), - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: t("environments.surveys.edit.does_not_end_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, ], }, @@ -447,27 +447,27 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: "=", - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: "!=", - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: ">", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThan, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThan, }, { label: "<", - value: ZSurveyLogicConditionsOperator.Enum.isLessThan, + value: ZSurveyLogicConditionsOperator.enum.isLessThan, }, { label: ">=", - value: ZSurveyLogicConditionsOperator.Enum.isGreaterThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isGreaterThanOrEqual, }, { label: "<=", - value: ZSurveyLogicConditionsOperator.Enum.isLessThanOrEqual, + value: ZSurveyLogicConditionsOperator.enum.isLessThanOrEqual, }, ], }, @@ -475,43 +475,43 @@ export const getLogicRules = (t: TFunction) => { options: [ { label: t("environments.surveys.edit.equals"), - value: ZSurveyLogicConditionsOperator.Enum.equals, + value: ZSurveyLogicConditionsOperator.enum.equals, }, { label: t("environments.surveys.edit.does_not_equal"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEqual, + value: ZSurveyLogicConditionsOperator.enum.doesNotEqual, }, { label: t("environments.surveys.edit.contains"), - value: ZSurveyLogicConditionsOperator.Enum.contains, + value: ZSurveyLogicConditionsOperator.enum.contains, }, { label: t("environments.surveys.edit.does_not_contain"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotContain, + value: ZSurveyLogicConditionsOperator.enum.doesNotContain, }, { label: t("environments.surveys.edit.starts_with"), - value: ZSurveyLogicConditionsOperator.Enum.startsWith, + value: ZSurveyLogicConditionsOperator.enum.startsWith, }, { label: t("environments.surveys.edit.does_not_start_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotStartWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotStartWith, }, { label: t("environments.surveys.edit.ends_with"), - value: ZSurveyLogicConditionsOperator.Enum.endsWith, + value: ZSurveyLogicConditionsOperator.enum.endsWith, }, { label: t("environments.surveys.edit.does_not_end_with"), - value: ZSurveyLogicConditionsOperator.Enum.doesNotEndWith, + value: ZSurveyLogicConditionsOperator.enum.doesNotEndWith, }, { label: t("environments.surveys.edit.is_set"), - value: ZSurveyLogicConditionsOperator.Enum.isSet, + value: ZSurveyLogicConditionsOperator.enum.isSet, }, { label: t("environments.surveys.edit.is_not_set"), - value: ZSurveyLogicConditionsOperator.Enum.isNotSet, + value: ZSurveyLogicConditionsOperator.enum.isNotSet, }, ], }, diff --git a/apps/web/modules/survey/editor/lib/survey.ts b/apps/web/modules/survey/editor/lib/survey.ts index 743aaa563e..d731c3a63c 100644 --- a/apps/web/modules/survey/editor/lib/survey.ts +++ b/apps/web/modules/survey/editor/lib/survey.ts @@ -1,4 +1,4 @@ -import { ActionClass, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import { prisma } from "@formbricks/database"; import { logger } from "@formbricks/logger"; import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; @@ -286,7 +286,12 @@ export const updateSurvey = async (updatedSurvey: TSurvey): Promise => } }; -export const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClasses: ActionClass[]) => { +type TriggerWithActionClassId = { actionClass: { id: string } }; + +export const checkTriggersValidity = ( + triggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> +) => { if (!triggers) return; // check if all the triggers are valid @@ -305,14 +310,14 @@ export const checkTriggersValidity = (triggers: TSurvey["triggers"], actionClass }; export const handleTriggerUpdates = ( - updatedTriggers: TSurvey["triggers"], - currentTriggers: TSurvey["triggers"], - actionClasses: ActionClass[] + updatedTriggers: TriggerWithActionClassId[] | null | undefined, + currentTriggers: TriggerWithActionClassId[] | null | undefined, + actionClasses: Array<{ id: string }> ) => { if (!updatedTriggers) return {}; checkTriggersValidity(updatedTriggers, actionClasses); - const currentTriggerIds = currentTriggers.map((trigger) => trigger.actionClass.id); + 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 @@ -321,7 +326,7 @@ export const handleTriggerUpdates = ( ); // deleted triggers are triggers that are not in the new triggers and are there in the current triggers - const deletedTriggers = currentTriggers.filter( + const deletedTriggers = (currentTriggers ?? []).filter( (trigger) => !updatedTriggerIds.includes(trigger.actionClass.id) ); diff --git a/apps/web/modules/survey/editor/types/survey-follow-up.ts b/apps/web/modules/survey/editor/types/survey-follow-up.ts index 35d40a79b5..582d9ba3c4 100644 --- a/apps/web/modules/survey/editor/types/survey-follow-up.ts +++ b/apps/web/modules/survey/editor/types/survey-follow-up.ts @@ -3,9 +3,9 @@ import { z } from "zod"; export const ZCreateSurveyFollowUpFormSchema = z.object({ followUpName: z.string().trim().min(1, "Name is required"), triggerType: z.enum(["response", "endings"]), - endingIds: z.array(z.string().cuid2()).nullable(), + endingIds: z.array(z.cuid2()).nullable(), emailTo: z.string().trim().min(1, "To is required"), - replyTo: z.array(z.string().email()).min(1, "Replies must have at least one email"), + replyTo: z.array(z.email()).min(1, "Replies must have at least one email"), subject: z.string().trim().min(1, "Subject is required"), body: z.string().trim().min(1, "Body is required"), attachResponseData: z.boolean(), diff --git a/apps/web/modules/survey/editor/types/survey.ts b/apps/web/modules/survey/editor/types/survey.ts index e270faf832..e836fd5599 100644 --- a/apps/web/modules/survey/editor/types/survey.ts +++ b/apps/web/modules/survey/editor/types/survey.ts @@ -7,21 +7,19 @@ import { ZSurveyType } from "@formbricks/types/surveys/types"; * Validates essential fields for security/functionality but allows incomplete survey data. * Full validation (ZSurvey) is enforced when publishing. */ -export const ZSurveyDraft = z - .object({ - // Essential fields - strictly validated - id: ZId, - status: z.literal("draft"), - environmentId: ZId, - type: ZSurveyType, - name: z.string().min(1, "Survey name is required"), +export const ZSurveyDraft = z.looseObject({ + // Essential fields - strictly validated + id: ZId, + status: z.literal("draft"), + environmentId: ZId, + type: ZSurveyType, + name: z.string().min(1, "Survey name is required"), - // Required fields for database operations - loosely validated - blocks: z.array(z.record(z.unknown())).optional(), - triggers: z.array(z.record(z.unknown())).optional(), - endings: z.array(z.record(z.unknown())).optional(), - segment: z.record(z.unknown()).nullable().optional(), - }) - .passthrough(); // Allow all other fields without validation + // Required fields for database operations - loosely validated + blocks: z.array(z.record(z.string(), z.unknown())).optional(), + triggers: z.array(z.record(z.string(), z.unknown())).optional(), + endings: z.array(z.record(z.string(), z.unknown())).optional(), + segment: z.record(z.string(), z.unknown()).nullable().optional(), +}); // Allow all other fields without validation export type TSurveyDraft = z.infer; diff --git a/apps/web/modules/survey/follow-ups/lib/follow-ups.ts b/apps/web/modules/survey/follow-ups/lib/follow-ups.ts index 1217746c0c..841225fa79 100644 --- a/apps/web/modules/survey/follow-ups/lib/follow-ups.ts +++ b/apps/web/modules/survey/follow-ups/lib/follow-ups.ts @@ -30,7 +30,7 @@ const evaluateFollowUp = async ( const logoUrl = organization.whitelabel?.logoUrl ?? ""; // Check if 'to' is a direct email address (team member or user email) - const parsedEmailTo = z.string().email().safeParse(to); + const parsedEmailTo = z.email().safeParse(to); if (parsedEmailTo.success) { // 'to' is a valid email address, send email directly await sendFollowUpEmail({ @@ -62,7 +62,7 @@ const evaluateFollowUp = async ( if (typeof toValueFromResponse === "string") { // parse this string to check for an email: - const parsedResult = z.string().email().safeParse(toValueFromResponse); + const parsedResult = z.email().safeParse(toValueFromResponse); if (parsedResult.success) { // send email to this email address await sendFollowUpEmail({ @@ -98,7 +98,7 @@ const evaluateFollowUp = async ( }; } - const parsedResult = z.string().email().safeParse(emailAddress); + const parsedResult = z.email().safeParse(emailAddress); if (parsedResult.data) { await sendFollowUpEmail({ followUp, diff --git a/apps/web/modules/survey/lib/action-class.ts b/apps/web/modules/survey/lib/action-class.ts index b18568aa8b..0197797e1c 100644 --- a/apps/web/modules/survey/lib/action-class.ts +++ b/apps/web/modules/survey/lib/action-class.ts @@ -6,7 +6,7 @@ import { DatabaseError } from "@formbricks/types/errors"; import { validateInputs } from "@/lib/utils/validate"; export const getActionClasses = reactCache(async (environmentId: string): Promise => { - validateInputs([environmentId, z.string().cuid2()]); + validateInputs([environmentId, z.cuid2()]); try { return await prisma.actionClass.findMany({ diff --git a/apps/web/modules/survey/link/actions.ts b/apps/web/modules/survey/link/actions.ts index 78cab4814c..cbf5dd4dbb 100644 --- a/apps/web/modules/survey/link/actions.ts +++ b/apps/web/modules/survey/link/actions.ts @@ -30,7 +30,7 @@ export const sendLinkSurveyEmailAction = actionClient }); const ZValidateSurveyPinAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), pin: z.string(), }); @@ -55,8 +55,8 @@ export const validateSurveyPinAction = actionClient }); const ZIsSurveyResponsePresentAction = z.object({ - surveyId: z.string().cuid2(), - email: z.string().email(), + surveyId: z.cuid2(), + email: z.email(), }); export const isSurveyResponsePresentAction = actionClient diff --git a/apps/web/modules/survey/link/components/verify-email.tsx b/apps/web/modules/survey/link/components/verify-email.tsx index ff18a3a60d..4be2309eb0 100644 --- a/apps/web/modules/survey/link/components/verify-email.tsx +++ b/apps/web/modules/survey/link/components/verify-email.tsx @@ -32,7 +32,7 @@ interface VerifyEmailProps { } const ZVerifyEmailInput = z.object({ - email: z.string().email(), + email: z.email(), }); type TVerifyEmailInput = z.infer; diff --git a/apps/web/modules/survey/list/actions.ts b/apps/web/modules/survey/list/actions.ts index 36b5a544bc..c10e8241c9 100644 --- a/apps/web/modules/survey/list/actions.ts +++ b/apps/web/modules/survey/list/actions.ts @@ -25,7 +25,7 @@ import { } from "@/modules/survey/list/lib/survey"; const ZGetSurveyAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), }); export const getSurveyAction = authenticatedActionClient @@ -51,8 +51,8 @@ export const getSurveyAction = authenticatedActionClient }); const ZCopySurveyToOtherEnvironmentAction = z.object({ - surveyId: z.string().cuid2(), - targetEnvironmentId: z.string().cuid2(), + surveyId: z.cuid2(), + targetEnvironmentId: z.cuid2(), }); export const copySurveyToOtherEnvironmentAction = authenticatedActionClient @@ -141,7 +141,7 @@ export const copySurveyToOtherEnvironmentAction = authenticatedActionClient ); const ZGetProjectsByEnvironmentIdAction = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), }); export const getProjectsByEnvironmentIdAction = authenticatedActionClient @@ -168,7 +168,7 @@ export const getProjectsByEnvironmentIdAction = authenticatedActionClient }); const ZDeleteSurveyAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), }); export const deleteSurveyAction = authenticatedActionClient.schema(ZDeleteSurveyAction).action( @@ -201,9 +201,9 @@ export const deleteSurveyAction = authenticatedActionClient.schema(ZDeleteSurvey ); const ZGenerateSingleUseIdAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), isEncrypted: z.boolean(), - count: z.number().min(1).max(5000).default(1), + count: z.number().min(1).max(5000).prefault(1), }); export const generateSingleUseIdsAction = authenticatedActionClient @@ -229,7 +229,7 @@ export const generateSingleUseIdsAction = authenticatedActionClient }); const ZGetSurveysAction = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), limit: z.number().optional(), offset: z.number().optional(), filterCriteria: ZSurveyFilterCriteria.optional(), diff --git a/apps/web/modules/survey/list/lib/environment.ts b/apps/web/modules/survey/list/lib/environment.ts index 2cc509ed47..61aca08287 100644 --- a/apps/web/modules/survey/list/lib/environment.ts +++ b/apps/web/modules/survey/list/lib/environment.ts @@ -45,7 +45,7 @@ export const getProjectIdIfEnvironmentExists = reactCache( export const getEnvironment = reactCache( async (environmentId: string): Promise | null> => { - validateInputs([environmentId, z.string().cuid2()]); + validateInputs([environmentId, z.cuid2()]); try { const environment = await prisma.environment.findUnique({ diff --git a/apps/web/modules/survey/list/lib/survey.ts b/apps/web/modules/survey/list/lib/survey.ts index 88dcb8edff..89fcc658c5 100644 --- a/apps/web/modules/survey/list/lib/survey.ts +++ b/apps/web/modules/survey/list/lib/survey.ts @@ -603,7 +603,7 @@ export const copySurveyToOtherEnvironment = async ( }; export const getSurveyCount = reactCache(async (environmentId: string): Promise => { - validateInputs([environmentId, z.string().cuid2()]); + validateInputs([environmentId, z.cuid2()]); try { const surveyCount = await prisma.survey.count({ where: { diff --git a/apps/web/modules/survey/slug/actions.ts b/apps/web/modules/survey/slug/actions.ts index 6d9a035149..9fcb27dbd4 100644 --- a/apps/web/modules/survey/slug/actions.ts +++ b/apps/web/modules/survey/slug/actions.ts @@ -10,7 +10,7 @@ import { getOrganizationIdFromSurveyId, getProjectIdFromSurveyId } from "@/lib/u import { updateSurveySlug } from "@/modules/survey/lib/slug"; const ZUpdateSurveySlugAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), slug: ZSurveySlug, }); @@ -39,7 +39,7 @@ export const updateSurveySlugAction = authenticatedActionClient }); const ZRemoveSurveySlugAction = z.object({ - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), }); export const removeSurveySlugAction = authenticatedActionClient diff --git a/apps/web/package.json b/apps/web/package.json index 1936eace3c..e4aa2c3349 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -42,18 +42,18 @@ "@lexical/react": "0.41.0", "@lexical/rich-text": "0.41.0", "@lexical/table": "0.41.0", - "@opentelemetry/auto-instrumentations-node": "0.70.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.212.0", - "@opentelemetry/exporter-prometheus": "0.212.0", - "@opentelemetry/exporter-trace-otlp-http": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-node": "0.212.0", - "@opentelemetry/sdk-trace-base": "2.5.1", + "@opentelemetry/auto-instrumentations-node": "0.71.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", + "@opentelemetry/exporter-prometheus": "0.213.0", + "@opentelemetry/exporter-trace-otlp-http": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-node": "0.213.0", + "@opentelemetry/sdk-trace-base": "2.6.0", "@opentelemetry/semantic-conventions": "1.40.0", - "@paralleldrive/cuid2": "2.3.1", - "@prisma/client": "6.19.2", - "@prisma/instrumentation": "6.19.2", + "@paralleldrive/cuid2": "3.3.0", + "@prisma/client": "7.4.2", + "@prisma/instrumentation": "7.4.2", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-dialog": "1.1.15", @@ -79,55 +79,55 @@ "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", - "csv-parse": "5.6.0", + "csv-parse": "6.1.0", "date-fns": "4.1.0", "file-loader": "6.2.0", - "framer-motion": "12.34.4", - "googleapis": "148.0.0", + "framer-motion": "12.35.0", + "googleapis": "171.4.0", "heic-convert": "2.1.0", "https-proxy-agent": "7.0.6", - "i18next": "25.8.13", + "i18next": "25.8.14", "i18next-icu": "2.4.3", "i18next-resources-to-backend": "1.2.1", "jiti": "2.6.1", "jsonwebtoken": "9.0.3", "lexical": "0.41.0", "lodash": "4.17.23", - "lucide-react": "0.576.0", + "lucide-react": "0.577.0", "markdown-it": "14.1.1", "next": "16.1.6", "next-auth": "4.24.13", - "next-safe-action": "7.10.8", + "next-safe-action": "8.1.5", "node-fetch": "3.3.2", - "nodemailer": "7.0.13", - "otplib": "12.0.1", + "nodemailer": "8.0.1", + "otplib": "13.3.0", "papaparse": "5.5.3", "prismjs": "1.30.0", "qr-code-styling": "1.9.2", "qrcode": "1.5.4", "react": "19.2.4", - "react-calendar": "5.1.0", + "react-calendar": "6.0.0", "react-colorful": "5.6.1", "react-confetti": "6.4.0", "react-day-picker": "9.14.0", "react-dom": "19.2.4", "react-hook-form": "7.71.2", "react-hot-toast": "2.6.0", - "react-i18next": "15.7.4", + "react-i18next": "16.5.4", "react-turnstile": "1.1.5", "react-use": "17.6.0", "sanitize-html": "2.17.1", "server-only": "0.0.1", "sharp": "0.34.5", - "stripe": "16.12.0", + "stripe": "20.4.0", "tailwind-merge": "3.5.0", "tailwindcss": "3.4.19", "ua-parser-js": "2.0.9", - "uuid": "11.1.0", - "webpack": "5.105.3", + "uuid": "13.0.0", + "webpack": "5.105.4", "xlsx": "file:vendor/xlsx-0.20.3.tgz", - "zod": "3.25.76", - "zod-openapi": "4.2.4" + "zod": "4.3.6", + "zod-openapi": "5.4.6" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", @@ -143,15 +143,15 @@ "@types/qrcode": "1.5.6", "@types/sanitize-html": "2.16.0", "@types/ungap__structured-clone": "1.2.0", - "@vitest/coverage-v8": "3.2.4", + "@vitest/coverage-v8": "4.0.18", "autoprefixer": "10.4.27", "cross-env": "10.1.0", - "dotenv": "16.6.1", + "dotenv": "17.3.1", "postcss": "8.5.8", "resize-observer-polyfill": "1.5.1", - "vite": "6.4.1", - "vite-tsconfig-paths": "5.1.4", - "vitest": "3.2.4", + "vite": "7.3.1", + "vite-tsconfig-paths": "6.1.1", + "vitest": "4.0.18", "vitest-mock-extended": "3.1.0" } } diff --git a/package.json b/package.json index 558a25522c..c948e62910 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,6 @@ "apps/*", "packages/*" ], - "prisma": { - "schema": "packages/database/schema.prisma" - }, "scripts": { "agents:update": "npx @next/codemod@canary agents-md --output AGENTS.md", "clean:all": "turbo run clean && rimraf node_modules pnpm-lock.yaml .turbo coverage out", @@ -54,10 +51,10 @@ "@playwright/test": "1.58.2", "eslint": "8.57.1", "husky": "9.1.7", - "lint-staged": "16.3.1", + "lint-staged": "16.3.2", "rimraf": "6.1.3", "tsx": "4.21.0", - "turbo": "2.8.12" + "turbo": "2.8.13" }, "lint-staged": { "(apps|packages)/**/*.{js,ts,jsx,tsx}": [ diff --git a/packages/cache/package.json b/packages/cache/package.json index bf3c38b289..c5da7d4113 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -39,13 +39,13 @@ "dependencies": { "@formbricks/logger": "workspace:*", "redis": "5.11.0", - "zod": "3.25.76" + "zod": "4.3.6" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "vite": "6.4.1", - "vitest": "3.2.4", - "@vitest/coverage-v8": "3.2.4" + "vite": "7.3.1", + "vitest": "4.0.18", + "@vitest/coverage-v8": "4.0.18" } } diff --git a/packages/cache/src/client.test.ts b/packages/cache/src/client.test.ts index 42273cd5cd..3047d1fcf4 100644 --- a/packages/cache/src/client.test.ts +++ b/packages/cache/src/client.test.ts @@ -21,19 +21,26 @@ vi.mock("@formbricks/logger", () => ({ // Mock CacheService vi.mock("./service", () => ({ - CacheService: vi.fn().mockImplementation((redis: RedisClient | null = null) => ({ - get: vi.fn(), - set: vi.fn(), - del: vi.fn(), - exists: vi.fn(), - withCache: vi.fn(), - getRedisClient: vi.fn().mockImplementation(() => { - if (!redis || !redis.isReady || !redis.isOpen) { + CacheService: class MockCacheService { + private redis: RedisClient | null; + + constructor(redis: RedisClient | null = null) { + this.redis = redis; + } + + get = vi.fn(); + set = vi.fn(); + del = vi.fn(); + exists = vi.fn(); + withCache = vi.fn(); + + getRedisClient = vi.fn(() => { + if (!this.redis || !this.redis.isReady || !this.redis.isOpen) { return null; } - return redis; - }), - })), + return this.redis; + }); + }, })); // Create a proper mock interface for Redis client diff --git a/packages/cache/src/service.test.ts b/packages/cache/src/service.test.ts index a459198a75..49b40f6a32 100644 --- a/packages/cache/src/service.test.ts +++ b/packages/cache/src/service.test.ts @@ -519,7 +519,7 @@ describe("CacheService", () => { const hangingPromise = new Promise(() => { // This promise never resolves to simulate timeout }); - mockRedis.ping.mockImplementation(() => hangingPromise); + mockRedis.ping.mockReturnValue(hangingPromise as Promise); const result = await cacheService.isRedisAvailable(); diff --git a/packages/cache/src/utils/validation.ts b/packages/cache/src/utils/validation.ts index 6417617aa7..d29f045faf 100644 --- a/packages/cache/src/utils/validation.ts +++ b/packages/cache/src/utils/validation.ts @@ -8,7 +8,7 @@ import { ErrorCode, err, ok } from "@/types/error"; * @param pairs - Array of [value, schema] tuples to validate * @returns Result with validated data or CacheValidationError */ -export function validateInputs][]>( +export function validateInputs( ...pairs: T ): Result<{ [K in keyof T]: T[K] extends readonly [unknown, z.ZodType] ? U : never }, CacheError> { const results: unknown[] = []; diff --git a/packages/cache/types/service.test.ts b/packages/cache/types/service.test.ts index 7d2856cdfb..f92a0de5c0 100644 --- a/packages/cache/types/service.test.ts +++ b/packages/cache/types/service.test.ts @@ -20,19 +20,19 @@ describe("ZTtlMs", () => { }); test("should reject non-integer values", () => { - expect(() => ZTtlMs.parse(1000.5)).toThrow("Expected integer, received float"); - expect(() => ZTtlMs.parse(1500.25)).toThrow("Expected integer, received float"); + expect(() => ZTtlMs.parse(1000.5)).toThrow(/expected int/i); + expect(() => ZTtlMs.parse(1500.25)).toThrow(/expected int/i); }); test("should reject non-finite values", () => { - expect(() => ZTtlMs.parse(NaN)).toThrow("Expected number, received nan"); - expect(() => ZTtlMs.parse(Infinity)).toThrow("TTL must be finite"); - expect(() => ZTtlMs.parse(-Infinity)).toThrow("TTL must be finite"); + expect(() => ZTtlMs.parse(NaN)).toThrow(/expected number.*nan/i); + expect(() => ZTtlMs.parse(Infinity)).toThrow(/expected number|finite/i); + expect(() => ZTtlMs.parse(-Infinity)).toThrow(/expected number|finite/i); }); test("should reject non-numeric values", () => { - expect(() => ZTtlMs.parse("1000")).toThrow("Expected number, received string"); - expect(() => ZTtlMs.parse(null)).toThrow("Expected number, received null"); - expect(() => ZTtlMs.parse(undefined)).toThrow("Required"); + expect(() => ZTtlMs.parse("1000")).toThrow(/expected number/i); + expect(() => ZTtlMs.parse(null)).toThrow(/expected number/i); + expect(() => ZTtlMs.parse(undefined)).toThrow(/expected number|required/i); }); }); diff --git a/packages/cache/types/service.ts b/packages/cache/types/service.ts index db6937d50a..ed708e7e80 100644 --- a/packages/cache/types/service.ts +++ b/packages/cache/types/service.ts @@ -1,13 +1,11 @@ import { z } from "zod"; export const ZTtlMs = z - .number() .int() .min(1000, "TTL must be at least 1000ms (1 second)") .finite("TTL must be finite"); export const ZTtlMsOptional = z - .number() .int() .min(1000, "TTL must be at least 1000ms (1 second)") .finite("TTL must be finite") diff --git a/packages/config-prettier/package.json b/packages/config-prettier/package.json index d8e0b681e8..d107c7fd4e 100644 --- a/packages/config-prettier/package.json +++ b/packages/config-prettier/package.json @@ -7,7 +7,7 @@ "clean": "rimraf node_modules .turbo" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "5.2.2", + "@trivago/prettier-plugin-sort-imports": "6.0.2", "prettier": "3.8.1", "prettier-plugin-tailwindcss": "0.7.2", "prettier-plugin-sort-json": "4.2.0" diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json index d175101a17..a6f6d6fef9 100644 --- a/packages/config-typescript/package.json +++ b/packages/config-typescript/package.json @@ -7,7 +7,7 @@ "clean": "rimraf node_modules dist turbo" }, "devDependencies": { - "@types/node": "22.19.13", + "@types/node": "25.3.3", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", "typescript": "5.9.3" diff --git a/packages/database/package.json b/packages/database/package.json index 07bebcc7f7..39df93f78e 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@formbricks/database", - "packageManager": "pnpm@9.15.9", + "packageManager": "pnpm@10.30.3", "private": true, "version": "0.1.0", "main": "./dist/index.cjs", @@ -47,23 +47,25 @@ "create-migration": "dotenv -e ../../.env -- tsx ./src/scripts/create-migration.ts" }, "dependencies": { + "@prisma/adapter-pg": "7.4.2", "@formbricks/logger": "workspace:*", - "@paralleldrive/cuid2": "2.3.1", - "@prisma/client": "6.19.2", - "bcryptjs": "2.4.3", - "uuid": "11.1.0", - "zod": "3.25.76", - "zod-openapi": "4.2.4" + "@paralleldrive/cuid2": "3.3.0", + "@prisma/client": "7.4.2", + "bcryptjs": "3.0.3", + "dotenv": "17.3.1", + "uuid": "13.0.0", + "zod": "4.3.6", + "zod-openapi": "5.4.6" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "dotenv-cli": "8.0.0", + "dotenv-cli": "11.0.0", "glob": "13.0.6", - "prisma": "6.19.2", - "prisma-json-types-generator": "3.6.2", + "prisma": "7.4.2", + "prisma-json-types-generator": "4.1.1", "tsx": "4.21.0", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4" } } diff --git a/packages/database/schema.prisma b/packages/database/schema.prisma index 17fa17e363..ca5751d1d8 100644 --- a/packages/database/schema.prisma +++ b/packages/database/schema.prisma @@ -3,7 +3,6 @@ datasource db { provider = "postgresql" - url = env("DATABASE_URL") extensions = [pgvector(map: "vector")] } diff --git a/packages/database/src/client.ts b/packages/database/src/client.ts index ae10f96027..aed1123f4c 100644 --- a/packages/database/src/client.ts +++ b/packages/database/src/client.ts @@ -1,12 +1,14 @@ -import { PrismaClient } from "@prisma/client"; +import { type PrismaClient } from "@prisma/client"; +import { createPrismaClient } from "./prisma-client"; const prismaClientSingleton = (): PrismaClient => { - return new PrismaClient({ - datasources: { db: { url: process.env.DATABASE_URL } }, - ...(process.env.DEBUG === "1" && { - log: ["query", "info"], - }), - }); + return createPrismaClient( + process.env.DEBUG === "1" + ? { + log: ["query", "info"], + } + : undefined + ); }; type PrismaClientSingleton = ReturnType; diff --git a/packages/database/src/prisma-client.ts b/packages/database/src/prisma-client.ts new file mode 100644 index 0000000000..808d42aef2 --- /dev/null +++ b/packages/database/src/prisma-client.ts @@ -0,0 +1,27 @@ +import { PrismaPg } from "@prisma/adapter-pg"; +import { type Prisma, PrismaClient } from "@prisma/client"; +import "dotenv/config"; + +interface CreatePrismaClientOptions extends Omit { + connectionString?: string; +} + +const getConnectionString = (connectionString?: string): string => { + const dbUrl = connectionString ?? process.env.DATABASE_URL; + + if (!dbUrl) { + throw new Error("DATABASE_URL is not set"); + } + + return dbUrl; +}; + +export const createPrismaClient = (options?: CreatePrismaClientOptions): PrismaClient => { + const adapter = new PrismaPg({ connectionString: getConnectionString(options?.connectionString) }); + const { connectionString: _connectionString, ...clientOptions } = options ?? {}; + + return new PrismaClient({ + adapter, + ...clientOptions, + }); +}; diff --git a/packages/database/src/scripts/backfill-attribute-values.ts b/packages/database/src/scripts/backfill-attribute-values.ts index b868b89c78..57d3e27467 100644 --- a/packages/database/src/scripts/backfill-attribute-values.ts +++ b/packages/database/src/scripts/backfill-attribute-values.ts @@ -18,7 +18,7 @@ * - Can be stopped and resumed safely (each batch commits independently) * - Logs progress throughout */ -import { PrismaClient } from "@prisma/client"; +import { createPrismaClient } from "../prisma-client"; // Regex patterns matching those used in the migration for consistency const NUMBER_PATTERN = "^-?[0-9]+(\\.[0-9]+)?$"; @@ -27,7 +27,7 @@ const ISO_DATE_PATTERN = "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2 // How many attribute keys to process in a single batch const KEY_BATCH_SIZE = 10; -const prisma = new PrismaClient(); +const prisma = createPrismaClient(); const SAFE_CAST_FUNCTION_NAME = "_backfill_safe_to_timestamp"; diff --git a/packages/database/src/scripts/create-saml-database.ts b/packages/database/src/scripts/create-saml-database.ts index e2fbf5b29d..6511fabdce 100644 --- a/packages/database/src/scripts/create-saml-database.ts +++ b/packages/database/src/scripts/create-saml-database.ts @@ -1,5 +1,5 @@ -import { PrismaClient } from "@prisma/client"; import { logger } from "@formbricks/logger"; +import { createPrismaClient } from "../prisma-client"; const createSamlDatabase = async (): Promise => { const samlDatabaseUrl = process.env.SAML_DATABASE_URL; @@ -18,7 +18,7 @@ const createSamlDatabase = async (): Promise => { } // Create a Prisma client to connect to the default database - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); try { // Check if the database exists diff --git a/packages/database/src/scripts/migration-runner.ts b/packages/database/src/scripts/migration-runner.ts index 655f17e87b..6430eaf88e 100644 --- a/packages/database/src/scripts/migration-runner.ts +++ b/packages/database/src/scripts/migration-runner.ts @@ -1,10 +1,11 @@ -import { type Prisma, PrismaClient } from "@prisma/client"; +import { type Prisma, type PrismaClient } from "@prisma/client"; import { exec } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { promisify } from "node:util"; import { logger } from "@formbricks/logger"; +import { createPrismaClient } from "../prisma-client"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -25,7 +26,7 @@ export interface MigrationScript { type: "data" | "schema"; } -const prisma = new PrismaClient(); +const prisma = createPrismaClient(); const TRANSACTION_TIMEOUT = 30 * 60 * 1000; // 30 minutes // Determine if we're running from built or source code diff --git a/packages/database/src/seed.ts b/packages/database/src/seed.ts index f29ad62dda..c16cd28710 100644 --- a/packages/database/src/seed.ts +++ b/packages/database/src/seed.ts @@ -1,10 +1,11 @@ import { createId } from "@paralleldrive/cuid2"; -import { type Prisma, PrismaClient } from "@prisma/client"; +import { type Prisma } from "@prisma/client"; import bcrypt from "bcryptjs"; import { logger } from "@formbricks/logger"; +import { createPrismaClient } from "./prisma-client"; import { SEED_CREDENTIALS, SEED_IDS } from "./seed/constants"; -const prisma = new PrismaClient(); +const prisma = createPrismaClient(); const isProduction = process.env.NODE_ENV === "production"; const allowSeed = process.env.ALLOW_SEED === "true"; diff --git a/packages/database/types/survey-follow-up.ts b/packages/database/types/survey-follow-up.ts index 8dfef57b40..ee4be81a46 100644 --- a/packages/database/types/survey-follow-up.ts +++ b/packages/database/types/survey-follow-up.ts @@ -5,7 +5,7 @@ export const ZSurveyFollowUpTrigger = z type: z.enum(["response", "endings"]), properties: z .object({ - endingIds: z.array(z.string().cuid2()), + endingIds: z.array(z.cuid2()), }) .nullable(), }) @@ -13,7 +13,7 @@ export const ZSurveyFollowUpTrigger = z if (trigger.type === "response") { if (trigger.properties) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Properties should be null for response type", }); } @@ -22,7 +22,7 @@ export const ZSurveyFollowUpTrigger = z if (trigger.type === "endings") { if (!trigger.properties) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Properties must be defined for endings type", }); } @@ -35,8 +35,8 @@ export const ZSurveyFollowUpAction = z.object({ type: z.literal("send-email"), properties: z.object({ to: z.string(), - from: z.string().email(), - replyTo: z.array(z.string().email()), + from: z.email(), + replyTo: z.array(z.email()), subject: z.string(), body: z.string(), attachResponseData: z.boolean(), @@ -48,13 +48,13 @@ export const ZSurveyFollowUpAction = z.object({ export type TSurveyFollowUpAction = z.infer; export const ZSurveyFollowUp = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), name: z.string(), trigger: ZSurveyFollowUpTrigger, action: ZSurveyFollowUpAction, - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), }); export type TSurveyFollowUp = z.infer; diff --git a/packages/database/vite.config.ts b/packages/database/vite.config.ts index 608fcdeab5..14addac17b 100644 --- a/packages/database/vite.config.ts +++ b/packages/database/vite.config.ts @@ -59,7 +59,9 @@ export default defineConfig(async (): Promise => { ], external: [ // External dependencies that should not be bundled + "@prisma/adapter-pg", "@prisma/client", + "dotenv/config", "zod", "zod-openapi", "@paralleldrive/cuid2", diff --git a/packages/database/zod/api-keys.ts b/packages/database/zod/api-keys.ts index f5b8ca8b14..f996619b21 100644 --- a/packages/database/zod/api-keys.ts +++ b/packages/database/zod/api-keys.ts @@ -2,50 +2,50 @@ import { type ApiKey, type ApiKeyEnvironment, ApiKeyPermission, EnvironmentType import { z } from "zod"; import { ZOrganizationAccess } from "../../types/api-key"; -export const ZApiKeyPermission = z.nativeEnum(ApiKeyPermission); +export const ZApiKeyPermission = z.enum(ApiKeyPermission); export const ZApiKeyEnvironment = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - apiKeyId: z.string().cuid2(), - environmentId: z.string().cuid2(), - projectId: z.string().cuid2(), + apiKeyId: z.cuid2(), + environmentId: z.cuid2(), + projectId: z.cuid2(), projectName: z.string(), - environmentType: z.nativeEnum(EnvironmentType), + environmentType: z.enum(EnvironmentType), permission: ZApiKeyPermission, }) satisfies z.ZodType; export const ZApiKey = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), createdBy: z.string(), lastUsedAt: z.date().nullable(), label: z.string(), hashedKey: z.string(), lookupHash: z.string().nullable(), - organizationId: z.string().cuid2(), + organizationId: z.cuid2(), organizationAccess: ZOrganizationAccess, }) satisfies z.ZodType; export const ZApiKeyCreateInput = z.object({ label: z.string(), - organizationId: z.string().cuid2(), - environmentIds: z.array(z.string().cuid2()), - permissions: z.record(z.string().cuid2(), ZApiKeyPermission), + organizationId: z.cuid2(), + environmentIds: z.array(z.cuid2()), + permissions: z.record(z.cuid2(), ZApiKeyPermission), createdBy: z.string(), }); export const ZApiKeyEnvironmentCreateInput = z.object({ - apiKeyId: z.string().cuid2(), - environmentId: z.string().cuid2(), + apiKeyId: z.cuid2(), + environmentId: z.cuid2(), permission: ZApiKeyPermission, }); export const ZApiKeyData = ZApiKey.pick({ organizationId: true, organizationAccess: true, -}).merge( +}).extend( z.object({ environments: z.array( ZApiKeyEnvironment.pick({ @@ -56,5 +56,5 @@ export const ZApiKeyData = ZApiKey.pick({ projectName: true, }) ), - }) + }).shape ); diff --git a/packages/database/zod/contact-attribute-keys.ts b/packages/database/zod/contact-attribute-keys.ts index 25931a10f6..d5325f8a4c 100644 --- a/packages/database/zod/contact-attribute-keys.ts +++ b/packages/database/zod/contact-attribute-keys.ts @@ -1,51 +1,61 @@ import { ContactAttributeDataType, type ContactAttributeKey, ContactAttributeType } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZContactAttributeKey = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the contact attribute key", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the contact attribute key was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the contact attribute key was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - isUnique: z.boolean().openapi({ - description: "Whether the attribute must have unique values across contacts", - example: false, - }), - key: z.string().openapi({ - description: "The attribute identifier used in the system", - example: "email", - }), - name: z.string().nullable().openapi({ - description: "Display name for the attribute", - example: "Email Address", - }), - description: z.string().nullable().openapi({ - description: "Description of the attribute", - example: "The user's email address", - }), - type: z.nativeEnum(ContactAttributeType).openapi({ - description: "Whether this is a default or custom attribute", - example: "custom", - }), - dataType: z.nativeEnum(ContactAttributeDataType).openapi({ - description: "The data type of the attribute (string, number, date)", - example: "string", - }), - environmentId: z.string().cuid2().openapi({ - description: "The ID of the environment this attribute belongs to", - }), + id: z.cuid2().describe("The ID of the contact attribute key"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the contact attribute key was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the contact attribute key was last updated"), + isUnique: z + .boolean() + .meta({ + example: false, + }) + .describe("Whether the attribute must have unique values across contacts"), + key: z + .string() + .meta({ + example: "email", + }) + .describe("The attribute identifier used in the system"), + name: z + .string() + .nullable() + .meta({ + example: "Email Address", + }) + .describe("Display name for the attribute"), + description: z + .string() + .nullable() + .meta({ + example: "The user's email address", + }) + .describe("Description of the attribute"), + type: z + .enum(ContactAttributeType) + .meta({ + example: "custom", + }) + .describe("Whether this is a default or custom attribute"), + dataType: z + .enum(ContactAttributeDataType) + .meta({ + example: "string", + }) + .describe("The data type of the attribute (string, number, date)"), + environmentId: z.cuid2().describe("The ID of the environment this attribute belongs to"), }) satisfies z.ZodType; -ZContactAttributeKey.openapi({ - ref: "contactAttributeKey", - description: "Defines a possible attribute that can be assigned to contacts", -}); +ZContactAttributeKey.meta({ + id: "contactAttributeKey", +}).describe("Defines a possible attribute that can be assigned to contacts"); diff --git a/packages/database/zod/contact-attributes.ts b/packages/database/zod/contact-attributes.ts index 90165b3d1d..cad7df317e 100644 --- a/packages/database/zod/contact-attributes.ts +++ b/packages/database/zod/contact-attributes.ts @@ -1,42 +1,44 @@ import type { ContactAttribute } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZContactAttribute = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the contact attribute", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the contact attribute was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the contact attribute was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - attributeKeyId: z.string().cuid2().openapi({ - description: "The ID of the attribute key", - }), - contactId: z.string().cuid2().openapi({ - description: "The ID of the contact", - }), - value: z.string().openapi({ - description: "The value of the attribute", - example: "example@email.com", - }), - valueNumber: z.number().nullable().openapi({ - description: "The numeric value of the attribute (used for number type)", - example: 123, - }), - valueDate: z.coerce.date().nullable().openapi({ - description: "The date value of the attribute (used for date type)", - example: "2022-01-19 00:00:00", - }), + id: z.cuid2().describe("The ID of the contact attribute"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the contact attribute was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the contact attribute was last updated"), + attributeKeyId: z.cuid2().describe("The ID of the attribute key"), + contactId: z.cuid2().describe("The ID of the contact"), + value: z + .string() + .meta({ + example: "example@email.com", + }) + .describe("The value of the attribute"), + valueNumber: z + .number() + .nullable() + .meta({ + example: 123, + }) + .describe("The numeric value of the attribute (used for number type)"), + valueDate: z.coerce + .date() + .nullable() + .meta({ + example: "2022-01-19 00:00:00", + }) + .describe("The date value of the attribute (used for date type)"), }) satisfies z.ZodType; -ZContactAttribute.openapi({ - ref: "contactAttribute", - description: "A contact attribute value associated with a contact", -}); +ZContactAttribute.meta({ + id: "contactAttribute", +}).describe("A contact attribute value associated with a contact"); diff --git a/packages/database/zod/contact.ts b/packages/database/zod/contact.ts index 93eebd36e1..ed89f6704b 100644 --- a/packages/database/zod/contact.ts +++ b/packages/database/zod/contact.ts @@ -1,30 +1,24 @@ import type { Contact } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZContact = z.object({ - id: z.string().cuid2().openapi({ - description: "Unique identifier for the contact", - }), - userId: z.string().nullable().openapi({ - description: "Optional external user identifier", - }), - createdAt: z.coerce.date().openapi({ - description: "When the contact was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "When the contact was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - environmentId: z.string().openapi({ - description: "The environment this contact belongs to", - }), + id: z.cuid2().describe("Unique identifier for the contact"), + userId: z.string().nullable().describe("Optional external user identifier"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("When the contact was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("When the contact was last updated"), + environmentId: z.string().describe("The environment this contact belongs to"), }) satisfies z.ZodType; -ZContact.openapi({ - ref: "contact", - description: "A person or user who can receive and respond to surveys", -}); +ZContact.meta({ + id: "contact", +}).describe("A person or user who can receive and respond to surveys"); diff --git a/packages/database/zod/invites.ts b/packages/database/zod/invites.ts index f5adbb5e34..d6f700bfc5 100644 --- a/packages/database/zod/invites.ts +++ b/packages/database/zod/invites.ts @@ -3,7 +3,7 @@ import { z } from "zod"; export const ZInvite = z.object({ id: z.string(), - email: z.string().email(), + email: z.email(), name: z.string().nullable(), organizationId: z.string(), creatorId: z.string(), diff --git a/packages/database/zod/organizations.ts b/packages/database/zod/organizations.ts index a194d9a63f..72c42795e0 100644 --- a/packages/database/zod/organizations.ts +++ b/packages/database/zod/organizations.ts @@ -1,8 +1,5 @@ import type { Organization } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZOrganizationWhiteLabel = z.object({ logoUrl: z.string().nullable(), @@ -10,8 +7,8 @@ export const ZOrganizationWhiteLabel = z.object({ export const ZOrganizationBilling = z.object({ stripeCustomerId: z.string().nullable(), - plan: z.enum(["free", "startup", "scale", "enterprise"]).default("free"), - period: z.enum(["monthly", "yearly"]).default("monthly"), + plan: z.enum(["free", "startup", "scale", "enterprise"]).prefault("free"), + period: z.enum(["monthly", "yearly"]).prefault("monthly"), limits: z .object({ projects: z.number().nullable(), @@ -20,7 +17,7 @@ export const ZOrganizationBilling = z.object({ miu: z.number().nullable(), }), }) - .default({ + .prefault({ projects: 3, monthly: { responses: 1500, @@ -31,11 +28,11 @@ export const ZOrganizationBilling = z.object({ }); export const ZOrganization = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.coerce.date(), updatedAt: z.coerce.date(), name: z.string(), whitelabel: ZOrganizationWhiteLabel, billing: ZOrganizationBilling as z.ZodType, - isAIEnabled: z.boolean().default(false) as z.ZodType, + isAIEnabled: z.boolean().prefault(false) as z.ZodType, }) satisfies z.ZodType; diff --git a/packages/database/zod/project-teams.ts b/packages/database/zod/project-teams.ts index 49647f8ec6..c5a0f0864a 100644 --- a/packages/database/zod/project-teams.ts +++ b/packages/database/zod/project-teams.ts @@ -1,30 +1,24 @@ import { type ProjectTeam, ProjectTeamPermission } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZProjectTeam = z.object({ - createdAt: z.coerce.date().openapi({ - description: "The date and time the project tem was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the project team was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - projectId: z.string().cuid2().openapi({ - description: "The ID of the project", - }), - teamId: z.string().cuid2().openapi({ - description: "The ID of the team", - }), - permission: z.nativeEnum(ProjectTeamPermission).openapi({ - description: "Level of access granted to the project", - }), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the project tem was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the project team was last updated"), + projectId: z.cuid2().describe("The ID of the project"), + teamId: z.cuid2().describe("The ID of the team"), + permission: z.enum(ProjectTeamPermission).describe("Level of access granted to the project"), }) satisfies z.ZodType; -ZProjectTeam.openapi({ - ref: "projectTeam", - description: "A relationship between a project and a team with associated permissions", -}); +ZProjectTeam.meta({ + id: "projectTeam", +}).describe("A relationship between a project and a team with associated permissions"); diff --git a/packages/database/zod/responses.ts b/packages/database/zod/responses.ts index e6881e5589..62273c6218 100644 --- a/packages/database/zod/responses.ts +++ b/packages/database/zod/responses.ts @@ -1,69 +1,79 @@ import type { Response } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZResponse = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the response", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the response was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the response was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - finished: z.boolean().openapi({ - description: "Whether the response is finished", - example: true, - }), - surveyId: z.string().cuid2().openapi({ - description: "The ID of the survey", - }), - contactId: z.string().cuid2().nullable().openapi({ - description: "The ID of the contact", - }), - endingId: z.string().cuid2().nullable().openapi({ - description: "The ID of the ending", - }), - data: z.record(z.union([z.string(), z.number(), z.array(z.string()), z.record(z.string())])).openapi({ - description: "The data of the response", - example: { - question1: "answer1", - question2: 2, - question3: ["answer3", "answer4"], - question4: { - subquestion1: "answer5", + id: z.cuid2().describe("The ID of the response"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the response was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the response was last updated"), + finished: z + .boolean() + .meta({ + example: true, + }) + .describe("Whether the response is finished"), + surveyId: z.cuid2().describe("The ID of the survey"), + contactId: z.cuid2().nullable().describe("The ID of the contact"), + endingId: z.cuid2().nullable().describe("The ID of the ending"), + data: z + .record( + z.string(), + z.union([z.string(), z.number(), z.array(z.string()), z.record(z.string(), z.string())]) + ) + .meta({ + example: { + question1: "answer1", + question2: 2, + question3: ["answer3", "answer4"], + question4: { + subquestion1: "answer5", + }, }, - }, - }), - variables: z.record(z.union([z.string(), z.number()])).openapi({ - description: "The variables of the response", - example: { - variable1: "answer1", - variable2: 2, - }, - }), - ttc: z.record(z.number()).openapi({ - description: "The TTC of the response", - example: { - question1: 10, - question2: 20, - }, - }), + }) + .describe("The data of the response"), + variables: z + .record(z.string(), z.union([z.string(), z.number()])) + .meta({ + example: { + variable1: "answer1", + variable2: 2, + }, + }) + .describe("The variables of the response"), + ttc: z + .record(z.string(), z.number()) + .meta({ + example: { + question1: 10, + question2: 20, + }, + }) + .describe("The TTC of the response"), meta: z .object({ - source: z.string().optional().openapi({ - description: "The source of the response", - example: "https://example.com", - }), - url: z.string().optional().openapi({ - description: "The URL of the response", - example: "https://example.com", - }), + source: z + .string() + .optional() + .meta({ + example: "https://example.com", + }) + .describe("The source of the response"), + url: z + .string() + .optional() + .meta({ + example: "https://example.com", + }) + .describe("The URL of the response"), userAgent: z .object({ browser: z.string().optional(), @@ -74,8 +84,7 @@ export const ZResponse = z.object({ country: z.string().optional(), action: z.string().optional(), }) - .openapi({ - description: "The meta data of the response", + .meta({ example: { source: "https://example.com", url: "https://example.com", @@ -87,30 +96,29 @@ export const ZResponse = z.object({ country: "US", action: "click", }, - }), + }) + .describe("The meta data of the response"), contactAttributes: z - .record(z.string()) + .record(z.string(), z.string()) .nullable() - .openapi({ - description: "The attributes of the contact", + .meta({ example: { attribute1: "value1", attribute2: "value2", }, - }), - singleUseId: z.string().nullable().openapi({ - description: "The single use ID of the response", - }), - language: z.string().nullable().openapi({ - description: "The language of the response", - example: "en", - }), - displayId: z.string().nullable().openapi({ - description: "The display ID of the response", - }), + }) + .describe("The attributes of the contact"), + singleUseId: z.string().nullable().describe("The single use ID of the response"), + language: z + .string() + .nullable() + .meta({ + example: "en", + }) + .describe("The language of the response"), + displayId: z.string().nullable().describe("The display ID of the response"), }) satisfies z.ZodType; -ZResponse.openapi({ - ref: "response", - description: "A response", -}); +ZResponse.meta({ + id: "response", +}).describe("A response"); diff --git a/packages/database/zod/surveys.ts b/packages/database/zod/surveys.ts index 442395f755..6dd23d1d9f 100644 --- a/packages/database/zod/surveys.ts +++ b/packages/database/zod/surveys.ts @@ -1,7 +1,6 @@ /* eslint-disable import/no-relative-packages -- Need to import from parent package */ import { SurveyStatus, SurveyType } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZOverlay } from "../../types/common"; // eslint-disable-next-line import/no-relative-packages -- Need to import from parent package import { ZLogo } from "../../types/styling"; @@ -14,8 +13,6 @@ import { ZSurveyVariable, } from "../../types/surveys/types"; -extendZodWithOpenApi(z); - const ZColor = z.string().regex(/^#(?:[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/); export const ZStylingColor = z.object({ @@ -39,102 +36,60 @@ export const ZSurveyStylingBackground = z.object({ export const ZPlacement = z.enum(["bottomLeft", "bottomRight", "topLeft", "topRight", "center"]); const ZSurveyBase = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the survey", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the survey was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the survey was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - name: z.string().openapi({ - description: "The name of the survey", - }), - redirectUrl: z.string().url().nullable().openapi({ - description: "The URL to redirect to after the survey is completed", - }), - type: z.nativeEnum(SurveyType).openapi({ - description: "The type of the survey", - }), - status: z.nativeEnum(SurveyStatus).openapi({ - description: "The status of the survey", - }), - thankYouMessage: z.string().nullable().openapi({ - description: "The thank you message of the survey", - }), - showLanguageSwitch: z.boolean().nullable().openapi({ - description: "Whether to show the language switch", - }), - showThankYouMessage: z.boolean().nullable().openapi({ - description: "Whether to show the thank you message", - }), + id: z.cuid2().describe("The ID of the survey"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the survey was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the survey was last updated"), + name: z.string().describe("The name of the survey"), + redirectUrl: z.url().nullable().describe("The URL to redirect to after the survey is completed"), + type: z.enum(SurveyType).describe("The type of the survey"), + status: z.enum(SurveyStatus).describe("The status of the survey"), + thankYouMessage: z.string().nullable().describe("The thank you message of the survey"), + showLanguageSwitch: z.boolean().nullable().describe("Whether to show the language switch"), + showThankYouMessage: z.boolean().nullable().describe("Whether to show the thank you message"), welcomeCard: z .object({ enabled: z.boolean(), timeToFinish: z.boolean(), showResponseCount: z.boolean(), - headline: z.record(z.string()).optional(), - subheader: z.record(z.string()).optional(), + headline: z.record(z.string(), z.string()).optional(), + subheader: z.record(z.string(), z.string()).optional(), fileUrl: z.string().optional(), - buttonLabel: z.record(z.string()).optional(), + buttonLabel: z.record(z.string(), z.string()).optional(), videoUrl: z.string().optional(), }) - .openapi({ - description: "The welcome card configuration", - }), - displayProgressBar: z.boolean().nullable().openapi({ - description: "Whether to display the progress bar", - }), - pin: z.string().nullable().openapi({ - description: "The pin of the survey", - }), - createdBy: z.string().nullable().openapi({ - description: "The user who created the survey", - }), - environmentId: z.string().cuid2().openapi({ - description: "The environment ID of the survey", - }), - questions: z.array(ZSurveyQuestion).openapi({ - description: "The questions of the survey", - }), - blocks: ZSurveyBlocks.default([]).openapi({ - description: "The blocks of the survey", - }), - endings: z.array(ZSurveyEnding).default([]).openapi({ - description: "The endings of the survey", - }), + .describe("The welcome card configuration"), + displayProgressBar: z.boolean().nullable().describe("Whether to display the progress bar"), + pin: z.string().nullable().describe("The pin of the survey"), + createdBy: z.string().nullable().describe("The user who created the survey"), + environmentId: z.cuid2().describe("The environment ID of the survey"), + questions: z.array(ZSurveyQuestion).describe("The questions of the survey"), + blocks: ZSurveyBlocks.prefault([]).describe("The blocks of the survey"), + endings: z.array(ZSurveyEnding).prefault([]).describe("The endings of the survey"), hiddenFields: z .object({ enabled: z.boolean(), fieldIds: z.array(z.string()).optional(), }) - .openapi({ - description: "Hidden fields configuration", - }), - variables: z.array(ZSurveyVariable).openapi({ - description: "Survey variables", - }), - displayOption: z.enum(["displayOnce", "displayMultiple", "displaySome", "respondMultiple"]).openapi({ - description: "Display options for the survey", - }), - recontactDays: z.number().nullable().openapi({ - description: "Days before recontacting", - }), - displayLimit: z.number().nullable().openapi({ - description: "Display limit for the survey", - }), - autoClose: z.number().nullable().openapi({ - description: "Auto close time in seconds", - }), - autoComplete: z.number().nullable().openapi({ - description: "Auto complete time in seconds", - }), - delay: z.number().openapi({ - description: "Delay before showing survey", - }), + .describe("Hidden fields configuration"), + variables: z.array(ZSurveyVariable).describe("Survey variables"), + displayOption: z + .enum(["displayOnce", "displayMultiple", "displaySome", "respondMultiple"]) + .describe("Display options for the survey"), + recontactDays: z.number().nullable().describe("Days before recontacting"), + displayLimit: z.number().nullable().describe("Display limit for the survey"), + autoClose: z.number().nullable().describe("Auto close time in seconds"), + autoComplete: z.number().nullable().describe("Auto complete time in seconds"), + delay: z.number().describe("Delay before showing survey"), surveyClosedMessage: z .object({ enabled: z.boolean(), @@ -142,12 +97,8 @@ const ZSurveyBase = z.object({ subheading: z.string(), }) .nullable() - .openapi({ - description: "Message shown when survey is closed", - }), - segmentId: z.string().nullable().openapi({ - description: "ID of the segment", - }), + .describe("Message shown when survey is closed"), + segmentId: z.string().nullable().describe("ID of the segment"), projectOverwrites: z .object({ brandColor: ZColor.nullish(), @@ -157,9 +108,7 @@ const ZSurveyBase = z.object({ overlay: ZOverlay.nullish(), }) .nullable() - .openapi({ - description: "Project specific overwrites", - }), + .describe("Project specific overwrites"), styling: z .object({ brandColor: ZStylingColor.nullish(), @@ -178,38 +127,20 @@ const ZSurveyBase = z.object({ logo: ZLogo.nullish(), }) .nullable() - .openapi({ - description: "Survey styling configuration", - }), + .describe("Survey styling configuration"), singleUse: z .object({ enabled: z.boolean(), isEncrypted: z.boolean(), }) - .openapi({ - description: "Single use configuration", - }), - isVerifyEmailEnabled: z.boolean().openapi({ - description: "Whether email verification is enabled", - }), - isSingleResponsePerEmailEnabled: z.boolean().openapi({ - description: "Whether single response per email is enabled", - }), - inlineTriggers: z.array(z.any()).nullable().openapi({ - description: "Inline triggers configuration", - }), - isBackButtonHidden: z.boolean().openapi({ - description: "Whether the back button is hidden", - }), - recaptcha: ZSurveyRecaptcha.openapi({ - description: "Google reCAPTCHA configuration", - }), - metadata: ZSurveyMetadata.openapi({ - description: "Custom link metadata for social sharing", - }), - displayPercentage: z.number().nullable().openapi({ - description: "The display percentage of the survey", - }), + .describe("Single use configuration"), + isVerifyEmailEnabled: z.boolean().describe("Whether email verification is enabled"), + isSingleResponsePerEmailEnabled: z.boolean().describe("Whether single response per email is enabled"), + inlineTriggers: z.array(z.any()).nullable().describe("Inline triggers configuration"), + isBackButtonHidden: z.boolean().describe("Whether the back button is hidden"), + recaptcha: ZSurveyRecaptcha.describe("Google reCAPTCHA configuration"), + metadata: ZSurveyMetadata.describe("Custom link metadata for social sharing"), + displayPercentage: z.number().nullable().describe("The display percentage of the survey"), }); export const ZSurvey = ZSurveyBase; @@ -217,12 +148,9 @@ export const ZSurvey = ZSurveyBase; export const ZSurveyWithoutQuestionType = ZSurveyBase.omit({ questions: true, }).extend({ - questions: z.array(z.any()).openapi({ - description: "The questions of the survey.", - }), + questions: z.array(z.any()).describe("The questions of the survey."), }); -ZSurvey.openapi({ - ref: "survey", - description: "A survey", -}); +ZSurvey.meta({ + id: "survey", +}).describe("A survey"); diff --git a/packages/database/zod/teams.ts b/packages/database/zod/teams.ts index d24e752cd7..dfe6a6b2ff 100644 --- a/packages/database/zod/teams.ts +++ b/packages/database/zod/teams.ts @@ -1,31 +1,29 @@ import type { Team } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZTeam = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the team", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the team was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the team was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - name: z.string().openapi({ - description: "The name of the team", - example: "My team", - }), - organizationId: z.string().cuid2().openapi({ - description: "The ID of the organization", - }), + id: z.cuid2().describe("The ID of the team"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the team was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the team was last updated"), + name: z + .string() + .meta({ + example: "My team", + }) + .describe("The name of the team"), + organizationId: z.cuid2().describe("The ID of the organization"), }) satisfies z.ZodType; -ZTeam.openapi({ - ref: "team", - description: "A team", -}); +ZTeam.meta({ + id: "team", +}).describe("A team"); diff --git a/packages/database/zod/users.ts b/packages/database/zod/users.ts index 6716357711..203bba2cf5 100644 --- a/packages/database/zod/users.ts +++ b/packages/database/zod/users.ts @@ -1,10 +1,7 @@ import { OrganizationRole, User } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZUserEmail, ZUserName } from "../../types/user"; -extendZodWithOpenApi(z); - const ZNoBillingOrganizationRoles = z.enum( Object.values(OrganizationRole).filter((role) => role !== OrganizationRole.billing) as [ OrganizationRole, @@ -15,44 +12,47 @@ const ZNoBillingOrganizationRoles = z.enum( export type TNoBillingOrganizationRoles = z.infer; export const ZUser = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the user", - }), - createdAt: z.coerce.date().openapi({ - description: "The date and time the user was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.coerce.date().openapi({ - description: "The date and time the user was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - lastLoginAt: z.coerce.date().openapi({ - description: "The date and time the user last logged in", - example: "2021-01-01T00:00:00.000Z", - }), - isActive: z.boolean().openapi({ - description: "Whether the user is active", - example: true, - }), - name: ZUserName.openapi({ - description: "The name of the user", + id: z.cuid2().describe("The ID of the user"), + createdAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the user was created"), + updatedAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the user was last updated"), + lastLoginAt: z.coerce + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the user last logged in"), + isActive: z + .boolean() + .meta({ + example: true, + }) + .describe("Whether the user is active"), + name: ZUserName.meta({ example: "John Doe", - }), - email: ZUserEmail.openapi({ - description: "The email of the user", + }).describe("The name of the user"), + email: ZUserEmail.meta({ example: "example@example.com", - }), - role: ZNoBillingOrganizationRoles.openapi({ - description: "The role of the user in the organization", + }).describe("The email of the user"), + role: ZNoBillingOrganizationRoles.meta({ example: OrganizationRole.member, - }), + }).describe("The role of the user in the organization"), teams: z .array(z.string()) .optional() - .openapi({ - description: "The list of teams the user is a member of", + .meta({ example: ["team1", "team2"], - }), + }) + .describe("The list of teams the user is a member of"), }) satisfies z.ZodType< Omit< User, @@ -78,9 +78,8 @@ export const ZUser = z.object({ > >; -ZUser.openapi({ - ref: "user", - description: "A user", -}); +ZUser.meta({ + id: "user", +}).describe("A user"); export type TUser = z.infer; diff --git a/packages/database/zod/webhooks.ts b/packages/database/zod/webhooks.ts index ae71cdef06..d5ffd6e1ca 100644 --- a/packages/database/zod/webhooks.ts +++ b/packages/database/zod/webhooks.ts @@ -1,50 +1,37 @@ import type { Webhook } from "@prisma/client"; import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; - -extendZodWithOpenApi(z); export const ZWebhook = z.object({ - id: z.string().cuid2().openapi({ - description: "The ID of the webhook", - }), - name: z.string().nullable().openapi({ - description: "The name of the webhook", - }), - createdAt: z.date().openapi({ - description: "The date and time the webhook was created", - example: "2021-01-01T00:00:00.000Z", - }), - updatedAt: z.date().openapi({ - description: "The date and time the webhook was last updated", - example: "2021-01-01T00:00:00.000Z", - }), - url: z.string().url().openapi({ - description: "The URL of the webhook", - }), - source: z.enum(["user", "zapier", "make", "n8n"]).openapi({ - description: "The source of the webhook", - }), - environmentId: z.string().cuid2().openapi({ - description: "The ID of the environment", - }), + id: z.cuid2().describe("The ID of the webhook"), + name: z.string().nullable().describe("The name of the webhook"), + createdAt: z + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the webhook was created"), + updatedAt: z + .date() + .meta({ + example: "2021-01-01T00:00:00.000Z", + }) + .describe("The date and time the webhook was last updated"), + url: z.url().describe("The URL of the webhook"), + source: z.enum(["user", "zapier", "make", "n8n"]).describe("The source of the webhook"), + environmentId: z.cuid2().describe("The ID of the environment"), triggers: z .array(z.enum(["responseFinished", "responseCreated", "responseUpdated"])) - .openapi({ - description: "The triggers of the webhook", - }) + .describe("The triggers of the webhook") .min(1, { - message: "At least one trigger is required", + error: "At least one trigger is required", }), - surveyIds: z.array(z.string().cuid2()).openapi({ - description: "The IDs of the surveys ", - }), - secret: z.string().nullable().openapi({ - description: "The shared secret used to generate HMAC signatures for webhook requests", - }), + surveyIds: z.array(z.cuid2()).describe("The IDs of the surveys "), + secret: z + .string() + .nullable() + .describe("The shared secret used to generate HMAC signatures for webhook requests"), }) satisfies z.ZodType; -ZWebhook.openapi({ - ref: "webhook", - description: "A webhook", -}); +ZWebhook.meta({ + id: "webhook", +}).describe("A webhook"); diff --git a/packages/i18n-utils/package.json b/packages/i18n-utils/package.json index aba9e69c02..bb478684b4 100644 --- a/packages/i18n-utils/package.json +++ b/packages/i18n-utils/package.json @@ -40,10 +40,10 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "@types/node": "^22.19.13", + "@types/node": "^25.3.3", "tsx": "^4.21.0", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vitest": "3.2.4" + "vitest": "4.0.18" } } diff --git a/packages/js-core/package.json b/packages/js-core/package.json index a49edfe7e1..446b38fc51 100644 --- a/packages/js-core/package.json +++ b/packages/js-core/package.json @@ -45,10 +45,10 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "@vitest/coverage-v8": "3.2.4", + "@vitest/coverage-v8": "4.0.18", "terser": "5.46.0", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vitest": "3.2.4" + "vitest": "4.0.18" } } diff --git a/packages/js-core/src/lib/environment/tests/state.test.ts b/packages/js-core/src/lib/environment/tests/state.test.ts index 0e93a37281..dfc0f8083a 100644 --- a/packages/js-core/src/lib/environment/tests/state.test.ts +++ b/packages/js-core/src/lib/environment/tests/state.test.ts @@ -13,9 +13,9 @@ import type { TEnvironmentState } from "@/types/config"; // Mock the ApiClient so we can control environment.getEnvironmentState vi.mock("@/lib/common/api", () => ({ - ApiClient: vi.fn().mockImplementation(() => ({ - getEnvironmentState: vi.fn(), - })), + ApiClient: vi.fn(function MockApiClient(this: { getEnvironmentState: ReturnType }) { + this.getEnvironmentState = vi.fn(); + }), })); // Mock logger (so we don’t spam console) @@ -62,7 +62,7 @@ describe("environment/state.ts", () => { describe("fetchEnvironmentState()", () => { test("returns ok(...) with environment state", async () => { // Setup mock - (ApiClient as unknown as Mock).mockImplementationOnce(() => { + (ApiClient as unknown as Mock).mockImplementationOnce(function MockApiClient() { return { getEnvironmentState: vi.fn().mockResolvedValue({ ok: true, @@ -88,7 +88,7 @@ describe("environment/state.ts", () => { test("returns err(...) if environment.getEnvironmentState is not ok", async () => { const mockError = { code: "forbidden", status: 403, message: "Access denied" }; - (ApiClient as unknown as Mock).mockImplementationOnce(() => { + (ApiClient as unknown as Mock).mockImplementationOnce(function MockApiClient() { return { getEnvironmentState: vi.fn().mockResolvedValue({ ok: false, @@ -116,7 +116,7 @@ describe("environment/state.ts", () => { responseMessage: "Network fail", }; - (ApiClient as unknown as Mock).mockImplementationOnce(() => { + (ApiClient as unknown as Mock).mockImplementationOnce(function MockApiClient() { return { getEnvironmentState: vi.fn().mockRejectedValue(mockNetworkError), }; @@ -191,12 +191,14 @@ describe("environment/state.ts", () => { mockJsConfig.mockReturnValue(mockConfig as unknown as Config); - (ApiClient as Mock).mockImplementation(() => ({ - getEnvironmentState: vi.fn().mockResolvedValue({ - ok: true, - data: mockNewState, - }), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + getEnvironmentState: vi.fn().mockResolvedValue({ + ok: true, + data: mockNewState, + }), + }; + }); (filterSurveys as Mock).mockReturnValue([]); @@ -233,9 +235,11 @@ describe("environment/state.ts", () => { mockJsConfig.mockReturnValue(mockConfig as unknown as Config); // Mock API to throw an error - (ApiClient as Mock).mockImplementation(() => ({ - getEnvironmentState: vi.fn().mockRejectedValue(new Error("Network error")), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + getEnvironmentState: vi.fn().mockRejectedValue(new Error("Network error")), + }; + }); addEnvironmentStateExpiryCheckListener(); @@ -261,9 +265,11 @@ describe("environment/state.ts", () => { mockJsConfig.mockReturnValue(mockConfig as unknown as Config); - const apiMock = vi.fn().mockImplementation(() => ({ - getEnvironmentState: vi.fn(), - })); + const apiMock = vi.fn().mockImplementation(function MockApiClient() { + return { + getEnvironmentState: vi.fn(), + }; + }); (ApiClient as Mock).mockImplementation(apiMock); diff --git a/packages/js-core/src/lib/user/tests/update.test.ts b/packages/js-core/src/lib/user/tests/update.test.ts index 80fef746d8..c900525f8b 100644 --- a/packages/js-core/src/lib/user/tests/update.test.ts +++ b/packages/js-core/src/lib/user/tests/update.test.ts @@ -34,9 +34,9 @@ vi.mock("@/lib/common/utils", () => ({ })); vi.mock("@/lib/common/api", () => ({ - ApiClient: vi.fn().mockImplementation(() => ({ - createOrUpdateUserUser: vi.fn(), - })), + ApiClient: vi.fn(function MockApiClient(this: { createOrUpdateUser: ReturnType }) { + this.createOrUpdateUser = vi.fn(); + }), })); describe("sendUpdatesToBackend", () => { @@ -57,9 +57,11 @@ describe("sendUpdatesToBackend", () => { }, }; - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockResolvedValue(mockResponse), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockResolvedValue(mockResponse), + }; + }); const result = await sendUpdatesToBackend({ appUrl: mockAppUrl, @@ -76,12 +78,14 @@ describe("sendUpdatesToBackend", () => { test("returns network error if API call fails", async () => { const mockUpdates: TUpdates = { userId: mockUserId, attributes: mockAttributes }; - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockResolvedValue({ - ok: false, - error: { code: "network_error", message: "Request failed", status: 500 }, - }), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockResolvedValue({ + ok: false, + error: { code: "network_error", message: "Request failed", status: 500 }, + }), + }; + }); const result = await sendUpdatesToBackend({ appUrl: mockAppUrl, @@ -99,9 +103,11 @@ describe("sendUpdatesToBackend", () => { test("returns error if network request fails", async () => { const mockUpdates: TUpdates = { userId: mockUserId, attributes: { plan: "premium" } }; - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockRejectedValue(new Error("Network error")), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockRejectedValue(new Error("Network error")), + }; + }); const result = await sendUpdatesToBackend({ appUrl: mockAppUrl, @@ -151,9 +157,11 @@ describe("sendUpdates", () => { }, }; - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockResolvedValue(mockResponse), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockResolvedValue(mockResponse), + }; + }); const result = await sendUpdates({ updates: { userId: mockUserId, attributes: mockAttributes } }); @@ -173,9 +181,11 @@ describe("sendUpdates", () => { }, }; - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockResolvedValue(mockErrorResponse), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockResolvedValue(mockErrorResponse), + }; + }); const result = await sendUpdates({ updates: { userId: mockUserId, attributes: mockAttributes } }); @@ -186,9 +196,11 @@ describe("sendUpdates", () => { }); test("handles unexpected errors", async () => { - (ApiClient as Mock).mockImplementation(() => ({ - createOrUpdateUser: vi.fn().mockRejectedValue(new Error("Unexpected error")), - })); + (ApiClient as Mock).mockImplementation(function MockApiClient() { + return { + createOrUpdateUser: vi.fn().mockRejectedValue(new Error("Unexpected error")), + }; + }); const result = await sendUpdates({ updates: { userId: mockUserId, attributes: mockAttributes } }); diff --git a/packages/logger/package.json b/packages/logger/package.json index fa7e89c598..ed5d9a377c 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -35,15 +35,15 @@ }, "author": "Formbricks ", "dependencies": { - "zod": "3.25.76", + "zod": "4.3.6", "pino": "10.3.1", - "pino-opentelemetry-transport": "2.0.0", + "pino-opentelemetry-transport": "3.0.0", "pino-pretty": "13.1.3" }, "devDependencies": { - "vite": "6.4.1", + "vite": "7.3.1", "@formbricks/config-typescript": "workspace:*", - "vitest": "3.2.4", + "vitest": "4.0.18", "@formbricks/eslint-config": "workspace:*", "vite-plugin-dts": "4.5.4" } diff --git a/packages/storage/package.json b/packages/storage/package.json index 50f96f39d4..8766a0539a 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -37,16 +37,16 @@ "author": "Formbricks ", "dependencies": { "@formbricks/logger": "workspace:*", - "@aws-sdk/client-s3": "3.1000.0", - "@aws-sdk/s3-presigned-post": "3.1000.0", - "@aws-sdk/s3-request-presigner": "3.1000.0" + "@aws-sdk/client-s3": "3.1002.0", + "@aws-sdk/s3-presigned-post": "3.1002.0", + "@aws-sdk/s3-request-presigner": "3.1002.0" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vitest": "3.2.4", - "@vitest/coverage-v8": "3.2.4" + "vitest": "4.0.18", + "@vitest/coverage-v8": "4.0.18" } } diff --git a/packages/storage/src/client.test.ts b/packages/storage/src/client.test.ts index 24d09a87bf..4a2e196da4 100644 --- a/packages/storage/src/client.test.ts +++ b/packages/storage/src/client.test.ts @@ -3,10 +3,13 @@ import { beforeEach, describe, expect, test, vi } from "vitest"; // Mock the AWS SDK S3Client vi.mock("@aws-sdk/client-s3", () => ({ - S3Client: vi.fn().mockImplementation((config: S3ClientConfig) => ({ - config, - send: vi.fn(), - })), + S3Client: vi.fn(function MockS3Client( + this: { config: S3ClientConfig; send: ReturnType }, + config: S3ClientConfig + ) { + this.config = config; + this.send = vi.fn(); + }), })); const mockS3Client = vi.mocked(S3Client); diff --git a/packages/survey-ui/package.json b/packages/survey-ui/package.json index 572e2cb5f0..5202dc2689 100644 --- a/packages/survey-ui/package.json +++ b/packages/survey-ui/package.json @@ -77,29 +77,29 @@ "class-variance-authority": "0.7.1", "clsx": "2.1.1", "date-fns": "4.1.0", - "isomorphic-dompurify": "2.36.0", - "lucide-react": "0.576.0", + "isomorphic-dompurify": "3.0.0", + "lucide-react": "0.577.0", "react-day-picker": "9.14.0", "tailwind-merge": "3.5.0" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "@storybook/react": "8.6.17", - "@storybook/react-vite": "8.6.17", + "@storybook/react": "10.2.15", + "@storybook/react-vite": "10.2.15", "@tailwindcss/postcss": "4.2.1", "@tailwindcss/vite": "4.2.1", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "4.7.0", + "@vitejs/plugin-react": "5.1.4", "react": "19.2.4", "react-dom": "19.2.4", "rimraf": "6.1.3", "tailwindcss": "4.2.1", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vite-tsconfig-paths": "5.1.4", - "@vitest/coverage-v8": "3.2.4", - "vitest": "3.2.4" + "vite-tsconfig-paths": "6.1.1", + "@vitest/coverage-v8": "4.0.18", + "vitest": "4.0.18" } } diff --git a/packages/surveys/package.json b/packages/surveys/package.json index eb76e28991..8f1dc247ff 100644 --- a/packages/surveys/package.json +++ b/packages/surveys/package.json @@ -45,11 +45,11 @@ "dependencies": { "@calcom/embed-snippet": "1.3.3", "@formbricks/survey-ui": "workspace:*", - "i18next": "25.8.13", + "i18next": "25.8.14", "i18next-icu": "2.4.3", - "isomorphic-dompurify": "2.36.0", + "isomorphic-dompurify": "3.0.0", "preact": "10.28.4", - "react-i18next": "15.7.4" + "react-i18next": "16.5.4" }, "devDependencies": { "@formbricks/config-typescript": "workspace:*", @@ -63,11 +63,11 @@ "autoprefixer": "10.4.27", "concurrently": "9.2.1", "postcss": "8.5.8", - "rollup-plugin-visualizer": "6.0.8", + "rollup-plugin-visualizer": "7.0.1", "tailwindcss": "4.2.1", "terser": "5.46.0", - "vite": "6.4.1", + "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vite-tsconfig-paths": "5.1.4" + "vite-tsconfig-paths": "6.1.1" } } diff --git a/packages/surveys/src/lib/html-utils.test.ts b/packages/surveys/src/lib/html-utils.test.ts index 7232005f8d..fffb2c3229 100644 --- a/packages/surveys/src/lib/html-utils.test.ts +++ b/packages/surveys/src/lib/html-utils.test.ts @@ -1,3 +1,4 @@ +// @vitest-environment jsdom import { describe, expect, test } from "vitest"; import { isValidHTML, stripInlineStyles } from "./html-utils"; diff --git a/packages/surveys/src/lib/response.queue.test.ts b/packages/surveys/src/lib/response.queue.test.ts index cf08ee4ba2..e0bd465a16 100644 --- a/packages/surveys/src/lib/response.queue.test.ts +++ b/packages/surveys/src/lib/response.queue.test.ts @@ -6,10 +6,12 @@ import { ResponseQueue, delay } from "./response-queue"; import { SurveyState } from "./survey-state"; vi.mock("./api-client", () => ({ - ApiClient: vi.fn().mockImplementation(() => ({ - updateResponse: vi.fn(), - createResponse: vi.fn(), - })), + ApiClient: vi.fn(function ApiClient() { + return { + updateResponse: vi.fn(), + createResponse: vi.fn(), + }; + }), })); const getSurveyState: () => SurveyState = () => ({ diff --git a/packages/surveys/src/lib/styles.test.ts b/packages/surveys/src/lib/styles.test.ts index 77351e2b74..5b92326392 100644 --- a/packages/surveys/src/lib/styles.test.ts +++ b/packages/surveys/src/lib/styles.test.ts @@ -1,3 +1,4 @@ +// @vitest-environment jsdom import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import { type TProjectStyling } from "@formbricks/types/project"; import { type TSurveyStyling } from "@formbricks/types/surveys/types"; diff --git a/packages/surveys/src/lib/ttc.test.ts b/packages/surveys/src/lib/ttc.test.ts index cab8602b7b..f95a09fae8 100644 --- a/packages/surveys/src/lib/ttc.test.ts +++ b/packages/surveys/src/lib/ttc.test.ts @@ -1,6 +1,7 @@ +// @vitest-environment jsdom import { act, renderHook } from "@testing-library/preact"; import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; -import { TResponseTtc } from "@formbricks/types/responses"; +import type { TResponseTtc } from "@formbricks/types/responses"; import { getUpdatedTtc, useTtc } from "./ttc"; describe("getUpdatedTtc", () => { @@ -26,21 +27,21 @@ describe("getUpdatedTtc", () => { }); describe("useTtc", () => { - let mockSetTtc: ReturnType; - let mockSetStartTime: ReturnType; + let mockSetTtc: ReturnType void>>; + let mockSetStartTime: ReturnType void>>; let currentTime = 0; let initialProps: { questionId: string; ttc: TResponseTtc; - setTtc: ReturnType; + setTtc: ReturnType void>>; startTime: number; - setStartTime: ReturnType; + setStartTime: ReturnType void>>; isCurrentQuestion: boolean; }; beforeEach(() => { - mockSetTtc = vi.fn(); - mockSetStartTime = vi.fn(); + mockSetTtc = vi.fn<(ttc: TResponseTtc) => void>(); + mockSetStartTime = vi.fn<(time: number) => void>(); currentTime = 1000; // Initial mock time vi.spyOn(performance, "now").mockImplementation(() => currentTime); vi.spyOn(document, "addEventListener"); diff --git a/packages/surveys/src/lib/validation/validators.ts b/packages/surveys/src/lib/validation/validators.ts index 8064929974..c012905be9 100644 --- a/packages/surveys/src/lib/validation/validators.ts +++ b/packages/surveys/src/lib/validation/validators.ts @@ -6,7 +6,6 @@ import type { TValidationRuleParamsContains, TValidationRuleParamsDoesNotContain, TValidationRuleParamsDoesNotEqual, - TValidationRuleParamsEmail, TValidationRuleParamsEquals, TValidationRuleParamsFileExtensionIs, TValidationRuleParamsFileExtensionIsNot, @@ -25,8 +24,6 @@ import type { TValidationRuleParamsMinSelections, TValidationRuleParamsMinValue, TValidationRuleParamsPattern, - TValidationRuleParamsPhone, - TValidationRuleParamsUrl, TValidationRuleType, TValidatorCheckResult, } from "@formbricks/types/surveys/validation-rules"; @@ -149,11 +146,7 @@ export const validators: Record = { } return { valid: validateEmail(value) }; }, - getDefaultMessage: ( - _params: TValidationRuleParamsEmail, - _element: TSurveyElement, - t: TFunction - ): string => { + getDefaultMessage: (_params: TValidationRuleParams, _element: TSurveyElement, t: TFunction): string => { return t("errors.please_enter_a_valid_email_address"); }, }, @@ -166,11 +159,7 @@ export const validators: Record = { } return { valid: validateUrl(value) }; }, - getDefaultMessage: ( - _params: TValidationRuleParamsUrl, - _element: TSurveyElement, - t: TFunction - ): string => { + getDefaultMessage: (_params: TValidationRuleParams, _element: TSurveyElement, t: TFunction): string => { return t("errors.please_enter_a_valid_url"); }, }, @@ -183,11 +172,7 @@ export const validators: Record = { } return { valid: validatePhone(value) }; }, - getDefaultMessage: ( - _params: TValidationRuleParamsPhone, - _element: TSurveyElement, - t: TFunction - ): string => { + getDefaultMessage: (_params: TValidationRuleParams, _element: TSurveyElement, t: TFunction): string => { return t("errors.please_enter_a_valid_phone_number"); }, }, diff --git a/packages/surveys/src/lib/validation/validators/validation-utils.test.ts b/packages/surveys/src/lib/validation/validators/validation-utils.test.ts index d58bbca335..d3e250d926 100644 --- a/packages/surveys/src/lib/validation/validators/validation-utils.test.ts +++ b/packages/surveys/src/lib/validation/validators/validation-utils.test.ts @@ -5,7 +5,7 @@ import { validateEmail, validatePhone, validateUrl } from "./validation-utils"; describe("Validation Logic Parity", () => { describe("Email Validation", () => { - const zodEmail = z.string().email(); + const zodEmail = z.email(); const testCases = [ "test@example.com", @@ -31,7 +31,7 @@ describe("Validation Logic Parity", () => { }); describe("URL Validation", () => { - const zodUrl = z.string().url(); + const zodUrl = z.url(); const testCases = [ "https://example.com", diff --git a/packages/types/action-classes.ts b/packages/types/action-classes.ts index 15164aec3f..939f395d03 100644 --- a/packages/types/action-classes.ts +++ b/packages/types/action-classes.ts @@ -30,7 +30,9 @@ const ZActionClassNoCodeConfigBase = z.object({ type: z.enum(["click", "pageView", "exitIntent", "fiftyPercentScroll"]), urlFilters: z.array( z.object({ - value: z.string().trim().min(1, { message: "Value must contain atleast 1 character" }), + value: z.string().trim().min(1, { + error: "Value must contain atleast 1 character", + }), rule: ZActionClassPageUrlRule, }) ), @@ -47,7 +49,7 @@ const ZActionClassNoCodeConfigClick = ZActionClassNoCodeConfigBase.extend({ .superRefine((data, ctx) => { if (!data.cssSelector && !data.innerHtml) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Either cssSelector or innerHtml must be provided`, }); } @@ -80,7 +82,7 @@ export const ZActionClassType = z.enum(["code", "noCode"]); export type TActionClassType = z.infer; export const ZActionClass = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), name: z.string().trim().min(1), description: z.string().nullable(), type: ZActionClassType, @@ -95,11 +97,17 @@ export type TActionClass = z.infer; const ZActionClassInputBase = z.object({ name: z - .string({ message: "Name is required" }) + .string({ + error: "Name is required", + }) .trim() - .min(1, { message: "Name must be at least 1 character long" }), + .min(1, { + error: "Name must be at least 1 character long", + }), description: z.string().nullish(), - environmentId: ZId.min(1, { message: "Environment ID cannot be empty" }), + environmentId: ZId.min(1, { + error: "Environment ID cannot be empty", + }), type: ZActionClassType, }); diff --git a/packages/types/activity.ts b/packages/types/activity.ts index 5e0ada7c5b..da0786d894 100644 --- a/packages/types/activity.ts +++ b/packages/types/activity.ts @@ -1,7 +1,7 @@ import { z } from "zod"; export const ZActivityFeedItem = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), type: z.enum(["event", "attribute", "display"]), createdAt: z.date(), updatedAt: z.date().nullable(), diff --git a/packages/types/api-key.ts b/packages/types/api-key.ts index 9e6731f0d5..a27876b1c7 100644 --- a/packages/types/api-key.ts +++ b/packages/types/api-key.ts @@ -24,7 +24,7 @@ const organizationAccessValues = Object.values(OrganizationAccess); export const ZOrganizationAccess = z.object( organizationAccessValues.reduce>>>( (acc, access) => { - acc[access] = z.object(organizationAccessTypeShape).strict(); + acc[access] = z.strictObject(organizationAccessTypeShape); return acc; }, {} diff --git a/packages/types/attributes.ts b/packages/types/attributes.ts index ec6891c0d0..089fbe14db 100644 --- a/packages/types/attributes.ts +++ b/packages/types/attributes.ts @@ -1,13 +1,13 @@ import { z } from "zod"; export const ZAttributeUpdateInput = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), userId: z.string(), - attributes: z.record(z.union([z.string(), z.number()])), + attributes: z.record(z.string(), z.union([z.string(), z.number()])), }); export type TAttributeUpdateInput = z.infer; // Attributes can be string or number (Date objects are converted to ISO strings by SDK) -export const ZAttributes = z.record(z.union([z.string(), z.number()])); +export const ZAttributes = z.record(z.string(), z.union([z.string(), z.number()])); export type TAttributes = z.infer; diff --git a/packages/types/auth.ts b/packages/types/auth.ts index 53f63b76cd..e75e94b298 100644 --- a/packages/types/auth.ts +++ b/packages/types/auth.ts @@ -9,10 +9,10 @@ export const ZAuthSession = z.object({ export const ZAPIKeyEnvironmentPermission = z.object({ environmentId: z.string(), - environmentType: z.nativeEnum(EnvironmentType), - projectId: z.string().cuid2(), + environmentType: z.enum(EnvironmentType), + projectId: z.cuid2(), projectName: z.string(), - permission: z.nativeEnum(ApiKeyPermission), + permission: z.enum(ApiKeyPermission), }); export type TAPIKeyEnvironmentPermission = z.infer; diff --git a/packages/types/common.ts b/packages/types/common.ts index 067d6ac6af..2721ccae3a 100644 --- a/packages/types/common.ts +++ b/packages/types/common.ts @@ -4,7 +4,7 @@ export const ZBoolean = z.boolean(); export const ZString = z.string(); -export const ZUrl = z.string().url(); +export const ZUrl = z.url(); /** * Schema for storage URLs that can be either: @@ -26,7 +26,9 @@ export const ZStorageUrl = z.string().refine( return false; } }, - { message: "Must be a valid URL or a relative storage path (/storage/...)" } + { + error: "Must be a valid URL or a relative storage path (/storage/...)", + } ); export const ZNumber = z.number(); @@ -47,9 +49,9 @@ export const ZOverlay = z.enum(["none", "light", "dark"]); export type TOverlay = z.infer; -export const ZId = z.string().cuid2(); +export const ZId = z.cuid2(); -export const ZUuid = z.string().uuid(); +export const ZUuid = z.uuid(); export const getZSafeUrl = z.string().superRefine((url, ctx) => { safeUrlRefinement(url, ctx); @@ -67,8 +69,8 @@ export const endingCardUrlRefinement = (url: string, ctx: z.RefinementCtx): void if (!trimmedUrl.startsWith("http://") && !trimmedUrl.startsWith("https://")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL must start with http:// or https://", + code: "custom", + error: "URL must start with http:// or https://", }); } }; @@ -76,24 +78,24 @@ export const endingCardUrlRefinement = (url: string, ctx: z.RefinementCtx): void export const safeUrlRefinement = (url: string, ctx: z.RefinementCtx): void => { if (url.includes(" ") || url.endsWith(" ") || url.startsWith(" ")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL must not contain spaces", + code: "custom", + error: "URL must not contain spaces", }); } // early recall check for better user feedback if (url.startsWith("#recall:")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL must not start with a recall value", + code: "custom", + error: "URL must not start with a recall value", }); } // Allow localhost for easy recall testing on self-hosted environments and mailto links if (!url.startsWith("https://") && !url.startsWith("http://localhost") && !url.startsWith("mailto:")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL must start with https:// or mailto:", + code: "custom", + error: "URL must start with https:// or mailto:", }); } @@ -103,15 +105,15 @@ export const safeUrlRefinement = (url: string, ctx: z.RefinementCtx): void => { const parsed = new URL(url); if (parsed.protocol !== "mailto:") { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Invalid mailto URL format", + code: "custom", + error: "Invalid mailto URL format", }); return; } } catch { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Invalid mailto URL format", + code: "custom", + error: "Invalid mailto URL format", }); } return; @@ -124,8 +126,8 @@ export const safeUrlRefinement = (url: string, ctx: z.RefinementCtx): void => { // Check if recall information appears in the hostname (not allowed) if (hostname.includes("#recall:")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Recall information must appear after the domain, not within it", + code: "custom", + error: "Recall information must appear after the domain, not within it", }); return; } @@ -134,8 +136,8 @@ export const safeUrlRefinement = (url: string, ctx: z.RefinementCtx): void => { if (hostname) { const addIssue = (): void => { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL is not valid", + code: "custom", + error: "URL is not valid", }); }; @@ -220,10 +222,10 @@ export const safeUrlRefinement = (url: string, ctx: z.RefinementCtx): void => { } } catch { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "URL is not valid", + code: "custom", + error: "URL is not valid", }); } }; -export const ZEmail = z.string().email(); +export const ZEmail = z.email(); diff --git a/packages/types/contact-attribute-key.ts b/packages/types/contact-attribute-key.ts index 63cb188187..3a1a2af2d8 100644 --- a/packages/types/contact-attribute-key.ts +++ b/packages/types/contact-attribute-key.ts @@ -9,15 +9,15 @@ export const ZContactAttributeDataType = z.enum(["string", "number", "date"]); export type TContactAttributeDataType = z.infer; export const ZContactAttributeKey = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - isUnique: z.boolean().default(false), + isUnique: z.boolean().prefault(false), key: z.string(), name: z.string().nullable(), description: z.string().nullable(), type: ZContactAttributeKeyType, - dataType: ZContactAttributeDataType.default("string"), + dataType: ZContactAttributeDataType.prefault("string"), environmentId: z.string(), }); diff --git a/packages/types/contact-attribute.ts b/packages/types/contact-attribute.ts index 238defb2af..1b603881bd 100644 --- a/packages/types/contact-attribute.ts +++ b/packages/types/contact-attribute.ts @@ -13,8 +13,8 @@ export const ZContactAttribute = z.object({ }); export type TContactAttribute = z.infer; -export const ZContactAttributes = z.record(z.string()); +export const ZContactAttributes = z.record(z.string(), z.string()); export type TContactAttributes = z.infer; -export const ZContactAttributesInput = z.record(z.union([z.string(), z.number(), z.boolean()])); +export const ZContactAttributesInput = z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])); export type TContactAttributesInput = z.infer; diff --git a/packages/types/displays.ts b/packages/types/displays.ts index 734570b7df..95c5195357 100644 --- a/packages/types/displays.ts +++ b/packages/types/displays.ts @@ -1,25 +1,25 @@ import { z } from "zod"; export const ZDisplay = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - contactId: z.string().cuid().nullable(), - surveyId: z.string().cuid(), + contactId: z.cuid().nullable(), + surveyId: z.cuid(), }); export type TDisplay = z.infer; export const ZDisplayCreateInput = z.object({ - environmentId: z.string().cuid2(), - surveyId: z.string().cuid2(), + environmentId: z.cuid2(), + surveyId: z.cuid2(), userId: z .string() .max(255, { - message: "User ID cannot exceed 255 characters", + error: "User ID cannot exceed 255 characters", }) .optional(), - responseId: z.string().cuid2().optional(), + responseId: z.cuid2().optional(), }); export type TDisplayCreateInput = z.infer; @@ -31,19 +31,19 @@ export const ZDisplayFilters = z.object({ max: z.date().optional(), }) .optional(), - responseIds: z.array(z.string().cuid2()).optional(), + responseIds: z.array(z.cuid2()).optional(), }); export type TDisplayFilters = z.infer; export const ZDisplayWithContact = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), surveyId: z.string(), contact: z .object({ id: z.string(), - attributes: z.record(z.string()), + attributes: z.record(z.string(), z.string()), }) .nullable(), }); diff --git a/packages/types/environment.ts b/packages/types/environment.ts index 9927201502..5af3b0730a 100644 --- a/packages/types/environment.ts +++ b/packages/types/environment.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -export const ZEnvironmentId = z.string().cuid(); +export const ZEnvironmentId = z.cuid(); export type TEnvironmentId = z.infer; diff --git a/packages/types/errors.ts b/packages/types/errors.ts index f85dcfb703..a083ea8a15 100644 --- a/packages/types/errors.ts +++ b/packages/types/errors.ts @@ -111,7 +111,7 @@ interface ForbiddenError { details?: Record; } -export const ZErrorHandler = z.function().args(z.any()).returns(z.void()); +export const ZErrorHandler = z.function({ input: [z.any()], output: z.void() }); export { ResourceNotFoundError, diff --git a/packages/types/i18n.ts b/packages/types/i18n.ts index 183b8f681d..f16a613a64 100644 --- a/packages/types/i18n.ts +++ b/packages/types/i18n.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -export const ZI18nString = z.record(z.string()).refine((obj) => "default" in obj, { - message: "I18n string must have a 'default' key", +export const ZI18nString = z.record(z.string(), z.string()).refine((obj) => "default" in obj, { + error: "I18n string must have a 'default' key", }); export type TI18nString = z.infer; diff --git a/packages/types/integration/airtable.ts b/packages/types/integration/airtable.ts index a9518406d4..74c889b4c9 100644 --- a/packages/types/integration/airtable.ts +++ b/packages/types/integration/airtable.ts @@ -15,14 +15,14 @@ export const ZIntegrationAirtableConfigData = z baseId: z.string(), tableName: z.string(), }) - .merge(ZIntegrationBaseSurveyData); + .extend(ZIntegrationBaseSurveyData.shape); export type TIntegrationAirtableConfigData = z.infer; export const ZIntegrationAirtableConfig = z.object({ key: ZIntegrationAirtableCredential, data: z.array(ZIntegrationAirtableConfigData), - email: z.string().email(), + email: z.email(), }); export type TIntegrationAirtableConfig = z.infer; diff --git a/packages/types/integration/google-sheet.ts b/packages/types/integration/google-sheet.ts index 28579fc05a..e2c344c1f4 100644 --- a/packages/types/integration/google-sheet.ts +++ b/packages/types/integration/google-sheet.ts @@ -16,14 +16,14 @@ export const ZIntegrationGoogleSheetsConfigData = z spreadsheetId: z.string(), spreadsheetName: z.string(), }) - .merge(ZIntegrationBaseSurveyData); + .extend(ZIntegrationBaseSurveyData.shape); export type TIntegrationGoogleSheetsConfigData = z.infer; export const ZIntegrationGoogleSheetsConfig = z.object({ key: ZGoogleCredential, data: z.array(ZIntegrationGoogleSheetsConfigData), - email: z.string().email(), + email: z.email(), }); export type TIntegrationGoogleSheetsConfig = z.infer; diff --git a/packages/types/integration/notion.ts b/packages/types/integration/notion.ts index 5b570a0826..a3be42807f 100644 --- a/packages/types/integration/notion.ts +++ b/packages/types/integration/notion.ts @@ -17,7 +17,7 @@ export const ZIntegrationNotionCredential = z.object({ object: z.string(), person: z .object({ - email: z.string().email(), + email: z.email(), }) .nullish(), avatar_url: z.string().nullish(), @@ -51,11 +51,11 @@ export const ZIntegrationNotionConfigData = z databaseId: z.string(), databaseName: z.string(), }) - .merge( + .extend( ZIntegrationBaseSurveyData.omit({ elementIds: true, elements: true, - }) + }).shape ); export type TIntegrationNotionConfigData = z.infer; diff --git a/packages/types/integration/slack.ts b/packages/types/integration/slack.ts index bfcc74d23c..fbef3e860d 100644 --- a/packages/types/integration/slack.ts +++ b/packages/types/integration/slack.ts @@ -7,7 +7,7 @@ export const ZIntegrationSlackConfigData = z channelId: z.string(), channelName: z.string(), }) - .merge(ZIntegrationBaseSurveyData); + .extend(ZIntegrationBaseSurveyData.shape); export type TIntegrationSlackConfigData = z.infer; diff --git a/packages/types/js.ts b/packages/types/js.ts index 9fb2096bf2..44d99eff9b 100644 --- a/packages/types/js.ts +++ b/packages/types/js.ts @@ -5,36 +5,36 @@ import { ZId } from "./common"; import { ZProject } from "./project"; import { ZResponseHiddenFieldValue, ZResponseUpdate } from "./responses"; import { ZUploadFileConfig } from "./storage"; -import { ZSurvey } from "./surveys/types"; +import { ZSurveyBase, surveyRefinement } from "./surveys/types"; -export const ZJsEnvironmentStateSurvey = ZSurvey.innerType() - .pick({ - id: true, - name: true, - welcomeCard: true, - questions: true, - blocks: true, - variables: true, - type: true, - showLanguageSwitch: true, - languages: true, - endings: true, - autoClose: true, - styling: true, - status: true, - segment: true, - recontactDays: true, - displayLimit: true, - displayOption: true, - hiddenFields: true, - triggers: true, - displayPercentage: true, - delay: true, - projectOverwrites: true, - isBackButtonHidden: true, - recaptcha: true, - }) - .superRefine(ZSurvey._def.effect.type === "refinement" ? ZSurvey._def.effect.refinement : () => null); +export const ZJsEnvironmentStateSurvey = ZSurveyBase.pick({ + id: true, + name: true, + welcomeCard: true, + questions: true, + blocks: true, + variables: true, + type: true, + showLanguageSwitch: true, + languages: true, + endings: true, + autoClose: true, + styling: true, + status: true, + segment: true, + recontactDays: true, + displayLimit: true, + displayOption: true, + hiddenFields: true, + triggers: true, + displayPercentage: true, + delay: true, + projectOverwrites: true, + isBackButtonHidden: true, + recaptcha: true, +}).superRefine((survey, ctx) => { + surveyRefinement(survey as z.infer, ctx); +}); export type TJsEnvironmentStateSurvey = z.infer; @@ -73,7 +73,7 @@ export const ZJsEnvironmentState = z.object({ export type TJsEnvironmentState = z.infer; export const ZJsSyncInput = z.object({ - environmentId: z.string().cuid(), + environmentId: z.cuid(), }); export type TJsSyncInput = z.infer; @@ -99,14 +99,14 @@ export const ZJsPersonState = z.object({ export type TJsPersonState = z.infer; export const ZJsUserIdentifyInput = z.object({ - environmentId: z.string().cuid(), + environmentId: z.cuid(), userId: z.string().max(255), }); export type TJsPersonIdentifyInput = z.infer; export const ZJsPeopleUserIdInput = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), userId: z.string().min(1).max(255), }); @@ -126,7 +126,7 @@ export const ZJsPeopleAttributeInput = z.object({ export type TJsPeopleAttributeInput = z.infer; export const ZJsActionInput = z.object({ - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), userId: z.string().optional(), name: z.string(), }); @@ -138,7 +138,7 @@ export const ZJsWesbiteActionInput = ZJsActionInput.omit({ userId: true }); export type TJsWesbiteActionInput = z.infer; export const ZJsEnvironmentSyncParams = z.object({ - environmentId: z.string().cuid(), + environmentId: z.cuid(), apiHost: z.string(), }); diff --git a/packages/types/memberships.ts b/packages/types/memberships.ts index 8fa830298f..1bfe453a47 100644 --- a/packages/types/memberships.ts +++ b/packages/types/memberships.ts @@ -17,7 +17,7 @@ export type TMembership = z.infer; export const ZMember = z.object({ name: z.string().nullable(), - email: z.string().email(), + email: z.email(), userId: z.string(), accepted: z.boolean(), role: ZOrganizationRole, diff --git a/packages/types/organizations.ts b/packages/types/organizations.ts index a0c486aead..6142e45fc5 100644 --- a/packages/types/organizations.ts +++ b/packages/types/organizations.ts @@ -20,9 +20,9 @@ export type TOrganizationBillingPlanLimits = z.infer; export const ZOrganization = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - name: z.string({ message: "Organization name is required" }).trim().min(1, { - message: "Organization name must be at least 1 character long", - }), + name: z + .string({ + error: "Organization name is required", + }) + .trim() + .min(1, { + error: "Organization name must be at least 1 character long", + }), whitelabel: ZOrganizationWhitelabel.optional(), billing: ZOrganizationBilling, - isAIEnabled: z.boolean().default(false), + isAIEnabled: z.boolean().prefault(false), }); export const ZOrganizationCreateInput = z.object({ - id: z.string().cuid2().optional(), + id: z.cuid2().optional(), name: z.string(), }); diff --git a/packages/types/package.json b/packages/types/package.json index 56c26f67df..7cb5944803 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -9,9 +9,9 @@ "clean": "rimraf node_modules .turbo" }, "dependencies": { - "@prisma/client": "6.19.2", - "zod": "3.25.76", - "zod-openapi": "4.2.4", + "@prisma/client": "7.4.2", + "zod": "4.3.6", + "zod-openapi": "5.4.6", "node-html-parser": "7.1.0" }, "devDependencies": { diff --git a/packages/types/people.ts b/packages/types/people.ts index ac5b95416f..4769f2c4fa 100644 --- a/packages/types/people.ts +++ b/packages/types/people.ts @@ -2,10 +2,10 @@ import { z } from "zod"; import { ZAttributes } from "./attributes"; export const ZPerson = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), }); export const ZPersonTableData = z.object({ diff --git a/packages/types/project.ts b/packages/types/project.ts index d33ab65bab..ff61c66b23 100644 --- a/packages/types/project.ts +++ b/packages/types/project.ts @@ -26,12 +26,12 @@ export const ZProjectConfig = z.object({ export type TProjectConfig = z.infer; export const ZLanguage = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), code: z.string(), alias: z.string().nullable(), - projectId: z.string().cuid2(), + projectId: z.cuid2(), }); export type TLanguage = z.infer; @@ -49,17 +49,22 @@ export type TLanguageUpdate = z.infer; export type TLogo = z.infer; export const ZProject = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - name: z.string().trim().min(1, { message: "Project name cannot be empty" }), + name: z.string().trim().min(1, { + error: "Project name cannot be empty", + }), organizationId: z.string(), styling: ZProjectStyling, recontactDays: z - .number({ message: "Recontact days is required" }) .int() - .min(0, { message: "Must be a positive number" }) - .max(365, { message: "Must be less than 365" }), + .min(0, { + error: "Must be a positive number", + }) + .max(365, { + error: "Must be less than 365", + }), inAppSurveyBranding: z.boolean(), linkSurveyBranding: z.boolean(), config: ZProjectConfig, @@ -75,10 +80,16 @@ export const ZProject = z.object({ export type TProject = z.infer; export const ZProjectUpdateInput = z.object({ - name: z.string().trim().min(1, { message: "Workspace name cannot be empty" }).optional(), + name: z + .string() + .trim() + .min(1, { + error: "Workspace name cannot be empty", + }) + .optional(), organizationId: z.string().optional(), highlightBorderColor: ZColor.nullish(), - recontactDays: z.number().int().optional(), + recontactDays: z.int().optional(), inAppSurveyBranding: z.boolean().optional(), linkSurveyBranding: z.boolean().optional(), config: ZProjectConfig.optional(), diff --git a/packages/types/quota.ts b/packages/types/quota.ts index 92fe35775c..742137dd2f 100644 --- a/packages/types/quota.ts +++ b/packages/types/quota.ts @@ -24,8 +24,12 @@ export const ZSurveyQuota = z.object({ createdAt: z.date(), updatedAt: z.date(), surveyId: ZId, - name: z.string().min(1, { message: "Quota name is required" }), - limit: z.number().min(1, { message: "Limit must be greater than 0" }), + name: z.string().min(1, { + error: "Quota name is required", + }), + limit: z.number().min(1, { + error: "Limit must be greater than 0", + }), logic: ZSurveyQuotaLogic, action: ZSurveyQuotaAction, endingCardId: ZId.nullable(), @@ -41,7 +45,7 @@ export const ZSurveyQuotaInput = ZSurveyQuota.omit({ // Validate ending card when action is endSurvey if (data.action === "endSurvey" && (data.endingCardId === null || data.endingCardId === "")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", path: ["action"], message: "endingCardId is required when action is endSurvey", }); diff --git a/packages/types/responses.ts b/packages/types/responses.ts index c9b5027283..057a1a65c4 100644 --- a/packages/types/responses.ts +++ b/packages/types/responses.ts @@ -5,7 +5,7 @@ import { ZSurvey } from "./surveys/types"; import { ZTag } from "./tags"; export const ZResponseDataValue = z - .union([z.string(), z.number(), z.array(z.string()), z.record(z.string())]) + .union([z.string(), z.number(), z.array(z.string()), z.record(z.string(), z.string())]) .optional(); export const ZResponseFilterCondition = z.enum([ @@ -39,100 +39,100 @@ export const ZResponseFilterCondition = z.enum([ export type TResponseDataValue = z.infer; -export const ZResponseData = z.record(ZResponseDataValue); +export const ZResponseData = z.record(z.string(), ZResponseDataValue); export type TResponseData = z.infer; -export const ZResponseVariables = z.record(z.union([z.string(), z.number()])); +export const ZResponseVariables = z.record(z.string(), z.union([z.string(), z.number()])); export type TResponseVariables = z.infer; -export const ZResponseTtc = z.record(z.number()); +export const ZResponseTtc = z.record(z.string(), z.number()); export type TResponseTtc = z.infer; -export const ZResponseContactAttributes = z.record(z.string()).nullable(); +export const ZResponseContactAttributes = z.record(z.string(), z.string()).nullable(); export type TResponseContactAttributes = z.infer; -export const ZSurveyContactAttributes = z.record(z.array(z.string())); +export const ZSurveyContactAttributes = z.record(z.string(), z.array(z.string())); export type TSurveyContactAttributes = z.infer; -export const ZSurveyMetaFieldFilter = z.record(z.array(z.string())); +export const ZSurveyMetaFieldFilter = z.record(z.string(), z.array(z.string())); export type TSurveyMetaFieldFilter = z.infer; -export const ZResponseHiddenFieldsFilter = z.record(z.array(z.string())); +export const ZResponseHiddenFieldsFilter = z.record(z.string(), z.array(z.string())); export type TResponseHiddenFieldsFilter = z.infer; const ZResponseFilterCriteriaDataLessThan = z.object({ - op: z.literal(ZResponseFilterCondition.Values.lessThan), + op: z.literal(ZResponseFilterCondition.enum.lessThan), value: z.number(), }); const ZResponseFilterCriteriaDataLessEqual = z.object({ - op: z.literal(ZResponseFilterCondition.Values.lessEqual), + op: z.literal(ZResponseFilterCondition.enum.lessEqual), value: z.number(), }); const ZResponseFilterCriteriaDataGreaterEqual = z.object({ - op: z.literal(ZResponseFilterCondition.Values.greaterEqual), + op: z.literal(ZResponseFilterCondition.enum.greaterEqual), value: z.number(), }); const ZResponseFilterCriteriaDataGreaterThan = z.object({ - op: z.literal(ZResponseFilterCondition.Values.greaterThan), + op: z.literal(ZResponseFilterCondition.enum.greaterThan), value: z.number(), }); const ZResponseFilterCriteriaDataIncludesOne = z.object({ - op: z.literal(ZResponseFilterCondition.Values.includesOne), + op: z.literal(ZResponseFilterCondition.enum.includesOne), value: z.union([z.array(z.string()), z.array(z.number())]), }); const ZResponseFilterCriteriaDataIncludesAll = z.object({ - op: z.literal(ZResponseFilterCondition.Values.includesAll), + op: z.literal(ZResponseFilterCondition.enum.includesAll), value: z.array(z.string()), }); const ZResponseFilterCriteriaDataEquals = z.object({ - op: z.literal(ZResponseFilterCondition.Values.equals), + op: z.literal(ZResponseFilterCondition.enum.equals), value: z.union([z.string(), z.number()]), }); const ZResponseFilterCriteriaDataNotEquals = z.object({ - op: z.literal(ZResponseFilterCondition.Values.notEquals), + op: z.literal(ZResponseFilterCondition.enum.notEquals), value: z.union([z.string(), z.number()]), }); const ZResponseFilterCriteriaDataAccepted = z.object({ - op: z.literal(ZResponseFilterCondition.Values.accepted), + op: z.literal(ZResponseFilterCondition.enum.accepted), }); const ZResponseFilterCriteriaDataClicked = z.object({ - op: z.literal(ZResponseFilterCondition.Values.clicked), + op: z.literal(ZResponseFilterCondition.enum.clicked), }); const ZResponseFilterCriteriaDataSubmitted = z.object({ - op: z.literal(ZResponseFilterCondition.Values.submitted), + op: z.literal(ZResponseFilterCondition.enum.submitted), }); const ZResponseFilterCriteriaDataSkipped = z.object({ - op: z.literal(ZResponseFilterCondition.Values.skipped), + op: z.literal(ZResponseFilterCondition.enum.skipped), }); const ZResponseFilterCriteriaDataUploaded = z.object({ - op: z.literal(ZResponseFilterCondition.Values.uploaded), + op: z.literal(ZResponseFilterCondition.enum.uploaded), }); const ZResponseFilterCriteriaDataNotUploaded = z.object({ - op: z.literal(ZResponseFilterCondition.Values.notUploaded), + op: z.literal(ZResponseFilterCondition.enum.notUploaded), }); const ZResponseFilterCriteriaDataBooked = z.object({ - op: z.literal(ZResponseFilterCondition.Values.booked), + op: z.literal(ZResponseFilterCondition.enum.booked), }); const ZResponseFilterCriteriaMatrix = z.object({ @@ -141,45 +141,45 @@ const ZResponseFilterCriteriaMatrix = z.object({ }); const ZResponseFilterCriteriaIsEmpty = z.object({ - op: z.literal(ZResponseFilterCondition.Values.isEmpty), + op: z.literal(ZResponseFilterCondition.enum.isEmpty), }); const ZResponseFilterCriteriaIsNotEmpty = z.object({ - op: z.literal(ZResponseFilterCondition.Values.isNotEmpty), + op: z.literal(ZResponseFilterCondition.enum.isNotEmpty), }); const ZResponseFilterCriteriaIsAnyOf = z.object({ - op: z.literal(ZResponseFilterCondition.Values.isAnyOf), + op: z.literal(ZResponseFilterCondition.enum.isAnyOf), value: z.record(z.string(), z.array(z.string())), }); const ZResponseFilterCriteriaContains = z.object({ - op: z.literal(ZResponseFilterCondition.Values.contains), + op: z.literal(ZResponseFilterCondition.enum.contains), value: z.string(), }); const ZResponseFilterCriteriaDoesNotContain = z.object({ - op: z.literal(ZResponseFilterCondition.Values.doesNotContain), + op: z.literal(ZResponseFilterCondition.enum.doesNotContain), value: z.string(), }); const ZResponseFilterCriteriaStartsWith = z.object({ - op: z.literal(ZResponseFilterCondition.Values.startsWith), + op: z.literal(ZResponseFilterCondition.enum.startsWith), value: z.string(), }); const ZResponseFilterCriteriaDoesNotStartWith = z.object({ - op: z.literal(ZResponseFilterCondition.Values.doesNotStartWith), + op: z.literal(ZResponseFilterCondition.enum.doesNotStartWith), value: z.string(), }); const ZResponseFilterCriteriaEndsWith = z.object({ - op: z.literal(ZResponseFilterCondition.Values.endsWith), + op: z.literal(ZResponseFilterCondition.enum.endsWith), value: z.string(), }); const ZResponseFilterCriteriaDoesNotEndWith = z.object({ - op: z.literal(ZResponseFilterCondition.Values.doesNotEndWith), + op: z.literal(ZResponseFilterCondition.enum.doesNotEndWith), value: z.string(), }); @@ -211,6 +211,7 @@ export const ZResponseFilterCriteria = z.object({ contactAttributes: z .record( + z.string(), z.object({ op: z.enum(["equals", "notEquals"]), value: z.union([z.string(), z.number()]), @@ -220,6 +221,7 @@ export const ZResponseFilterCriteria = z.object({ data: z .record( + z.string(), z.union([ ZResponseFilterCriteriaDataLessThan, ZResponseFilterCriteriaDataLessEqual, @@ -254,6 +256,7 @@ export const ZResponseFilterCriteria = z.object({ others: z .record( + z.string(), z.object({ op: z.enum(["equals", "notEquals"]), value: z.union([z.string(), z.number()]), @@ -263,6 +266,7 @@ export const ZResponseFilterCriteria = z.object({ meta: z .record( + z.string(), z.union([ ZResponseFilterCriteriaDataEquals, ZResponseFilterCriteriaDataNotEquals, @@ -315,10 +319,10 @@ export const ZResponseMeta = z.object({ export type TResponseMeta = z.infer; export const ZResponse = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), - surveyId: z.string().cuid2(), + surveyId: z.cuid2(), displayId: z.string().nullish(), contact: ZResponseContact.nullable(), contactAttributes: ZResponseContactAttributes, @@ -338,8 +342,8 @@ export type TResponse = z.infer; export const ZResponseInput = z.object({ createdAt: z.coerce.date().optional(), updatedAt: z.coerce.date().optional(), - environmentId: z.string().cuid2(), - surveyId: z.string().cuid2(), + environmentId: z.cuid2(), + surveyId: z.cuid2(), userId: z.string().nullish(), displayId: z.string().nullish(), singleUseId: z.string().nullable().optional(), @@ -386,7 +390,10 @@ export const ZResponseWithSurvey = ZResponse.extend({ export type TResponseWithSurvey = z.infer; -export const ZResponseHiddenFieldValue = z.record(z.union([z.string(), z.number(), z.array(z.string())])); +export const ZResponseHiddenFieldValue = z.record( + z.string(), + z.union([z.string(), z.number(), z.array(z.string())]) +); export type TResponseHiddenFieldValue = z.infer; export const ZResponseUpdate = z.object({ @@ -418,7 +425,7 @@ export const ZResponseTableData = z.object({ tags: z.array(ZTag), language: z.string().nullable(), responseData: ZResponseData, - variables: z.record(z.union([z.string(), z.number()])), + variables: z.record(z.string(), z.union([z.string(), z.number()])), person: ZResponseContact.nullable(), contactAttributes: ZResponseContactAttributes, meta: ZResponseMeta, diff --git a/packages/types/segment.ts b/packages/types/segment.ts index 7e1749b6af..0a08080340 100644 --- a/packages/types/segment.ts +++ b/packages/types/segment.ts @@ -123,7 +123,7 @@ export type TSegmentFilterValue = z.infer; // Each filter has a qualifier, which usually contains the operator for evaluating the filter. // Attribute filter -> root will always have type "attribute" export const ZSegmentAttributeFilter = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), root: z.object({ type: z.literal("attribute"), contactAttributeKey: z.string(), @@ -137,7 +137,7 @@ export type TSegmentAttributeFilter = z.infer; // Person filter -> root will always have type "person" export const ZSegmentPersonFilter = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), root: z.object({ type: z.literal("person"), personIdentifier: z.string(), @@ -151,7 +151,7 @@ export type TSegmentPersonFilter = z.infer; // Segment filter -> root will always have type "segment" export const ZSegmentSegmentFilter = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), root: z.object({ type: z.literal("segment"), segmentId: z.string(), @@ -165,7 +165,7 @@ export type TSegmentSegmentFilter = z.infer; // Device filter -> root will always have type "device" export const ZSegmentDeviceFilter = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), root: z.object({ type: z.literal("device"), deviceType: z.string(), @@ -226,7 +226,7 @@ export const ZSegmentFilter = z return true; }, { - message: + error: "Value must be a string for string operators, a number for arithmetic operators, and an object for relative date operators", } ) @@ -272,7 +272,7 @@ export const ZSegmentFilter = z return true; }, { - message: "Invalid value for filters: please check your filter values", + error: "Invalid value for filters: please check your filter values", } ); @@ -292,7 +292,7 @@ export type TBaseFilters = TBaseFilter[]; export const ZBaseFilter: z.ZodType = z.lazy(() => z.object({ - id: z.string().cuid2(), + id: z.cuid2(), connector: ZSegmentConnector, resource: z.union([ZSegmentFilter, ZBaseFilters]), }) @@ -326,20 +326,20 @@ const refineFilters = (filters: TBaseFilters): boolean => { export const ZSegmentFilters: z.ZodType = z .array( z.object({ - id: z.string().cuid2(), + id: z.cuid2(), connector: ZSegmentConnector, resource: z.union([ZSegmentFilter, z.lazy(() => ZSegmentFilters)]), }) ) .refine(refineFilters, { - message: "Invalid filters applied", + error: "Invalid filters applied", }); export const ZSegment = z.object({ id: z.string(), title: z.string(), description: z.string().nullable(), - isPrivate: z.boolean().default(true), + isPrivate: z.boolean().prefault(true), filters: ZSegmentFilters, environmentId: z.string(), createdAt: z.date(), @@ -351,7 +351,7 @@ export const ZSegmentCreateInput = z.object({ environmentId: z.string(), title: z.string(), description: z.string().optional(), - isPrivate: z.boolean().default(true), + isPrivate: z.boolean().prefault(true), filters: ZSegmentFilters, surveyId: z.string(), }); @@ -368,7 +368,7 @@ export const ZSegmentUpdateInput = z .object({ title: z.string(), description: z.string().nullable(), - isPrivate: z.boolean().default(true), + isPrivate: z.boolean().prefault(true), filters: ZSegmentFilters, surveys: z.array(z.string()), }) diff --git a/packages/types/storage.ts b/packages/types/storage.ts index 4d3295c6d0..9e8e55059d 100644 --- a/packages/types/storage.ts +++ b/packages/types/storage.ts @@ -86,10 +86,10 @@ export const ZDownloadFileRequest = z.object({ return true; }, { - message: "File name must have an extension", + error: "File name must have an extension", } ), - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), accessType: ZAccessType, }); @@ -107,8 +107,8 @@ export const ZUploadPrivateFileRequest = z fileName: z.string().trim().min(1), fileType: z.string().trim().min(1), allowedFileExtensions: z.array(ZAllowedFileExtension).optional(), - surveyId: z.string().cuid2(), - environmentId: z.string().cuid2(), + surveyId: z.cuid2(), + environmentId: z.cuid2(), }) .superRefine((data, ctx) => { refineFileUploadInput({ @@ -134,7 +134,7 @@ export const ZUploadFileResponse = z.object({ uuid: z.string(), }) .nullable(), - presignedFields: z.record(z.string()).optional(), + presignedFields: z.record(z.string(), z.string()).optional(), updatedFileName: z.string(), }), }); @@ -145,7 +145,7 @@ export const ZUploadPublicFileRequest = z .object({ fileName: z.string().trim().min(1), fileType: z.string().trim().min(1), - environmentId: z.string().cuid2(), + environmentId: z.cuid2(), allowedFileExtensions: z.array(ZAllowedFileExtension).optional(), }) .superRefine((data, ctx) => { @@ -176,7 +176,7 @@ const refineFileUploadInput = ({ if (!fileExtension || fileExtension.toLowerCase() === data.fileName.toLowerCase()) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "File name must have an extension", path: ["fileName"], }); @@ -188,7 +188,7 @@ const refineFileUploadInput = ({ if (!success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "File extension is not allowed for security reasons", path: ["fileName"], }); @@ -199,7 +199,7 @@ const refineFileUploadInput = ({ const normalizedFileType = data.fileType.toLowerCase().split(";")[0]; // removes parameters from fileType like "image/jpeg; charset=binary" if (normalizedFileType !== mimeTypes[fileExtension]) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "File type doesn't match the file extension", path: ["fileType"], }); @@ -210,7 +210,7 @@ const refineFileUploadInput = ({ if (data.allowedFileExtensions?.length) { if (!data.allowedFileExtensions.includes(fileExtension)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `File extension is not allowed, allowed extensions are: ${data.allowedFileExtensions.join(", ")}`, path: ["fileName"], }); diff --git a/packages/types/styling.ts b/packages/types/styling.ts index 63358e5d4e..f475f8d346 100644 --- a/packages/types/styling.ts +++ b/packages/types/styling.ts @@ -35,7 +35,9 @@ export const ZSurveyStylingBackground = z return true; }, - { message: "Invalid background" } + { + error: "Invalid background", + } ); export type TSurveyStylingBackground = z.infer; diff --git a/packages/types/surveys/blocks.ts b/packages/types/surveys/blocks.ts index f108baf814..68d26d3dbf 100644 --- a/packages/types/surveys/blocks.ts +++ b/packages/types/surveys/blocks.ts @@ -24,7 +24,9 @@ export const ZActionCalculateText = ZActionCalculateBase.extend({ z.object({ type: z.literal("static"), value: z - .string({ message: "Conditional Logic: Value must be a string for text variable" }) + .string({ + error: "Conditional Logic: Value must be a string for text variable", + }) .min(1, "Conditional Logic: Please enter a value in logic field"), }), ZDynamicLogicFieldValue, @@ -36,14 +38,16 @@ export const ZActionCalculateNumber = ZActionCalculateBase.extend({ value: z.union([ z.object({ type: z.literal("static"), - value: z.number({ message: "Conditional Logic: Value must be a number for number variable" }), + value: z.number({ + error: "Conditional Logic: Value must be a number for number variable", + }), }), ZDynamicLogicFieldValue, ]), }).superRefine((val, ctx) => { if (val.operator === "divide" && val.value.type === "static" && val.value.value === 0) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Conditional Logic: Cannot divide by zero", path: ["value", "value"], }); @@ -68,7 +72,7 @@ export const ZActionRequireAnswer = z.object({ const idParsed = ZSurveyElementId.safeParse(id); if (!idParsed.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", // This is not possible from the UI hence we can use the term "element" instead of "question" message: "Conditional Logic: Target element id is not a valid element id", path: ["target"], @@ -91,7 +95,7 @@ export const ZActionJumpToBlock = z.object({ const idParsed = ZSurveyBlockId.safeParse(id); if (!idParsed.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Conditional Logic: Target block id is not a valid block id", }); } @@ -120,8 +124,12 @@ export type TSurveyBlockLogic = z.infer; export const ZSurveyBlock = z .object({ id: ZSurveyBlockId, // CUID - name: z.string().min(1, { message: "Block name is required" }), // REQUIRED for editor - elements: ZSurveyElements.min(1, { message: "Block must have at least one element" }), + name: z.string().min(1, { + error: "Block name is required", + }), // REQUIRED for editor + elements: ZSurveyElements.min(1, { + error: "Block must have at least one element", + }), logic: z.array(ZSurveyBlockLogic).optional(), logicFallback: ZSurveyBlockId.optional(), buttonLabel: ZI18nString.optional(), @@ -133,7 +141,7 @@ export const ZSurveyBlock = z const uniqueElementIds = new Set(elementIds); if (uniqueElementIds.size !== elementIds.length) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Element IDs must be unique within a block", path: [elementIds.findIndex((id, index) => elementIds.indexOf(id) !== index), "id"], }); diff --git a/packages/types/surveys/elements-validation.ts b/packages/types/surveys/elements-validation.ts index 11bf989878..21ec9a40d1 100644 --- a/packages/types/surveys/elements-validation.ts +++ b/packages/types/surveys/elements-validation.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import type { IssueData } from "zod"; import type { TI18nString } from "../i18n"; import type { TSurveyLanguage } from "./types"; import { getTextContent } from "./validation"; @@ -51,7 +51,7 @@ export const validateElementLabels = ( blockIndex: number, elementIndex: number, skipArticle = false -): z.IssueData | null => { +): IssueData | null => { // fieldLabel should contain all the keys present in languages for (const language of languages) { if ( @@ -60,7 +60,8 @@ export const validateElementLabels = ( fieldLabel[language.language.code] === undefined ) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message: `The ${field} in question ${String(elementIndex + 1)} of block ${String(blockIndex + 1)} is not present for the following languages: ${language.language.code}`, path: ["blocks", blockIndex, "elements", elementIndex, field], }; @@ -80,7 +81,8 @@ export const validateElementLabels = ( if (invalidLanguageCodes.length) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message, path: ["blocks", blockIndex, "elements", elementIndex, field], params: isDefaultOnly ? undefined : { invalidLanguageCodes }, diff --git a/packages/types/surveys/elements.ts b/packages/types/surveys/elements.ts index ea1f415e23..383185ce1f 100644 --- a/packages/types/surveys/elements.ts +++ b/packages/types/surveys/elements.ts @@ -21,21 +21,21 @@ export { TSurveyElementTypeEnum }; export const ZSurveyElementId = z.string().superRefine((id, ctx) => { if (FORBIDDEN_IDS.includes(id)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Element id is not allowed`, }); } if (id.includes(" ")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Element id not allowed, avoid using spaces.", }); } if (!/^[a-zA-Z0-9_-]+$/.test(id)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Element id not allowed, use only alphanumeric characters, hyphens, or underscores.", }); } @@ -51,14 +51,14 @@ export type TValidationLogic = z.infer; // Uses general TValidationRule[] type instead of element-specific narrowed types export const ZValidation = z.object({ rules: ZValidationRules, - logic: ZValidationLogic.default("and"), + logic: ZValidationLogic.prefault("and"), }); // Base element (like ZSurveyQuestionBase but WITHOUT logic, buttonLabel, backButtonLabel) // Note: validation is not included in base - each element type will add its own narrowed schema export const ZSurveyElementBase = z.object({ id: ZSurveyElementId, - type: z.nativeEnum(TSurveyElementTypeEnum), + type: z.enum(TSurveyElementTypeEnum), headline: ZI18nString, subheader: ZI18nString.optional(), imageUrl: ZStorageUrl.optional(), @@ -77,20 +77,20 @@ export const ZSurveyOpenTextElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.OpenText), placeholder: ZI18nString.optional(), longAnswer: z.boolean().optional(), - inputType: ZSurveyOpenTextElementInputType.optional().default("text"), - insightsEnabled: z.boolean().default(false).optional(), + inputType: ZSurveyOpenTextElementInputType.optional().prefault("text"), + insightsEnabled: z.boolean().prefault(false).optional(), charLimit: z .object({ - enabled: z.boolean().default(false).optional(), + enabled: z.boolean().prefault(false).optional(), min: z.number().optional(), max: z.number().optional(), }) - .default({ enabled: false }), + .prefault({ enabled: false }), validation: ZValidation.optional(), }).superRefine((data, ctx) => { if (data.charLimit.enabled && data.charLimit.min === undefined && data.charLimit.max === undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Enter the values for either minimum or maximum field", }); } @@ -100,7 +100,7 @@ export const ZSurveyOpenTextElement = ZSurveyElementBase.extend({ (data.charLimit.max !== undefined && data.charLimit.max < 0) ) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "The character limit values should be positive", }); } @@ -111,7 +111,7 @@ export const ZSurveyOpenTextElement = ZSurveyElementBase.extend({ data.charLimit.min > data.charLimit.max ) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Minimum value cannot be greater than the maximum value", }); } @@ -145,9 +145,9 @@ export type TMultipleChoiceOptionDisplayType = z.infer; @@ -186,7 +186,7 @@ export type TSurveyNPSElement = z.infer; // CTA Element export const ZSurveyCTAElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.CTA), - buttonExternal: z.boolean().optional().default(false), + buttonExternal: z.boolean().optional().prefault(false), buttonUrl: z.string().optional(), ctaButtonLabel: ZI18nString.optional(), }).superRefine((data, ctx) => { @@ -194,7 +194,7 @@ export const ZSurveyCTAElement = ZSurveyElementBase.extend({ if (data.buttonExternal) { if (!data.buttonUrl || data.buttonUrl.trim() === "") { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Button URL is required when external button is enabled", path: ["buttonUrl"], }); @@ -203,7 +203,7 @@ export const ZSurveyCTAElement = ZSurveyElementBase.extend({ const urlValidation = ZUrl.safeParse(data.buttonUrl); if (!urlValidation.success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Please enter a valid URL", path: ["buttonUrl"], }); @@ -212,7 +212,7 @@ export const ZSurveyCTAElement = ZSurveyElementBase.extend({ if (!data.ctaButtonLabel?.default || data.ctaButtonLabel.default.trim() === "") { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Button label is required when external button is enabled", path: ["ctaButtonLabel"], }); @@ -229,7 +229,7 @@ export const ZSurveyRatingElement = ZSurveyElementBase.extend({ range: z.union([z.literal(5), z.literal(3), z.literal(4), z.literal(6), z.literal(7), z.literal(10)]), lowerLabel: ZI18nString.optional(), upperLabel: ZI18nString.optional(), - isColorCodingEnabled: z.boolean().optional().default(false), + isColorCodingEnabled: z.boolean().optional().prefault(false), }); export type TSurveyRatingElement = z.infer; @@ -244,10 +244,10 @@ export type TSurveyPictureChoice = z.infer; export const ZSurveyPictureSelectionElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.PictureSelection), - allowMulti: z.boolean().optional().default(false), - choices: z - .array(ZSurveyPictureChoice) - .min(2, { message: "Picture Selection element must have a minimum of 2 choices" }), + allowMulti: z.boolean().optional().prefault(false), + choices: z.array(ZSurveyPictureChoice).min(2, { + error: "Picture Selection element must have a minimum of 2 choices", + }), validation: ZValidation.optional(), }); @@ -277,7 +277,9 @@ export type TSurveyFileUploadElement = z.infer; // Cal Element export const ZSurveyCalElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.Cal), - calUserName: z.string().min(1, { message: "Cal user name is required" }), + calUserName: z.string().min(1, { + error: "Cal user name is required", + }), calHost: z.string().optional(), }); @@ -295,7 +297,7 @@ export const ZSurveyMatrixElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.Matrix), rows: z.array(ZSurveyMatrixElementChoice), columns: z.array(ZSurveyMatrixElementChoice), - shuffleOption: ZShuffleOption.optional().default("none"), + shuffleOption: ZShuffleOption.optional().prefault("none"), validation: ZValidation.optional(), }); @@ -328,8 +330,12 @@ export const ZSurveyRankingElement = ZSurveyElementBase.extend({ type: z.literal(TSurveyElementTypeEnum.Ranking), choices: z .array(ZSurveyElementChoice) - .min(2, { message: "Ranking Element must have at least two options" }) - .max(25, { message: "Ranking Element can have at most 25 options" }), + .min(2, { + error: "Ranking Element must have at least two options", + }) + .max(25, { + error: "Ranking Element can have at most 25 options", + }), otherOptionPlaceholder: ZI18nString.optional(), shuffleOption: ZShuffleOption.optional(), validation: ZValidation.optional(), diff --git a/packages/types/surveys/logic.ts b/packages/types/surveys/logic.ts index 53eb231f05..bc3d27c426 100644 --- a/packages/types/surveys/logic.ts +++ b/packages/types/surveys/logic.ts @@ -1,9 +1,6 @@ import { z } from "zod"; -import { extendZodWithOpenApi } from "zod-openapi"; import { ZId } from "../common"; -extendZodWithOpenApi(z); - // Logic operators export const ZSurveyLogicConditionsOperator = z.enum([ "equals", @@ -44,12 +41,14 @@ export type TSurveyLogicConditionsOperator = z.infer; @@ -63,14 +62,15 @@ export type TConnector = z.infer; const ZDynamicElement = z.object({ type: z.literal("element"), value: z.string().min(1, "Conditional Logic: Element id cannot be empty"), - meta: z.record(z.string()).optional(), + meta: z.record(z.string(), z.string()).optional(), }); const ZDynamicVariable = z.object({ type: z.literal("variable"), value: z - .string() - .cuid2({ message: "Conditional Logic: Variable id must be a valid cuid" }) + .cuid2({ + error: "Conditional Logic: Variable id must be a valid cuid", + }) .min(1, "Conditional Logic: Variable id cannot be empty"), }); @@ -80,7 +80,7 @@ const ZDynamicHiddenField = z.object({ }); export const ZDynamicLogicFieldValue = z.union([ZDynamicElement, ZDynamicVariable, ZDynamicHiddenField], { - message: "Conditional Logic: Invalid dynamic field value", + error: "Conditional Logic: Invalid dynamic field value", }); export type TDynamicLogicFieldValue = z.infer; @@ -90,13 +90,13 @@ export type TDynamicLogicFieldValue = z.infer; const ZDynamicQuestion = z.object({ type: z.literal("question"), value: z.string().min(1, "Conditional Logic: Question id cannot be empty"), - meta: z.record(z.string()).optional(), + meta: z.record(z.string(), z.string()).optional(), }); export const ZDynamicLogicFieldValueDeprecated = z.union( [ZDynamicQuestion, ZDynamicElement, ZDynamicVariable, ZDynamicHiddenField], { - message: "Conditional Logic: Invalid dynamic field value", + error: "Conditional Logic: Invalid dynamic field value", } ); @@ -120,18 +120,18 @@ export type TRightOperandDeprecated = z.infer; // Operators that don't require a right operand export const operatorsWithoutRightOperand = [ - ZSurveyLogicConditionsOperator.Enum.isSubmitted, - ZSurveyLogicConditionsOperator.Enum.isSkipped, - ZSurveyLogicConditionsOperator.Enum.isClicked, - ZSurveyLogicConditionsOperator.Enum.isNotClicked, - ZSurveyLogicConditionsOperator.Enum.isAccepted, - ZSurveyLogicConditionsOperator.Enum.isBooked, - ZSurveyLogicConditionsOperator.Enum.isPartiallySubmitted, - ZSurveyLogicConditionsOperator.Enum.isCompletelySubmitted, - ZSurveyLogicConditionsOperator.Enum.isSet, - ZSurveyLogicConditionsOperator.Enum.isNotSet, - ZSurveyLogicConditionsOperator.Enum.isEmpty, - ZSurveyLogicConditionsOperator.Enum.isNotEmpty, + ZSurveyLogicConditionsOperator.enum.isSubmitted, + ZSurveyLogicConditionsOperator.enum.isSkipped, + ZSurveyLogicConditionsOperator.enum.isClicked, + ZSurveyLogicConditionsOperator.enum.isNotClicked, + ZSurveyLogicConditionsOperator.enum.isAccepted, + ZSurveyLogicConditionsOperator.enum.isBooked, + ZSurveyLogicConditionsOperator.enum.isPartiallySubmitted, + ZSurveyLogicConditionsOperator.enum.isCompletelySubmitted, + ZSurveyLogicConditionsOperator.enum.isSet, + ZSurveyLogicConditionsOperator.enum.isNotSet, + ZSurveyLogicConditionsOperator.enum.isEmpty, + ZSurveyLogicConditionsOperator.enum.isNotEmpty, ] as const; // Single condition @@ -144,7 +144,7 @@ export const ZSingleCondition = z }) .and( z.object({ - connector: z.undefined(), + connector: z.undefined().optional(), }) ) .superRefine((val, ctx) => { @@ -153,19 +153,19 @@ export const ZSingleCondition = z ) { if (val.rightOperand === undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand is required for operator "${val.operator}"`, path: ["rightOperand"], }); } else if (val.rightOperand.type === "static" && val.rightOperand.value === "") { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand value cannot be empty for operator "${val.operator}"`, }); } } else if (val.rightOperand !== undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand should not be present for operator "${val.operator}"`, path: ["rightOperand"], }); @@ -184,7 +184,7 @@ export const ZSingleConditionDeprecated = z }) .and( z.object({ - connector: z.undefined(), + connector: z.undefined().optional(), }) ) .superRefine((val, ctx) => { @@ -193,19 +193,19 @@ export const ZSingleConditionDeprecated = z ) { if (val.rightOperand === undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand is required for operator "${val.operator}"`, path: ["rightOperand"], }); } else if (val.rightOperand.type === "static" && val.rightOperand.value === "") { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand value cannot be empty for operator "${val.operator}"`, }); } } else if (val.rightOperand !== undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: right operand should not be present for operator "${val.operator}"`, path: ["rightOperand"], }); @@ -222,7 +222,7 @@ export const ZConditionGroup: z.ZodType = z conditions: z.array(z.union([ZSingleCondition, ZConditionGroup])), }) ) - .openapi({ ref: "conditionGroup" }); + .meta({ id: "conditionGroup" }); export interface TConditionGroup { id: string; diff --git a/packages/types/surveys/types.ts b/packages/types/surveys/types.ts index 08566f379e..54b229bf56 100644 --- a/packages/types/surveys/types.ts +++ b/packages/types/surveys/types.ts @@ -51,7 +51,7 @@ import { } from "./validation"; const ZSurveyEndingBase = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), }); export const ZSurveyEndScreenCard = ZSurveyEndingBase.extend({ @@ -112,21 +112,21 @@ export enum TSurveyQuestionTypeEnum { export const ZSurveyQuestionId = z.string().superRefine((id, ctx) => { if (FORBIDDEN_IDS.includes(id)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Question id is not allowed`, }); } if (id.includes(" ")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Question id not allowed, avoid using spaces.", }); } if (!/^[a-zA-Z0-9_-]+$/.test(id)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Question id not allowed, use only alphanumeric characters, hyphens, or underscores.", }); } @@ -144,12 +144,12 @@ export const ZSurveyWelcomeCard = z subheader: ZI18nString.optional(), fileUrl: ZStorageUrl.optional(), buttonLabel: ZI18nString.optional(), - timeToFinish: z.boolean().default(true), - showResponseCount: z.boolean().default(false), + timeToFinish: z.boolean().prefault(true), + showResponseCount: z.boolean().prefault(false), videoUrl: ZStorageUrl.optional(), }) .refine((schema) => !(schema.enabled && !schema.headline), { - message: "Welcome card must have a headline", + error: "Welcome card must have a headline", }); export type TSurveyWelcomeCard = z.infer; @@ -161,21 +161,21 @@ export const ZSurveyHiddenFields = z.object({ z.string().superRefine((field, ctx) => { if (FORBIDDEN_IDS.includes(field)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Hidden field id is not allowed`, }); } if (field.includes(" ")) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Hidden field id not allowed, avoid using spaces.", }); } if (!/^[a-zA-Z0-9_-]+$/.test(field)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Hidden field id not allowed, use only alphanumeric characters, hyphens, or underscores.", }); @@ -190,23 +190,23 @@ export type TSurveyHiddenFields = z.infer; export const ZSurveyVariable = z .discriminatedUnion("type", [ z.object({ - id: z.string().cuid2(), + id: z.cuid2(), name: z.string(), type: z.literal("number"), - value: z.number().default(0), + value: z.number().prefault(0), }), z.object({ - id: z.string().cuid2(), + id: z.cuid2(), name: z.string(), type: z.literal("text"), - value: z.string().default(""), + value: z.string().prefault(""), }), ]) .superRefine((data, ctx) => { // variable name can only contain lowercase letters, numbers, and underscores if (!/^[a-z0-9_]+$/.test(data.name)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Variable name can only contain lowercase letters, numbers, and underscores", path: ["variables"], }); @@ -324,7 +324,9 @@ export const ZActionCalculateText = ZActionCalculateBase.extend({ z.object({ type: z.literal("static"), value: z - .string({ message: "Conditional Logic: Value must be a string for text variable" }) + .string({ + error: "Conditional Logic: Value must be a string for text variable", + }) .min(1, "Conditional Logic: Please enter a value in logic field"), }), ZDynamicLogicFieldValueDeprecated, // Accept both "question" and "element" for backward compatibility @@ -336,14 +338,16 @@ export const ZActionCalculateNumber = ZActionCalculateBase.extend({ value: z.union([ z.object({ type: z.literal("static"), - value: z.number({ message: "Conditional Logic: Value must be a number for number variable" }), + value: z.number({ + error: "Conditional Logic: Value must be a number for number variable", + }), }), ZDynamicLogicFieldValueDeprecated, // Accept both "question" and "element" for backward compatibility ]), }).superRefine((val, ctx) => { if (val.operator === "divide" && val.value.type === "static" && val.value.value === 0) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Conditional Logic: Cannot divide by zero", path: ["value", "value"], }); @@ -427,19 +431,19 @@ export const ZSurveyOpenTextQuestion = ZSurveyQuestionBase.extend({ type: z.literal(TSurveyQuestionTypeEnum.OpenText), placeholder: ZI18nString.optional(), longAnswer: z.boolean().optional(), - inputType: ZSurveyOpenTextQuestionInputType.optional().default("text"), - insightsEnabled: z.boolean().default(false).optional(), + inputType: ZSurveyOpenTextQuestionInputType.optional().prefault("text"), + insightsEnabled: z.boolean().prefault(false).optional(), charLimit: z .object({ - enabled: z.boolean().default(false).optional(), + enabled: z.boolean().prefault(false).optional(), min: z.number().optional(), max: z.number().optional(), }) - .default({ enabled: false }), + .prefault({ enabled: false }), }).superRefine((data, ctx) => { if (data.charLimit.enabled && data.charLimit.min === undefined && data.charLimit.max === undefined) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Enter the values for either minimum or maximum field", }); } @@ -449,7 +453,7 @@ export const ZSurveyOpenTextQuestion = ZSurveyQuestionBase.extend({ (data.charLimit.max !== undefined && data.charLimit.max < 0) ) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "The character limit values should be positive", }); } @@ -460,7 +464,7 @@ export const ZSurveyOpenTextQuestion = ZSurveyQuestionBase.extend({ data.charLimit.min > data.charLimit.max ) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Minimum value cannot be greater than the maximum value", }); } @@ -496,9 +500,9 @@ export const ZSurveyMultipleChoiceQuestion = ZSurveyQuestionBase.extend({ z.literal(TSurveyQuestionTypeEnum.MultipleChoiceSingle), z.literal(TSurveyQuestionTypeEnum.MultipleChoiceMulti), ]), - choices: z - .array(ZSurveyQuestionChoice) - .min(2, { message: "Multiple Choice Question must have at least two choices" }), + choices: z.array(ZSurveyQuestionChoice).min(2, { + error: "Multiple Choice Question must have at least two choices", + }), shuffleOption: ZShuffleOption.optional(), otherOptionPlaceholder: ZI18nString.optional(), }); @@ -515,7 +519,7 @@ export const ZSurveyNPSQuestion = ZSurveyQuestionBase.extend({ type: z.literal(TSurveyQuestionTypeEnum.NPS), lowerLabel: ZI18nString.optional(), upperLabel: ZI18nString.optional(), - isColorCodingEnabled: z.boolean().optional().default(false), + isColorCodingEnabled: z.boolean().optional().prefault(false), }); /** @@ -547,7 +551,7 @@ export const ZSurveyRatingQuestion = ZSurveyQuestionBase.extend({ range: z.union([z.literal(5), z.literal(3), z.literal(4), z.literal(6), z.literal(7), z.literal(10)]), lowerLabel: ZI18nString.optional(), upperLabel: ZI18nString.optional(), - isColorCodingEnabled: z.boolean().optional().default(false), + isColorCodingEnabled: z.boolean().optional().prefault(false), }); /** @@ -574,10 +578,10 @@ export type TSurveyRatingQuestion = z.infer; */ export const ZSurveyPictureSelectionQuestion = ZSurveyQuestionBase.extend({ type: z.literal(TSurveyQuestionTypeEnum.PictureSelection), - allowMulti: z.boolean().optional().default(false), - choices: z - .array(ZSurveyPictureChoice) - .min(2, { message: "Picture Selection question must have atleast 2 choices" }), + allowMulti: z.boolean().optional().prefault(false), + choices: z.array(ZSurveyPictureChoice).min(2, { + error: "Picture Selection question must have atleast 2 choices", + }), }); /** @@ -605,7 +609,9 @@ export type TSurveyFileUploadQuestion = z.infer; -export const ZSurvey = z - .object({ - id: z.string().cuid2(), - createdAt: z.date(), - updatedAt: z.date(), - name: z.string(), - type: ZSurveyType, - environmentId: z.string(), - createdBy: z.string().nullable(), - status: ZSurveyStatus, - displayOption: ZSurveyDisplayOption, - autoClose: z.number().nullable(), - triggers: z.array(z.object({ actionClass: ZActionClass })), - recontactDays: z.number().nullable(), - displayLimit: z.number().nullable(), - welcomeCard: ZSurveyWelcomeCard, - // TODO: Remove this once blocks are the single source of truth - questions: ZSurveyQuestions.default([]).superRefine((questions, ctx) => { - const questionIds = questions.map((q) => q.id); - const uniqueQuestionIds = new Set(questionIds); - if (uniqueQuestionIds.size !== questionIds.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Question IDs must be unique", - path: [questionIds.findIndex((id, index) => questionIds.indexOf(id) !== index), "id"], - }); - } - }), - blocks: ZSurveyBlocks.default([]).superRefine((blocks, ctx) => { - const blockIds = blocks.map((b) => b.id); - const uniqueBlockIds = new Set(blockIds); - if (uniqueBlockIds.size !== blockIds.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Block IDs must be unique", - path: [blockIds.findIndex((id, index) => blockIds.indexOf(id) !== index), "id"], - }); - } - }), - endings: ZSurveyEndings.superRefine((endings, ctx) => { - const endingIds = endings.map((q) => q.id); - const uniqueEndingIds = new Set(endingIds); - if (uniqueEndingIds.size !== endingIds.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Ending IDs must be unique", - path: [endingIds.findIndex((id, index) => endingIds.indexOf(id) !== index), "id"], - }); - } - }), - hiddenFields: ZSurveyHiddenFields, - variables: ZSurveyVariables.superRefine((variables, ctx) => { - // variable ids must be unique - const variableIds = variables.map((v) => v.id); - const uniqueVariableIds = new Set(variableIds); - if (uniqueVariableIds.size !== variableIds.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Variable IDs must be unique", - path: ["variables"], - }); - } - - // variable names must be unique - const variableNames = variables.map((v) => v.name); - const uniqueVariableNames = new Set(variableNames); - if (uniqueVariableNames.size !== variableNames.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Variable names must be unique", - path: ["variables"], - }); - } - }), - followUps: z.array( - ZSurveyFollowUp.extend({ - deleted: z.boolean().optional(), - }) - ), - delay: z.number(), - autoComplete: z.number().min(1, { message: "Response limit must be greater than 0" }).nullable(), - projectOverwrites: ZSurveyProjectOverwrites.nullable(), - styling: ZSurveyStyling.nullable(), - showLanguageSwitch: z.boolean().nullable(), - surveyClosedMessage: ZSurveyClosedMessage.nullable(), - segment: ZSegment.nullable(), - singleUse: ZSurveySingleUse.nullable(), - isVerifyEmailEnabled: z.boolean(), - recaptcha: ZSurveyRecaptcha.nullable(), - isSingleResponsePerEmailEnabled: z.boolean(), - isBackButtonHidden: z.boolean(), - isCaptureIpEnabled: z.boolean(), - pin: z.string().length(4, { message: "PIN must be a four digit number" }).nullish(), - displayPercentage: z.number().min(0.01).max(100).nullable(), - languages: z.array(ZSurveyLanguage), - metadata: ZSurveyMetadata, - slug: ZSurveySlug.nullable(), - customHeadScripts: z.string().nullish(), - customHeadScriptsMode: z.enum(["add", "replace"]).nullish(), - }) - .superRefine((survey, ctx) => { - const { questions, blocks, languages, welcomeCard, endings, isBackButtonHidden } = survey; - - // Validate: must have questions OR blocks with elements, not both - const hasQuestions = questions.length > 0; - const hasBlocks = blocks.length > 0 && blocks.some((b) => b.elements.length > 0); - - if (!hasQuestions && !hasBlocks) { +export const ZSurveyBase = z.object({ + id: z.cuid2(), + createdAt: z.date(), + updatedAt: z.date(), + name: z.string(), + type: ZSurveyType, + environmentId: z.string(), + createdBy: z.string().nullable(), + status: ZSurveyStatus, + displayOption: ZSurveyDisplayOption, + autoClose: z.number().nullable(), + triggers: z.array(z.object({ actionClass: ZActionClass })), + recontactDays: z.number().nullable(), + displayLimit: z.number().nullable(), + welcomeCard: ZSurveyWelcomeCard, + // TODO: Remove this once blocks are the single source of truth + questions: ZSurveyQuestions.prefault([]).superRefine((questions, ctx) => { + const questionIds = questions.map((q) => q.id); + const uniqueQuestionIds = new Set(questionIds); + if (uniqueQuestionIds.size !== questionIds.length) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Survey must have either questions or blocks with elements", - path: ["questions"], + code: "custom", + message: "Question IDs must be unique", + path: [questionIds.findIndex((id, index) => questionIds.indexOf(id) !== index), "id"], + }); + } + }), + blocks: ZSurveyBlocks.prefault([]).superRefine((blocks, ctx) => { + const blockIds = blocks.map((b) => b.id); + const uniqueBlockIds = new Set(blockIds); + if (uniqueBlockIds.size !== blockIds.length) { + ctx.addIssue({ + code: "custom", + message: "Block IDs must be unique", + path: [blockIds.findIndex((id, index) => blockIds.indexOf(id) !== index), "id"], + }); + } + }), + endings: ZSurveyEndings.superRefine((endings, ctx) => { + const endingIds = endings.map((q) => q.id); + const uniqueEndingIds = new Set(endingIds); + if (uniqueEndingIds.size !== endingIds.length) { + ctx.addIssue({ + code: "custom", + message: "Ending IDs must be unique", + path: [endingIds.findIndex((id, index) => endingIds.indexOf(id) !== index), "id"], + }); + } + }), + hiddenFields: ZSurveyHiddenFields, + variables: ZSurveyVariables.superRefine((variables, ctx) => { + // variable ids must be unique + const variableIds = variables.map((v) => v.id); + const uniqueVariableIds = new Set(variableIds); + if (uniqueVariableIds.size !== variableIds.length) { + ctx.addIssue({ + code: "custom", + message: "Variable IDs must be unique", + path: ["variables"], }); } - if (hasQuestions && hasBlocks) { + // variable names must be unique + const variableNames = variables.map((v) => v.name); + const uniqueVariableNames = new Set(variableNames); + if (uniqueVariableNames.size !== variableNames.length) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Survey cannot have both questions and blocks. Use one model.", - path: ["blocks"], + code: "custom", + message: "Variable names must be unique", + path: ["variables"], }); } + }), + followUps: z.array( + ZSurveyFollowUp.extend({ + deleted: z.boolean().optional(), + }) + ), + delay: z.number(), + autoComplete: z + .number() + .min(1, { + error: "Response limit must be greater than 0", + }) + .nullable(), + projectOverwrites: ZSurveyProjectOverwrites.nullable(), + styling: ZSurveyStyling.nullable(), + showLanguageSwitch: z.boolean().nullable(), + surveyClosedMessage: ZSurveyClosedMessage.nullable(), + segment: ZSegment.nullable(), + singleUse: ZSurveySingleUse.nullable(), + isVerifyEmailEnabled: z.boolean(), + recaptcha: ZSurveyRecaptcha.nullable(), + isSingleResponsePerEmailEnabled: z.boolean(), + isBackButtonHidden: z.boolean(), + isCaptureIpEnabled: z.boolean(), + pin: z + .string() + .length(4, { + error: "PIN must be a four digit number", + }) + .nullish(), + displayPercentage: z.number().min(0.01).max(100).nullable(), + languages: z.array(ZSurveyLanguage), + metadata: ZSurveyMetadata, + slug: ZSurveySlug.nullable(), + customHeadScripts: z.string().nullish(), + customHeadScriptsMode: z.enum(["add", "replace"]).nullish(), +}); - let multiLangIssue: z.IssueData | null; +export const surveyRefinement = (survey: z.infer, ctx: z.RefinementCtx): void => { + const { questions, blocks, languages, welcomeCard, endings, isBackButtonHidden } = survey; - // welcome card validations - if (welcomeCard.enabled) { - if (welcomeCard.headline) { - multiLangIssue = validateCardFieldsForAllLanguages( - "cardHeadline", - welcomeCard.headline, - languages, - "welcome" - ); + // Validate: must have questions OR blocks with elements, not both + const hasQuestions = questions.length > 0; + const hasBlocks = blocks.length > 0 && blocks.some((b) => b.elements.length > 0); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); - } - } + if (!hasQuestions && !hasBlocks) { + ctx.addIssue({ + code: "custom", + message: "Survey must have either questions or blocks with elements", + path: ["questions"], + }); + } - if (welcomeCard.subheader && welcomeCard.subheader.default.trim() !== "") { - multiLangIssue = validateCardFieldsForAllLanguages( - "welcomeCardSubheader", - welcomeCard.subheader, - languages, - "welcome" - ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); - } - } + if (hasQuestions && hasBlocks) { + ctx.addIssue({ + code: "custom", + message: "Survey cannot have both questions and blocks. Use one model.", + path: ["blocks"], + }); + } - if (welcomeCard.buttonLabel && welcomeCard.buttonLabel.default.trim() !== "") { - multiLangIssue = validateCardFieldsForAllLanguages( - "buttonLabel", - welcomeCard.buttonLabel, - languages, - "welcome" - ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); - } + let multiLangIssue: z.IssueData | null; + + // welcome card validations + if (welcomeCard.enabled) { + if (welcomeCard.headline) { + multiLangIssue = validateCardFieldsForAllLanguages( + "cardHeadline", + welcomeCard.headline, + languages, + "welcome" + ); + + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); } } - // Custom default validation for each question - if (hasQuestions) { - questions.forEach((question, questionIndex) => { - multiLangIssue = validateQuestionLabels("headline", question.headline, languages, questionIndex); + if (welcomeCard.subheader && welcomeCard.subheader.default.trim() !== "") { + multiLangIssue = validateCardFieldsForAllLanguages( + "welcomeCardSubheader", + welcomeCard.subheader, + languages, + "welcome" + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + } + + if (welcomeCard.buttonLabel && welcomeCard.buttonLabel.default.trim() !== "") { + multiLangIssue = validateCardFieldsForAllLanguages( + "buttonLabel", + welcomeCard.buttonLabel, + languages, + "welcome" + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + } + } + + // Custom default validation for each question + if (hasQuestions) { + questions.forEach((question, questionIndex) => { + multiLangIssue = validateQuestionLabels("headline", question.headline, languages, questionIndex); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + + if (question.subheader && question.subheader.default.trim() !== "") { + multiLangIssue = validateQuestionLabels("subheader", question.subheader, languages, questionIndex); if (multiLangIssue) { ctx.addIssue(multiLangIssue); } + } - if (question.subheader && question.subheader.default.trim() !== "") { - multiLangIssue = validateQuestionLabels("subheader", question.subheader, languages, questionIndex); + const defaultLanguageCode = "default"; + const initialFieldsToValidate = ["buttonLabel", "upperLabel", "lowerLabel", "label", "placeholder"]; + + let fieldsToValidate = + questionIndex === 0 || isBackButtonHidden + ? initialFieldsToValidate + : [...initialFieldsToValidate, "backButtonLabel"]; + + // Skip buttonLabel validation for required NPS and Rating questions + if ( + (question.type === TSurveyQuestionTypeEnum.NPS || question.type === TSurveyQuestionTypeEnum.Rating) && + question.required + ) { + fieldsToValidate = fieldsToValidate.filter((field) => field !== "buttonLabel"); + } + + for (const field of fieldsToValidate) { + // Skip label validation for consent questions as its called checkbox label + if (field === "label" && question.type === TSurveyQuestionTypeEnum.Consent) { + continue; + } + + const questionFieldValue = question[field as keyof typeof question] as TI18nString | null; + if ( + typeof questionFieldValue?.[defaultLanguageCode] !== "undefined" && + questionFieldValue[defaultLanguageCode].trim() !== "" + ) { + multiLangIssue = validateQuestionLabels(field, questionFieldValue, languages, questionIndex); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + } + } + + if (question.type === TSurveyQuestionTypeEnum.OpenText) { + if ( + question.placeholder && + question.placeholder[defaultLanguageCode].trim() !== "" && + languages.length > 1 + ) { + multiLangIssue = validateQuestionLabels( + "placeholder", + question.placeholder, + languages, + questionIndex + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + } + } + + if ( + question.type === TSurveyQuestionTypeEnum.MultipleChoiceSingle || + question.type === TSurveyQuestionTypeEnum.MultipleChoiceMulti || + question.type === TSurveyQuestionTypeEnum.Ranking + ) { + question.choices.forEach((choice, choiceIndex) => { + multiLangIssue = validateQuestionLabels( + `Choice ${String(choiceIndex + 1)}`, + choice.label, + languages, + questionIndex, + true + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + }); + + const duplicateChoicesLanguageCodes = findLanguageCodesForDuplicateLabels( + question.choices.map((choice) => choice.label), + languages + ); + + if (duplicateChoicesLanguageCodes.length > 0) { + const invalidLanguageCodes = duplicateChoicesLanguageCodes.map((invalidLanguageCode) => + invalidLanguageCode === "default" + ? (languages.find((lang) => lang.default)?.language.code ?? "default") + : invalidLanguageCode + ); + + const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; + + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)} has duplicate choice labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["questions", questionIndex, "choices"], + params: isDefaultOnly ? undefined : { invalidLanguageCodes }, + }); + } + } + + if (question.type === TSurveyQuestionTypeEnum.Consent) { + multiLangIssue = validateQuestionLabels("consent.label", question.label, languages, questionIndex); + + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + } + + if (question.type === TSurveyQuestionTypeEnum.CTA) { + if (!question.required && question.dismissButtonLabel) { + multiLangIssue = validateQuestionLabels( + "dismissButtonLabel", + question.dismissButtonLabel, + languages, + questionIndex + ); if (multiLangIssue) { ctx.addIssue(multiLangIssue); } } - const defaultLanguageCode = "default"; - const initialFieldsToValidate = ["buttonLabel", "upperLabel", "lowerLabel", "label", "placeholder"]; - - let fieldsToValidate = - questionIndex === 0 || isBackButtonHidden - ? initialFieldsToValidate - : [...initialFieldsToValidate, "backButtonLabel"]; - - // Skip buttonLabel validation for required NPS and Rating questions - if ( - (question.type === TSurveyQuestionTypeEnum.NPS || - question.type === TSurveyQuestionTypeEnum.Rating) && - question.required - ) { - fieldsToValidate = fieldsToValidate.filter((field) => field !== "buttonLabel"); - } - - for (const field of fieldsToValidate) { - // Skip label validation for consent questions as its called checkbox label - if (field === "label" && question.type === TSurveyQuestionTypeEnum.Consent) { - continue; - } - - const questionFieldValue = question[field as keyof typeof question] as TI18nString | null; - if ( - typeof questionFieldValue?.[defaultLanguageCode] !== "undefined" && - questionFieldValue[defaultLanguageCode].trim() !== "" - ) { - multiLangIssue = validateQuestionLabels(field, questionFieldValue, languages, questionIndex); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); + if (question.buttonExternal) { + if (!question.buttonUrl || question.buttonUrl.trim() === "") { + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)}: Button URL is required when external button is enabled`, + path: ["questions", questionIndex, "buttonUrl"], + }); + } else { + const parsedButtonUrl = getZSafeUrl.safeParse(question.buttonUrl); + if (!parsedButtonUrl.success) { + const errorMessage = parsedButtonUrl.error.issues[0].message; + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)}: ${errorMessage}`, + path: ["questions", questionIndex, "buttonUrl"], + }); } } } + } - if (question.type === TSurveyQuestionTypeEnum.OpenText) { - if ( - question.placeholder && - question.placeholder[defaultLanguageCode].trim() !== "" && - languages.length > 1 - ) { - multiLangIssue = validateQuestionLabels( - "placeholder", - question.placeholder, - languages, - questionIndex - ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); - } + if (question.type === TSurveyQuestionTypeEnum.Matrix) { + question.rows.forEach((row, rowIndex) => { + multiLangIssue = validateQuestionLabels( + `Row ${String(rowIndex + 1)}`, + row.label, + languages, + questionIndex, + true + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); } + }); + + question.columns.forEach((column, columnIndex) => { + multiLangIssue = validateQuestionLabels( + `Column ${String(columnIndex + 1)}`, + column.label, + languages, + questionIndex, + true + ); + if (multiLangIssue) { + ctx.addIssue(multiLangIssue); + } + }); + + const duplicateRowsLanguageCodes = findLanguageCodesForDuplicateLabels( + question.rows.map((row) => row.label), + languages + ); + const duplicateColumnLanguageCodes = findLanguageCodesForDuplicateLabels( + question.columns.map((column) => column.label), + languages + ); + + if (duplicateRowsLanguageCodes.length > 0) { + const invalidLanguageCodes = duplicateRowsLanguageCodes.map((invalidLanguageCode) => + invalidLanguageCode === "default" + ? (languages.find((lang) => lang.default)?.language.code ?? "default") + : invalidLanguageCode + ); + + const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; + + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)} has duplicate row labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["questions", questionIndex, "rows"], + params: isDefaultOnly ? undefined : { invalidLanguageCodes }, + }); } - if ( - question.type === TSurveyQuestionTypeEnum.MultipleChoiceSingle || - question.type === TSurveyQuestionTypeEnum.MultipleChoiceMulti || - question.type === TSurveyQuestionTypeEnum.Ranking - ) { - question.choices.forEach((choice, choiceIndex) => { - multiLangIssue = validateQuestionLabels( - `Choice ${String(choiceIndex + 1)}`, - choice.label, + if (duplicateColumnLanguageCodes.length > 0) { + const invalidLanguageCodes = duplicateColumnLanguageCodes.map((invalidLanguageCode) => + invalidLanguageCode === "default" + ? (languages.find((lang) => lang.default)?.language.code ?? "default") + : invalidLanguageCode + ); + + const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; + + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)} has duplicate column labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["questions", questionIndex, "columns"], + params: isDefaultOnly ? undefined : { invalidLanguageCodes }, + }); + } + } + + if (question.type === TSurveyQuestionTypeEnum.FileUpload) { + // allowedFileExtensions must have atleast one element + if (question.allowedFileExtensions && question.allowedFileExtensions.length === 0) { + ctx.addIssue({ + code: "custom", + message: `Question ${String(questionIndex + 1)} must have atleast one allowed file extension`, + path: ["questions", questionIndex, "allowedFileExtensions"], + }); + } + } + + if (question.type === TSurveyQuestionTypeEnum.Cal) { + if (question.calHost !== undefined) { + const hostnameRegex = /^(?!-)[a-zA-Z0-9-]{1,63}(? !field.show)) { + ctx.addIssue({ + code: "custom", + message: "At least one field must be shown in the Contact Info question", + path: ["questions", questionIndex], + }); + } + fields.forEach((field) => { + const multiLangIssueInPlaceholder = + field.show && + validateQuestionLabels( + `Label for field ${field.label}`, + field.placeholder, languages, questionIndex, true ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); + if (multiLangIssueInPlaceholder) { + ctx.addIssue(multiLangIssueInPlaceholder); + } + }); + } + + if (question.type === TSurveyQuestionTypeEnum.Address) { + const { addressLine1, addressLine2, city, state, zip, country } = question; + const fields = [ + { ...addressLine1, label: "Address Line 1" }, + { ...addressLine2, label: "Address Line 2" }, + { ...city, label: "City" }, + { ...state, label: "State" }, + { ...zip, label: "Zip" }, + { ...country, label: "Country" }, + ]; + + if (fields.every((field) => !field.show)) { + ctx.addIssue({ + code: "custom", + message: "At least one field must be shown in the Address question", + path: ["questions", questionIndex], + }); + } + fields.forEach((field) => { + const multiLangIssueInPlaceholder = + field.show && + validateQuestionLabels( + `Label for field ${field.label}`, + field.placeholder, + languages, + questionIndex, + true + ); + if (multiLangIssueInPlaceholder) { + ctx.addIssue(multiLangIssueInPlaceholder); + } + }); + } + + if (question.logic) { + const logicIssues = validateLogic(survey, questionIndex, question.logic); + + logicIssues.forEach((issue) => { + ctx.addIssue(issue as z.IssueData); + }); + } + }); + + const questionsWithCyclicLogic = findQuestionsWithCyclicLogic(questions); + if (questionsWithCyclicLogic.length > 0) { + questionsWithCyclicLogic.forEach((questionId) => { + const questionIndex = questions.findIndex((q) => q.id === questionId); + ctx.addIssue({ + code: "custom", + message: `Conditional Logic: Cyclic logic detected 🔃 Please check the logic of question ${String(questionIndex + 1)}.`, + path: ["questions", questionIndex, "logic"], + }); + }); + } + } + + // Blocks validation + if (hasBlocks) { + // 1. Validate block IDs are unique (CUIDs should be unique by design, but validate anyway) + const blockIds = blocks.map((b) => b.id); + const uniqueBlockIds = new Set(blockIds); + if (uniqueBlockIds.size !== blockIds.length) { + ctx.addIssue({ + code: "custom", + message: "Block IDs must be unique", + path: ["blocks", blockIds.findIndex((id, index) => blockIds.indexOf(id) !== index), "id"], + }); + } + + // 2. Build map of all elements across all blocks + const allElements = new Map(); + blocks.forEach((block, blockIdx) => { + block.elements.forEach((element, elemIdx) => { + if (allElements.has(element.id)) { + ctx.addIssue({ + code: "custom", + message: `Element ID "${element.id}" is used in multiple blocks. Element IDs must be unique across all blocks.`, + path: ["blocks", blockIdx, "elements", elemIdx, "id"], + }); + } + allElements.set(element.id, { block: blockIdx, element: elemIdx, data: element }); + }); + }); + + // 4. Detailed validation for each block and its elements + blocks.forEach((block, blockIndex) => { + const defaultLanguageCode = "default"; + // Validate each element in the block + block.elements.forEach((element, elementIndex) => { + // Validate headline (required for all elements) + let elementMultiLangIssue = validateElementLabels( + "headline", + element.headline, + languages, + blockIndex, + elementIndex + ); + if (elementMultiLangIssue) { + ctx.addIssue(elementMultiLangIssue); + } + + // Validate subheader if present + if (element.subheader && element.subheader[defaultLanguageCode].trim() !== "") { + elementMultiLangIssue = validateElementLabels( + "subheader", + element.subheader, + languages, + blockIndex, + elementIndex + ); + if (elementMultiLangIssue) { + ctx.addIssue(elementMultiLangIssue); + } + } + + // Type-specific validation + if (element.type === TSurveyElementTypeEnum.OpenText) { + if ( + element.placeholder && + element.placeholder[defaultLanguageCode].trim() !== "" && + languages.length > 1 + ) { + elementMultiLangIssue = validateElementLabels( + "placeholder", + element.placeholder, + languages, + blockIndex, + elementIndex + ); + if (elementMultiLangIssue) { + ctx.addIssue(elementMultiLangIssue); + } + } + } + + if ( + element.type === TSurveyElementTypeEnum.MultipleChoiceSingle || + element.type === TSurveyElementTypeEnum.MultipleChoiceMulti || + element.type === TSurveyElementTypeEnum.Ranking + ) { + element.choices.forEach((choice, choiceIndex) => { + elementMultiLangIssue = validateElementLabels( + `Choice ${String(choiceIndex + 1)}`, + choice.label, + languages, + blockIndex, + elementIndex, + true + ); + if (elementMultiLangIssue) { + ctx.addIssue({ + ...elementMultiLangIssue, + path: ["blocks", blockIndex, "elements", elementIndex, "choices", choiceIndex], + }); } }); const duplicateChoicesLanguageCodes = findLanguageCodesForDuplicateLabels( - question.choices.map((choice) => choice.label), + element.choices.map((choice) => choice.label), languages ); @@ -1069,89 +1438,111 @@ export const ZSurvey = z const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)} has duplicate choice labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["questions", questionIndex, "choices"], + code: "custom", + message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate choice labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["blocks", blockIndex, "elements", elementIndex, "choices"], params: isDefaultOnly ? undefined : { invalidLanguageCodes }, }); } } - if (question.type === TSurveyQuestionTypeEnum.Consent) { - multiLangIssue = validateQuestionLabels("consent.label", question.label, languages, questionIndex); + if (element.type === TSurveyElementTypeEnum.Consent) { + elementMultiLangIssue = validateElementLabels( + "consent.label", + element.label, + languages, + blockIndex, + elementIndex + ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); + if (elementMultiLangIssue) { + ctx.addIssue({ + ...elementMultiLangIssue, + path: ["blocks", blockIndex, "elements", elementIndex, "label"], + }); } } - if (question.type === TSurveyQuestionTypeEnum.CTA) { - if (!question.required && question.dismissButtonLabel) { - multiLangIssue = validateQuestionLabels( - "dismissButtonLabel", - question.dismissButtonLabel, + if (element.type === TSurveyElementTypeEnum.CTA) { + // Only validate buttonExternal fields when buttonExternal is true + if (element.buttonExternal) { + // Validate ctaButtonLabel when buttonExternal is enabled + elementMultiLangIssue = validateElementLabels( + "ctaButtonLabel", + element.ctaButtonLabel ?? {}, languages, - questionIndex + blockIndex, + elementIndex ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); - } - } - - if (question.buttonExternal) { - if (!question.buttonUrl || question.buttonUrl.trim() === "") { + if (elementMultiLangIssue) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)}: Button URL is required when external button is enabled`, - path: ["questions", questionIndex, "buttonUrl"], + ...elementMultiLangIssue, + path: ["blocks", blockIndex, "elements", elementIndex, "ctaButtonLabel"], + }); + } + + // Validate buttonUrl when buttonExternal is enabled + if (!element.buttonUrl || element.buttonUrl.trim() === "") { + ctx.addIssue({ + code: "custom", + message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}: Button URL is required when external button is enabled`, + path: ["blocks", blockIndex, "elements", elementIndex, "buttonUrl"], }); } else { - const parsedButtonUrl = getZSafeUrl.safeParse(question.buttonUrl); + const parsedButtonUrl = getZSafeUrl.safeParse(element.buttonUrl); if (!parsedButtonUrl.success) { const errorMessage = parsedButtonUrl.error.issues[0].message; ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)}: ${errorMessage}`, - path: ["questions", questionIndex, "buttonUrl"], + code: "custom", + message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}: ${errorMessage}`, + path: ["blocks", blockIndex, "elements", elementIndex, "buttonUrl"], }); } } } } - if (question.type === TSurveyQuestionTypeEnum.Matrix) { - question.rows.forEach((row, rowIndex) => { - multiLangIssue = validateQuestionLabels( + if (element.type === TSurveyElementTypeEnum.Matrix) { + element.rows.forEach((row, rowIndex) => { + elementMultiLangIssue = validateElementLabels( `Row ${String(rowIndex + 1)}`, row.label, languages, - questionIndex, + blockIndex, + elementIndex, true ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); + if (elementMultiLangIssue) { + ctx.addIssue({ + ...elementMultiLangIssue, + path: ["blocks", blockIndex, "elements", elementIndex, "rows", rowIndex], + }); } }); - question.columns.forEach((column, columnIndex) => { - multiLangIssue = validateQuestionLabels( + element.columns.forEach((column, columnIndex) => { + elementMultiLangIssue = validateElementLabels( `Column ${String(columnIndex + 1)}`, column.label, languages, - questionIndex, + blockIndex, + elementIndex, true ); - if (multiLangIssue) { - ctx.addIssue(multiLangIssue); + if (elementMultiLangIssue) { + ctx.addIssue({ + ...elementMultiLangIssue, + path: ["blocks", blockIndex, "elements", elementIndex, "columns", columnIndex], + }); } }); const duplicateRowsLanguageCodes = findLanguageCodesForDuplicateLabels( - question.rows.map((row) => row.label), + element.rows.map((row) => row.label), languages ); const duplicateColumnLanguageCodes = findLanguageCodesForDuplicateLabels( - question.columns.map((column) => column.label), + element.columns.map((column) => column.label), languages ); @@ -1165,9 +1556,9 @@ export const ZSurvey = z const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)} has duplicate row labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["questions", questionIndex, "rows"], + code: "custom", + message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate row labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["blocks", blockIndex, "elements", elementIndex, "rows"], params: isDefaultOnly ? undefined : { invalidLanguageCodes }, }); } @@ -1182,40 +1573,39 @@ export const ZSurvey = z const isDefaultOnly = invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)} has duplicate column labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["questions", questionIndex, "columns"], + code: "custom", + message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate column labels ${isDefaultOnly ? "" : "for the following languages:"}`, + path: ["blocks", blockIndex, "elements", elementIndex, "columns"], params: isDefaultOnly ? undefined : { invalidLanguageCodes }, }); } } - if (question.type === TSurveyQuestionTypeEnum.FileUpload) { - // allowedFileExtensions must have atleast one element - if (question.allowedFileExtensions && question.allowedFileExtensions.length === 0) { + if (element.type === TSurveyElementTypeEnum.FileUpload) { + if (element.allowedFileExtensions && element.allowedFileExtensions.length === 0) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(questionIndex + 1)} must have atleast one allowed file extension`, - path: ["questions", questionIndex, "allowedFileExtensions"], + code: "custom", + message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} must have atleast one allowed file extension`, + path: ["blocks", blockIndex, "elements", elementIndex, "allowedFileExtensions"], }); } } - if (question.type === TSurveyQuestionTypeEnum.Cal) { - if (question.calHost !== undefined) { + if (element.type === TSurveyElementTypeEnum.Cal) { + if (element.calHost !== undefined) { const hostnameRegex = /^(?!-)[a-zA-Z0-9-]{1,63}(? !field.show)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "At least one field must be shown in the Contact Info question", - path: ["questions", questionIndex], + code: "custom", + message: `At least one field must be shown in the Contact Info question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}`, + path: ["blocks", blockIndex, "elements", elementIndex], }); } fields.forEach((field) => { const multiLangIssueInPlaceholder = field.show && - validateQuestionLabels( + validateElementLabels( `Label for field ${field.label}`, field.placeholder, languages, - questionIndex, + blockIndex, + elementIndex, true ); if (multiLangIssueInPlaceholder) { - ctx.addIssue(multiLangIssueInPlaceholder); + ctx.addIssue({ + ...multiLangIssueInPlaceholder, + path: [ + "blocks", + blockIndex, + "elements", + elementIndex, + field.label.toLowerCase().replace(" ", ""), + ], + }); } }); } - if (question.type === TSurveyQuestionTypeEnum.Address) { - const { addressLine1, addressLine2, city, state, zip, country } = question; + if (element.type === TSurveyElementTypeEnum.Address) { + const { addressLine1, addressLine2, city, state, zip, country } = element; const fields = [ { ...addressLine1, label: "Address Line 1" }, { ...addressLine2, label: "Address Line 2" }, @@ -1260,609 +1660,214 @@ export const ZSurvey = z if (fields.every((field) => !field.show)) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "At least one field must be shown in the Address question", - path: ["questions", questionIndex], + code: "custom", + message: `At least one field must be shown in the Address question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}`, + path: ["blocks", blockIndex, "elements", elementIndex], }); } fields.forEach((field) => { const multiLangIssueInPlaceholder = field.show && - validateQuestionLabels( + validateElementLabels( `Label for field ${field.label}`, field.placeholder, languages, - questionIndex, + blockIndex, + elementIndex, true ); if (multiLangIssueInPlaceholder) { - ctx.addIssue(multiLangIssueInPlaceholder); - } - }); - } - - if (question.logic) { - const logicIssues = validateLogic(survey, questionIndex, question.logic); - - logicIssues.forEach((issue) => { - ctx.addIssue(issue); - }); - } - }); - - const questionsWithCyclicLogic = findQuestionsWithCyclicLogic(questions); - if (questionsWithCyclicLogic.length > 0) { - questionsWithCyclicLogic.forEach((questionId) => { - const questionIndex = questions.findIndex((q) => q.id === questionId); - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Conditional Logic: Cyclic logic detected 🔃 Please check the logic of question ${String(questionIndex + 1)}.`, - path: ["questions", questionIndex, "logic"], - }); - }); - } - } - - // Blocks validation - if (hasBlocks) { - // 1. Validate block IDs are unique (CUIDs should be unique by design, but validate anyway) - const blockIds = blocks.map((b) => b.id); - const uniqueBlockIds = new Set(blockIds); - if (uniqueBlockIds.size !== blockIds.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Block IDs must be unique", - path: ["blocks", blockIds.findIndex((id, index) => blockIds.indexOf(id) !== index), "id"], - }); - } - - // 2. Build map of all elements across all blocks - const allElements = new Map(); - blocks.forEach((block, blockIdx) => { - block.elements.forEach((element, elemIdx) => { - if (allElements.has(element.id)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Element ID "${element.id}" is used in multiple blocks. Element IDs must be unique across all blocks.`, - path: ["blocks", blockIdx, "elements", elemIdx, "id"], - }); - } - allElements.set(element.id, { block: blockIdx, element: elemIdx, data: element }); - }); - }); - - // 4. Detailed validation for each block and its elements - blocks.forEach((block, blockIndex) => { - const defaultLanguageCode = "default"; - // Validate each element in the block - block.elements.forEach((element, elementIndex) => { - // Validate headline (required for all elements) - let elementMultiLangIssue = validateElementLabels( - "headline", - element.headline, - languages, - blockIndex, - elementIndex - ); - if (elementMultiLangIssue) { - ctx.addIssue(elementMultiLangIssue); - } - - // Validate subheader if present - if (element.subheader && element.subheader[defaultLanguageCode].trim() !== "") { - elementMultiLangIssue = validateElementLabels( - "subheader", - element.subheader, - languages, - blockIndex, - elementIndex - ); - if (elementMultiLangIssue) { - ctx.addIssue(elementMultiLangIssue); - } - } - - // Type-specific validation - if (element.type === TSurveyElementTypeEnum.OpenText) { - if ( - element.placeholder && - element.placeholder[defaultLanguageCode].trim() !== "" && - languages.length > 1 - ) { - elementMultiLangIssue = validateElementLabels( - "placeholder", - element.placeholder, - languages, - blockIndex, - elementIndex - ); - if (elementMultiLangIssue) { - ctx.addIssue(elementMultiLangIssue); - } - } - } - - if ( - element.type === TSurveyElementTypeEnum.MultipleChoiceSingle || - element.type === TSurveyElementTypeEnum.MultipleChoiceMulti || - element.type === TSurveyElementTypeEnum.Ranking - ) { - element.choices.forEach((choice, choiceIndex) => { - elementMultiLangIssue = validateElementLabels( - `Choice ${String(choiceIndex + 1)}`, - choice.label, - languages, - blockIndex, - elementIndex, - true - ); - if (elementMultiLangIssue) { - elementMultiLangIssue.path = [ - "blocks", - blockIndex, - "elements", - elementIndex, - "choices", - choiceIndex, - ]; - ctx.addIssue(elementMultiLangIssue); - } - }); - - const duplicateChoicesLanguageCodes = findLanguageCodesForDuplicateLabels( - element.choices.map((choice) => choice.label), - languages - ); - - if (duplicateChoicesLanguageCodes.length > 0) { - const invalidLanguageCodes = duplicateChoicesLanguageCodes.map((invalidLanguageCode) => - invalidLanguageCode === "default" - ? (languages.find((lang) => lang.default)?.language.code ?? "default") - : invalidLanguageCode - ); - - const isDefaultOnly = - invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate choice labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["blocks", blockIndex, "elements", elementIndex, "choices"], - params: isDefaultOnly ? undefined : { invalidLanguageCodes }, - }); - } - } - - if (element.type === TSurveyElementTypeEnum.Consent) { - elementMultiLangIssue = validateElementLabels( - "consent.label", - element.label, - languages, - blockIndex, - elementIndex - ); - - if (elementMultiLangIssue) { - elementMultiLangIssue.path = ["blocks", blockIndex, "elements", elementIndex, "label"]; - ctx.addIssue(elementMultiLangIssue); - } - } - - if (element.type === TSurveyElementTypeEnum.CTA) { - // Only validate buttonExternal fields when buttonExternal is true - if (element.buttonExternal) { - // Validate ctaButtonLabel when buttonExternal is enabled - elementMultiLangIssue = validateElementLabels( - "ctaButtonLabel", - element.ctaButtonLabel ?? {}, - languages, - blockIndex, - elementIndex - ); - if (elementMultiLangIssue) { - elementMultiLangIssue.path = [ - "blocks", - blockIndex, - "elements", - elementIndex, - "ctaButtonLabel", - ]; - ctx.addIssue(elementMultiLangIssue); - } - - // Validate buttonUrl when buttonExternal is enabled - if (!element.buttonUrl || element.buttonUrl.trim() === "") { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}: Button URL is required when external button is enabled`, - path: ["blocks", blockIndex, "elements", elementIndex, "buttonUrl"], - }); - } else { - const parsedButtonUrl = getZSafeUrl.safeParse(element.buttonUrl); - if (!parsedButtonUrl.success) { - const errorMessage = parsedButtonUrl.error.issues[0].message; - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Element ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}: ${errorMessage}`, - path: ["blocks", blockIndex, "elements", elementIndex, "buttonUrl"], - }); - } - } - } - } - - if (element.type === TSurveyElementTypeEnum.Matrix) { - element.rows.forEach((row, rowIndex) => { - elementMultiLangIssue = validateElementLabels( - `Row ${String(rowIndex + 1)}`, - row.label, - languages, - blockIndex, - elementIndex, - true - ); - if (elementMultiLangIssue) { - elementMultiLangIssue.path = [ - "blocks", - blockIndex, - "elements", - elementIndex, - "rows", - rowIndex, - ]; - ctx.addIssue(elementMultiLangIssue); - } - }); - - element.columns.forEach((column, columnIndex) => { - elementMultiLangIssue = validateElementLabels( - `Column ${String(columnIndex + 1)}`, - column.label, - languages, - blockIndex, - elementIndex, - true - ); - if (elementMultiLangIssue) { - elementMultiLangIssue.path = [ - "blocks", - blockIndex, - "elements", - elementIndex, - "columns", - columnIndex, - ]; - ctx.addIssue(elementMultiLangIssue); - } - }); - - const duplicateRowsLanguageCodes = findLanguageCodesForDuplicateLabels( - element.rows.map((row) => row.label), - languages - ); - const duplicateColumnLanguageCodes = findLanguageCodesForDuplicateLabels( - element.columns.map((column) => column.label), - languages - ); - - if (duplicateRowsLanguageCodes.length > 0) { - const invalidLanguageCodes = duplicateRowsLanguageCodes.map((invalidLanguageCode) => - invalidLanguageCode === "default" - ? (languages.find((lang) => lang.default)?.language.code ?? "default") - : invalidLanguageCode - ); - - const isDefaultOnly = - invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; - - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate row labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["blocks", blockIndex, "elements", elementIndex, "rows"], - params: isDefaultOnly ? undefined : { invalidLanguageCodes }, - }); - } - - if (duplicateColumnLanguageCodes.length > 0) { - const invalidLanguageCodes = duplicateColumnLanguageCodes.map((invalidLanguageCode) => - invalidLanguageCode === "default" - ? (languages.find((lang) => lang.default)?.language.code ?? "default") - : invalidLanguageCode - ); - - const isDefaultOnly = - invalidLanguageCodes.length === 1 && invalidLanguageCodes[0] === "default"; - - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} has duplicate column labels ${isDefaultOnly ? "" : "for the following languages:"}`, - path: ["blocks", blockIndex, "elements", elementIndex, "columns"], - params: isDefaultOnly ? undefined : { invalidLanguageCodes }, - }); - } - } - - if (element.type === TSurveyElementTypeEnum.FileUpload) { - if (element.allowedFileExtensions && element.allowedFileExtensions.length === 0) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)} must have atleast one allowed file extension`, - path: ["blocks", blockIndex, "elements", elementIndex, "allowedFileExtensions"], - }); - } - } - - if (element.type === TSurveyElementTypeEnum.Cal) { - if (element.calHost !== undefined) { - const hostnameRegex = /^(?!-)[a-zA-Z0-9-]{1,63}(? !field.show)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `At least one field must be shown in the Contact Info question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}`, - path: ["blocks", blockIndex, "elements", elementIndex], - }); - } - fields.forEach((field) => { - const multiLangIssueInPlaceholder = - field.show && - validateElementLabels( - `Label for field ${field.label}`, - field.placeholder, - languages, - blockIndex, - elementIndex, - true - ); - if (multiLangIssueInPlaceholder) { - multiLangIssueInPlaceholder.path = [ - "blocks", - blockIndex, - "elements", - elementIndex, - field.label.toLowerCase().replace(" ", ""), - ]; - ctx.addIssue(multiLangIssueInPlaceholder); - } - }); - } - - if (element.type === TSurveyElementTypeEnum.Address) { - const { addressLine1, addressLine2, city, state, zip, country } = element; - const fields = [ - { ...addressLine1, label: "Address Line 1" }, - { ...addressLine2, label: "Address Line 2" }, - { ...city, label: "City" }, - { ...state, label: "State" }, - { ...zip, label: "Zip" }, - { ...country, label: "Country" }, - ]; - - if (fields.every((field) => !field.show)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `At least one field must be shown in the Address question ${String(elementIndex + 1)} in block ${String(blockIndex + 1)}`, - path: ["blocks", blockIndex, "elements", elementIndex], - }); - } - fields.forEach((field) => { - const multiLangIssueInPlaceholder = - field.show && - validateElementLabels( - `Label for field ${field.label}`, - field.placeholder, - languages, - blockIndex, - elementIndex, - true - ); - if (multiLangIssueInPlaceholder) { - multiLangIssueInPlaceholder.path = [ + ...multiLangIssueInPlaceholder, + path: [ "blocks", blockIndex, "elements", elementIndex, field.label.toLowerCase().replace(/ /g, ""), - ]; - ctx.addIssue(multiLangIssueInPlaceholder); - } - }); - } - }); - - // Validate block logic (conditions, actions, fallback) - const logicIssues = validateBlockLogic(survey, blockIndex, block, allElements); - logicIssues.forEach((issue) => { - ctx.addIssue(issue); - }); + ], + }); + } + }); + } }); - // 5. Check for cyclic logic in blocks - const blocksWithCyclicLogic = findBlocksWithCyclicLogic(blocks); - if (blocksWithCyclicLogic.length > 0) { - blocksWithCyclicLogic.forEach((blockId) => { - const blockIndex = blocks.findIndex((b) => b.id === blockId); - if (blockIndex !== -1) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Conditional Logic: Cyclic logic detected in block ${String(blockIndex + 1)} (${blocks[blockIndex].name}).`, - path: ["blocks", blockIndex, "logic"], - }); - } - }); - } - } + // Validate block logic (conditions, actions, fallback) + const logicIssues = validateBlockLogic(survey, blockIndex, block, allElements); + logicIssues.forEach((issue) => { + ctx.addIssue(issue as z.IssueData); + }); + }); - endings.forEach((ending, index) => { - // thank you card validations - if (ending.type === "endScreen") { - const multiLangIssueInHeadline = validateCardFieldsForAllLanguages( - "cardHeadline", - ending.headline ?? {}, + // 5. Check for cyclic logic in blocks + const blocksWithCyclicLogic = findBlocksWithCyclicLogic(blocks); + if (blocksWithCyclicLogic.length > 0) { + blocksWithCyclicLogic.forEach((blockId) => { + const blockIndex = blocks.findIndex((b) => b.id === blockId); + if (blockIndex !== -1) { + ctx.addIssue({ + code: "custom", + message: `Conditional Logic: Cyclic logic detected in block ${String(blockIndex + 1)} (${blocks[blockIndex].name}).`, + path: ["blocks", blockIndex, "logic"], + }); + } + }); + } + } + + endings.forEach((ending, index) => { + // thank you card validations + if (ending.type === "endScreen") { + const multiLangIssueInHeadline = validateCardFieldsForAllLanguages( + "cardHeadline", + ending.headline ?? {}, + languages, + "end", + index + ); + + if (multiLangIssueInHeadline) { + ctx.addIssue(multiLangIssueInHeadline); + } + + if (ending.subheader) { + const multiLangIssueInSubheader = validateCardFieldsForAllLanguages( + "subheader", + ending.subheader, languages, "end", index ); - if (multiLangIssueInHeadline) { - ctx.addIssue(multiLangIssueInHeadline); + if (multiLangIssueInSubheader) { + ctx.addIssue(multiLangIssueInSubheader); } + } - if (ending.subheader) { - const multiLangIssueInSubheader = validateCardFieldsForAllLanguages( - "subheader", - ending.subheader, + if (ending.buttonLabel !== undefined || ending.buttonLink !== undefined) { + if (!ending.buttonLabel) { + ctx.addIssue({ + code: "custom", + message: `Ending card ${String(index + 1)}: Button label cannot be empty`, + path: ["endings", index, "buttonLabel"], + }); + } else { + const multiLangIssueInButtonLabel = validateCardFieldsForAllLanguages( + "endingCardButtonLabel", + ending.buttonLabel, languages, "end", index ); - - if (multiLangIssueInSubheader) { - ctx.addIssue(multiLangIssueInSubheader); + if (multiLangIssueInButtonLabel) { + ctx.addIssue(multiLangIssueInButtonLabel); } } - if (ending.buttonLabel !== undefined || ending.buttonLink !== undefined) { - if (!ending.buttonLabel) { + if (!ending.buttonLink || ending.buttonLink.trim() === "") { + ctx.addIssue({ + code: "custom", + message: `Ending card ${String(index + 1)}: Button link cannot be empty`, + path: ["endings", index, "buttonLink"], + }); + } else { + const parsedButtonLink = ZEndingCardUrl.safeParse(ending.buttonLink); + if (!parsedButtonLink.success) { + const errorMessage = parsedButtonLink.error.issues[0].message; ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Ending card ${String(index + 1)}: Button label cannot be empty`, - path: ["endings", index, "buttonLabel"], + code: "custom", + message: `Ending card ${String(index + 1)}: ${errorMessage}`, + path: ["endings", index, "buttonLink"], }); - } else { - const multiLangIssueInButtonLabel = validateCardFieldsForAllLanguages( - "endingCardButtonLabel", - ending.buttonLabel, - languages, - "end", - index - ); - if (multiLangIssueInButtonLabel) { - ctx.addIssue(multiLangIssueInButtonLabel); + } + } + } + } + if (ending.type === "redirectToUrl") { + if (!ending.label || ending.label.trim() === "") { + ctx.addIssue({ + code: "custom", + message: `Redirect Url label cannot be empty for ending Card ${String(index + 1)}.`, + path: ["endings", index, "label"], + }); + } + + // Validate redirect URL + if (!ending.url || ending.url.trim() === "") { + ctx.addIssue({ + code: "custom", + message: `Ending card ${String(index + 1)}: Redirect URL cannot be empty`, + path: ["endings", index, "url"], + }); + } else { + const parsedUrl = ZEndingCardUrl.safeParse(ending.url); + if (!parsedUrl.success) { + const errorMessage = parsedUrl.error.issues[0].message; + ctx.addIssue({ + code: "custom", + message: `Ending card ${String(index + 1)}: ${errorMessage}`, + path: ["endings", index, "url"], + }); + } + } + } + }); + + if (survey.followUps.length) { + const questionsFromBlocks = survey.blocks.flatMap((block: TSurveyBlock) => block.elements); + + survey.followUps + .filter((followUp) => !followUp.deleted) + .forEach((followUp, index) => { + if (followUp.action.properties.to) { + const validOptions = [ + "verifiedEmail", // Allow verified email from email verification feature + ...questionsFromBlocks + .filter((q) => { + if (q.type === TSurveyElementTypeEnum.OpenText) { + if (q.inputType === "email") { + return true; + } + } + + if (q.type === TSurveyElementTypeEnum.ContactInfo) { + return q.email.show; + } + + return false; + }) + .map((q) => q.id), + ...(survey.hiddenFields.fieldIds ?? []), + ]; + + if (validOptions.findIndex((option) => option === followUp.action.properties.to) === -1) { + // not from a valid option within the survey, but it could be a correct email from the team member emails or the user's email: + const parsedEmailTo = z.email().safeParse(followUp.action.properties.to); + if (!parsedEmailTo.success) { + ctx.addIssue({ + code: "custom", + message: `The action in follow up ${String(index + 1)} has an invalid email field`, + path: ["followUps"], + }); } } - if (!ending.buttonLink || ending.buttonLink.trim() === "") { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Ending card ${String(index + 1)}: Button link cannot be empty`, - path: ["endings", index, "buttonLink"], - }); - } else { - const parsedButtonLink = ZEndingCardUrl.safeParse(ending.buttonLink); - if (!parsedButtonLink.success) { - const errorMessage = parsedButtonLink.error.issues[0].message; + if (followUp.trigger.type === "endings") { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- endingIds is always defined + if (!followUp.trigger.properties?.endingIds?.length) { ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Ending card ${String(index + 1)}: ${errorMessage}`, - path: ["endings", index, "buttonLink"], + code: "custom", + message: `The trigger in follow up ${String(index + 1)} has no ending selected`, + path: ["followUps"], }); } } } - } - if (ending.type === "redirectToUrl") { - if (!ending.label || ending.label.trim() === "") { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Redirect Url label cannot be empty for ending Card ${String(index + 1)}.`, - path: ["endings", index, "label"], - }); - } + }); + } +}; - // Validate redirect URL - if (!ending.url || ending.url.trim() === "") { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Ending card ${String(index + 1)}: Redirect URL cannot be empty`, - path: ["endings", index, "url"], - }); - } else { - const parsedUrl = ZEndingCardUrl.safeParse(ending.url); - if (!parsedUrl.success) { - const errorMessage = parsedUrl.error.issues[0].message; - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Ending card ${String(index + 1)}: ${errorMessage}`, - path: ["endings", index, "url"], - }); - } - } - } - }); - - if (survey.followUps.length) { - const questionsFromBlocks = survey.blocks.flatMap((block: TSurveyBlock) => block.elements); - - survey.followUps - .filter((followUp) => !followUp.deleted) - .forEach((followUp, index) => { - if (followUp.action.properties.to) { - const validOptions = [ - "verifiedEmail", // Allow verified email from email verification feature - ...questionsFromBlocks - .filter((q) => { - if (q.type === TSurveyElementTypeEnum.OpenText) { - if (q.inputType === "email") { - return true; - } - } - - if (q.type === TSurveyElementTypeEnum.ContactInfo) { - return q.email.show; - } - - return false; - }) - .map((q) => q.id), - ...(survey.hiddenFields.fieldIds ?? []), - ]; - - if (validOptions.findIndex((option) => option === followUp.action.properties.to) === -1) { - // not from a valid option within the survey, but it could be a correct email from the team member emails or the user's email: - const parsedEmailTo = z.string().email().safeParse(followUp.action.properties.to); - if (!parsedEmailTo.success) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `The action in follow up ${String(index + 1)} has an invalid email field`, - path: ["followUps"], - }); - } - } - - if (followUp.trigger.type === "endings") { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- endingIds is always defined - if (!followUp.trigger.properties?.endingIds?.length) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `The trigger in follow up ${String(index + 1)} has no ending selected`, - path: ["followUps"], - }); - } - } - } - }); - } - }); +export const ZSurvey = ZSurveyBase.superRefine(surveyRefinement); const isInvalidOperatorsForQuestionType = ( question: TSurveyQuestion, @@ -2106,14 +2111,14 @@ const validateConditions = ( if (!question) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ID ${questionId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); return; } else if (questionIndex < questionIdx) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ${String(questionIndex + 1)} cannot refer to a question ${String(questionIdx + 1)} that appears later in the survey`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2124,7 +2129,7 @@ const validateConditions = ( const isInvalidOperator = isInvalidOperatorsForQuestionType(question, operator); if (isInvalidOperator) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid operator "${operator}" for question type "${question.type}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2146,7 +2151,7 @@ const validateConditions = ( ) { if (rightOperand !== undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should not be defined for operator "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2162,7 +2167,7 @@ const validateConditions = ( if (!ques) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ID ${questionId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2187,7 +2192,7 @@ const validateConditions = ( if (!validQuestionTypes.includes(ques.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type "${ques.type}" for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2199,7 +2204,7 @@ const validateConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2210,7 +2215,7 @@ const validateConditions = ( if (!field) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2218,7 +2223,7 @@ const validateConditions = ( } else if (rightOperand?.type === "static") { if (!rightOperand.value) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Static value is required in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2227,14 +2232,14 @@ const validateConditions = ( } else if (question.type === TSurveyQuestionTypeEnum.MultipleChoiceSingle) { if (rightOperand?.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a static value for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (condition.operator === "equals" || condition.operator === "doesNotEqual") { if (typeof rightOperand.value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a string for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2242,7 +2247,7 @@ const validateConditions = ( const choice = question.choices.find((c) => c.id === rightOperand.value); if (!choice) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choice with label "${rightOperand.value}" does not exist in question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2251,7 +2256,7 @@ const validateConditions = ( } else if (condition.operator === "equalsOneOf") { if (!Array.isArray(rightOperand.value)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be an array for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2259,7 +2264,7 @@ const validateConditions = ( rightOperand.value.forEach((value) => { if (typeof value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be an array of strings for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2270,7 +2275,7 @@ const validateConditions = ( if (rightOperand.value.some((value) => !choices.includes(value))) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choices selected in right operand does not exist in the choices of the question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2283,14 +2288,14 @@ const validateConditions = ( ) { if (rightOperand?.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be amongst the choice values for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (condition.operator === "equals" || condition.operator === "doesNotEqual") { if (typeof rightOperand.value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a string for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2298,7 +2303,7 @@ const validateConditions = ( const choice = question.choices.find((c) => c.id === rightOperand.value); if (!choice) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choice with label "${rightOperand.value}" does not exist in question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2311,7 +2316,7 @@ const validateConditions = ( ) { if (!Array.isArray(rightOperand.value)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be an array for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2319,7 +2324,7 @@ const validateConditions = ( rightOperand.value.forEach((value) => { if (typeof value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be an array of strings for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2330,7 +2335,7 @@ const validateConditions = ( if (rightOperand.value.some((value) => !choices.includes(value))) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choices selected in right operand does not exist in the choices of the question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2347,13 +2352,13 @@ const validateConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== "number") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type should be number in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2361,28 +2366,28 @@ const validateConditions = ( } else if (rightOperand?.type === "static") { if (typeof rightOperand.value !== "number") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a number for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (question.type === TSurveyQuestionTypeEnum.NPS) { if (rightOperand.value < 0 || rightOperand.value > 10) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: NPS score should be between 0 and 10 for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } } else if (rightOperand.value < 1 || rightOperand.value > question.range) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Rating value should be between 1 and ${String(question.range)} for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } } else { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a variable or a static value for "${operator}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2394,7 +2399,7 @@ const validateConditions = ( if (!ques) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ID ${questionId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2402,7 +2407,7 @@ const validateConditions = ( const validQuestionTypes = [TSurveyQuestionTypeEnum.OpenText, TSurveyQuestionTypeEnum.Date]; if (!validQuestionTypes.includes(question.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type "${question.type}" for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2414,13 +2419,13 @@ const validateConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== "text") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type should be text in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2431,7 +2436,7 @@ const validateConditions = ( if (!doesFieldExists) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2441,13 +2446,13 @@ const validateConditions = ( if (!date) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Please select a date value in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (isNaN(new Date(date).getTime())) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid date format for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2458,14 +2463,14 @@ const validateConditions = ( if (row === undefined) { if (rightOperand?.value !== undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand is not allowed in matrix question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } if (!["isPartiallySubmitted", "isCompletelySubmitted"].includes(operator)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Operator "${operator}" is not allowed in matrix question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2473,7 +2478,7 @@ const validateConditions = ( } else { if (rightOperand === undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand is required in matrix question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2481,7 +2486,7 @@ const validateConditions = ( if (rightOperand) { if (rightOperand.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a static value in matrix question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2489,7 +2494,7 @@ const validateConditions = ( const rowIndex = Number(row); if (rowIndex < 0 || rowIndex >= question.rows.length) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid row index in matrix question in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2502,7 +2507,7 @@ const validateConditions = ( const variable = survey.variables.find((v) => v.id === variableId); if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2511,7 +2516,7 @@ const validateConditions = ( const isInvalidOperator = isInvalidOperatorsForVariableType(variable.type, operator); if (isInvalidOperator) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid operator "${operator}" for variable ${variable.name} of type "${variable.type}" in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2524,7 +2529,7 @@ const validateConditions = ( if (!question) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ID ${questionId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2536,7 +2541,7 @@ const validateConditions = ( question.inputType !== "number" ) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type "${question.type}" for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2556,7 +2561,7 @@ const validateConditions = ( if (!validQuestionTypes.includes(question.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type "${question.type}" for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2568,13 +2573,13 @@ const validateConditions = ( if (!foundVariable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== foundVariable.type) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type mismatch in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2585,7 +2590,7 @@ const validateConditions = ( if (!field) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2598,7 +2603,7 @@ const validateConditions = ( if (!hiddenField) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${hiddenFieldId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2608,7 +2613,7 @@ const validateConditions = ( const isInvalidOperator = isInvalidOperatorsForHiddenFieldType(operator); if (isInvalidOperator) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid operator "${operator}" for hidden field in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2621,7 +2626,7 @@ const validateConditions = ( if (!question) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Question ID ${questionId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2640,7 +2645,7 @@ const validateConditions = ( if (!validQuestionTypes.includes(question.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type "${question.type}" for right operand in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2652,13 +2657,13 @@ const validateConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== "text") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type should be text in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2669,7 +2674,7 @@ const validateConditions = ( if (!field) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex, "conditions"], }); @@ -2710,7 +2715,7 @@ const validateActions = ( if (!variable) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${action.variableId} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex], }; @@ -2721,7 +2726,7 @@ const validateActions = ( if (!selectedVariable || selectedVariable.type !== variable.type) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid variable type for variable in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex], }; @@ -2732,8 +2737,8 @@ const validateActions = ( const textVariableParseData = ZActionCalculateText.safeParse(action); if (!textVariableParseData.success) { return { - code: z.ZodIssueCode.custom, - message: textVariableParseData.error.errors[0].message, + code: "custom", + message: textVariableParseData.error.issues[0].message, path: ["questions", questionIndex, "logic", logicIndex], }; } @@ -2751,7 +2756,7 @@ const validateActions = ( if (!selectedQuestion || !allowedQuestions.includes(selectedQuestion.type)) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type for text variable in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex], }; @@ -2764,8 +2769,8 @@ const validateActions = ( const numberVariableParseData = ZActionCalculateNumber.safeParse(action); if (!numberVariableParseData.success) { return { - code: z.ZodIssueCode.custom, - message: numberVariableParseData.error.errors[0].message, + code: "custom", + message: numberVariableParseData.error.issues[0].message, path: ["questions", questionIndex, "logic", logicIndex], }; } @@ -2782,7 +2787,7 @@ const validateActions = ( selectedQuestion.inputType !== "number") ) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid question type for number variable in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex], }; @@ -2796,7 +2801,7 @@ const validateActions = ( if (!possibleQuestionIds.includes(action.target)) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Question ID ${action.target} does not exist in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic"], }; @@ -2811,7 +2816,7 @@ const validateActions = ( const quesIdx = survey.questions.findIndex((q) => q.id === action.target); return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Question ${String(quesIdx + 1)} is already required in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic", logicIndex], }; @@ -2825,7 +2830,7 @@ const validateActions = ( const jumpToQuestionActions = actions.filter((action) => action.objective === "jumpToQuestion"); if (jumpToQuestionActions.length > 1) { actionIssues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Multiple jump actions are not allowed in logic no: ${String(logicIndex + 1)} of question ${String(questionIndex + 1)}`, path: ["questions", questionIndex, "logic"], }); @@ -2843,7 +2848,7 @@ const validateLogicFallback = (survey: TSurvey, questionIdx: number): z.ZodIssue if (!question.logic?.length && question.logicFallback) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback logic is defined without any logic in question ${String(questionIdx + 1)}`, path: ["questions", questionIdx], }, @@ -2851,7 +2856,7 @@ const validateLogicFallback = (survey: TSurvey, questionIdx: number): z.ZodIssue } else if (question.id === question.logicFallback) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback logic is defined with the same question in question ${String(questionIdx + 1)}`, path: ["questions", questionIdx], }, @@ -2873,7 +2878,7 @@ const validateLogicFallback = (survey: TSurvey, questionIdx: number): z.ZodIssue if (!possibleFallbackIds.includes(question.logicFallback)) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback question ID ${question.logicFallback} does not exist in question ${String(questionIdx + 1)}`, path: ["questions", questionIdx], }, @@ -3067,14 +3072,14 @@ const validateBlockConditions = ( if (!elementInfo) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element Id ${elementId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); return; } else if (blockIndex < elementInfo.block) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Block ${String(blockIndex + 1)} cannot refer to an element in block ${String(elementInfo.block + 1)} that appears later in the survey`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3087,7 +3092,7 @@ const validateBlockConditions = ( const isInvalidOperator = isInvalidOperatorsForElementType(element, operator); if (isInvalidOperator) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid operator "${operator}" for element type "${element.type}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3096,7 +3101,7 @@ const validateBlockConditions = ( // Validate CTA elements: CTAs without external buttons cannot be used in logic if (element.type === TSurveyElementTypeEnum.CTA && !element.buttonExternal) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: CTA element "${elementId}" does not have an external button and cannot be used in logic conditions in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3120,7 +3125,7 @@ const validateBlockConditions = ( ) { if (rightOperand !== undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should not be defined for operator "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3136,7 +3141,7 @@ const validateBlockConditions = ( if (!elem) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ID ${elemId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3161,7 +3166,7 @@ const validateBlockConditions = ( if (!validElementTypes.includes(elem.data.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid element type "${elem.data.type}" for right operand in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3173,7 +3178,7 @@ const validateBlockConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3184,7 +3189,7 @@ const validateBlockConditions = ( if (!field) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3192,7 +3197,7 @@ const validateBlockConditions = ( } else if (rightOperand?.type === "static") { if (!rightOperand.value) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Static value is required in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3201,14 +3206,14 @@ const validateBlockConditions = ( } else if (element.type === TSurveyElementTypeEnum.MultipleChoiceSingle) { if (rightOperand?.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a static value for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (condition.operator === "equals" || condition.operator === "doesNotEqual") { if (typeof rightOperand.value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a string for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3217,7 +3222,7 @@ const validateBlockConditions = ( const choiceMatch = element.choices.find((c) => c.id === rightOperand.value); if (!choiceMatch) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choice "${rightOperand.value}" does not exist in element ${String(elementInfo.element + 1)} of block ${String(elementInfo.block + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3231,14 +3236,14 @@ const validateBlockConditions = ( ) { if (rightOperand?.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a static value for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (condition.operator === "equals" || condition.operator === "doesNotEqual") { if (typeof rightOperand.value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a string for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3247,7 +3252,7 @@ const validateBlockConditions = ( const choiceMatch = element.choices.find((c) => c.id === rightOperand.value); if (!choiceMatch) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Choice "${rightOperand.value}" does not exist in element ${String(elementInfo.element + 1)} of block ${String(elementInfo.block + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3260,7 +3265,7 @@ const validateBlockConditions = ( ) { if (!Array.isArray(rightOperand.value)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be an array for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3268,7 +3273,7 @@ const validateBlockConditions = ( rightOperand.value.forEach((value) => { if (typeof value !== "string") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Each value in the right operand should be a string for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3279,7 +3284,7 @@ const validateBlockConditions = ( const choiceIds = element.choices.map((c) => c.id); if (rightOperand.value.some((value) => !choiceIds.includes(value))) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: One or more choices selected in right operand do not exist in the element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3296,13 +3301,13 @@ const validateBlockConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== "number") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type should be number in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3310,28 +3315,28 @@ const validateBlockConditions = ( } else if (rightOperand?.type === "static") { if (typeof rightOperand.value !== "number") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a number for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (element.type === TSurveyElementTypeEnum.NPS) { if (rightOperand.value < 0 || rightOperand.value > 10) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: NPS score should be between 0 and 10 for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } } else if (rightOperand.value < 1 || rightOperand.value > element.range) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Rating value should be between 1 and ${String(element.range)} for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } } else { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a variable or a static value for "${operator}" in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3343,7 +3348,7 @@ const validateBlockConditions = ( if (!elem) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ID ${elemId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3354,7 +3359,7 @@ const validateBlockConditions = ( ]; if (!validElementTypes.includes(elem.data.type)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid element type "${elem.data.type}" for right operand in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3366,13 +3371,13 @@ const validateBlockConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (variable.type !== "text") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable type should be text in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3383,7 +3388,7 @@ const validateBlockConditions = ( if (!doesFieldExists) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3393,13 +3398,13 @@ const validateBlockConditions = ( if (!date) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Please select a date value in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } else if (isNaN(new Date(date).getTime())) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid date format for right operand in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3410,14 +3415,14 @@ const validateBlockConditions = ( if (row === undefined) { if (rightOperand?.value !== undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand is not allowed in matrix element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); } if (!["isPartiallySubmitted", "isCompletelySubmitted"].includes(operator)) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Operator "${operator}" is not allowed in matrix element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3425,7 +3430,7 @@ const validateBlockConditions = ( } else { if (rightOperand === undefined) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand is required in matrix element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3433,7 +3438,7 @@ const validateBlockConditions = ( if (rightOperand) { if (rightOperand.type !== "static") { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Right operand should be a static value in matrix element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3441,7 +3446,7 @@ const validateBlockConditions = ( const rowIndex = Number(row); if (rowIndex < 0 || rowIndex >= element.rows.length) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid row index in matrix element in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3455,7 +3460,7 @@ const validateBlockConditions = ( if (!variable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${variableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3468,7 +3473,7 @@ const validateBlockConditions = ( if (!rightVariable) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${rightVariableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3481,7 +3486,7 @@ const validateBlockConditions = ( if (!field) { issues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Hidden field ID ${fieldId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex, "conditions"], }); @@ -3521,7 +3526,7 @@ const validateBlockActions = ( if (!variable) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Variable ID ${action.variableId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3532,7 +3537,7 @@ const validateBlockActions = ( if (!selectedVariable || selectedVariable.type !== variable.type) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid variable type for variable in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3553,7 +3558,7 @@ const validateBlockActions = ( if (!selectedElement || !allowedElements.includes(selectedElement.data.type)) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid element type for text variable in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3578,7 +3583,7 @@ const validateBlockActions = ( selectedElement.data.inputType !== "number") ) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Invalid element type for number variable in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3591,7 +3596,7 @@ const validateBlockActions = ( if (!targetElementInfo) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ID ${targetElementId} does not exist for requireAnswer action in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3600,7 +3605,7 @@ const validateBlockActions = ( // Check if element is in the current block (not allowed) if (targetElementInfo.block === blockIndex) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ${targetElementId} cannot be in the current block for requireAnswer action in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}. RequireAnswer must target elements in other blocks.`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3609,7 +3614,7 @@ const validateBlockActions = ( // Check if element is in a previous block (should target future blocks) if (targetElementInfo.block < blockIndex) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ${targetElementId} is in a previous block (block ${String(targetElementInfo.block + 1)}). RequireAnswer should target elements in future blocks after block ${String(blockIndex + 1)}.`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3618,7 +3623,7 @@ const validateBlockActions = ( // Check if element is optional (not required) if (targetElementInfo.data.required) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Element ${targetElementId} in block ${String(targetElementInfo.block + 1)} is already required in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3632,7 +3637,7 @@ const validateBlockActions = ( if (!possibleTargets.includes(targetBlockId)) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Block ID ${targetBlockId} does not exist in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3641,7 +3646,7 @@ const validateBlockActions = ( // Cannot jump to the current block if (targetBlockId === currentBlock.id) { return { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Cannot jump to the current block in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic", logicIndex], }; @@ -3654,7 +3659,7 @@ const validateBlockActions = ( const jumpToBlockActions = actions.filter((action) => action.objective === "jumpToBlock"); if (jumpToBlockActions.length > 1) { actionIssues.push({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Multiple jump actions are not allowed in logic no: ${String(logicIndex + 1)} of block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex, "logic"], }); @@ -3674,7 +3679,7 @@ const validateBlockLogicFallback = ( if (!block.logic?.length && block.logicFallback) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback logic is defined without any logic in block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex], }, @@ -3682,7 +3687,7 @@ const validateBlockLogicFallback = ( } else if (block.id === block.logicFallback) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback logic is defined with the same block in block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex], }, @@ -3704,7 +3709,7 @@ const validateBlockLogicFallback = ( if (!possibleFallbackIds.includes(block.logicFallback)) { return [ { - code: z.ZodIssueCode.custom, + code: "custom", message: `Conditional Logic: Fallback block ID ${block.logicFallback} does not exist in block ${String(blockIndex + 1)}`, path: ["blocks", blockIndex], }, @@ -3734,9 +3739,8 @@ const validateBlockLogic = ( return [...logicIssues.flat(), ...(logicFallbackIssue ?? [])]; }; -// ZSurvey is a refinement, so to extend it to ZSurveyUpdateInput, we need to transform the innerType and then apply the same refinements. -export const ZSurveyUpdateInput = ZSurvey.innerType() - .omit({ createdAt: true, updatedAt: true, followUps: true }) +// ZSurvey is refined, so update/create inputs start from ZSurveyBase and reapply the same refinement. +export const ZSurveyUpdateInput = ZSurveyBase.omit({ createdAt: true, updatedAt: true, followUps: true }) .extend({ followUps: z .array( @@ -3747,7 +3751,7 @@ export const ZSurveyUpdateInput = ZSurvey.innerType() }) ) ) - .default([]), + .prefault([]), }) .and( z.object({ @@ -3755,7 +3759,7 @@ export const ZSurveyUpdateInput = ZSurvey.innerType() updatedAt: z.coerce.date(), }) ) - .superRefine(ZSurvey._def.effect.type === "refinement" ? ZSurvey._def.effect.refinement : () => undefined); + .superRefine(surveyRefinement); // Helper function to make all properties of a Zod object schema optional const makeSchemaOptional = ( @@ -3763,14 +3767,12 @@ const makeSchemaOptional = ( ): z.ZodObject<{ [K in keyof T]: z.ZodOptional; }> => { - return schema.extend( - Object.fromEntries(Object.entries(schema.shape).map(([key, value]) => [key, value.optional()])) as { - [K in keyof T]: z.ZodOptional; - } - ); + return schema.partial() as z.ZodObject<{ + [K in keyof T]: z.ZodOptional; + }>; }; -export const ZSurveyCreateInput = makeSchemaOptional(ZSurvey.innerType()) +export const ZSurveyCreateInput = makeSchemaOptional(ZSurveyBase) .omit({ id: true, createdAt: true, @@ -3781,24 +3783,26 @@ export const ZSurveyCreateInput = makeSchemaOptional(ZSurvey.innerType()) }) .extend({ name: z.string(), // Keep name required - questions: ZSurvey.innerType().shape.questions, - blocks: ZSurvey.innerType().shape.blocks, - languages: z.array(ZSurveyLanguage).default([]), - welcomeCard: ZSurveyWelcomeCard.default({ + questions: ZSurveyBase.shape.questions, + blocks: ZSurveyBase.shape.blocks, + languages: z.array(ZSurveyLanguage).prefault([]), + welcomeCard: ZSurveyWelcomeCard.prefault({ enabled: false, }), - endings: ZSurveyEndings.default([]), - type: ZSurveyType.default("link"), - followUps: z.array(ZSurveyFollowUp.omit({ createdAt: true, updatedAt: true })).default([]), + endings: ZSurveyEndings.prefault([]), + type: ZSurveyType.prefault("link"), + followUps: z.array(ZSurveyFollowUp.omit({ createdAt: true, updatedAt: true })).prefault([]), + }) + .superRefine((survey, ctx) => { + surveyRefinement(survey as z.infer, ctx); }) - .superRefine(ZSurvey._def.effect.type === "refinement" ? ZSurvey._def.effect.refinement : () => null) .superRefine((data, ctx) => { const hasQuestions = data.questions.length > 0; const hasBlocks = data.blocks.length > 0; if (hasQuestions && hasBlocks) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Cannot provide both questions and blocks. Please provide only one of these fields.", path: ["questions"], }); @@ -3806,7 +3810,7 @@ export const ZSurveyCreateInput = makeSchemaOptional(ZSurvey.innerType()) if (!hasQuestions && !hasBlocks) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Must provide either questions or blocks. Both cannot be empty.", path: ["questions"], }); @@ -3815,7 +3819,7 @@ export const ZSurveyCreateInput = makeSchemaOptional(ZSurvey.innerType()) export type TSurvey = z.infer; -export const ZSurveyCreateInputWithEnvironmentId = makeSchemaOptional(ZSurvey.innerType()) +export const ZSurveyCreateInputWithEnvironmentId = makeSchemaOptional(ZSurveyBase) .omit({ id: true, createdAt: true, @@ -3827,24 +3831,26 @@ export const ZSurveyCreateInputWithEnvironmentId = makeSchemaOptional(ZSurvey.in .extend({ name: z.string(), // Keep name required environmentId: z.string(), - questions: ZSurvey.innerType().shape.questions, - blocks: ZSurvey.innerType().shape.blocks, - languages: z.array(ZSurveyLanguage).default([]), - welcomeCard: ZSurveyWelcomeCard.default({ + questions: ZSurveyBase.shape.questions, + blocks: ZSurveyBase.shape.blocks, + languages: z.array(ZSurveyLanguage).prefault([]), + welcomeCard: ZSurveyWelcomeCard.prefault({ enabled: false, }), - endings: ZSurveyEndings.default([]), - type: ZSurveyType.default("link"), - followUps: z.array(ZSurveyFollowUp.omit({ createdAt: true, updatedAt: true })).default([]), + endings: ZSurveyEndings.prefault([]), + type: ZSurveyType.prefault("link"), + followUps: z.array(ZSurveyFollowUp.omit({ createdAt: true, updatedAt: true })).prefault([]), + }) + .superRefine((survey, ctx) => { + surveyRefinement(survey as z.infer, ctx); }) - .superRefine(ZSurvey._def.effect.type === "refinement" ? ZSurvey._def.effect.refinement : () => null) .superRefine((data, ctx) => { const hasQuestions = data.questions.length > 0; const hasBlocks = data.blocks.length > 0; if (hasQuestions && hasBlocks) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Cannot provide both questions and blocks. Please provide only one of these fields.", path: ["questions"], }); @@ -3852,7 +3858,7 @@ export const ZSurveyCreateInputWithEnvironmentId = makeSchemaOptional(ZSurvey.in if (!hasQuestions && !hasBlocks) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Must provide either questions or blocks. Both cannot be empty.", path: ["questions"], }); @@ -4235,8 +4241,8 @@ export const ZSurveySummary = z.object({ }), dropOff: z.array( z.object({ - elementId: z.string().cuid2(), - elementType: z.nativeEnum(TSurveyElementTypeEnum), + elementId: z.cuid2(), + elementType: z.enum(TSurveyElementTypeEnum), headline: z.string(), ttc: z.number(), impressions: z.number(), diff --git a/packages/types/surveys/validation-rules.ts b/packages/types/surveys/validation-rules.ts index 705035d20e..1a6bba6fb7 100644 --- a/packages/types/surveys/validation-rules.ts +++ b/packages/types/surveys/validation-rules.ts @@ -72,11 +72,11 @@ export const ZValidationRuleParamsPattern = z.object({ // Use strict() to prevent these empty objects from matching any object in unions // Without strict(), z.object({}) is non-strict and accepts extra properties, defeating union discrimination -export const ZValidationRuleParamsEmail = z.object({}).strict(); +export const ZValidationRuleParamsEmail = z.strictObject({}); -export const ZValidationRuleParamsUrl = z.object({}).strict(); +export const ZValidationRuleParamsUrl = z.strictObject({}); -export const ZValidationRuleParamsPhone = z.object({}).strict(); +export const ZValidationRuleParamsPhone = z.strictObject({}); export const ZValidationRuleParamsMinValue = z.object({ min: z.number(), @@ -140,8 +140,8 @@ export const ZValidationRuleParamsMinRanked = z.object({ min: z.number().min(1), }); -export const ZValidationRuleParamsRankAll = z.object({}).strict(); -export const ZValidationRuleParamsAnswerAllRows = z.object({}).strict(); +export const ZValidationRuleParamsRankAll = z.strictObject({}); +export const ZValidationRuleParamsAnswerAllRows = z.strictObject({}); export const ZValidationRuleParamsMinRowsAnswered = z.object({ min: z.number().min(1), diff --git a/packages/types/surveys/validation.ts b/packages/types/surveys/validation.ts index a3e8e423e1..b0f83b75b0 100644 --- a/packages/types/surveys/validation.ts +++ b/packages/types/surveys/validation.ts @@ -1,5 +1,5 @@ import { parse } from "node-html-parser"; -import { z } from "zod"; +import type { IssueData } from "zod"; import type { TI18nString } from "../i18n"; import type { TConditionGroup, TSingleCondition } from "./logic"; import type { @@ -118,7 +118,7 @@ export const validateQuestionLabels = ( languages: TSurveyLanguage[], questionIndex: number, skipArticle = false -): z.IssueData | null => { +): IssueData | null => { // fieldLabel should contain all the keys present in languages // even if one of the keys is an empty string, its okay but it shouldn't be undefined @@ -129,7 +129,8 @@ export const validateQuestionLabels = ( fieldLabel[language.language.code] === undefined ) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message: `The ${field} in question ${String(questionIndex + 1)} is not present for the following languages: ${language.language.code}`, path: ["questions", questionIndex, field], }; @@ -149,7 +150,8 @@ export const validateQuestionLabels = ( if (invalidLanguageCodes.length) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message, path: ["questions", questionIndex, field], params: isDefaultOnly ? undefined : { invalidLanguageCodes }, @@ -166,7 +168,7 @@ export const validateCardFieldsForAllLanguages = ( cardType: "welcome" | "end", endingCardIndex?: number, skipArticle = false -): z.IssueData | null => { +): IssueData | null => { // fieldLabel should contain all the keys present in languages // even if one of the keys is an empty string, its okay but it shouldn't be undefined @@ -182,7 +184,8 @@ export const validateCardFieldsForAllLanguages = ( fieldLabel[language.language.code] === undefined ) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message: `The ${field} in ${cardTypeLabel} is not present for the following languages: ${language.language.code}`, path, }; @@ -202,7 +205,8 @@ export const validateCardFieldsForAllLanguages = ( if (invalidLanguageCodes.length) { return { - code: z.ZodIssueCode.custom, + code: "custom", + input: fieldLabel, message, path, params: isDefaultOnly ? undefined : { invalidLanguageCodes }, diff --git a/packages/types/tags.ts b/packages/types/tags.ts index 1e859f2447..cfc1cbafd5 100644 --- a/packages/types/tags.ts +++ b/packages/types/tags.ts @@ -1,7 +1,7 @@ import { z } from "zod"; export const ZTag = z.object({ - id: z.string().cuid2(), + id: z.cuid2(), createdAt: z.date(), updatedAt: z.date(), name: z.string(), @@ -11,7 +11,7 @@ export type TTag = z.infer; export const ZTagsCount = z.array( z.object({ - tagId: z.string().cuid2(), + tagId: z.cuid2(), count: z.number(), }) ); diff --git a/packages/types/templates.ts b/packages/types/templates.ts index 01827dbf8c..535f897d0e 100644 --- a/packages/types/templates.ts +++ b/packages/types/templates.ts @@ -22,7 +22,7 @@ export const ZTemplate = z.object({ preset: z.object({ name: z.string(), welcomeCard: ZSurveyWelcomeCard, - blocks: ZSurveyBlocks.default([]), + blocks: ZSurveyBlocks.prefault([]), endings: ZSurveyEndings, hiddenFields: ZSurveyHiddenFields, }), diff --git a/packages/types/user.ts b/packages/types/user.ts index 9a8cb1fae8..dc893ead94 100644 --- a/packages/types/user.ts +++ b/packages/types/user.ts @@ -20,24 +20,34 @@ export const ZUserLocale = z.enum([ export type TUserLocale = z.infer; export const ZUserNotificationSettings = z.object({ - alert: z.record(z.boolean()), + alert: z.record(z.string(), z.boolean()), unsubscribedOrganizationIds: z.array(z.string()).optional(), }); export const ZUserName = z .string() .trim() - .min(1, { message: "Name should be at least 1 character long" }) + .min(1, { + error: "Name should be at least 1 character long", + }) .regex(/^[\p{L}\p{M}\s'\d-]+$/u, "Invalid name format"); -export const ZUserEmail = z.string().max(255).email({ message: "Invalid email" }); +export const ZUserEmail = z + .email({ + error: "Invalid email", + }) + .max(255); export type TUserEmail = z.infer; export const ZUserPassword = z .string() - .min(8, { message: "Password must be at least 8 characters long" }) - .max(128, { message: "Password must be 128 characters or less" }) + .min(8, { + error: "Password must be at least 8 characters long", + }) + .max(128, { + error: "Password must be 128 characters or less", + }) .regex(/^(?=.*[A-Z])(?=.*\d).*$/); export type TUserPassword = z.infer; @@ -58,7 +68,7 @@ export const ZUser = z.object({ notificationSettings: ZUserNotificationSettings, locale: ZUserLocale, lastLoginAt: z.date().nullable(), - isActive: z.boolean().default(true), + isActive: z.boolean().prefault(true), }); export type TUser = z.infer; diff --git a/packages/vite-plugins/package.json b/packages/vite-plugins/package.json index 1d9911c7e5..9125ece072 100644 --- a/packages/vite-plugins/package.json +++ b/packages/vite-plugins/package.json @@ -17,6 +17,6 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "vite": "6.4.1" + "vite": "7.3.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20ce7f66dd..1383213c9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,8 +51,8 @@ importers: specifier: 9.1.7 version: 9.1.7 lint-staged: - specifier: 16.3.1 - version: 16.3.1 + specifier: 16.3.2 + version: 16.3.2 rimraf: specifier: 6.1.3 version: 6.1.3 @@ -60,32 +60,32 @@ importers: specifier: 4.21.0 version: 4.21.0 turbo: - specifier: 2.8.12 - version: 2.8.12 + specifier: 2.8.13 + version: 2.8.13 apps/storybook: devDependencies: '@chromatic-com/storybook': specifier: ^5.0.1 - version: 5.0.1(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 5.0.1(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-a11y': - specifier: 10.2.14 - version: 10.2.14(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + specifier: 10.2.15 + version: 10.2.15(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-docs': - specifier: 10.2.14 - version: 10.2.14(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3)) + specifier: 10.2.15 + version: 10.2.15(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) '@storybook/addon-links': - specifier: 10.2.14 - version: 10.2.14(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + specifier: 10.2.15 + version: 10.2.15(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-onboarding': - specifier: 10.2.14 - version: 10.2.14(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + specifier: 10.2.15 + version: 10.2.15(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/react-vite': - specifier: 10.2.14 - version: 10.2.14(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3)) + specifier: 10.2.15 + version: 10.2.15(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) '@tailwindcss/vite': specifier: 4.2.1 - version: 4.2.1(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) @@ -94,25 +94,25 @@ importers: version: 8.56.1(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) eslint-plugin-react-refresh: specifier: 0.4.26 version: 0.4.26(eslint@8.57.1) eslint-plugin-storybook: specifier: 10.2.14 - version: 10.2.14(eslint@8.57.1)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 10.2.14(eslint@8.57.1)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) storybook: - specifier: 10.2.14 - version: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 10.2.15 + version: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) vite: specifier: 7.3.1 - version: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) apps/web: dependencies: '@boxyhq/saml-jackson': specifier: 1.52.2 - version: 1.52.2(socks@2.8.7)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + version: 1.52.2(socks@2.8.7)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) '@dnd-kit/core': specifier: 6.3.1 version: 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -180,41 +180,41 @@ importers: specifier: 0.41.0 version: 0.41.0 '@opentelemetry/auto-instrumentations-node': - specifier: 0.70.1 - version: 0.70.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)) + specifier: 0.71.0 + version: 0.71.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)) '@opentelemetry/exporter-metrics-otlp-http': - specifier: 0.212.0 - version: 0.212.0(@opentelemetry/api@1.9.0) + specifier: 0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-prometheus': - specifier: 0.212.0 - version: 0.212.0(@opentelemetry/api@1.9.0) + specifier: 0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-trace-otlp-http': - specifier: 0.212.0 - version: 0.212.0(@opentelemetry/api@1.9.0) + specifier: 0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': - specifier: 2.5.1 - version: 2.5.1(@opentelemetry/api@1.9.0) + specifier: 2.6.0 + version: 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': - specifier: 2.5.1 - version: 2.5.1(@opentelemetry/api@1.9.0) + specifier: 2.6.0 + version: 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': - specifier: 0.212.0 - version: 0.212.0(@opentelemetry/api@1.9.0) + specifier: 0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': - specifier: 2.5.1 - version: 2.5.1(@opentelemetry/api@1.9.0) + specifier: 2.6.0 + version: 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': specifier: 1.40.0 version: 1.40.0 '@paralleldrive/cuid2': - specifier: 2.3.1 - version: 2.3.1 + specifier: 3.3.0 + version: 3.3.0 '@prisma/client': - specifier: 6.19.2 - version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + specifier: 7.4.2 + version: 7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) '@prisma/instrumentation': - specifier: 6.19.2 - version: 6.19.2(@opentelemetry/api@1.9.0) + specifier: 7.4.2 + version: 7.4.2(@opentelemetry/api@1.9.0) '@radix-ui/react-checkbox': specifier: 1.3.3 version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -259,16 +259,16 @@ importers: version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@sentry/nextjs': specifier: 10.42.0 - version: 10.42.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.3) + version: 10.42.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.4) '@t3-oss/env-nextjs': specifier: 0.13.10 - version: 0.13.10(arktype@2.1.29)(typescript@5.9.3)(zod@3.25.76) + version: 0.13.10(arktype@2.1.29)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(zod@4.3.6) '@tailwindcss/forms': specifier: 0.5.11 - version: 0.5.11(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3))) + version: 0.5.11(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3))) '@tailwindcss/typography': specifier: 0.5.19 - version: 0.5.19(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3))) + version: 0.5.19(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3))) '@tanstack/react-table': specifier: 8.21.3 version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -291,20 +291,20 @@ importers: specifier: 1.1.1 version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) csv-parse: - specifier: 5.6.0 - version: 5.6.0 + specifier: 6.1.0 + version: 6.1.0 date-fns: specifier: 4.1.0 version: 4.1.0 file-loader: specifier: 6.2.0 - version: 6.2.0(webpack@5.105.3) + version: 6.2.0(webpack@5.105.4) framer-motion: - specifier: 12.34.4 - version: 12.34.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 12.35.0 + version: 12.35.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) googleapis: - specifier: 148.0.0 - version: 148.0.0(encoding@0.1.13) + specifier: 171.4.0 + version: 171.4.0 heic-convert: specifier: 2.1.0 version: 2.1.0 @@ -312,8 +312,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.8.13 - version: 25.8.13(typescript@5.9.3) + specifier: 25.8.14 + version: 25.8.14(typescript@5.9.3) i18next-icu: specifier: 2.4.3 version: 2.4.3(intl-messageformat@10.7.18) @@ -333,8 +333,8 @@ importers: specifier: 4.17.23 version: 4.17.23 lucide-react: - specifier: 0.576.0 - version: 0.576.0(react@19.2.4) + specifier: 0.577.0 + version: 0.577.0(react@19.2.4) markdown-it: specifier: 14.1.1 version: 14.1.1 @@ -343,19 +343,19 @@ importers: version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-auth: specifier: 4.24.13 - version: 4.24.13(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nodemailer@7.0.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 4.24.13(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nodemailer@8.0.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-safe-action: - specifier: 7.10.8 - version: 7.10.8(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + specifier: 8.1.5 + version: 8.1.5(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) node-fetch: specifier: 3.3.2 version: 3.3.2 nodemailer: - specifier: 7.0.13 - version: 7.0.13 + specifier: 8.0.1 + version: 8.0.1 otplib: - specifier: 12.0.1 - version: 12.0.1 + specifier: 13.3.0 + version: 13.3.0 papaparse: specifier: 5.5.3 version: 5.5.3 @@ -372,8 +372,8 @@ importers: specifier: 19.2.4 version: 19.2.4 react-calendar: - specifier: 5.1.0 - version: 5.1.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 6.0.0 + version: 6.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-colorful: specifier: 5.6.1 version: 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -393,8 +393,8 @@ importers: specifier: 2.6.0 version: 2.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-i18next: - specifier: 15.7.4 - version: 15.7.4(i18next@25.8.13(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + specifier: 16.5.4 + version: 16.5.4(i18next@25.8.14(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) react-turnstile: specifier: 1.1.5 version: 1.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -411,14 +411,14 @@ importers: specifier: 0.34.5 version: 0.34.5 stripe: - specifier: 16.12.0 - version: 16.12.0 + specifier: 20.4.0 + version: 20.4.0(@types/node@25.3.3) tailwind-merge: specifier: 3.5.0 version: 3.5.0 tailwindcss: specifier: 3.4.19 - version: 3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + version: 3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) ua-parser-js: specifier: 2.0.9 version: 2.0.9 @@ -426,17 +426,17 @@ importers: specifier: 11.1.0 version: 11.1.0 webpack: - specifier: 5.105.3 - version: 5.105.3 + specifier: 5.105.4 + version: 5.105.4 xlsx: specifier: file:vendor/xlsx-0.20.3.tgz version: file:apps/web/vendor/xlsx-0.20.3.tgz zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.3.6 + version: 4.3.6 zod-openapi: - specifier: 4.2.4 - version: 4.2.4(zod@3.25.76) + specifier: 5.4.6 + version: 5.4.6(zod@4.3.6) devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -478,8 +478,8 @@ importers: specifier: 1.2.0 version: 1.2.0 '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) autoprefixer: specifier: 10.4.27 version: 10.4.27(postcss@8.5.8) @@ -487,8 +487,8 @@ importers: specifier: 10.1.0 version: 10.1.0 dotenv: - specifier: 16.6.1 - version: 16.6.1 + specifier: 17.3.1 + version: 17.3.1 postcss: specifier: 8.5.8 version: 8.5.8 @@ -496,17 +496,17 @@ importers: specifier: 1.5.1 version: 1.5.1 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-tsconfig-paths: - specifier: 5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 6.1.1 + version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vitest-mock-extended: specifier: 3.1.0 - version: 3.1.0(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.1.0(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) packages/cache: dependencies: @@ -517,8 +517,8 @@ importers: specifier: 5.11.0 version: 5.11.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.3.6 + version: 4.3.6 devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -527,14 +527,14 @@ importers: specifier: workspace:* version: link:../config-eslint '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/config-eslint: devDependencies: @@ -549,10 +549,10 @@ importers: version: 8.56.1(eslint@8.57.1)(typescript@5.9.3) '@vercel/style-guide': specifier: 6.0.0 - version: 6.0.0(@next/eslint-plugin-next@15.5.12)(eslint@8.57.1)(prettier@3.8.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.0.0(@next/eslint-plugin-next@15.5.12)(eslint@8.57.1)(prettier@3.8.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/eslint-plugin': specifier: 1.6.9 - version: 1.6.9(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.6.9(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) eslint-config-next: specifier: 15.5.12 version: 15.5.12(eslint@8.57.1)(typescript@5.9.3) @@ -561,7 +561,7 @@ importers: version: 10.1.8(eslint@8.57.1) eslint-config-turbo: specifier: 2.8.12 - version: 2.8.12(eslint@8.57.1)(turbo@2.8.12) + version: 2.8.12(eslint@8.57.1)(turbo@2.8.13) eslint-plugin-react: specifier: 7.37.5 version: 7.37.5(eslint@8.57.1) @@ -575,8 +575,8 @@ importers: packages/config-prettier: devDependencies: '@trivago/prettier-plugin-sort-imports': - specifier: 5.2.2 - version: 5.2.2(prettier@3.8.1) + specifier: 6.0.2 + version: 6.0.2(prettier@3.8.1) prettier: specifier: 3.8.1 version: 3.8.1 @@ -585,13 +585,13 @@ importers: version: 4.2.0(prettier@3.8.1) prettier-plugin-tailwindcss: specifier: 0.7.2 - version: 0.7.2(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.8.1))(prettier@3.8.1) + version: 0.7.2(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1))(prettier@3.8.1) packages/config-typescript: devDependencies: '@types/node': - specifier: 22.19.13 - version: 22.19.13 + specifier: 25.3.3 + version: 25.3.3 '@types/react': specifier: 19.2.14 version: 19.2.14 @@ -608,23 +608,29 @@ importers: specifier: workspace:* version: link:../logger '@paralleldrive/cuid2': - specifier: 2.3.1 - version: 2.3.1 + specifier: 3.3.0 + version: 3.3.0 + '@prisma/adapter-pg': + specifier: 7.4.2 + version: 7.4.2 '@prisma/client': - specifier: 6.19.2 - version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + specifier: 7.4.2 + version: 7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) bcryptjs: - specifier: 2.4.3 - version: 2.4.3 + specifier: 3.0.3 + version: 3.0.3 + dotenv: + specifier: 17.3.1 + version: 17.3.1 uuid: specifier: 11.1.0 version: 11.1.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.3.6 + version: 4.3.6 zod-openapi: - specifier: 4.2.4 - version: 4.2.4(zod@3.25.76) + specifier: 5.4.6 + version: 5.4.6(zod@4.3.6) devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -633,26 +639,26 @@ importers: specifier: workspace:* version: link:../config-eslint dotenv-cli: - specifier: 8.0.0 - version: 8.0.0 + specifier: 11.0.0 + version: 11.0.0 glob: specifier: 13.0.6 version: 13.0.6 prisma: - specifier: 6.19.2 - version: 6.19.2(magicast@0.3.5)(typescript@5.9.3) + specifier: 7.4.2 + version: 7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) prisma-json-types-generator: - specifier: 3.6.2 - version: 3.6.2(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + specifier: 4.1.1 + version: 4.1.1(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) tsx: specifier: 4.21.0 version: 4.21.0 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) packages/email: dependencies: @@ -689,7 +695,7 @@ importers: version: 3.5.0 tailwindcss: specifier: 3.4.19 - version: 3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + version: 3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) packages/i18n-utils: dependencies: @@ -704,20 +710,20 @@ importers: specifier: workspace:* version: link:../config-eslint '@types/node': - specifier: ^22.19.13 - version: 22.19.13 + specifier: ^25.3.3 + version: 25.3.3 tsx: specifier: ^4.21.0 version: 4.21.0 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/js-core: devDependencies: @@ -728,20 +734,20 @@ importers: specifier: workspace:* version: link:../config-eslint '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) terser: specifier: 5.46.0 version: 5.46.0 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/logger: dependencies: @@ -749,14 +755,14 @@ importers: specifier: 10.3.1 version: 10.3.1 pino-opentelemetry-transport: - specifier: 2.0.0 - version: 2.0.0(@opentelemetry/api@1.9.0)(pino@10.3.1) + specifier: 3.0.0 + version: 3.0.0(@opentelemetry/api@1.9.0)(pino@10.3.1) pino-pretty: specifier: 13.1.3 version: 13.1.3 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.3.6 + version: 4.3.6 devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -765,26 +771,26 @@ importers: specifier: workspace:* version: link:../config-eslint vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/storage: dependencies: '@aws-sdk/client-s3': - specifier: 3.1000.0 - version: 3.1000.0 + specifier: 3.1002.0 + version: 3.1002.0 '@aws-sdk/s3-presigned-post': - specifier: 3.1000.0 - version: 3.1000.0 + specifier: 3.1002.0 + version: 3.1002.0 '@aws-sdk/s3-request-presigner': - specifier: 3.1000.0 - version: 3.1000.0 + specifier: 3.1002.0 + version: 3.1002.0 '@formbricks/logger': specifier: workspace:* version: link:../logger @@ -796,17 +802,17 @@ importers: specifier: workspace:* version: link:../config-eslint '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/survey-ui: dependencies: @@ -841,11 +847,11 @@ importers: specifier: 4.1.0 version: 4.1.0 isomorphic-dompurify: - specifier: 2.36.0 - version: 2.36.0(@noble/hashes@1.8.0) + specifier: 3.0.0 + version: 3.0.0(@noble/hashes@2.0.1) lucide-react: - specifier: 0.576.0 - version: 0.576.0(react@19.2.4) + specifier: 0.577.0 + version: 0.577.0(react@19.2.4) react-day-picker: specifier: 9.14.0 version: 9.14.0(react@19.2.4) @@ -860,17 +866,17 @@ importers: specifier: workspace:* version: link:../config-eslint '@storybook/react': - specifier: 8.6.17 - version: 8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + specifier: 10.2.15 + version: 10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) '@storybook/react-vite': - specifier: 8.6.17 - version: 8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 10.2.15 + version: 10.2.15(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) '@tailwindcss/postcss': specifier: 4.2.1 version: 4.2.1 '@tailwindcss/vite': specifier: 4.2.1 - version: 4.2.1(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@types/react': specifier: 19.2.14 version: 19.2.14 @@ -878,11 +884,11 @@ importers: specifier: 19.2.3 version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': - specifier: 4.7.0 - version: 4.7.0(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 5.1.4 + version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) react: specifier: 19.2.4 version: 19.2.4 @@ -896,17 +902,17 @@ importers: specifier: 4.2.1 version: 4.2.1 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite-tsconfig-paths: - specifier: 5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 6.1.1 + version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/surveys: dependencies: @@ -917,20 +923,20 @@ importers: specifier: workspace:* version: link:../survey-ui i18next: - specifier: 25.8.13 - version: 25.8.13(typescript@5.9.3) + specifier: 25.8.14 + version: 25.8.14(typescript@5.9.3) i18next-icu: specifier: 2.4.3 version: 2.4.3(intl-messageformat@10.7.18) isomorphic-dompurify: - specifier: 2.36.0 - version: 2.36.0(@noble/hashes@1.8.0) + specifier: 3.0.0 + version: 3.0.0(@noble/hashes@2.0.1) preact: specifier: '>=10.26.10' version: 10.28.2 react-i18next: - specifier: 15.7.4 - version: 15.7.4(i18next@25.8.13(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + specifier: 16.5.4 + version: 16.5.4(i18next@25.8.14(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -946,7 +952,7 @@ importers: version: link:../types '@preact/preset-vite': specifier: 2.10.3 - version: 2.10.3(@babel/core@7.29.0)(preact@10.28.2)(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.10.3(@babel/core@7.29.0)(preact@10.28.2)(rollup@4.59.0)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@tailwindcss/postcss': specifier: 4.2.1 version: 4.2.1 @@ -966,8 +972,8 @@ importers: specifier: 8.5.8 version: 8.5.8 rollup-plugin-visualizer: - specifier: 6.0.8 - version: 6.0.8(rollup@4.59.0) + specifier: 7.0.1 + version: 7.0.1(rollup@4.59.0) tailwindcss: specifier: 4.2.1 version: 4.2.1 @@ -975,29 +981,29 @@ importers: specifier: 5.46.0 version: 5.46.0 vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite-tsconfig-paths: - specifier: 5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 6.1.1 + version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) packages/types: dependencies: '@prisma/client': - specifier: 6.19.2 - version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + specifier: 7.4.2 + version: 7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) node-html-parser: specifier: 7.1.0 version: 7.1.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.3.6 + version: 4.3.6 zod-openapi: - specifier: 4.2.4 - version: 4.2.4(zod@3.25.76) + specifier: 5.4.6 + version: 5.4.6(zod@4.3.6) devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -1015,8 +1021,8 @@ importers: specifier: workspace:* version: link:../config-eslint vite: - specifier: 6.4.1 - version: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -1030,10 +1036,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@ark/schema@0.56.0': resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} @@ -1081,8 +1083,8 @@ packages: resolution: {integrity: sha512-UXHY1cOsPTyrzRY+8yJUYcD7dnMHbP2hoFRhNOiMCMqjKV4lRRQ/1EiLxX5aohAYkxxr2kOqSDFjzq9wbtX6PQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.1000.0': - resolution: {integrity: sha512-7kPy33qNGq3NfwHC0412T6LDK1bp4+eiPzetX0sVd9cpTSXuQDKpoOFnB0Njj6uZjJDcLS3n2OeyarwwgkQ0Ow==} + '@aws-sdk/client-s3@3.1002.0': + resolution: {integrity: sha512-tc+vZgvjcm+1Ot+YhQjXZxVELKGGGO3D5cuR4p5xaeitXYX2+RRiz4/WdSak9slumIClnlXsdqhJ0OHognUT+w==} engines: {node: '>=20.0.0'} '@aws-sdk/client-sso@3.817.0': @@ -1093,8 +1095,8 @@ packages: resolution: {integrity: sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.973.15': - resolution: {integrity: sha512-AlC0oQ1/mdJ8vCIqu524j5RB7M8i8E24bbkZmya1CuiQxkY7SdIZAyw7NDNMGaNINQFq/8oGRMX0HeOfCVsl/A==} + '@aws-sdk/core@3.973.17': + resolution: {integrity: sha512-VtgGP0TjbCeyp6DQpiBqJKbemTSIaN2bZc3UbeTDCani3lBCyxn75ouJYD6koSSp0bh7rKLEbUpiFsNCI7tr0w==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.3': @@ -1109,60 +1111,60 @@ packages: resolution: {integrity: sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.972.13': - resolution: {integrity: sha512-6ljXKIQ22WFKyIs1jbORIkGanySBHaPPTOI4OxACP5WXgbcR0nDYfqNJfXEGwCK7IzHdNbCSFsNKKs0qCexR8Q==} + '@aws-sdk/credential-provider-env@3.972.15': + resolution: {integrity: sha512-RhHQG1lhkWHL4tK1C/KDjaOeis+9U0tAMnWDiwiSVQZMC7CsST9Xin+sK89XywJ5g/tyABtb7TvFePJ4Te5XSQ==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-http@3.816.0': resolution: {integrity: sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.972.15': - resolution: {integrity: sha512-dJuSTreu/T8f24SHDNTjd7eQ4rabr0TzPh2UTCwYexQtzG3nTDKm1e5eIdhiroTMDkPEJeY+WPkA6F9wod/20A==} + '@aws-sdk/credential-provider-http@3.972.17': + resolution: {integrity: sha512-b/bDL76p51+yQ+0O9ZDH5nw/ioE0sRYkjwjOwFWAWZXo6it2kQZUOXhVpjohx3ldKyUxt/SwAivjUu1Nr/PWlQ==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-ini@3.817.0': resolution: {integrity: sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.972.13': - resolution: {integrity: sha512-JKSoGb7XeabZLBJptpqoZIFbROUIS65NuQnEHGOpuT9GuuZwag2qciKANiDLFiYk4u8nSrJC9JIOnWKVvPVjeA==} + '@aws-sdk/credential-provider-ini@3.972.15': + resolution: {integrity: sha512-qWnM+wB8MmU2kKY7f4KowKjOjkwRosaFxrtseEEIefwoXn1SjN+CbHzXBVdTAQxxkbBiqhPgJ/WHiPtES4grRQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.13': - resolution: {integrity: sha512-RtYcrxdnJHKY8MFQGLltCURcjuMjnaQpAxPE6+/QEdDHHItMKZgabRe/KScX737F9vJMQsmJy9EmMOkCnoC1JQ==} + '@aws-sdk/credential-provider-login@3.972.15': + resolution: {integrity: sha512-x92FJy34/95wgu+qOGD8SHcgh1hZ9Qx2uFtQEGn4m9Ljou8ICIv3Ybq5yxdB7A60S8ZGCQB0mIopmjJwiLbh5g==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-node@3.817.0': resolution: {integrity: sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.972.14': - resolution: {integrity: sha512-WqoC2aliIjQM/L3oFf6j+op/enT2i9Cc4UTxxMEKrJNECkq4/PlKE5BOjSYFcq6G9mz65EFbXJh7zOU4CvjSKQ==} + '@aws-sdk/credential-provider-node@3.972.16': + resolution: {integrity: sha512-7mlt14Ee4rPFAFUVgpWE7+0CBhetJJyzVFqfIsMp7sgyOSm9Y/+qHZOWAuK5I4JNc+Y5PltvJ9kssTzRo92iXQ==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-process@3.816.0': resolution: {integrity: sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.972.13': - resolution: {integrity: sha512-rsRG0LQA4VR+jnDyuqtXi2CePYSmfm5GNL9KxiW8DSe25YwJSr06W8TdUfONAC+rjsTI+aIH2rBGG5FjMeANrw==} + '@aws-sdk/credential-provider-process@3.972.15': + resolution: {integrity: sha512-PrH3iTeD18y/8uJvQD2s/T87BTGhsdS/1KZU7ReWHXsplBwvCqi7AbnnNbML1pFlQwRWCE2RdSZFWDVId3CvkA==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-sso@3.817.0': resolution: {integrity: sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.972.13': - resolution: {integrity: sha512-fr0UU1wx8kNHDhTQBXioc/YviSW8iXuAxHvnH7eQUtn8F8o/FU3uu6EUMvAQgyvn7Ne5QFnC0Cj0BFlwCk+RFw==} + '@aws-sdk/credential-provider-sso@3.972.15': + resolution: {integrity: sha512-M/+LBHTPKZxxXckM6m4dnJeR+jlm9NynH9b2YDswN4Zj2St05SK/crdL3Wy3WfJTZootnnhm3oTh87Usl7PS7w==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-web-identity@3.817.0': resolution: {integrity: sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.13': - resolution: {integrity: sha512-a6iFMh1pgUH0TdcouBppLJUfPM7Yd3R9S1xFodPtCRoLqCz2RQFA3qjA8x4112PVYXEd4/pHX2eihapq39w0rA==} + '@aws-sdk/credential-provider-web-identity@3.972.15': + resolution: {integrity: sha512-QTH6k93v+UOfFam/ado8zc71tH+enTVyuvLy9uEWXX1x894dN5ovtf/MdBDgFwq3g6c9mbtgVJ4B+yBqDtXvdA==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-providers@3.817.0': @@ -1185,8 +1187,8 @@ packages: resolution: {integrity: sha512-QMdffpU+GkSGC+bz6WdqlclqIeCsOfgX8JFZ5xvwDtX+UTj4mIXm3uXu7Ko6dBseRcJz1FA6T9OmlAAY6JgJUg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.973.1': - resolution: {integrity: sha512-QLXsxsI6VW8LuGK+/yx699wzqP/NMCGk/hSGP+qtB+Lcff+23UlbahyouLlk+nfT7Iu021SkXBhnAuVd6IZcPw==} + '@aws-sdk/middleware-flexible-checksums@3.973.3': + resolution: {integrity: sha512-C9Mu9pXMpQh7jBydx0MrfQxNIKwJvKbVbJJ0GZthM+cQ+KTChXA01MwttRsMq0ZRb4pBJZQtIKDUxXusDr5OKg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.804.0': @@ -1217,8 +1219,8 @@ packages: resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.15': - resolution: {integrity: sha512-WDLgssevOU5BFx1s8jA7jj6cE5HuImz28sy9jKOaVtz0AW1lYqSzotzdyiybFaBcQTs5zxXOb2pUfyMxgEKY3Q==} + '@aws-sdk/middleware-sdk-s3@3.972.17': + resolution: {integrity: sha512-uSyOGoVFMP44pTt29MIMfsOjegqE/7lT0K3HG0GWPiH2lD4rqZC/TRi/kH4zrGiOQdsaLc+dkfd7Sb2q8vh+gA==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.6': @@ -1229,16 +1231,16 @@ packages: resolution: {integrity: sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.972.15': - resolution: {integrity: sha512-ABlFVcIMmuRAwBT+8q5abAxOr7WmaINirDJBnqGY5b5jSDo00UMlg/G4a0xoAgwm6oAECeJcwkvDlxDwKf58fQ==} + '@aws-sdk/middleware-user-agent@3.972.17': + resolution: {integrity: sha512-HHArkgWzomuwufXwheQqkddu763PWCpoNTq1dGjqXzJT/lojX3VlOqjNSR2Xvb6/T9ISfwYcMOcbFgUp4EWxXA==} engines: {node: '>=20.0.0'} '@aws-sdk/nested-clients@3.817.0': resolution: {integrity: sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.996.3': - resolution: {integrity: sha512-AU5TY1V29xqwg/MxmA2odwysTez+ccFAhmfRJk+QZT5HNv90UTA9qKd1J9THlsQkvmH7HWTEV1lDNxkQO5PzNw==} + '@aws-sdk/nested-clients@3.996.5': + resolution: {integrity: sha512-zn0WApcULn7Rtl6T+KP2CQTZo/7wOa2YV1yHQnbijTQoi4YXQHM8s21JcJzt33/mqPh8AdvWX1f+83KvKuxlZw==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.808.0': @@ -1249,26 +1251,26 @@ packages: resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} engines: {node: '>=20.0.0'} - '@aws-sdk/s3-presigned-post@3.1000.0': - resolution: {integrity: sha512-klqxU6VoMarIjCymOW3q8UVdvZ3TnIfqa3lk9hJcWJfKKC5sqYL0ahuF+wcLrJOxE15fGEOg31t8FL0gFO1Z4Q==} + '@aws-sdk/s3-presigned-post@3.1002.0': + resolution: {integrity: sha512-0ubAV/QAfxBwvvpdjGqH5GOTYdsANvlpTP0ig6nhwuzaI2M3/hcmPCqoD2/89PsCeo8UPhvaCmZh8l+vXjumVw==} engines: {node: '>=20.0.0'} - '@aws-sdk/s3-request-presigner@3.1000.0': - resolution: {integrity: sha512-DP6EbwCD0CKzBwBnT1X6STB5i+bY765CxjMbWCATDhCgOB343Q6AHM9c1S/300Uc5waXWtI/Wdeak9Ru56JOvg==} + '@aws-sdk/s3-request-presigner@3.1002.0': + resolution: {integrity: sha512-vzbygdP2KMRoD7jheRNBlYVvrmGrwyeec+6KwHiM9AtFQ+tx4EvF8x0Wo+7FjVn1PL3t5Do7i54f4ozKCYJleQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.3': - resolution: {integrity: sha512-gQYI/Buwp0CAGQxY7mR5VzkP56rkWq2Y1ROkFuXh5XY94DsSjJw62B3I0N0lysQmtwiL2ht2KHI9NylM/RP4FA==} + '@aws-sdk/signature-v4-multi-region@3.996.5': + resolution: {integrity: sha512-AVIhf74wRMzU1WBPVzcGPjlADF5VxZ8m8Ctm1v7eO4/reWMhZnEBn4tlR4vM4pOYFkdrYp3MTzYVZIikCO+53Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1002.0': + resolution: {integrity: sha512-x972uKOydFn4Rb0PZJzLdNW59rH0KWC78Q2JbQzZpGlGt0DxjYdDRwBG6F42B1MyaEwHGqO/tkGc4r3/PRFfMw==} engines: {node: '>=20.0.0'} '@aws-sdk/token-providers@3.817.0': resolution: {integrity: sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.999.0': - resolution: {integrity: sha512-cx0hHUlgXULfykx4rdu/ciNAJaa3AL5xz3rieCz7NKJ68MJwlj3664Y8WR5MGgxfyYJBdamnkjNSx5Kekuc0cg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.804.0': resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} engines: {node: '>=18.0.0'} @@ -1318,8 +1320,8 @@ packages: aws-crt: optional: true - '@aws-sdk/util-user-agent-node@3.973.0': - resolution: {integrity: sha512-A9J2G4Nf236e9GpaC1JnA8wRn6u6GjnOXiTwBLA6NUJhlBTIGfrTy+K1IazmF8y+4OFdW3O5TZlhyspJMqiqjA==} + '@aws-sdk/util-user-agent-node@3.973.2': + resolution: {integrity: sha512-lpaIuekdkpw7VRiik0IZmd6TyvEUcuLgKZ5fKRGpCA3I4PjrD/XH15sSwW+OptxQjNU4DEzSxag70spC9SluvA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1327,8 +1329,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.8': - resolution: {integrity: sha512-Ql8elcUdYCha83Ol7NznBsgN5GVZnv3vUd86fEc6waU6oUdY0T1O9NODkEEOS/Uaogr87avDrUC6DSeM4oXjZg==} + '@aws-sdk/xml-builder@3.972.9': + resolution: {integrity: sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.2': @@ -1615,6 +1617,18 @@ packages: '@calcom/embed-snippet@1.3.3': resolution: {integrity: sha512-pqqKaeLB8R6BvyegcpI9gAyY6Xyx1bKYfWvIGOvIbTpguWyM1BBBVcT9DCeGe8Zw7Ujp5K56ci7isRUrT2Uadg==} + '@chevrotain/cst-dts-gen@10.5.0': + resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} + + '@chevrotain/gast@10.5.0': + resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} + + '@chevrotain/types@10.5.0': + resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} + + '@chevrotain/utils@10.5.0': + resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} + '@chromatic-com/storybook@5.0.1': resolution: {integrity: sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA==} engines: {node: '>=20.0.0', yarn: '>=1.22.18'} @@ -1687,6 +1701,20 @@ packages: peerDependencies: react: '>=16.8.0' + '@electric-sql/pglite-socket@0.0.20': + resolution: {integrity: sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==} + hasBin: true + peerDependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite-tools@0.2.20': + resolution: {integrity: sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==} + peerDependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite@0.3.15': + resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} @@ -2263,6 +2291,12 @@ packages: engines: {node: '>=6'} hasBin: true + '@hono/node-server@1.19.9': + resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@hookform/resolvers@5.2.2': resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} peerDependencies: @@ -2450,19 +2484,6 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0': - resolution: {integrity: sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==} - peerDependencies: - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4': resolution: {integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==} peerDependencies: @@ -2623,6 +2644,10 @@ packages: '@mongodb-js/saslprep@1.4.4': resolution: {integrity: sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g==} + '@mrleebo/prisma-ast@0.13.1': + resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==} + engines: {node: '>=16'} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -2690,9 +2715,9 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2718,10 +2743,6 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@opentelemetry/api-logs@0.206.0': - resolution: {integrity: sha512-yIVDu9jX//nV5wSMLZLdHdb1SKHIMj9k+wQVFtln5Flcgdldz9BkHtavvExQiJqBZg2OpEEJEZmzQazYztdz2A==} - engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.207.0': resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} engines: {node: '>=8.0.0'} @@ -2738,6 +2759,10 @@ packages: resolution: {integrity: sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==} engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.213.0': + resolution: {integrity: sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.57.1': resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==} engines: {node: '>=14'} @@ -2746,25 +2771,19 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/auto-instrumentations-node@0.70.1': - resolution: {integrity: sha512-r8BKs0rHtBAzZViPIuzSD2eh65fOPau0NqVsca2sACuZ6LFGu6a+QMhqq7skXz+/OqKwFr/7/b6VsaNMS+zZpQ==} + '@opentelemetry/auto-instrumentations-node@0.71.0': + resolution: {integrity: sha512-umqazfIujHj9fE+p3skrPMO9uCsDodSUqIgVRtELaPX036HhGkVaI7MwCQL3/kiyqrXRsKYSow2vCBR4CVsnOA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.4.1 '@opentelemetry/core': ^2.0.0 - '@opentelemetry/configuration@0.212.0': - resolution: {integrity: sha512-D8sAY6RbqMa1W8lCeiaSL2eMCW2MF87QI3y+I6DQE1j+5GrDMwiKPLdzpa/2/+Zl9v1//74LmooCTCJBvWR8Iw==} + '@opentelemetry/configuration@0.213.0': + resolution: {integrity: sha512-MfVgZiUuwL1d3bPPvXcEkVHGTGNUGoqGK97lfwBuRoKttcVGGqDyxTCCVa5MGbirtBQkUTysXMBUVWPaq7zbWw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks@2.5.1': - resolution: {integrity: sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/context-async-hooks@2.6.0': resolution: {integrity: sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==} engines: {node: ^18.19.0 || >=20.6.0} @@ -2777,12 +2796,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.1.0': - resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.5.0': resolution: {integrity: sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -2801,20 +2814,14 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-logs-otlp-grpc@0.206.0': - resolution: {integrity: sha512-kJKxKBaGwqWop95d6tcluz260IWwIgOG0BH8oVm6429tg8LxY2PJb7Om8d5s+5vOFM8DkUYCnIpn9d/13/RcKQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-grpc@0.212.0': resolution: {integrity: sha512-/0bk6fQG+eSFZ4L6NlckGTgUous/ib5+OVdg0x4OdwYeHzV3lTEo3it1HgnPY6UKpmX7ki+hJvxjsOql8rCeZA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-http@0.206.0': - resolution: {integrity: sha512-VWcHEnS+1kN+sQTAdCgSn2anqHPxY1/e52fhpe2mcSnEaXI1srFf3RU5DAu7hzQO6T9DPQzOKG8kc76vCtyYDw==} + '@opentelemetry/exporter-logs-otlp-grpc@0.213.0': + resolution: {integrity: sha512-QiRZzvayEOFnenSXi85Eorgy5WTqyNQ+E7gjl6P6r+W3IUIwAIH8A9/BgMWfP056LwmdrBL6+qvnwaIEmug6Yg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2825,8 +2832,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-proto@0.206.0': - resolution: {integrity: sha512-CsYNXJwkn1qCXJGE+/JvvYucAjL8rpaxa2hnl+tDP6M5E0O3UVa8zG4ZUEebjr5J5Nc32egvslEZx5rgNOp3lQ==} + '@opentelemetry/exporter-logs-otlp-http@0.213.0': + resolution: {integrity: sha512-vqDVSpLp09ZzcFIdb7QZrEFPxUlO3GzdhBKLstq3jhYB5ow3+ZtV5V0ngSdi/0BZs+J5WPiN1+UDV4X5zD/GzA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2837,8 +2844,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-grpc@0.212.0': - resolution: {integrity: sha512-/6Gqf9wpBq22XsomR1i0iPGnbQtCq2Vwnrq5oiDPjYSqveBdK1jtQbhGfmpK2mLLxk4cPDtD1ZEYdIou5K8EaA==} + '@opentelemetry/exporter-logs-otlp-proto@0.213.0': + resolution: {integrity: sha512-gQk41nqfK3KhDk8jbSo3LR/fQBlV7f6Q5xRcfDmL1hZlbgXQPdVFV9/rIfYUrCoq1OM+2NnKnFfGjBt6QpLSsA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.213.0': + resolution: {integrity: sha512-Z8gYKUAU48qwm+a1tjnGv9xbE7a5lukVIwgF6Z5i3VPXPVMe4Sjra0nN3zU7m277h+V+ZpsPGZJ2Xf0OTkL7/w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2849,8 +2862,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.212.0': - resolution: {integrity: sha512-8hgBw3aTTRpSTkU4b9MLf/2YVLnfWp+hfnLq/1Fa2cky+vx6HqTodo+Zv1GTIrAKMOOwgysOjufy0gTxngqeBg==} + '@opentelemetry/exporter-metrics-otlp-http@0.213.0': + resolution: {integrity: sha512-yw3fTIw4KQIRXC/ZyYQq5gtA3Ogfdfz/g5HVgleobQAcjUUE8Nj3spGMx8iQPp+S+u6/js7BixufRkXhzLmpJA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2861,38 +2874,38 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-proto@0.212.0': - resolution: {integrity: sha512-C7I4WN+ghn3g7SnxXm2RK3/sRD0k/BYcXaK6lGU3yPjiM7a1M25MLuM6zY3PeVPPzzTZPfuS7+wgn/tHk768Xw==} + '@opentelemetry/exporter-metrics-otlp-proto@0.213.0': + resolution: {integrity: sha512-geHF+zZaDb0/WRkJTxR8o8dG4fCWT/Wq7HBdNZCxwH5mxhwRi/5f37IDYH7nvU+dwU6IeY4Pg8TPI435JCiNkg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-prometheus@0.212.0': - resolution: {integrity: sha512-hJFLhCJba5MW5QHexZMHZdMhBfNqNItxOsN0AZojwD1W2kU9xM+BEICowFGJFo/vNV+I2BJvTtmuKafeDSAo7Q==} + '@opentelemetry/exporter-prometheus@0.213.0': + resolution: {integrity: sha512-FyV3/JfKGAgx+zJUwCHdjQHbs+YeGd2fOWvBHYrW6dmfv/w89lb8WhJTSZEoWgP525jwv/gFeBttlGu1flebdA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.212.0': - resolution: {integrity: sha512-9xTuYWp8ClBhljDGAoa0NSsJcsxJsC9zCFKMSZJp1Osb9pjXCMRdA6fwXtlubyqe7w8FH16EWtQNKx/FWi+Ghw==} + '@opentelemetry/exporter-trace-otlp-grpc@0.213.0': + resolution: {integrity: sha512-L8y6piP4jBIIx1Nv7/9hkx25ql6/Cro/kQrs+f9e8bPF0Ar5Dm991v7PnbtubKz6Q4fT872H56QXUWVnz/Cs4Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-http@0.212.0': - resolution: {integrity: sha512-v/0wMozNoiEPRolzC4YoPo4rAT0q8r7aqdnRw3Nu7IDN0CGFzNQazkfAlBJ6N5y0FYJkban7Aw5WnN73//6YlA==} + '@opentelemetry/exporter-trace-otlp-http@0.213.0': + resolution: {integrity: sha512-tnRmJD39aWrE/Sp7F6AbRNAjKHToDkAqBi6i0lESpGWz3G+f4bhVAV6mgSXH2o18lrDVJXo6jf9bAywQw43wRA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-proto@0.212.0': - resolution: {integrity: sha512-d1ivqPT0V+i0IVOOdzGaLqonjtlk5jYrW7ItutWzXL/Mk+PiYb59dymy/i2reot9dDnBFWfrsvxyqdutGF5Vig==} + '@opentelemetry/exporter-trace-otlp-proto@0.213.0': + resolution: {integrity: sha512-six3vPq3sL+ge1iZOfKEg+RHuFQhGb8ZTdlvD234w/0gi8ty/qKD46qoGpKvM3amy5yYunWBKiFBW47WaVS26w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-zipkin@2.5.1': - resolution: {integrity: sha512-Me6JVO7WqXGXsgr4+7o+B7qwKJQbt0c8WamFnxpkR43avgG9k/niTntwCaXiXUTjonWy0+61ZuX6CGzj9nn8CQ==} + '@opentelemetry/exporter-zipkin@2.6.0': + resolution: {integrity: sha512-AFP77OQMLfw/Jzh6WT2PtrywstNjdoyT9t9lYrYdk1s4igsvnMZ8DkZKCwxsItC01D+4Lydgrb+Wy0bAvpp8xg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -2903,32 +2916,32 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-amqplib@0.59.0': - resolution: {integrity: sha512-xscSgOJA+GHphESDZxBHNk/zjNaEgoeufMwmiqYdL+qM27Xw3BbR9vN6Ucbq9dW6Y+oYUPgTTj17qf+Za4+uzg==} + '@opentelemetry/instrumentation-amqplib@0.60.0': + resolution: {integrity: sha512-q/B2IvoVXRm1M00MvhnzpMN6rKYOszPXVsALi6u0ss4AYHe+TidZEtLW9N1ZhrobI1dSriHnBqqtAOZVAv07sg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-aws-lambda@0.64.0': - resolution: {integrity: sha512-vYhM/a8fG34/Dl/Q9gfv5Ih3OFPgqeyn79S8FN+Xs/QZw6h6L8a1lDa3CyigyicOXLCmVIM7Fc9vFD4BGqgGLA==} + '@opentelemetry/instrumentation-aws-lambda@0.65.0': + resolution: {integrity: sha512-7SiaXnyEH0abDi61r72YCpkeQr27ePiCK3SaE2uFEF/riAUwk18r6vDXQKPZczWv3BGrGpk1YDc4qYYlY0uomA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-aws-sdk@0.67.0': - resolution: {integrity: sha512-btpwJnZ2RBXDh/pTpfVpInpBu9Pedi+lbLKbt3naB344SggbbYnIdT7u8EzmGIApWi9EV91vw7hm896I7nESQA==} + '@opentelemetry/instrumentation-aws-sdk@0.68.0': + resolution: {integrity: sha512-nHXSRX3iYSE9MaiPE+jIovuNA8dTmleeg0vdLHkk5nvWCYFf/I9kMdqA3KcfKCPonVc5+NtSTft6OVtuGtawIA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-bunyan@0.57.0': - resolution: {integrity: sha512-W4zLz1Y9ptCsdL+QMXR7xQaBHkJivLBmVlLCjUe23rX4V8E65fGAtlIJSKTKAfz4aEgtWgQAGMdkeqACwG0Caw==} + '@opentelemetry/instrumentation-bunyan@0.58.0': + resolution: {integrity: sha512-vxotqOCzUQf2C4Dlrv+feY9XhQSa2wG/R+0S/JZ/axhbW0/yJeNKWsWWQ1FUFZQkUlZUS5nyWM8ePvgVmPq/Kg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-cassandra-driver@0.57.0': - resolution: {integrity: sha512-xLwrK+XnN32IB5i6t/a2j+SVdjlq/BIgjpVRkke4HAsKjoSMy1GeSI+ZOiJffRLFb4MojcvH4RG2+nEg1uC6Zg==} + '@opentelemetry/instrumentation-cassandra-driver@0.58.0': + resolution: {integrity: sha512-qPzEANo6IVz02sctrbihMwcNGq+LUUrISnzFitUmFzBz5SjPp5iEPy59KFNqpNa9k/oas5B7650OWB/z2Ld7qQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2939,14 +2952,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-connect@0.55.0': - resolution: {integrity: sha512-UfGw7ubKKZBoTRjxi5KlfeECEaXZinS20RdRNlZE5tVF+O17hJOnrcGwAoQAHp6eYmxI2jW9IQ4t6450gnNF9g==} + '@opentelemetry/instrumentation-connect@0.56.0': + resolution: {integrity: sha512-PKp+sSZ7AfzMvGgO3VCyo1inwNu+q7A1k9X88WK4PQ+S6Hp7eFk8pie+sWHDTaARovmqq5V2osav3lQej2B0nw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-cucumber@0.28.0': - resolution: {integrity: sha512-kim+bRxu4LZqKEyF2SgO01tgG88W+/iYltyP1XjT31FIXzlBjzQpwtSLLM8byayO85mcZIBha54WSNFDLM/7qQ==} + '@opentelemetry/instrumentation-cucumber@0.29.0': + resolution: {integrity: sha512-u3bECWikRK/nHQemb5TJbfht/eC70sVUwzkhAOTuXHAU+QAtUV9XLy6snjtGSJ1RLgOXU26tb4SqNplLa26COA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -2957,14 +2970,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-dataloader@0.29.0': - resolution: {integrity: sha512-220WjRb1G1UiAKbVblSMxwxxFdpyB4wj1XYIO9BJs5r62Azj2dL5fyZiXK3/WO6wB3uLul9R946iKI1bpPxktQ==} + '@opentelemetry/instrumentation-dataloader@0.30.0': + resolution: {integrity: sha512-MXHP2Q38cd2OhzEBKAIXUi9uBlPEYzF6BNJbyjUXBQ6kLaf93kRC41vNMIz0Nl5mnuwK7fDvKT+/lpx7BXRwdg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-dns@0.55.0': - resolution: {integrity: sha512-cfWLaFi22V+sQrKY7t6QroYzT3kO9m3PpkN1OXYmuCyfwxQaXOVlF8NSAHtua/RQYw0aQl+2fe6JOWyJdEZiwA==} + '@opentelemetry/instrumentation-dns@0.56.0': + resolution: {integrity: sha512-u2E07CxapafcgNkTH5V0XSeE7xm3VA19HpKVEcwV+j9S7lKb9CE1j42dAM6nT7NgIQocIyyon1vFU2ubS0ukpA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2975,14 +2988,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-express@0.60.0': - resolution: {integrity: sha512-KghHCDqKq0D7iuPIVCuPSXut5WVAI6uwKcPrhwTUJL5VE2LC18id2vKoiAm1V8XvVlgIGAiECtEvbrFwkTCj3g==} + '@opentelemetry/instrumentation-express@0.61.0': + resolution: {integrity: sha512-Xdmqo9RZuZlL29Flg8QdwrrX7eW1CZ7wFQPKHyXljNymgKhN1MCsYuqQ/7uxavhSKwAl7WxkTzKhnqpUApLMvQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fastify@0.56.0': - resolution: {integrity: sha512-zotOPoZsWtMF47BjottK23XaaBSmVuwG5D/R3FlGfAAwMNFoDR3IY1OGO9v9KfOU/1/xDVkxsQ22NFfu9lE8aA==} + '@opentelemetry/instrumentation-fastify@0.57.0': + resolution: {integrity: sha512-D+rwRtbiOediYocpKGvY/RQTpuLsLdCVwaOREyqWViwItJGibWI7O/wgd9xIV63pMP0D9IdSy27wnARfUaotKg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -2993,8 +3006,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fs@0.31.0': - resolution: {integrity: sha512-C7tdXGDnkMgLVlE79VSekB+Y+P345zKUigvFMs5M7U0GIYA8ERx3FS0aAcY/ICIq9YwRmH2uuMb++Br5M2vNUg==} + '@opentelemetry/instrumentation-fs@0.32.0': + resolution: {integrity: sha512-koR6apx0g0wX6RRiPpjA4AFQUQUbXrK16kq4/SZjVp7u5cffJhNkY4TnITxcGA4acGSPYAfx3NHRIv4Khn1axQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3005,8 +3018,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-generic-pool@0.55.0': - resolution: {integrity: sha512-7hWiyLbEX/dIS4LZy/h8VaAQPs8oBeEqsrysDWbos0b9PF414L6Rsbi2um/omtxIs+GTvsbuqDscWigeaxyWdA==} + '@opentelemetry/instrumentation-generic-pool@0.56.0': + resolution: {integrity: sha512-fg+Jffs6fqrf0uQS0hom7qBFKsbtpBiBl8+Vkc63Gx8xh6pVh+FhagmiO6oM0m3vyb683t1lP7yGYq22SiDnqg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3017,14 +3030,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-graphql@0.60.0': - resolution: {integrity: sha512-XPATrmxAd2tFCsYbJ3eVIXt+gyvMKjc36QQuQxjtssMnAbw006Le9b5lKs7WXik7ItOpM1exATi1aDdOcCjRRg==} + '@opentelemetry/instrumentation-graphql@0.61.0': + resolution: {integrity: sha512-pUiVASv6nh2XrerTvlbVHh7vKFzscpgwiQ/xvnZuAIzQ5lRjWVdRPUuXbvZJ/Yq79QsE81TZdJ7z9YsXiss1ew==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-grpc@0.212.0': - resolution: {integrity: sha512-r1t7LNKWVhSQMUrBdDJtooFmmLZ93kGuFixqeXPoUP8W+chJCxhey9l0c0+L3xriNdyB7TzvkKHhPXUDevgVEA==} + '@opentelemetry/instrumentation-grpc@0.213.0': + resolution: {integrity: sha512-GT53wIJnEffHcWlDUXRodTSUUspy57PNBZXc46z9rfy3Ee+VeM5XqWnieF1yefCd01QTaISYB49LXNc2SayIBQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3035,8 +3048,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-hapi@0.58.0': - resolution: {integrity: sha512-reuRApR2KHm2VsfyDgsrLhNE+IOy4uIU6n3oMjUleReHacEEZmf4vXxdt4/qcmJ6GoUXnRN2AOu3s5N3pMrgYA==} + '@opentelemetry/instrumentation-hapi@0.59.0': + resolution: {integrity: sha512-33wa4mEr+9+ztwdgLor1SeBu4Opz4IsmpcLETXAd3VmBrOjez8uQtrsOhPCa5Vhbm5gzDlMYTgFRLQzf8/YHFA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3047,8 +3060,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.212.0': - resolution: {integrity: sha512-t2nt16Uyv9irgR+tqnX96YeToOStc3X5js7Ljn3EKlI2b4Fe76VhMkTXtsTQ0aId6AsYgefrCRnXSCo/Fn/vww==} + '@opentelemetry/instrumentation-http@0.213.0': + resolution: {integrity: sha512-B978Xsm5XEPGhm1P07grDoaOFLHapJPkOG9h016cJsyWWxmiLnPu2M/4Nrm7UCkHSiLnkXgC+zVGUAIahy8EEA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3059,8 +3072,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.60.0': - resolution: {integrity: sha512-R+nnbPD9l2ruzu248qM3YDWzpdmWVaFFFv08lQqsc0EP4pT/B1GGUg06/tHOSo3L5njB2eejwyzpkvJkjaQEMA==} + '@opentelemetry/instrumentation-ioredis@0.61.0': + resolution: {integrity: sha512-hsHDadUtAFbws1YSDc1XW0svGFKiUbqv2td1Cby+UAiwvojm1NyBo/taifH0t8CuFZ0x/2SDm0iuTwrM5pnVOg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3071,8 +3084,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-kafkajs@0.21.0': - resolution: {integrity: sha512-lkLrILnKGO7SHw1xPJnuGx2S4XwbKmQiJyzUGuEImRoU/6Gj0Nka0lkbeRd4ANN20dxr/mLdXIsUsk6DzTrX6A==} + '@opentelemetry/instrumentation-kafkajs@0.22.0': + resolution: {integrity: sha512-wJU4IBQMUikdJAcTChLFqK5lo+flo7pahqd8DSLv7uMxsdOdAHj6RzKYAm8pPfUS6ItKYutYyuicwKaFwQKsoA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3083,8 +3096,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-knex@0.56.0': - resolution: {integrity: sha512-pKqtY5lbAQ70MC5K/BJeAA1t2gAUlRBZBAJ5ergRUNs5jw8zbdOXEZOLztiuNvQqD2z4a9N0Tkde9JMFm2pKMQ==} + '@opentelemetry/instrumentation-knex@0.57.0': + resolution: {integrity: sha512-vMCSh8kolEm5rRsc+FZeTZymWmIJwc40hjIKnXH4O0Dv/gAkJJIRXCsPX5cPbe0c0j/34+PsENd0HqKruwhVYw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3095,8 +3108,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.9.0 - '@opentelemetry/instrumentation-koa@0.60.0': - resolution: {integrity: sha512-UOmu2y2LHgPzKsm9xd0sCQJimr11YP4MKFc190Do1ufd8qds7Zd5BI3f6TudqYhH9dUIhojsQyUaS6K4nv5FsQ==} + '@opentelemetry/instrumentation-koa@0.61.0': + resolution: {integrity: sha512-lvrfWe9ShK/D2X4brmx8ZqqeWPfRl8xekU0FCn7C1dHm5k6+rTOOi36+4fnaHAP8lig9Ux6XQ1D4RNIpPCt1WQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -3107,14 +3120,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-lru-memoizer@0.56.0': - resolution: {integrity: sha512-vXtOValhKRgWA9tLAiTU3P37Q31OveRuM2N5iLSVHl4GzkMBQ5p50A9kSKvt5gReL6BzFDXPCM9ItJiAhSS2KQ==} + '@opentelemetry/instrumentation-lru-memoizer@0.57.0': + resolution: {integrity: sha512-cEqpUocSKJfwDtLYTTJehRLWzkZ2eoePCxfVIgGkGkb83fMB71O+y4MvRHJPbeV2bdoWdOVrl8uO0+EynWhTEA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-memcached@0.55.0': - resolution: {integrity: sha512-kdhW/j5X+vNCAvHVc50PZfvE7diUScg1ZkBaNFRygY3Z6IUjgPLR0luWQMDPSFun6AVo1HaMDPxbUqJrot6qrA==} + '@opentelemetry/instrumentation-memcached@0.56.0': + resolution: {integrity: sha512-rU5kc6g465SgG52uUl2Qlf5OiNopYleqzNgJCDPokPdEeUb3Hpj3O7kqjAJ5bKEVMZVG9UC1MBp2TQwGv60byw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3125,8 +3138,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongodb@0.65.0': - resolution: {integrity: sha512-hOAJRs5vrY7fZolSYUXmf29Y+HFDHWrek0DeLq82uwMPjPSda7h6oumQnqEX5olzw357q/QG39/uJdkclJ/JUg==} + '@opentelemetry/instrumentation-mongodb@0.66.0': + resolution: {integrity: sha512-d7m9QnAY+4TCWI4q1QRkfrc6fo/92VwssaB1DzQfXNRvu51b78P+HJlWP7Qg6N6nkwdb9faMZNBCZJfftmszkw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3137,8 +3150,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongoose@0.58.0': - resolution: {integrity: sha512-3L0Fqo1y2oreISFPWaqdt/bg3NhLgrkn5U/E/9RNG1QaM81drTMBCHseMY1q8SlejjE43ZWOy+0KbmRBlUPJ+g==} + '@opentelemetry/instrumentation-mongoose@0.59.0': + resolution: {integrity: sha512-6/jWU+c1NgznkVLDU/2y0bXV2nJo3o9FWZ9mZ9nN6T/JBNRoMnVXZl2FdBmgH+a5MwaWLs5kmRJTP5oUVGIkPw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3149,8 +3162,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql2@0.58.0': - resolution: {integrity: sha512-EubjV1XZb7XHrENqF7TW2lnah+KN0LddMneKNAB8PjGVKL5lJkVV/vhJ6EIcUNn9nCWmAwZ3GRcFVEDKCnyXfQ==} + '@opentelemetry/instrumentation-mysql2@0.59.0': + resolution: {integrity: sha512-n9/xrVCRBfG9egVbffnlU1uhr+HX0vF4GgtAB/Bvm48wpFgRidqD8msBMiym1kRYzmpWvJqTxNT47u1MkgBEdw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3161,32 +3174,32 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql@0.58.0': - resolution: {integrity: sha512-wZDrBCL3WfJclV6KywWVV3/B2ZiUYmDQdgyu3pq4jK/5qSfoDmezHzT/Nayln5MVVWMAGXIMLrCj8BKa6jaKQQ==} + '@opentelemetry/instrumentation-mysql@0.59.0': + resolution: {integrity: sha512-r+V/Fh0sm7Ga8/zk/TI5H5FQRAjwr0RrpfPf8kNIehlsKf12XnvIaZi8ViZkpX0gyPEpLXqzqWD6QHlgObgzZw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.58.0': - resolution: {integrity: sha512-0lE9oW8j6nmvBHJoOxIQgKzMQQYNfX1nhiWZdXD0sNAMFsWBtvECWS7NAPSroKrEP53I04TcHCyyhcK4I9voXg==} + '@opentelemetry/instrumentation-nestjs-core@0.59.0': + resolution: {integrity: sha512-tt2cFTENV8XB3D3xjhOz0q4hLc1eqkMZS5UyT9nnHF5FfYH94S2vAGdssvsMv+pFtA6/PmhPUZd4onUN1O7STg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-net@0.56.0': - resolution: {integrity: sha512-h69x7U6f86mP3gGWWTaMkQZk0K3tBvpVMIU7E0q2kkVw6eZ5TqFm9rkaEy38moQmixiDFQ9j/2/cwxG9P7ZEeA==} + '@opentelemetry/instrumentation-net@0.57.0': + resolution: {integrity: sha512-UUb59z83btvU8q9sQFOc3wr6dsxZP9O17dPlqRUxl1gVrxx8+CIajEGFP+KhJNdlkGyRjH09UfMRvWvCtJdakw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-openai@0.10.0': - resolution: {integrity: sha512-0lV2zxge2mMaruVCw/bmypWVu+aJ76rc0HBvAVFCPUI3zzJdgBZJZafGIHZ1IB2F6VvrDFL+JstEnle6V8brvA==} + '@opentelemetry/instrumentation-openai@0.11.0': + resolution: {integrity: sha512-dlE35fB8xUFBFvlVOQcaMMii+mKk6kWeQbwQEePOLBp2U4oQd2wGGeVPYyihMnTFLVhQdQm2k5DVPFc2Gcllow==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-oracledb@0.37.0': - resolution: {integrity: sha512-OzMghtAEAEkXlkUrZI4QcXSZq0MILeU6WC0/N5+1MSkuIkruIeaRw99/RtyS2of8vlPDa8XbbXl32Q1RM3wSyg==} + '@opentelemetry/instrumentation-oracledb@0.38.0': + resolution: {integrity: sha512-xPVEN9jO5pdpuzRYY8d7JTMEk2sPA3KShzoK4mBQgfLvM2BR3k0XwtyyX/FmWYSrjE7oxnO30HlhuyfkEd6o5A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3197,14 +3210,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pg@0.64.0': - resolution: {integrity: sha512-NbfB/rlfsRI3zpTjnbvJv3qwuoGLsN8FxR/XoI+ZTn1Rs62x1IenO+TSSvk4NO+7FlXpd2MiOe8LT/oNbydHGA==} + '@opentelemetry/instrumentation-pg@0.65.0': + resolution: {integrity: sha512-W0zpHEIEuyZ8zvb3njaX9AAbHgPYOsSWVOoWmv1sjVRSF6ZpBqtlxBWbU+6hhq1TFWBeWJOXZ8nZS/PUFpLJYQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pino@0.58.0': - resolution: {integrity: sha512-rgy+tA7cDjuSq6dXAO40OiYP25azIDHMBtxG3RzSmCBVEYdjggl6btyuLVasX6VkOOhP2gf6PBuLMNxVwaIqAw==} + '@opentelemetry/instrumentation-pino@0.59.0': + resolution: {integrity: sha512-IgImVFtWjfMmqxc0NIe3iSjp+J3Asf9lLX8reouUFUk3Aa/qJQO5PEvOtO3sNQtJBkC9bAd1OQdFaFWSFQc03g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3215,32 +3228,32 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-redis@0.60.0': - resolution: {integrity: sha512-Ea/GffmmzIVHc9geaMjT94IR7poVZzIv4Kk/Lw0tbxGD3cBYcMUsLFVajKxpZsE1NRCECFpidAWeifCIKD0inw==} + '@opentelemetry/instrumentation-redis@0.61.0': + resolution: {integrity: sha512-JnPexA034/0UJRsvH96B0erQoNOqKJZjE2ZRSw9hiTSC23LzE0nJE/u6D+xqOhgUhRnhhcPHq4MdYtmUdYTF+Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-restify@0.57.0': - resolution: {integrity: sha512-kO6MsZFU+RdXOKhsKw8SOSBYGYCdFSlza+mpBQRl1DQmveZcnidchv4V5JQPtNgHxCGH+1n3hDpLdxdGUbJPNA==} + '@opentelemetry/instrumentation-restify@0.58.0': + resolution: {integrity: sha512-E8pEjW9d5rd6xxLhgHiQTwUG6YBOBeWzH/pe/IkdIGwkDzm1NVoExjSCVtMLQ8dRZbVo0nSdv2TqzyDcysuiSQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-router@0.56.0': - resolution: {integrity: sha512-PHECDGQElLazI/QbHU16C5m9fDC7DGJk+jLIwO5ca6bcp7bXhUPPUTT78l7da2pDsrz4mhv5ytYNZmBbW/Q3rA==} + '@opentelemetry/instrumentation-router@0.57.0': + resolution: {integrity: sha512-iWhLFvNee9ZX5QhFbXZeGdoT966QemUfd1i+zxPWceE58P22qf9va6x662LbrNhcvJfXnf7hoW7BU9tzaBLmYg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-runtime-node@0.25.0': - resolution: {integrity: sha512-XaCmwBSui5KeTn8M6OzaEn1rEsNWtUkjuc1ylg0tqQTLHibNQ0n7f8v4zdF6x/nBV1OnsiYlN8RLHauGemv/TA==} + '@opentelemetry/instrumentation-runtime-node@0.26.0': + resolution: {integrity: sha512-Q6xlV3o/ogtAJ1stWNNqL7kKFD6sMEDyC3Rb9GqnMQ5uH1wfnXO189F2XwMNt7Xe52asNU1WCrqiGa0iSrkq1g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-socket.io@0.59.0': - resolution: {integrity: sha512-71DnM/FEqH0PjvU2uZvzWJeaGyVIy3rJKk8rZrxg/aS2QT3qLGb+UPL/B+1vOw4pzDPn4papLTSMpLVF9G8uvw==} + '@opentelemetry/instrumentation-socket.io@0.60.0': + resolution: {integrity: sha512-gzIkrN+hJzuQR87CA1zVCUQASOuuz0uC7kk7qDt9E/4sNvWrCIfI0YYa8ZTPgbaofqZE1fGWt0UqzIzQTb5BWQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3251,8 +3264,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-tedious@0.31.0': - resolution: {integrity: sha512-HoF2EtcyP3JR4R3jLPHohZ9lFcj1QLJyGmFfLKDTvUUjPiFuK4XZ6L1OV9HhaqvN0xY+tWKfNdCPS3r33rd0Xw==} + '@opentelemetry/instrumentation-tedious@0.32.0': + resolution: {integrity: sha512-BQS6gG8RJ1foEqfEZ+wxoqlwfCAzb1ZVG0ad8Gfe4x8T658HJCLGLd4E4NaoQd8EvPfLqOXgzGaE/2U4ytDSWA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3263,14 +3276,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.7.0 - '@opentelemetry/instrumentation-undici@0.22.0': - resolution: {integrity: sha512-yb6vEWUPOrD5i7yR1XceEEqiVHbMgr5YnUPnom5eQVCjvrTkEVswyrf9i+vvJR+28wrNqILIIphWgOOx6BjnTQ==} + '@opentelemetry/instrumentation-undici@0.23.0': + resolution: {integrity: sha512-LL0VySzKVR2cJSFVZaTYpZl1XTpBGnfzoQPe2W7McS2267ldsaEIqtQY6VXs2KCXN0poFjze5110PIpxHDaDGg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.7.0 - '@opentelemetry/instrumentation-winston@0.56.0': - resolution: {integrity: sha512-ITIA0Qe61CQ6FQU/bN23pNBvJ+5U0ofoASMOOYrODtXyV9wI267AigNTTwDmv2Myt8dPEFvvVFJZKhiZLIpehA==} + '@opentelemetry/instrumentation-winston@0.57.0': + resolution: {integrity: sha512-0MEeeyTd55OcXEd3SRkDwPvpb2equZ4kIADI7boVB9OYyaxAR2TB7jPX1IGORn1n/V+FXVWlYn9pQc2GuboJ+w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3293,14 +3306,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.212.0': - resolution: {integrity: sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-exporter-base@0.206.0': - resolution: {integrity: sha512-Rv54oSNKMHYS5hv+H5EGksfBUtvPQWFTK+Dk6MjJun9tOijCsFJrhRFvAqg5d67TWSMn+ZQYRKIeXh5oLVrpAQ==} + '@opentelemetry/instrumentation@0.213.0': + resolution: {integrity: sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3311,20 +3318,26 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.213.0': + resolution: {integrity: sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.57.1': resolution: {integrity: sha512-GNBJAEYfeiYJQ3O2dvXgiNZ/qjWrBxSb1L1s7iV/jKBRGMN3Nv+miTk2SLeEobF5E5ZK4rVcHKlBZ71bPVIv/g==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-grpc-exporter-base@0.206.0': - resolution: {integrity: sha512-IA8EDbrB8OKtidMqErBY8sUc9mh03LOXuNPwp4/rdPrxSt45g1gBuZMovRXdEWfRyKKbF2E7MdipT2m11bs6SQ==} + '@opentelemetry/otlp-grpc-exporter-base@0.212.0': + resolution: {integrity: sha512-YidOSlzpsun9uw0iyIWrQp6HxpMtBlECE3tiHGAsnpEqJWbAUWcMnIffvIuvTtTQ1OyRtwwaE79dWSQ8+eiB7g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-grpc-exporter-base@0.212.0': - resolution: {integrity: sha512-YidOSlzpsun9uw0iyIWrQp6HxpMtBlECE3tiHGAsnpEqJWbAUWcMnIffvIuvTtTQ1OyRtwwaE79dWSQ8+eiB7g==} + '@opentelemetry/otlp-grpc-exporter-base@0.213.0': + resolution: {integrity: sha512-XgRGuLE9usFNlnw2lgMIM4HTwpcIyjdU/xPoJ8v3LbBLBfjaDkIugjc9HoWa7ZSJ/9Bhzgvm/aD0bGdYUFgnTw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3335,14 +3348,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.206.0': - resolution: {integrity: sha512-Li2Cik1WnmNbU2mmTnw7DxvRiXhMcnAuTfAclP8y/zy7h5+GrLDpTZ+Z0XUs+Q3MLkb/h3ry4uFrC/z+2a6X7g==} + '@opentelemetry/otlp-transformer@0.212.0': + resolution: {integrity: sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.212.0': - resolution: {integrity: sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==} + '@opentelemetry/otlp-transformer@0.213.0': + resolution: {integrity: sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3353,14 +3366,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@2.5.1': - resolution: {integrity: sha512-AU6sZgunZrZv/LTeHP+9IQsSSH5p3PtOfDPe8VTdwYH69nZCfvvvXehhzu+9fMW2mgJMh5RVpiH8M9xuYOu5Dg==} + '@opentelemetry/propagator-b3@2.6.0': + resolution: {integrity: sha512-SguK4jMmRvQ0c0dxAMl6K+Eu1+01X0OP7RLiIuHFjOS8hlB23ZYNnhnbAdSQEh5xVXQmH0OAS0TnmVI+6vB2Kg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@2.5.1': - resolution: {integrity: sha512-8+SB94/aSIOVGDUPRFSBRHVUm2A8ye1vC6/qcf/D+TF4qat7PC6rbJhRxiUGDXZtMtKEPM/glgv5cBGSJQymSg==} + '@opentelemetry/propagator-jaeger@2.6.0': + resolution: {integrity: sha512-KGWJuvp9X8X36bhHgIhWEnHAzXDInFr+Fvo9IQhhuu6pXLT8mF7HzFyx/X+auZUITvPaZhM39Phj3vK12MbhwA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -3369,32 +3382,32 @@ packages: resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} engines: {node: ^18.19.0 || >=20.6.0} - '@opentelemetry/resource-detector-alibaba-cloud@0.33.2': - resolution: {integrity: sha512-EaS54zwYmOg9Ttc79juaktpCBYqyh2IquXl534sLls+c1/pc8LZfWPMqytFt+iBvSPQ6ajraUnvi6cun4AhSjQ==} + '@opentelemetry/resource-detector-alibaba-cloud@0.33.3': + resolution: {integrity: sha512-Ep3LDWALU+wCgGzAa1rgFXh3TObahN7HaQZntAeVQnnNhZ3VSXnBniRGeSCTIRvRr7YdZvq+G+rstixtAN5Ugw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-aws@2.12.0': - resolution: {integrity: sha512-VelueKblsnQEiBVqEYcvM9VEb+B8zN6nftltdO9HAD7qi/OlicP4z/UGJ9EeW2m++WabdMoj0G3QVL8YV0P9tw==} + '@opentelemetry/resource-detector-aws@2.13.0': + resolution: {integrity: sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-azure@0.20.0': - resolution: {integrity: sha512-iRy+O2cB6DOlQ/OONaK+L8Cp8nLS89dZVRp6KgnFAfzykXuq9Ws/ygJKcU3CCmjkgY5j2Vk3uVTre/E35bWhYg==} + '@opentelemetry/resource-detector-azure@0.21.0': + resolution: {integrity: sha512-gAjK+lKeywMcRk9X/DjJsK9aPrQo+tM9vcp6AKpAAHRN5hNwzO/vAaW/Ezdodu76BK4ELo/O77y/b9qP+uU7vg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-container@0.8.3': - resolution: {integrity: sha512-5J0JP2cy655rBKM9Doz26ffO3rG+Xqm7OXeNXkckzmc3JmL6Bj3dPBKugPYsfemhEIqtf7INH9UmPQqTMuWoHg==} + '@opentelemetry/resource-detector-container@0.8.4': + resolution: {integrity: sha512-kIvGHkMSacp+kb7btTuXbOAIWLyOCO+P/h/8xxaeLcp5ptmHRZ67uEdLAQo61ApdayFB/uqjJ9gY4x2/i/KsoA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-gcp@0.47.0': - resolution: {integrity: sha512-57T/kRVdU0ch1P4KPEkmU2b5mWNlUs8hHgqrBYVF+fNZMc1jMdL1mANZhEzoLtWKIeoCEy+57Itt7RkXAYNJiQ==} + '@opentelemetry/resource-detector-gcp@0.48.0': + resolution: {integrity: sha512-kT/iG9zjlbWYaj22ixQ+vso0fXKCSKLH0loTb0Xfq+nQpu19MBTAa63IdITGCfqjcffh8/aB4hdyExypwAC16A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -3405,26 +3418,26 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@2.1.0': - resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.5.1': resolution: {integrity: sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-logs@0.206.0': - resolution: {integrity: sha512-SQ2yTmqe4Mw9RI3a/glVkfjWPsXh6LySvnljXubiZq4zu+UP8NMJt2j82ZsYb+KpD7Eu+/41/7qlJnjdeVjz7Q==} + '@opentelemetry/resources@2.6.0': + resolution: {integrity: sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.212.0': + resolution: {integrity: sha512-qglb5cqTf0mOC1sDdZ7nfrPjgmAqs2OxkzOPIf2+Rqx8yKBK0pS7wRtB1xH30rqahBIut9QJDbDePyvtyqvH/Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-logs@0.212.0': - resolution: {integrity: sha512-qglb5cqTf0mOC1sDdZ7nfrPjgmAqs2OxkzOPIf2+Rqx8yKBK0pS7wRtB1xH30rqahBIut9QJDbDePyvtyqvH/Q==} + '@opentelemetry/sdk-logs@0.213.0': + resolution: {integrity: sha512-00xlU3GZXo3kXKve4DLdrAL0NAFUaZ9appU/mn00S/5kSUdAvyYsORaDUfR04Mp2CLagAOhrzfUvYozY/EZX2g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' @@ -3441,20 +3454,20 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.1.0': - resolution: {integrity: sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.5.1': resolution: {integrity: sha512-RKMn3QKi8nE71ULUo0g/MBvq1N4icEBo7cQSKnL3URZT16/YH3nSVgWegOjwx7FRBTrjOIkMJkCUn/ZFIEfn4A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-node@0.212.0': - resolution: {integrity: sha512-tJzVDk4Lo44MdgJLlP+gdYdMnjxSNsjC/IiTxj5CFSnsjzpHXwifgl3BpUX67Ty3KcdubNVfedeBc/TlqHXwwg==} + '@opentelemetry/sdk-metrics@2.6.0': + resolution: {integrity: sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.213.0': + resolution: {integrity: sha512-8s7SQtY8DIAjraXFrUf0+I90SBAUQbsMWMtUGKmusswRHWXtKJx42aJQMoxEtC82Csqj+IlBH6FoP8XmmUDSrQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -3465,20 +3478,20 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.1.0': - resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.5.1': resolution: {integrity: sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-node@2.5.1': - resolution: {integrity: sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==} + '@opentelemetry/sdk-trace-base@2.6.0': + resolution: {integrity: sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.6.0': + resolution: {integrity: sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -3501,29 +3514,30 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 - '@otplib/core@12.0.1': - resolution: {integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==} + '@otplib/core@13.3.0': + resolution: {integrity: sha512-pnQDOuCmFVeF/XnboJq9TOJgLoo2idNPJKMymOF8vGqJJ+ReKRYM9bUGjNPRWC0tHjMwu1TXbnzyBp494JgRag==} - '@otplib/plugin-crypto@12.0.1': - resolution: {integrity: sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==} - deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths + '@otplib/hotp@13.3.0': + resolution: {integrity: sha512-XJMZGz2bg4QJwK7ulvl1GUI2VMn/flaIk/E/BTKAejHsX2kUtPF1bRhlZ2+elq8uU5Fs9Z9FHcQK2CPZNQbbUQ==} - '@otplib/plugin-thirty-two@12.0.1': - resolution: {integrity: sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==} - deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths + '@otplib/plugin-base32-scure@13.3.0': + resolution: {integrity: sha512-/jYbL5S6GB0Ie3XGEWtLIr9s5ZICl/BfmNL7+8/W7usZaUU4GiyLd2S+JGsNCslPyqNekSudD864nDAvRI0s8w==} - '@otplib/preset-default@12.0.1': - resolution: {integrity: sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==} - deprecated: Please upgrade to v13 of otplib. Refer to otplib docs for migration paths + '@otplib/plugin-crypto-noble@13.3.0': + resolution: {integrity: sha512-wmV+jBVncepgwv99G7Plrdzd0tHfbpXk2U+OD7MO7DzpDqOYEgOPi+IIneksJSTL8QvWdfi+uQEuhnER4fKouA==} - '@otplib/preset-v11@12.0.1': - resolution: {integrity: sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==} + '@otplib/totp@13.3.0': + resolution: {integrity: sha512-XfjGNoN8d9S3Ove2j7AwkVV7+QDFsV7Lm7YwSiezNaHffkWtJ60aJYpmf+01dARdPST71U2ptueMsRJso4sq4A==} + + '@otplib/uri@13.3.0': + resolution: {integrity: sha512-3oh6nBXy+cm3UX9cxEAGZiDrfxHU2gfelYFV+XNCx+8dq39VaQVymwlU2yjPZiMAi/3agaUeEftf2RwM5F+Cyg==} '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} - '@paralleldrive/cuid2@2.3.1': - resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@paralleldrive/cuid2@3.3.0': + resolution: {integrity: sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw==} + hasBin: true '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -3567,58 +3581,83 @@ packages: preact: '>=10.26.10' vite: '>=2.0.0' - '@prisma/client@6.19.2': - resolution: {integrity: sha512-gR2EMvfK/aTxsuooaDA32D8v+us/8AAet+C3J1cc04SW35FPdZYgLF+iN4NDLUgAaUGTKdAB0CYenu1TAgGdMg==} - engines: {node: '>=18.18'} + '@prisma/adapter-pg@7.4.2': + resolution: {integrity: sha512-oUo2Zhe9Tf6YwVL8kLPuOLTK1Z2pwi/Ua77t2PuGyBan2w7shRKqHvYK+3XXmRH9RWhPJ4SMtHZKpNo6Ax/4bQ==} + + '@prisma/client-runtime-utils@7.4.2': + resolution: {integrity: sha512-cID+rzOEb38VyMsx5LwJMEY4NGIrWCNpKu/0ImbeooQ2Px7TI+kOt7cm0NelxUzF2V41UVVXAmYjANZQtCu1/Q==} + + '@prisma/client@7.4.2': + resolution: {integrity: sha512-ts2mu+cQHriAhSxngO3StcYubBGTWDtu/4juZhXCUKOwgh26l+s4KD3vT2kMUzFyrYnll9u/3qWrtzRv9CGWzA==} + engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: prisma: '*' - typescript: '>=5.1.0' + typescript: '>=5.4.0' peerDependenciesMeta: prisma: optional: true typescript: optional: true - '@prisma/config@6.19.2': - resolution: {integrity: sha512-kadBGDl+aUswv/zZMk9Mx0C8UZs1kjao8H9/JpI4Wh4SHZaM7zkTwiKn/iFLfRg+XtOAo/Z/c6pAYhijKl0nzQ==} + '@prisma/config@7.4.2': + resolution: {integrity: sha512-CftBjWxav99lzY1Z4oDgomdb1gh9BJFAOmWF6P2v1xRfXqQb56DfBub+QKcERRdNoAzCb3HXy3Zii8Vb4AsXhg==} - '@prisma/debug@6.19.1': - resolution: {integrity: sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==} + '@prisma/debug@7.2.0': + resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - '@prisma/debug@6.19.2': - resolution: {integrity: sha512-lFnEZsLdFLmEVCVNdskLDCL8Uup41GDfU0LUfquw+ercJC8ODTuL0WNKgOKmYxCJVvFwf0OuZBzW99DuWmoH2A==} + '@prisma/debug@7.4.2': + resolution: {integrity: sha512-aP7qzu+g/JnbF6U69LMwHoUkELiserKmWsE2shYuEpNUJ4GrtxBCvZwCyCBHFSH2kLTF2l1goBlBh4wuvRq62w==} - '@prisma/dmmf@6.19.1': - resolution: {integrity: sha512-QY6z6GBt1ySavs2I6VxXJFhPV2wabkookKjLsK/GFygZ0tmDmki0iutS8Mv0fQs3O8vk1t+1x3rZjJHqy/6OSw==} + '@prisma/dev@0.20.0': + resolution: {integrity: sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==} - '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': - resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==} + '@prisma/dmmf@7.4.2': + resolution: {integrity: sha512-EurUPjBwmAd69MM8PLZ5n94xeeQ+7SB3Wd9p2+YsgXhvqCa1cgJRBJiB6fTWkPTz5Lf05ySNJ/59EnuEJMAnrw==} - '@prisma/engines@6.19.2': - resolution: {integrity: sha512-TTkJ8r+uk/uqczX40wb+ODG0E0icVsMgwCTyTHXehaEfb0uo80M9g1aW1tEJrxmFHeOZFXdI2sTA1j1AgcHi4A==} + '@prisma/driver-adapter-utils@7.4.2': + resolution: {integrity: sha512-REdjFpT/ye9KdDs+CXAXPIbMQkVLhne9G5Pe97sNY4Ovx4r2DAbWM9hOFvvB1Oq8H8bOCdu0Ri3AoGALquQqVw==} - '@prisma/fetch-engine@6.19.2': - resolution: {integrity: sha512-h4Ff4Pho+SR1S8XerMCC12X//oY2bG3Iug/fUnudfcXEUnIeRiBdXHFdGlGOgQ3HqKgosTEhkZMvGM9tWtYC+Q==} + '@prisma/engines-version@7.5.0-10.94a226be1cf2967af2541cca5529f0f7ba866919': + resolution: {integrity: sha512-5FIKY3KoYQlBuZC2yc16EXfVRQ8HY+fLqgxkYfWCtKhRb3ajCRzP/rPeoSx11+NueJDANdh4hjY36mdmrTcGSg==} - '@prisma/generator-helper@6.19.1': - resolution: {integrity: sha512-/q5JlaWIthJ5wpx7Y7e9pstAeUpGt7vXMKK/yQhZ000fOKnLySNqlt/5bHXT4TO4P2Apjwb/bM0GwTGMV6D+eA==} + '@prisma/engines@7.4.2': + resolution: {integrity: sha512-B+ZZhI4rXlzjVqRw/93AothEKOU5/x4oVyJFGo9RpHPnBwaPwk4Pi0Q4iGXipKxeXPs/dqljgNBjK0m8nocOJA==} - '@prisma/generator@6.19.1': - resolution: {integrity: sha512-q/JOCDQg8S0l5dM9HXWszTKHVZzwvYB/8aFNln2FDcTGB2YeO9Q7nKTMnYfezip6RE/lCcxz5rZ+YXWr62XUwQ==} + '@prisma/fetch-engine@7.4.2': + resolution: {integrity: sha512-f/c/MwYpdJO7taLETU8rahEstLeXfYgQGlz5fycG7Fbmva3iPdzGmjiSWHeSWIgNnlXnelUdCJqyZnFocurZuA==} - '@prisma/get-platform@6.19.2': - resolution: {integrity: sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA==} + '@prisma/generator-helper@7.4.2': + resolution: {integrity: sha512-PWTkqlMILGVghoWP8SZB3prw/EcthiyPYJsMoiVZrClqPMQn6doPjphCQffPDyGzZvAwmA64edbc6Gm/6Omkjg==} - '@prisma/instrumentation@6.19.2': - resolution: {integrity: sha512-5VXvzh/qOh7uBnVIx26IQJDBIXgpBhyh1+TPHDmw3pv/rue9x7NVAvip+bznUIYUREPPPTGWjabANUacRFttrA==} - peerDependencies: - '@opentelemetry/api': ^1.8 + '@prisma/generator@7.4.2': + resolution: {integrity: sha512-+4B8Rrq5Ef2cm7cW7Wyu6oXn/QVcDVdNti9mKEkcbPVLlA85I6Rbd+j6r+k2E2nlj0zKZbDbq8fIx/Xnt1SmkA==} + + '@prisma/get-platform@7.2.0': + resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} + + '@prisma/get-platform@7.4.2': + resolution: {integrity: sha512-UTnChXRwiauzl/8wT4hhe7Xmixja9WE28oCnGpBtRejaHhvekx5kudr3R4Y9mLSA0kqGnAMeyTiKwDVMjaEVsw==} '@prisma/instrumentation@7.2.0': resolution: {integrity: sha512-Rh9Z4x5kEj1OdARd7U18AtVrnL6rmLSI0qYShaB4W7Wx5BKbgzndWF+QnuzMb7GLfVdlT5aYCXoPQVYuYtVu0g==} peerDependencies: '@opentelemetry/api': ^1.8 + '@prisma/instrumentation@7.4.2': + resolution: {integrity: sha512-r9JfchJF1Ae6yAxcaLu/V1TGqBhAuSDe3mRNOssBfx1rMzfZ4fdNvrgUBwyb/TNTGXFxlH9AZix5P257x07nrg==} + peerDependencies: + '@opentelemetry/api': ^1.8 + + '@prisma/query-plan-executor@7.2.0': + resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} + + '@prisma/studio-core@0.13.1': + resolution: {integrity: sha512-agdqaPEePRHcQ7CexEfkX1RvSH9uWDb6pXrZnhCRykhDFAV0/0P3d07WtfiY8hZWb7oRU4v+NkT4cGFHkQJIPg==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -4364,9 +4403,6 @@ packages: peerDependencies: '@redis/client': ^5.11.0 - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -4687,6 +4723,9 @@ packages: '@rushstack/ts-command-line@5.3.3': resolution: {integrity: sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==} + '@scure/base@2.0.0': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} @@ -4841,6 +4880,10 @@ packages: resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.11': + resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} + engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.8': resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} engines: {node: '>=18.0.0'} @@ -4853,6 +4896,10 @@ packages: resolution: {integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.10': + resolution: {integrity: sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg==} + engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.6': resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} @@ -4865,14 +4912,18 @@ packages: resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.6': - resolution: {integrity: sha512-4xE+0L2NrsFKpEVFlFELkIHQddBvMbQ41LRIP74dGCXnY1zQ9DgksrBcRBDJT+iOzGy4VEJIeU3hkUK5mn06kg==} + '@smithy/core@3.23.8': + resolution: {integrity: sha512-f7uPeBi7ehmLT4YF2u9j3qx6lSnurG1DLXOsTtJrIRNDF7VXio4BGHQ+SQteN/BrUVudbkuL4v7oOsRCzq4BqA==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.10': resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.11': + resolution: {integrity: sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.7': resolution: {integrity: sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==} engines: {node: '>=18.0.0'} @@ -4901,8 +4952,8 @@ packages: resolution: {integrity: sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.11': - resolution: {integrity: sha512-wbTRjOxdFuyEg0CpumjZO0hkUl+fetJFqxNROepuLIoijQh51aMBmzFLfoQdwRjxsuuS2jizzIUTjPWgd8pd7g==} + '@smithy/fetch-http-handler@5.3.13': + resolution: {integrity: sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ==} engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.3.9': @@ -4945,6 +4996,10 @@ packages: resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} + engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.2.10': resolution: {integrity: sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ==} engines: {node: '>=18.0.0'} @@ -4961,22 +5016,26 @@ packages: resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.20': - resolution: {integrity: sha512-9W6Np4ceBP3XCYAGLoMCmn8t2RRVzuD1ndWPLBbv7H9CrwM9Bprf6Up6BM9ZA/3alodg0b7Kf6ftBK9R1N04vw==} + '@smithy/middleware-endpoint@4.4.22': + resolution: {integrity: sha512-sc81w1o4Jy+/MAQlY3sQ8C7CmSpcvIi3TAzXblUv2hjG11BBSJi/Cw8vDx5BxMxapuH2I+Gc+45vWsgU07WZRQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-retry@4.4.30': resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.37': - resolution: {integrity: sha512-/1psZZllBBSQ7+qo5+hhLz7AEPGLx3Z0+e3ramMBEuPK2PfvLK4SrncDB9VegX5mBn+oP/UTDrM6IHrFjvX1ZA==} + '@smithy/middleware-retry@4.4.39': + resolution: {integrity: sha512-MCVCxaCzuZgiHtHGV2Ke44nh6t4+8/tO+rTYOzrr2+G4nMLU/qbzNCWKBX54lyEaVcGQrfOJiG2f8imtiw+nIQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.11': resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.12': + resolution: {integrity: sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.9': resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} engines: {node: '>=18.0.0'} @@ -4985,6 +5044,10 @@ packages: resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.11': + resolution: {integrity: sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.8': resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} engines: {node: '>=18.0.0'} @@ -4993,12 +5056,16 @@ packages: resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.11': + resolution: {integrity: sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.8': resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.12': - resolution: {integrity: sha512-zo1+WKJkR9x7ZtMeMDAAsq2PufwiLDmkhcjpWPRRkmeIuOm6nq1qjFICSZbnjBvD09ei8KMo26BWxsu2BUU+5w==} + '@smithy/node-http-handler@4.4.14': + resolution: {integrity: sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A==} engines: {node: '>=18.0.0'} '@smithy/node-http-handler@4.4.9': @@ -5009,6 +5076,10 @@ packages: resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.11': + resolution: {integrity: sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.7': resolution: {integrity: sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==} engines: {node: '>=18.0.0'} @@ -5021,6 +5092,10 @@ packages: resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.11': + resolution: {integrity: sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.8': resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} engines: {node: '>=18.0.0'} @@ -5029,6 +5104,10 @@ packages: resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.11': + resolution: {integrity: sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.8': resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} engines: {node: '>=18.0.0'} @@ -5037,6 +5116,10 @@ packages: resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.11': + resolution: {integrity: sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.8': resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} engines: {node: '>=18.0.0'} @@ -5045,6 +5128,10 @@ packages: resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.11': + resolution: {integrity: sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.8': resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} engines: {node: '>=18.0.0'} @@ -5057,6 +5144,10 @@ packages: resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.4.6': + resolution: {integrity: sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.10': resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} engines: {node: '>=18.0.0'} @@ -5069,8 +5160,8 @@ packages: resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.0': - resolution: {integrity: sha512-R8bQ9K3lCcXyZmBnQqUZJF4ChZmtWT5NLi6x5kgWx5D+/j0KorXcA0YcFg/X5TOgnTCy1tbKc6z2g2y4amFupQ==} + '@smithy/smithy-client@4.12.2': + resolution: {integrity: sha512-HezY3UuG0k4T+4xhFKctLXCA5N2oN+Rtv+mmL8Gt7YmsUY2yhmcLyW75qrSzldfj75IsCW/4UhY3s20KcFnZqA==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -5085,6 +5176,10 @@ packages: resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.11': + resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.8': resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} engines: {node: '>=18.0.0'} @@ -5097,6 +5192,10 @@ packages: resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.0': resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} @@ -5105,6 +5204,10 @@ packages: resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.2.1': resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} engines: {node: '>=18.0.0'} @@ -5125,6 +5228,10 @@ packages: resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.2.0': resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} @@ -5133,20 +5240,24 @@ packages: resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.29': resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.36': - resolution: {integrity: sha512-R0smq7EHQXRVMxkAxtH5akJ/FvgAmNF6bUy/GwY/N20T4GrwjT633NFm0VuRpC+8Bbv8R9A0DoJ9OiZL/M3xew==} + '@smithy/util-defaults-mode-browser@4.3.38': + resolution: {integrity: sha512-c8P1mFLNxcsdAMabB8/VUQUbWzFmgujWi4bAXSggcqLYPc8V4U5abqFqOyn+dK4YT+q8UyCVkTO8807t4t2syA==} engines: {node: '>=18.0.0'} '@smithy/util-defaults-mode-node@4.2.32': resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.39': - resolution: {integrity: sha512-otWuoDm35btJV1L8MyHrPl462B07QCdMTktKc7/yM+Psv6KbED/ziXiHnmr7yPHUjfIwE9S8Max0LO24Mo3ZVg==} + '@smithy/util-defaults-mode-node@4.2.41': + resolution: {integrity: sha512-/UG+9MT3UZAR0fLzOtMJMfWGcjjHvgggq924x/CRy8vRbL+yFf3Z6vETlvq8vDH92+31P/1gSOFoo7303wN8WQ==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -5157,6 +5268,10 @@ packages: resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.3.2': + resolution: {integrity: sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.0': resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} @@ -5165,10 +5280,18 @@ packages: resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.10': resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.11': + resolution: {integrity: sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.8': resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} engines: {node: '>=18.0.0'} @@ -5177,6 +5300,10 @@ packages: resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.11': + resolution: {integrity: sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.8': resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} @@ -5185,8 +5312,8 @@ packages: resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.15': - resolution: {integrity: sha512-OlOKnaqnkU9X+6wEkd7mN+WB7orPbCVDauXOj22Q7VtiTkvy7ZdSsOg4QiNAZMgI4OkvNf+/VLUC3VXkxuWJZw==} + '@smithy/util-stream@4.5.17': + resolution: {integrity: sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -5197,6 +5324,10 @@ packages: resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} + engines: {node: '>=18.0.0'} + '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} @@ -5209,6 +5340,10 @@ packages: resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.2.10': resolution: {integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==} engines: {node: '>=18.0.0'} @@ -5221,8 +5356,8 @@ packages: resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.1': - resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': @@ -5237,53 +5372,42 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@storybook/addon-a11y@10.2.14': - resolution: {integrity: sha512-So/Pf8IHEV1XcCHjwPUWs55cB5PilqS3TEho1IXDWpQHBmxBHgX+Z2lQ/SrfqqtMWwy3YY95YO3fA2fn7To5Yg==} + '@storybook/addon-a11y@10.2.15': + resolution: {integrity: sha512-lhWG4NbR1o0AOzrCucz2m3AU5pmNSzN4lC7Q2wHjpDSgXokz5xzGvilYlDzCuEvsyPFiivOBx1igwSWdIV4BTw==} peerDependencies: - storybook: ^10.2.14 + storybook: ^10.2.15 - '@storybook/addon-docs@10.2.14': - resolution: {integrity: sha512-vUGw+zoodb91GIcDECZetXL8Bo0AJ/lYudcRBqtdw8taLXucss28Ev6u36dXggARYHPT8V0FhBkipzzJxssjUQ==} + '@storybook/addon-docs@10.2.15': + resolution: {integrity: sha512-gZ1tLXS9HycIt99cKfkAS7D2Arv/vlSZN0YJlQ/8Hurvnsah2NrxZkRbSx4S7HBzZ23u0CMIoXnFlinGYNWQNA==} peerDependencies: - storybook: ^10.2.14 + storybook: ^10.2.15 - '@storybook/addon-links@10.2.14': - resolution: {integrity: sha512-cnZ9+s9rYfT9cHjVHTAtyl0+U/qGEbGEuqv89nbXtc69B7SUi/+vfcf9uMjA+ntMVKEiLljOj8vYxuDWxLHFJA==} + '@storybook/addon-links@10.2.15': + resolution: {integrity: sha512-9hg/hItO9GU5xmT1B3ax1BmC2uGslmUBmPHv0c0PQNkuRQNqB+57+SPZcpjZvS5bbx1xVJqDZE2HW+Vn5jnRDw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.14 + storybook: ^10.2.15 peerDependenciesMeta: react: optional: true - '@storybook/addon-onboarding@10.2.14': - resolution: {integrity: sha512-xkRBrmzk/kVJPXQpUUcN9vpIKQeXhzJnmJ4RJBzHykN6U6MLNqJUkqPdn7BCcdgQiRXAZCxLNDa5qPxCLrnZ7g==} + '@storybook/addon-onboarding@10.2.15': + resolution: {integrity: sha512-XeI84XuWV24U4ssKSXnQZszjBZus0Bqshn7IKNQLAaVxPCx6OgGc3SQrk76qwAQDLnCzZxN6iqowKKvzccioaw==} peerDependencies: - storybook: ^10.2.14 + storybook: ^10.2.15 - '@storybook/builder-vite@10.2.14': - resolution: {integrity: sha512-4b/opKbbTg+npeFXzj4GwZ7SDJdqsJbcJYxFpAznpl9FqMhP+ktH/7QSDs1DtOXpCanKcrmj6UQQgKR8OGypUQ==} + '@storybook/builder-vite@10.2.15': + resolution: {integrity: sha512-+RWyGxvIsT5rx3E1AQJIhKJj9XA4pP2JpYBOY90460Lsf40e9zfgml4cORGYhNmC5N3PMo6QkfsEOO2gLcQNJA==} peerDependencies: - storybook: ^10.2.14 + storybook: ^10.2.15 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/builder-vite@8.6.17': - resolution: {integrity: sha512-ZqFaLUKlRNaU4ovEa5R6D5YTbft1CUcNHLhzpmL9JWInEh4PrUkxiLD/jjB6fiYLcRpSpcs2DF+O/Jh2GDWemA==} - peerDependencies: - storybook: ^8.6.17 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - - '@storybook/components@8.6.17': - resolution: {integrity: sha512-0b8xkkuPCNbM8LTOzyfxuo2KdJCHIfu3+QxWBFllXap0eYNHwVeSxE5KERQ/bk2GDCiRzaUbwH9PeLorxOzJJQ==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/csf-plugin@10.2.14': - resolution: {integrity: sha512-N4frSzhig3pkhaWdN0kAnhgEi9IGEy6rJnpuNAocS6d70fSahGQk958TMml2JCG3LLiVamuXySyUrVtFiHrxvg==} + '@storybook/csf-plugin@10.2.15': + resolution: {integrity: sha512-QPZg2JXB3k7mMI7yoqurMWR6eisUDPrbjbM71L1wW4FUehW/CKChUWy97vP6Bgm1sU17Tfoc3nBRUdtEDC1RSw==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.2.14 + storybook: ^10.2.15 vite: '*' webpack: '*' peerDependenciesMeta: @@ -5296,11 +5420,6 @@ packages: webpack: optional: true - '@storybook/csf-plugin@8.6.17': - resolution: {integrity: sha512-ouvF/izbKclZxpfnRUkyC5ZVDU7QA0cHhjQnXTDT4F8b0uciQUDw1LosDZy5MXf03BeIDdyBAtzd/ym3wzd+kw==} - peerDependencies: - storybook: ^8.6.17 - '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} @@ -5310,82 +5429,32 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/manager-api@8.6.17': - resolution: {integrity: sha512-sPJytvClNrw5GgKcPletMTxDOAYcTRA8VRt9E+ncKvPSYHtPDqLfGTgWajXmt0hRsiBUN5bOgLS9bmNjNQWhrw==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/preview-api@8.6.17': - resolution: {integrity: sha512-vpTCTkw11wXerYnlG5Q0y4SbFqG9O6GhR0hlYgCn3Z9kcHlNjK/xuwd3h4CvwNXxRNWZGT8qYYCLn5gSSrX6fA==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/react-dom-shim@10.2.14': - resolution: {integrity: sha512-hO/Yzhf3fX/HhB5MDc/ERM5QLA1+yLgnyt0a4NGDqeWeXQ90YSjEski1RppdAI9oNGyhNwWllZPUrozrL7ECyg==} + '@storybook/react-dom-shim@10.2.15': + resolution: {integrity: sha512-rfPwAz0f67ORfKpA0gq9bhDNlDST2CY9X7bjVfOvOHIfaVVjIJ8wTXE8ozBxOXTBbcv0eblRR9Xcm7aRBG8+iA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.14 + storybook: ^10.2.15 - '@storybook/react-dom-shim@8.6.17': - resolution: {integrity: sha512-bHLsR9b/tiwm9lXbN8kp9XlOgkRXeg84UFwXaWBPu3pOO7vRXukk23SQUpLW+HhjKtCJ3xClSi5uMpse5MpkVQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.17 - - '@storybook/react-vite@10.2.14': - resolution: {integrity: sha512-qfHkDjv0ElJFqhXN/uD+fuuMBVOI7xzJbMqLi9I4TKt4645B0P6X7s83oyLgU9y9xQEi4Dr2zSJq0VtNBe+VBg==} + '@storybook/react-vite@10.2.15': + resolution: {integrity: sha512-AMLKdAnHglFYA0P+KlfkRx2xUSK3+DcCcBL6yQuEwl/MhrQafUJy1kfLWWAbiiPml1inyrer71p/635YUJrQBA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.14 + storybook: ^10.2.15 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/react-vite@8.6.17': - resolution: {integrity: sha512-Tsn16nN++3j0fynrPQkuxxNQHHh06nqgYRTfCTT5qQUV6hDY1uiwN7ZkJEIODEqc26O4HRd0yrAA6lOnr1KZOg==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@storybook/test': 8.6.17 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.17 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - '@storybook/test': - optional: true - - '@storybook/react@10.2.14': - resolution: {integrity: sha512-GzbbsfyOeGpTqLoss6yyb9m7eYO7oXSV8cey+y0gxVplOmK8XISA8q0AtH7gWzw6pDUOaBpEfnrE/jgOOKwQlw==} + '@storybook/react@10.2.15': + resolution: {integrity: sha512-gyreXMjiS1mRiagaGtAqia142hoQ3EDd2nIxwvZu0av/TWpq7Rn6Fh3a9Jdi6Y4psUO+CqGPPur0svgfAD/4+Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.14 + storybook: ^10.2.15 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: optional: true - '@storybook/react@8.6.17': - resolution: {integrity: sha512-yoOzgyZ2VXPJBmvcKS4EVoAf7SJxXbMBcLjWGvmWdDnS+hd7S9cHG/SbgQ+9/vgiLUc+uEuvQjiKrwY3iOA5rg==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@storybook/test': 8.6.17 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.17 - typescript: '>= 4.2.x' - peerDependenciesMeta: - '@storybook/test': - optional: true - typescript: - optional: true - - '@storybook/theming@8.6.17': - resolution: {integrity: sha512-IttFvRqozpuzN5MlQEWGOzUA2rZg86688Dyv1d+bjpYcFHtY1X4XyTCGwv1BPTaTsB959oM8R2yoNYWQkABbBA==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@streamparser/json@0.0.20': resolution: {integrity: sha512-VqAAkydywPpkw63WQhPVKCD3SdwXuihCUVZbbiY3SfSTGQyHmwRoq27y4dmJdZuJwd5JIlQoMPyGvMbUPY0RKQ==} @@ -5590,17 +5659,20 @@ packages: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} - '@trivago/prettier-plugin-sort-imports@5.2.2': - resolution: {integrity: sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==} - engines: {node: '>18.12'} + '@trivago/prettier-plugin-sort-imports@6.0.2': + resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==} + engines: {node: '>= 20'} peerDependencies: '@vue/compiler-sfc': 3.x prettier: 2.x - 3.x + prettier-plugin-ember-template-tag: '>= 2.0.0' prettier-plugin-svelte: 3.x svelte: 4.x || 5.x peerDependenciesMeta: '@vue/compiler-sfc': optional: true + prettier-plugin-ember-template-tag: + optional: true prettier-plugin-svelte: optional: true svelte: @@ -5711,12 +5783,12 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - '@types/node@22.19.13': resolution: {integrity: sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==} + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + '@types/nodemailer@7.0.11': resolution: {integrity: sha512-E+U4RzR2dKrx+u3N4DlsmLaDC6mMZOM/TPROxA0UAPiTgI0y4CEFBmZE+coGWTjakDriRsXG368lNk1u9Q0a2g==} @@ -6088,23 +6160,17 @@ packages: typescript: optional: true - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitejs/plugin-react@5.1.4': resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.0.18 + vitest: 4.0.18 peerDependenciesMeta: '@vitest/browser': optional: true @@ -6125,11 +6191,14 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true @@ -6139,18 +6208,27 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@volar/language-core@2.4.27': resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} @@ -6225,8 +6303,8 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@wojtekmaj/date-utils@1.5.1': - resolution: {integrity: sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==} + '@wojtekmaj/date-utils@2.0.2': + resolution: {integrity: sha512-Do66mSlSNifFFuo3l9gNKfRMSFi26CRuQMsDJuuKO/ekrDWuTTtE4ZQxoFCUOG+NgxnpSeBq/k5TY8ZseEzLpA==} '@xmldom/is-dom-node@1.0.1': resolution: {integrity: sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==} @@ -6541,9 +6619,6 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true - bcryptjs@2.4.3: - resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} - bcryptjs@3.0.3: resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} hasBin: true @@ -6596,9 +6671,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -6636,10 +6708,6 @@ packages: magicast: optional: true - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -6678,6 +6746,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -6690,6 +6762,9 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chevrotain@10.5.0: + resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -6919,8 +6994,8 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - csv-parse@5.6.0: - resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} + csv-parse@6.1.0: + resolution: {integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -7142,12 +7217,12 @@ packages: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} - dotenv-cli@8.0.0: - resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==} + dotenv-cli@11.0.0: + resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} hasBin: true - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} engines: {node: '>=12'} dotenv@16.0.3: @@ -7158,6 +7233,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -7236,6 +7315,9 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-causes@3.0.2: + resolution: {integrity: sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw==} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -7709,8 +7791,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.34.4: - resolution: {integrity: sha512-q1PwNhc1XJ3qYG7nc9+pEU5P3tnjB6Eh9vv5gGzy61nedDLB4+xk5peMCWhKM0Zn6sfhgunf/q9n0UgCoyKOBA==} + framer-motion@12.35.0: + resolution: {integrity: sha512-w8hghCMQ4oq10j6aZh3U2yeEQv5K69O/seDI/41PK4HtgkLrcBovUNc0ayBC3UyyU7V1mrY2yLzvYdWJX9pGZQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -7766,6 +7848,10 @@ packages: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + gaxios@7.1.4: resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} engines: {node: '>=18'} @@ -7813,6 +7899,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -7824,8 +7913,8 @@ packages: get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - get-user-locale@2.3.2: - resolution: {integrity: sha512-O2GWvQkhnbDoWFUJfaBlDIKUEdND8ATpBXD6KXcbhxlfktyD/d8w6mkzM/IlQEqGZAMz/PW6j6Hv53BiigKLUQ==} + get-user-locale@3.0.0: + resolution: {integrity: sha512-iJfHSmdYV39UUBw7Jq6GJzeJxUr4U+S03qdhVuDsR9gCEnfbqLy9gYDJFBJQL1riqolFUKQvx36mEkp2iGgJ3g==} giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} @@ -7887,6 +7976,10 @@ packages: peerDependencies: csstype: ^3.0.10 + google-auth-library@10.6.1: + resolution: {integrity: sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==} + engines: {node: '>=18'} + google-auth-library@9.15.1: resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} engines: {node: '>=14'} @@ -7903,9 +7996,13 @@ packages: resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} engines: {node: '>=14.0.0'} - googleapis@148.0.0: - resolution: {integrity: sha512-8PDG5VItm6E1TdZWDqtRrUJSlBcNwz0/MwCa6AL81y/RxPGXJRUwKqGZfCoVX1ZBbfr3I4NkDxBmeTyOAZSWqw==} - engines: {node: '>=14.0.0'} + googleapis-common@8.0.1: + resolution: {integrity: sha512-eCzNACUXPb1PW5l0ULTzMHaL/ltPRADoPgjBlT8jWsTbxkCp6siv+qKJ/1ldaybCthGwsYFYallF7u9AkU4L+A==} + engines: {node: '>=18.0.0'} + + googleapis@171.4.0: + resolution: {integrity: sha512-xybFL2SmmUgIifgsbsRQYRdNrSAYwxWZDmkZTGjUIaRnX5jPqR8el/cEvo6rCqh7iaZx6MfEPS/lrDgZ0bymkg==} + engines: {node: '>=18'} gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} @@ -7914,9 +8011,15 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grammex@3.1.12: + resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphmatch@1.1.1: + resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==} + gtoken@7.1.0: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} @@ -7970,6 +8073,10 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hono@4.11.4: + resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==} + engines: {node: '>=16.9.0'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -8001,6 +8108,9 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + https-proxy-agent@5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -8032,8 +8142,8 @@ packages: i18next-resources-to-backend@1.2.1: resolution: {integrity: sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==} - i18next@25.8.13: - resolution: {integrity: sha512-E0vzjBY1yM+nsFrtgkjLhST2NBkirkvOVoQa0MSldhsuZ3jUge7ZNpuwG0Cfc74zwo5ZwRzg3uOgT+McBn32iA==} + i18next@25.8.14: + resolution: {integrity: sha512-paMUYkfWJMsWPeE/Hejcw+XLhHrQPehem+4wMo+uELnvIwvCG019L9sAIljwjCmEMtFQQO3YeitJY8Kctei3iA==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -8044,6 +8154,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8062,6 +8176,10 @@ packages: import-in-the-middle@2.0.6: resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} + import-in-the-middle@3.0.0: + resolution: {integrity: sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg==} + engines: {node: '>=18'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -8184,6 +8302,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -8297,9 +8419,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-dompurify@2.36.0: - resolution: {integrity: sha512-E8YkGyPY3a/U5s0WOoc8Ok+3SWL/33yn2IHCoxCFLBUUPVy9WGa++akJZFxQCcJIhI+UvYhbrbnTIFQkHKZbgA==} - engines: {node: '>=20.19.5'} + isomorphic-dompurify@3.0.0: + resolution: {integrity: sha512-5K+MYP7Nrg74+Bi+QmQGzQ/FgEOyVHWsN8MuJy5wYQxxBRxPnWsD25Tjjt5FWYhan3OQ+vNLubyNJH9dfG03lQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} @@ -8312,10 +8434,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -8381,9 +8499,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -8563,6 +8678,10 @@ packages: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -8573,8 +8692,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.3.1: - resolution: {integrity: sha512-bqvvquXzFBAlSbluugR4KXAe4XnO/QZcKVszpkBtqLWa2KEiVy8n6Xp38OeUbv/gOJOX4Vo9u5pFt/ADvbm42Q==} + lint-staged@16.3.2: + resolution: {integrity: sha512-xKqhC2AeXLwiAHXguxBjuChoTTWFC6Pees0SHPwOpwlvI3BH7ZADFPddAdN3pgo3aiKgPUx/bxE78JfUnxQnlg==} engines: {node: '>=20.17'} hasBin: true @@ -8602,6 +8721,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -8675,8 +8797,8 @@ packages: resolution: {integrity: sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} - lucide-react@0.576.0: - resolution: {integrity: sha512-koNxU14BXrxUfZQ9cUaP0ES1uyPZKYDjk31FQZB6dQ/x+tXk979sVAn9ppZ/pVeJJyOxVM8j1E+8QEuSc02Vug==} + lucide-react@0.577.0: + resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -8684,16 +8806,15 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -8705,10 +8826,6 @@ packages: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} - map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} - markdown-it@14.1.1: resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true @@ -8731,9 +8848,9 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - mem@8.1.1: - resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} - engines: {node: '>=10'} + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} @@ -8765,10 +8882,6 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -8905,8 +9018,8 @@ packages: socks: optional: true - motion-dom@12.34.3: - resolution: {integrity: sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==} + motion-dom@12.35.0: + resolution: {integrity: sha512-FFMLEnIejK/zDABn+vqGVAUN4T0+3fw+cVAY8MMT65yR+j5uMuvWdd4npACWhh94OVWQs79CrBBuwOwGRZAQiA==} motion-utils@12.29.2: resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} @@ -8926,6 +9039,10 @@ packages: resolution: {integrity: sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==} engines: {node: '>= 8.0'} + mysql2@3.15.3: + resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + engines: {node: '>= 8.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -8983,26 +9100,13 @@ packages: nodemailer: optional: true - next-safe-action@7.10.8: - resolution: {integrity: sha512-cTBoPWtvQ0t83N0a5zaveOh9vP2g3//d0hgzPJ4ch1EXCyt9+bavbVNgyOYbzWUwFerppHeFXPYsg7pbRulLQw==} + next-safe-action@8.1.5: + resolution: {integrity: sha512-u/fVpMR8EHYziR0QKQTzSX4FfEq7s7Aejcwr9/4SYU7n6Rv4htBGWwCdqLR2ZHsvx0/xLG7BKrD4saGQ1n9wWA==} engines: {node: '>=18.17'} peerDependencies: - '@sinclair/typebox': '>= 0.33.3' next: '>= 14.0.0' react: '>= 18.2.0' react-dom: '>= 18.2.0' - valibot: '>= 0.36.0' - yup: '>= 1.0.0' - zod: '>= 3.0.0' - peerDependenciesMeta: - '@sinclair/typebox': - optional: true - valibot: - optional: true - yup: - optional: true - zod: - optional: true next@16.1.6: resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} @@ -9071,8 +9175,8 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - nodemailer@7.0.13: - resolution: {integrity: sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==} + nodemailer@8.0.1: + resolution: {integrity: sha512-5kcldIXmaEjZcHR6F28IKGSgpmZHaF1IXLWFTG+Xh3S+Cce4MiakLtWY+PlBU69fLbRa8HlaGIrC/QolUpHkhg==} engines: {node: '>=6.0.0'} nopt@5.0.0: @@ -9153,6 +9257,9 @@ packages: obliterator@1.6.1: resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -9175,6 +9282,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + openid-client@5.7.1: resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} @@ -9189,20 +9300,16 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} - otlp-logger@1.1.13: - resolution: {integrity: sha512-r53tPnMLprtQSMOJUkj4Az4tR8NL+U+8C7M8BV1ZA9y7cDfAbWQp2mRL/eYS/O786oAi9KnN9hKsZ5cFKNchKw==} + otlp-logger@2.0.0: + resolution: {integrity: sha512-QINdS45wkraRxz3+bGoKEWJjlCUYCVxrFThP4iwoh6mU1BvCFXU+VLnGxteatBb9iol9+Dj0WQfL+isPilnMZQ==} - otplib@12.0.1: - resolution: {integrity: sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==} + otplib@13.3.0: + resolution: {integrity: sha512-VYMKyyDG8yt2q+z58sz54/EIyTh7+tyMrjeemR44iVh5+dkKtIs57irTqxjH+IkAL1uMmG1JIFhG5CxTpqdU5g==} own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -9237,6 +9344,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -9244,6 +9354,9 @@ packages: parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -9300,6 +9413,12 @@ packages: pg-cloudflare@1.2.7: resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} + pg-cloudflare@1.3.0: + resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} + + pg-connection-string@2.12.0: + resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} + pg-connection-string@2.9.1: resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} @@ -9312,9 +9431,17 @@ packages: peerDependencies: pg: '>=8.0' + pg-pool@3.13.0: + resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} + peerDependencies: + pg: '>=8.0' + pg-protocol@1.10.3: resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + pg-protocol@1.13.0: + resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} + pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} @@ -9328,6 +9455,15 @@ packages: pg-native: optional: true + pg@8.20.0: + resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} @@ -9349,8 +9485,8 @@ packages: pino-abstract-transport@3.0.0: resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} - pino-opentelemetry-transport@2.0.0: - resolution: {integrity: sha512-tWoq02WEtnCWfr63Co1n0sGlDpkBz2YUovSAsSBv/+jwKUIn/PjxwRileGViKrH/K3e+oc71nGl6yUdgQlrVkg==} + pino-opentelemetry-transport@3.0.0: + resolution: {integrity: sha512-t/fH23X+/pSSaUTdD7hq8FbT5BtTnUvXDojxKNVGX/auDPpDshG58t2yxFr2cmMgpQetIKBCcsH3KmcJXJJ5cQ==} peerDependencies: pino: ^10.0.0 @@ -9458,6 +9594,10 @@ packages: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + postgres-array@3.0.4: + resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} + engines: {node: '>=12'} + postgres-bytea@1.0.1: resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} engines: {node: '>=0.10.0'} @@ -9470,6 +9610,14 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + postgres@3.4.7: + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + preact-render-to-string@5.2.6: resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: @@ -9568,22 +9716,25 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - prisma-json-types-generator@3.6.2: - resolution: {integrity: sha512-WX/oENQ0S74r/Wgd2uuHT5i3KbnwLFCP2Fq5ISzrXkus/htOC4uCaQPYuGP2m/wSeKZZCw1RxptTlD+ib7Ht/A==} + prisma-json-types-generator@4.1.1: + resolution: {integrity: sha512-oz0MYu1r2Jqu3qOGCEGulz6RjPsECVjyS3ZAz3HEmz0jkKbVkZEwQyksNJm0X5utV1TZCmaG/98EPExN7S22xw==} engines: {node: '>=14.0'} hasBin: true peerDependencies: - '@prisma/client': ^6.14 - prisma: ^6.14 - typescript: ^5.9.2 + '@prisma/client': ^7.2.0 + prisma: ^7.2.0 + typescript: ^5.9.3 - prisma@6.19.2: - resolution: {integrity: sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==} - engines: {node: '>=18.18'} + prisma@7.4.2: + resolution: {integrity: sha512-2bP8Ruww3Q95Z2eH4Yqh4KAENRsj/SxbdknIVBfd6DmjPwmpsC4OVFMLOeHt6tM3Amh8ebjvstrUz3V/hOe1dA==} + engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true peerDependencies: - typescript: '>=5.1.0' + better-sqlite3: '>=9.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: + better-sqlite3: + optional: true typescript: optional: true @@ -9624,6 +9775,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} @@ -9674,9 +9828,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -9684,8 +9835,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-calendar@5.1.0: - resolution: {integrity: sha512-09o/rQHPZGEi658IXAJtWfra1N69D1eFnuJ3FQm9qUVzlzNnos1+GWgGiUeSs22QOpNm32aoVFOimq0p3Ug9Eg==} + react-calendar@6.0.0: + resolution: {integrity: sha512-6wqaki3Us0DNDjZDr0DYIzhSFprNoy4FdPT9Pjy5aD2hJJVjtJwmdMT9VmrTUo949nlk35BOxehThxX62RkuRQ==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -9717,10 +9868,6 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@7.1.1: - resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} - engines: {node: '>=16.14.0'} - react-docgen@8.0.2: resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==} engines: {node: ^20.9.0 || >=22} @@ -9753,10 +9900,10 @@ packages: react: '>=16' react-dom: '>=16' - react-i18next@15.7.4: - resolution: {integrity: sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==} + react-i18next@16.5.4: + resolution: {integrity: sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==} peerDependencies: - i18next: '>= 23.4.0' + i18next: '>= 25.6.2' react: '>= 16.8.0' react-dom: '*' react-native: '*' @@ -9775,10 +9922,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -9891,6 +10034,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -9903,6 +10049,9 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + remeda@2.33.4: + resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9960,6 +10109,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + rimraf@6.1.3: resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} engines: {node: 20 || >=22} @@ -9968,10 +10121,9 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup-plugin-visualizer@6.0.8: - resolution: {integrity: sha512-MmLbgYWDiDu8XKoePA1GtmRejl+4GWJTx156zjvycoxCbOq0PkNNwbepyB5tHCfDyRc8PKDLh2f/GLVGKNeV7w==} + rollup-plugin-visualizer@7.0.1: + resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} engines: {node: '>=22'} - deprecated: Rolled back. Use 6.0.5 or 7.0.0. hasBin: true peerDependencies: rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc @@ -10082,9 +10234,6 @@ packages: seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -10308,8 +10457,8 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - storybook@10.2.14: - resolution: {integrity: sha512-HGAgLbDAAbLOgjERsBXPpHUMxynHumYgoCRNBnAH57HfKuHL9LA3nKvKpbhFbYb/8PSG5X3hiKukki0R6Op7Aw==} + storybook@10.2.15: + resolution: {integrity: sha512-PbBlrMHdkeV2SV2er5v3jvMp1eOosR6v+Dc4h/sJHKHbnnGmwhf01AHwISQp9edEGipyS8lopJPpnEnWeua0mw==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -10398,12 +10547,14 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - - stripe@16.12.0: - resolution: {integrity: sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ==} - engines: {node: '>=12.*'} + stripe@20.4.0: + resolution: {integrity: sha512-F/aN1IQ9vHmlyLNi3DkiIbyzQb6gyBG0uYFd/VrEVQSc9BLtlgknPUx0EvzZdBMRLFuRaPFIFd7Mxwtg7Pbwzw==} + engines: {node: '>=16'} + peerDependencies: + '@types/node': '>=16' + peerDependenciesMeta: + '@types/node': + optional: true strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} @@ -10495,8 +10646,8 @@ packages: resolution: {integrity: sha512-g7jC56o3MzLkE3lHkaFe2ZdOVFBahq5bsB60/M4NYUbocw/MCrS89IOEQUFr+ba6pb8ZHczZ/VqCyYeYq0xBAg==} engines: {node: '>=18'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + terser-webpack-plugin@5.3.17: + resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -10516,10 +10667,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -10530,10 +10677,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thirty-two@1.0.2: - resolution: {integrity: sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==} - engines: {node: '>=0.2.6'} - thread-stream@4.0.0: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} @@ -10548,9 +10691,6 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -10559,14 +10699,14 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.4: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} @@ -10608,6 +10748,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + try@1.0.3: + resolution: {integrity: sha512-AHA8khVCII6zKyRkyPo6pRwoR9v5jb7QFw6e5avtaVSkxVfaEucYIo06xnwB+pJaEarfYNbs7W3Vq+LZLZiWyA==} + ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -10689,38 +10832,38 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.8.12: - resolution: {integrity: sha512-EiHJmW2MeQQx+21x8hjMHw/uPhXt9PIxvDrxzOtyVwrXzL0tQmsxtO4qHf2l7uA+K6PUJ4+TjY1MHZDuCvWXrw==} + turbo-darwin-64@2.8.13: + resolution: {integrity: sha512-PmOvodQNiOj77+Zwoqku70vwVjKzL34RTNxxoARjp5RU5FOj/CGiC6vcDQhNtFPUOWSAaogHF5qIka9TBhX4XA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.8.12: - resolution: {integrity: sha512-cbqqGN0vd7ly2TeuaM8k9AK9u1CABO4kBA5KPSqovTiLL3sORccn/mZzJSbvQf0EsYRfU34MgW5FotfwW3kx8Q==} + turbo-darwin-arm64@2.8.13: + resolution: {integrity: sha512-kI+anKcLIM4L8h+NsM7mtAUpElkCOxv5LgiQVQR8BASyDFfc8Efj5kCk3cqxuxOvIqx0sLfCX7atrHQ2kwuNJQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.8.12: - resolution: {integrity: sha512-jXKw9j4r4q6s0goSXuKI3aKbQK2qiNeP25lGGEnq018TM6SWRW1CCpPMxyG91aCKrub7wDm/K45sGNT4ZFBcFQ==} + turbo-linux-64@2.8.13: + resolution: {integrity: sha512-j29KnQhHyzdzgCykBFeBqUPS4Wj7lWMnZ8CHqytlYDap4Jy70l4RNG46pOL9+lGu6DepK2s1rE86zQfo0IOdPw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.8.12: - resolution: {integrity: sha512-BRJCMdyXjyBoL0GYpvj9d2WNfMHwc3tKmJG5ATn2Efvil9LsiOsd/93/NxDqW0jACtHFNVOPnd/CBwXRPiRbwA==} + turbo-linux-arm64@2.8.13: + resolution: {integrity: sha512-OEl1YocXGZDRDh28doOUn49QwNe82kXljO1HXApjU0LapkDiGpfl3jkAlPKxEkGDSYWc8MH5Ll8S16Rf5tEBYg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.8.12: - resolution: {integrity: sha512-vyFOlpFFzQFkikvSVhVkESEfzIopgs2J7J1rYvtSwSHQ4zmHxkC95Q8Kjkus8gg+8X2mZyP1GS5jirmaypGiPw==} + turbo-windows-64@2.8.13: + resolution: {integrity: sha512-717bVk1+Pn2Jody7OmWludhEirEe0okoj1NpRbSm5kVZz/yNN/jfjbxWC6ilimXMz7xoMT3IDfQFJsFR3PMANA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.8.12: - resolution: {integrity: sha512-9nRnlw5DF0LkJClkIws1evaIF36dmmMEO84J5Uj4oQ8C0QTHwlH7DNe5Kq2Jdmu8GXESCNDNuUYG8Cx6W/vm3g==} + turbo-windows-arm64@2.8.13: + resolution: {integrity: sha512-R819HShLIT0Wj6zWVnIsYvSNtRNj1q9VIyaUz0P24SMcLCbQZIm1sV09F4SDbg+KCCumqD2lcaR2UViQ8SnUJA==} cpu: [arm64] os: [win32] - turbo@2.8.12: - resolution: {integrity: sha512-auUAMLmi0eJhxDhQrxzvuhfEbICnVt0CTiYQYY8WyRJ5nwCDZxD0JG8bCSxT4nusI2CwJzmZAay5BfF6LmK7Hw==} + turbo@2.8.13: + resolution: {integrity: sha512-nyM99hwFB9/DHaFyKEqatdayGjsMNYsQ/XBNO6MITc7roncZetKb97MpHxWf3uiU+LB9c9HUlU3Jp2Ixei2k1A==} hasBin: true tween-functions@1.2.0: @@ -10855,6 +10998,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@7.22.0: resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} @@ -10869,10 +11015,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} - unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -10927,6 +11069,14 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + valibot@1.2.0: + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -10934,11 +11084,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-dts@4.5.4: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: @@ -10953,53 +11098,10 @@ packages: peerDependencies: vite: 5.x || 6.x || 7.x - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + vite-tsconfig-paths@6.1.1: + resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} peerDependencies: vite: '*' - peerDependenciesMeta: - vite: - optional: true - - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} @@ -11047,26 +11149,32 @@ packages: typescript: 3.x || 4.x || 5.x vitest: '>=3.0.0' - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -11115,8 +11223,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.105.3: - resolution: {integrity: sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==} + webpack@5.105.4: + resolution: {integrity: sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -11226,6 +11334,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + xlsx@file:apps/web/vendor/xlsx-0.20.3.tgz: resolution: {integrity: sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==, tarball: file:apps/web/vendor/xlsx-0.20.3.tgz} version: 0.20.3 @@ -11332,14 +11444,17 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-openapi@4.2.4: - resolution: {integrity: sha512-tsrQpbpqFCXqVXUzi3TPwFhuMtLN3oNZobOtYnK6/5VkXsNdnIgyNr4r8no4wmYluaxzN3F7iS+8xCW8BmMQ8g==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.21.4 + zeptomatch@2.1.0: + resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod-openapi@5.4.6: + resolution: {integrity: sha512-P2jsOOBAq/6hCwUsMCjUATZ8szkMsV5VAwZENfyxp2Hc/XPJQpVwAgevWZc65xZauCwWB9LAn7zYeiCJFAEL+A==} + engines: {node: '>=20'} + peerDependencies: + zod: ^3.25.74 || ^4.0.0 + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} snapshots: @@ -11349,11 +11464,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@ark/schema@0.56.0': dependencies: '@ark/util': 0.56.0 @@ -11519,60 +11629,60 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.1000.0': + '@aws-sdk/client-s3@3.1002.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.15 - '@aws-sdk/credential-provider-node': 3.972.14 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-node': 3.972.16 '@aws-sdk/middleware-bucket-endpoint': 3.972.6 '@aws-sdk/middleware-expect-continue': 3.972.6 - '@aws-sdk/middleware-flexible-checksums': 3.973.1 + '@aws-sdk/middleware-flexible-checksums': 3.973.3 '@aws-sdk/middleware-host-header': 3.972.6 '@aws-sdk/middleware-location-constraint': 3.972.6 '@aws-sdk/middleware-logger': 3.972.6 '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-s3': 3.972.15 + '@aws-sdk/middleware-sdk-s3': 3.972.17 '@aws-sdk/middleware-ssec': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.15 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/signature-v4-multi-region': 3.996.3 + '@aws-sdk/signature-v4-multi-region': 3.996.5 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.0 + '@aws-sdk/util-user-agent-node': 3.973.2 '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.6 + '@smithy/core': 3.23.8 '@smithy/eventstream-serde-browser': 4.2.10 '@smithy/eventstream-serde-config-resolver': 4.3.10 '@smithy/eventstream-serde-node': 4.2.10 - '@smithy/fetch-http-handler': 5.3.11 + '@smithy/fetch-http-handler': 5.3.13 '@smithy/hash-blob-browser': 4.2.11 '@smithy/hash-node': 4.2.10 '@smithy/hash-stream-node': 4.2.10 '@smithy/invalid-dependency': 4.2.10 '@smithy/md5-js': 4.2.10 '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-retry': 4.4.37 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 '@smithy/middleware-serde': 4.2.11 '@smithy/middleware-stack': 4.2.10 '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.12 + '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 '@smithy/url-parser': 4.2.10 '@smithy/util-base64': 4.3.1 '@smithy/util-body-length-browser': 4.2.1 '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.36 - '@smithy/util-defaults-mode-node': 4.2.39 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 '@smithy/util-endpoints': 3.3.1 '@smithy/util-middleware': 4.2.10 '@smithy/util-retry': 4.2.10 - '@smithy/util-stream': 4.5.15 + '@smithy/util-stream': 4.5.17 '@smithy/util-utf8': 4.2.1 '@smithy/util-waiter': 4.2.10 tslib: 2.8.1 @@ -11636,16 +11746,16 @@ snapshots: fast-xml-parser: 5.3.4 tslib: 2.8.1 - '@aws-sdk/core@3.973.15': + '@aws-sdk/core@3.973.17': dependencies: '@aws-sdk/types': 3.973.4 - '@aws-sdk/xml-builder': 3.972.8 - '@smithy/core': 3.23.6 + '@aws-sdk/xml-builder': 3.972.9 + '@smithy/core': 3.23.8 '@smithy/node-config-provider': 4.3.10 '@smithy/property-provider': 4.2.10 '@smithy/protocol-http': 5.3.10 '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 '@smithy/util-base64': 4.3.1 '@smithy/util-middleware': 4.2.10 @@ -11675,9 +11785,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.13': + '@aws-sdk/credential-provider-env@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@smithy/property-provider': 4.2.10 '@smithy/types': 4.13.0 @@ -11696,17 +11806,17 @@ snapshots: '@smithy/util-stream': 4.5.11 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.15': + '@aws-sdk/credential-provider-http@3.972.17': dependencies: - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/node-http-handler': 4.4.12 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 '@smithy/property-provider': 4.2.10 '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.15 + '@smithy/util-stream': 4.5.17 tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.817.0': @@ -11727,16 +11837,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-ini@3.972.13': + '@aws-sdk/credential-provider-ini@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/credential-provider-env': 3.972.13 - '@aws-sdk/credential-provider-http': 3.972.15 - '@aws-sdk/credential-provider-login': 3.972.13 - '@aws-sdk/credential-provider-process': 3.972.13 - '@aws-sdk/credential-provider-sso': 3.972.13 - '@aws-sdk/credential-provider-web-identity': 3.972.13 - '@aws-sdk/nested-clients': 3.996.3 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-login': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 '@smithy/credential-provider-imds': 4.2.10 '@smithy/property-provider': 4.2.10 @@ -11746,10 +11856,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.13': + '@aws-sdk/credential-provider-login@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 '@smithy/property-provider': 4.2.10 '@smithy/protocol-http': 5.3.10 @@ -11776,14 +11886,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.14': + '@aws-sdk/credential-provider-node@3.972.16': dependencies: - '@aws-sdk/credential-provider-env': 3.972.13 - '@aws-sdk/credential-provider-http': 3.972.15 - '@aws-sdk/credential-provider-ini': 3.972.13 - '@aws-sdk/credential-provider-process': 3.972.13 - '@aws-sdk/credential-provider-sso': 3.972.13 - '@aws-sdk/credential-provider-web-identity': 3.972.13 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-ini': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 '@aws-sdk/types': 3.973.4 '@smithy/credential-provider-imds': 4.2.10 '@smithy/property-provider': 4.2.10 @@ -11802,9 +11912,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.13': + '@aws-sdk/credential-provider-process@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@smithy/property-provider': 4.2.10 '@smithy/shared-ini-file-loader': 4.4.5 @@ -11824,11 +11934,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-sso@3.972.13': + '@aws-sdk/credential-provider-sso@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/token-providers': 3.999.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/token-providers': 3.1002.0 '@aws-sdk/types': 3.973.4 '@smithy/property-provider': 4.2.10 '@smithy/shared-ini-file-loader': 4.4.5 @@ -11848,10 +11958,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.13': + '@aws-sdk/credential-provider-web-identity@3.972.15': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 '@smithy/property-provider': 4.2.10 '@smithy/shared-ini-file-loader': 4.4.5 @@ -11915,12 +12025,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.973.1': + '@aws-sdk/middleware-flexible-checksums@3.973.3': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/crc64-nvme': 3.972.3 '@aws-sdk/types': 3.973.4 '@smithy/is-array-buffer': 4.2.1 @@ -11928,7 +12038,7 @@ snapshots: '@smithy/protocol-http': 5.3.10 '@smithy/types': 4.13.0 '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.15 + '@smithy/util-stream': 4.5.17 '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 @@ -11979,20 +12089,20 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.15': + '@aws-sdk/middleware-sdk-s3@3.972.17': dependencies: - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.23.6 + '@smithy/core': 3.23.8 '@smithy/node-config-provider': 4.3.10 '@smithy/protocol-http': 5.3.10 '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 '@smithy/util-config-provider': 4.2.1 '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.15 + '@smithy/util-stream': 4.5.17 '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 @@ -12012,12 +12122,12 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.15': + '@aws-sdk/middleware-user-agent@3.972.17': dependencies: - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 - '@smithy/core': 3.23.6 + '@smithy/core': 3.23.8 '@smithy/protocol-http': 5.3.10 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -12065,41 +12175,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.996.3': + '@aws-sdk/nested-clients@3.996.5': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.15 + '@aws-sdk/core': 3.973.17 '@aws-sdk/middleware-host-header': 3.972.6 '@aws-sdk/middleware-logger': 3.972.6 '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.15 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/region-config-resolver': 3.972.6 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.0 + '@aws-sdk/util-user-agent-node': 3.973.2 '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.6 - '@smithy/fetch-http-handler': 5.3.11 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 '@smithy/hash-node': 4.2.10 '@smithy/invalid-dependency': 4.2.10 '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-retry': 4.4.37 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 '@smithy/middleware-serde': 4.2.11 '@smithy/middleware-stack': 4.2.10 '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.12 + '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 '@smithy/url-parser': 4.2.10 '@smithy/util-base64': 4.3.1 '@smithy/util-body-length-browser': 4.2.1 '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.36 - '@smithy/util-defaults-mode-node': 4.2.39 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 '@smithy/util-endpoints': 3.3.1 '@smithy/util-middleware': 4.2.10 '@smithy/util-retry': 4.2.10 @@ -12125,12 +12235,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/s3-presigned-post@3.1000.0': + '@aws-sdk/s3-presigned-post@3.1002.0': dependencies: - '@aws-sdk/client-s3': 3.1000.0 + '@aws-sdk/client-s3': 3.1002.0 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-format-url': 3.972.6 - '@smithy/middleware-endpoint': 4.4.20 + '@smithy/middleware-endpoint': 4.4.22 '@smithy/signature-v4': 5.3.10 '@smithy/types': 4.13.0 '@smithy/util-hex-encoding': 4.2.1 @@ -12139,26 +12249,38 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/s3-request-presigner@3.1000.0': + '@aws-sdk/s3-request-presigner@3.1002.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.996.3 + '@aws-sdk/signature-v4-multi-region': 3.996.5 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-format-url': 3.972.6 - '@smithy/middleware-endpoint': 4.4.20 + '@smithy/middleware-endpoint': 4.4.22 '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.3': + '@aws-sdk/signature-v4-multi-region@3.996.5': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.15 + '@aws-sdk/middleware-sdk-s3': 3.972.17 '@aws-sdk/types': 3.973.4 '@smithy/protocol-http': 5.3.10 '@smithy/signature-v4': 5.3.10 '@smithy/types': 4.13.0 tslib: 2.8.1 + '@aws-sdk/token-providers@3.1002.0': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/token-providers@3.817.0': dependencies: '@aws-sdk/core': 3.816.0 @@ -12171,18 +12293,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.999.0': - dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.804.0': dependencies: '@smithy/types': 4.12.0 @@ -12250,15 +12360,15 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.0': + '@aws-sdk/util-user-agent-node@3.973.2': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.15 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/types': 3.973.4 '@smithy/node-config-provider': 4.3.10 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.8': + '@aws-sdk/xml-builder@3.972.9': dependencies: '@smithy/types': 4.13.0 fast-xml-parser: 5.3.4 @@ -12632,21 +12742,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -12725,7 +12825,7 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.29.0 - '@boxyhq/saml-jackson@1.52.2(socks@2.8.7)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3))': + '@boxyhq/saml-jackson@1.52.2(socks@2.8.7)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3))': dependencies: '@aws-sdk/client-dynamodb': 3.817.0 '@aws-sdk/credential-providers': 3.817.0 @@ -12751,7 +12851,7 @@ snapshots: reflect-metadata: 0.2.2 ripemd160: 2.0.2 sqlite3: 5.1.7 - typeorm: 0.3.28(mongodb@6.16.0(@aws-sdk/credential-providers@3.817.0)(socks@2.8.7))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.16.0)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + typeorm: 0.3.28(mongodb@6.16.0(@aws-sdk/credential-providers@3.817.0)(socks@2.8.7))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.16.0)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) transitivePeerDependencies: - '@google-cloud/spanner' - '@mongodb-js/zstd' @@ -12795,13 +12895,28 @@ snapshots: dependencies: '@calcom/embed-core': 1.5.3 - '@chromatic-com/storybook@5.0.1(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@chevrotain/cst-dts-gen@10.5.0': + dependencies: + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + lodash: 4.17.21 + + '@chevrotain/gast@10.5.0': + dependencies: + '@chevrotain/types': 10.5.0 + lodash: 4.17.21 + + '@chevrotain/types@10.5.0': {} + + '@chevrotain/utils@10.5.0': {} + + '@chromatic-com/storybook@5.0.1(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 13.3.4 filesize: 10.1.6 jsonfile: 6.2.0 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) strip-ansi: 7.1.2 transitivePeerDependencies: - '@chromatic-com/cypress' @@ -12868,6 +12983,16 @@ snapshots: react: 19.2.4 tslib: 2.8.1 + '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': + dependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite-tools@0.2.20(@electric-sql/pglite@0.3.15)': + dependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite@0.3.15': {} + '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -13143,9 +13268,9 @@ snapshots: '@eslint/js@8.57.1': {} - '@exodus/bytes@1.14.1(@noble/hashes@1.8.0)': + '@exodus/bytes@1.14.1(@noble/hashes@2.0.1)': optionalDependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 2.0.1 '@fastify/otel@0.16.0(@opentelemetry/api@1.9.0)': dependencies: @@ -13244,6 +13369,10 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 + '@hono/node-server@1.19.9(hono@4.11.4)': + dependencies: + hono: 4.11.4 + '@hookform/resolvers@5.2.2(react-hook-form@7.71.2(react@19.2.4))': dependencies: '@standard-schema/utils': 0.3.0 @@ -13376,22 +13505,11 @@ snapshots: dependencies: minipass: 7.1.3 - '@istanbuljs/schema@0.1.3': {} - - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - glob: 10.5.0 - magic-string: 0.27.0 - react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - optionalDependencies: - typescript: 5.9.3 - - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 @@ -13638,23 +13756,23 @@ snapshots: '@types/react': 19.2.14 react: 19.2.4 - '@microsoft/api-extractor-model@7.33.4(@types/node@22.19.13)': + '@microsoft/api-extractor-model@7.33.4(@types/node@25.3.3)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.3) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.57.6(@types/node@22.19.13)': + '@microsoft/api-extractor@7.57.6(@types/node@25.3.3)': dependencies: - '@microsoft/api-extractor-model': 7.33.4(@types/node@22.19.13) + '@microsoft/api-extractor-model': 7.33.4(@types/node@25.3.3) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.3) '@rushstack/rig-package': 0.7.2 - '@rushstack/terminal': 0.22.3(@types/node@22.19.13) - '@rushstack/ts-command-line': 5.3.3(@types/node@22.19.13) + '@rushstack/terminal': 0.22.3(@types/node@25.3.3) + '@rushstack/ts-command-line': 5.3.3(@types/node@25.3.3) diff: 8.0.3 lodash: 4.17.23 minimatch: 10.2.1 @@ -13687,6 +13805,11 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 + '@mrleebo/prisma-ast@0.13.1': + dependencies: + chevrotain: 10.5.0 + lilconfig: 2.1.0 + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.7.1 @@ -13730,7 +13853,7 @@ snapshots: dependencies: eslint-scope: 5.1.1 - '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -13758,10 +13881,6 @@ snapshots: rimraf: 3.0.2 optional: true - '@opentelemetry/api-logs@0.206.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs@0.207.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -13778,78 +13897,78 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.213.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.57.1': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.9.0': {} - '@opentelemetry/auto-instrumentations-node@0.70.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))': + '@opentelemetry/auto-instrumentations-node@0.71.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-lambda': 0.64.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-aws-sdk': 0.67.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-bunyan': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cassandra-driver': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-cucumber': 0.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.29.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dns': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fastify': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.31.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-grpc': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-memcached': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.65.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-net': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-openai': 0.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-oracledb': 0.37.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.64.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pino': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.60.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-restify': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-router': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-runtime-node': 0.25.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-socket.io': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.31.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-winston': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-alibaba-cloud': 0.33.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-aws': 2.12.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-azure': 0.20.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-container': 0.8.3(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-gcp': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.60.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.65.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.68.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.58.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.58.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.32.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.66.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-openai': 0.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-oracledb': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.65.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.58.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-runtime-node': 0.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.60.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.32.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.23.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.33.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 2.13.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.21.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.8.4(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/configuration@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/configuration@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) yaml: 2.8.2 - '@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -13859,11 +13978,6 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -13879,16 +13993,6 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/exporter-logs-otlp-grpc@0.206.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.12.6 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc@0.212.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.3 @@ -13899,14 +14003,15 @@ snapshots: '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http@0.206.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-grpc@0.213.0(@opentelemetry/api@1.9.0)': dependencies: + '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.206.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-logs-otlp-http@0.212.0(@opentelemetry/api@1.9.0)': dependencies: @@ -13917,16 +14022,14 @@ snapshots: '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto@0.206.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-http@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.206.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-logs-otlp-proto@0.212.0(@opentelemetry/api@1.9.0)': dependencies: @@ -13939,17 +14042,28 @@ snapshots: '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-proto@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-metrics-otlp-grpc@0.57.1(@opentelemetry/api@1.9.0)': dependencies: @@ -13963,14 +14077,14 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-http@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-metrics-otlp-http@0.57.1(@opentelemetry/api@1.9.0)': dependencies: @@ -13981,59 +14095,59 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-proto@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-prometheus@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-grpc@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-proto@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-zipkin@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/instrumentation-amqplib@0.58.0(@opentelemetry/api@1.9.0)': @@ -14045,46 +14159,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-amqplib@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-amqplib@0.60.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-lambda@0.64.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-aws-lambda@0.65.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/aws-lambda': 8.10.160 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-sdk@0.67.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-aws-sdk@0.68.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-bunyan@0.57.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-bunyan@0.58.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@types/bunyan': 1.8.11 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cassandra-driver@0.57.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-cassandra-driver@0.58.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14099,20 +14213,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-connect@0.55.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-connect@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cucumber@0.28.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-cucumber@0.29.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14124,17 +14238,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dataloader@0.29.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-dataloader@0.30.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dns@0.55.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-dns@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14147,20 +14261,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-express@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fastify@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-fastify@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14173,11 +14287,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fs@0.31.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-fs@0.32.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14188,10 +14302,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-generic-pool@0.55.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-generic-pool@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14202,17 +14316,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-graphql@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-grpc@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-grpc@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14226,11 +14340,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-hapi@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14245,11 +14359,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-http@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 forwarded-parse: 2.1.2 transitivePeerDependencies: @@ -14264,10 +14378,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-ioredis@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -14281,10 +14395,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-kafkajs@0.21.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-kafkajs@0.22.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14297,10 +14411,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-knex@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-knex@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14314,11 +14428,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-koa@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-koa@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14330,17 +14444,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-lru-memoizer@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-lru-memoizer@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-memcached@0.55.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-memcached@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/memcached': 2.2.10 transitivePeerDependencies: @@ -14354,10 +14468,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongodb@0.65.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mongodb@0.66.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14371,11 +14485,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongoose@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mongoose@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14389,10 +14503,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql2@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mysql2@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: @@ -14407,44 +14521,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-mysql@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/mysql': 2.15.27 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-nestjs-core@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-net@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-net@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-openai@0.10.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-openai@0.11.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-oracledb@0.37.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-oracledb@0.38.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/oracledb': 6.5.2 transitivePeerDependencies: @@ -14462,11 +14576,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.64.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pg@0.65.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.6 @@ -14474,12 +14588,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pino@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pino@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14492,43 +14606,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-redis@0.60.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-redis@0.61.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-restify@0.57.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-restify@0.58.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-router@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-router@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-runtime-node@0.25.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-runtime-node@0.26.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-socket.io@0.59.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-socket.io@0.60.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14541,10 +14655,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-tedious@0.31.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-tedious@0.32.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/tedious': 4.0.14 transitivePeerDependencies: @@ -14559,20 +14673,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-undici@0.22.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-undici@0.23.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-winston@0.56.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-winston@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -14603,41 +14717,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - import-in-the-middle: 2.0.6 + '@opentelemetry/api-logs': 0.213.0 + import-in-the-middle: 3.0.0 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.206.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base@0.212.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base@0.57.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.206.0(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.12.6 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.212.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.3 @@ -14646,25 +14752,22 @@ snapshots: '@opentelemetry/otlp-exporter-base': 0.212.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base@0.57.1(@opentelemetry/api@1.9.0)': dependencies: - '@grpc/grpc-js': 1.12.6 + '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-exporter-base': 0.57.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.206.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.206.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 - '@opentelemetry/otlp-transformer@0.212.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -14676,6 +14779,17 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) protobufjs: 8.0.0 + '@opentelemetry/otlp-transformer@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + '@opentelemetry/otlp-transformer@0.57.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -14687,49 +14801,49 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) protobufjs: 7.5.4 - '@opentelemetry/propagator-b3@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-jaeger@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common@0.38.2': {} - '@opentelemetry/resource-detector-alibaba-cloud@0.33.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-alibaba-cloud@0.33.3(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-aws@2.12.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-aws@2.13.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resource-detector-azure@0.20.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-azure@0.21.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resource-detector-container@0.8.3(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-container@0.8.4(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-gcp@0.47.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-gcp@0.48.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) gcp-metadata: 8.1.2 transitivePeerDependencies: - supports-color @@ -14740,24 +14854,17 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.206.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sdk-logs@0.212.0(@opentelemetry/api@1.9.0)': dependencies: @@ -14766,6 +14873,14 @@ snapshots: '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/sdk-logs@0.57.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -14779,44 +14894,44 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node@0.212.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.212.0 - '@opentelemetry/configuration': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.213.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.213.0 + '@opentelemetry/configuration': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -14828,13 +14943,6 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -14842,12 +14950,19 @@ snapshots: '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-node@2.5.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/sdk-trace-node@2.6.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions@1.28.0': {} @@ -14858,36 +14973,42 @@ snapshots: '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@otplib/core@12.0.1': {} + '@otplib/core@13.3.0': {} - '@otplib/plugin-crypto@12.0.1': + '@otplib/hotp@13.3.0': dependencies: - '@otplib/core': 12.0.1 + '@otplib/core': 13.3.0 + '@otplib/uri': 13.3.0 - '@otplib/plugin-thirty-two@12.0.1': + '@otplib/plugin-base32-scure@13.3.0': dependencies: - '@otplib/core': 12.0.1 - thirty-two: 1.0.2 + '@otplib/core': 13.3.0 + '@scure/base': 2.0.0 - '@otplib/preset-default@12.0.1': + '@otplib/plugin-crypto-noble@13.3.0': dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 + '@noble/hashes': 2.0.1 + '@otplib/core': 13.3.0 - '@otplib/preset-v11@12.0.1': + '@otplib/totp@13.3.0': dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 + '@otplib/core': 13.3.0 + '@otplib/hotp': 13.3.0 + '@otplib/uri': 13.3.0 + + '@otplib/uri@13.3.0': + dependencies: + '@otplib/core': 13.3.0 '@panva/hkdf@1.2.1': {} - '@paralleldrive/cuid2@2.3.1': + '@paralleldrive/cuid2@3.3.0': dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 2.0.1 + bignumber.js: 9.3.1 + error-causes: 3.0.2 '@pinojs/redact@0.4.0': {} @@ -14900,18 +15021,18 @@ snapshots: dependencies: playwright: 1.58.2 - '@preact/preset-vite@2.10.3(@babel/core@7.29.0)(preact@10.28.2)(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@preact/preset-vite@2.10.3(@babel/core@7.29.0)(preact@10.28.2)(rollup@4.59.0)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.11(preact@10.28.2)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@prefresh/vite': 2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 picocolors: 1.1.1 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-prerender-plugin: 0.5.12(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite-prerender-plugin: 0.5.12(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - preact - rollup @@ -14927,7 +15048,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.11(preact@10.28.2)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@prefresh/vite@2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@prefresh/babel-plugin': 0.5.2 @@ -14935,16 +15056,28 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.28.2 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/adapter-pg@7.4.2': + dependencies: + '@prisma/driver-adapter-utils': 7.4.2 + pg: 8.20.0 + postgres-array: 3.0.4 + transitivePeerDependencies: + - pg-native + + '@prisma/client-runtime-utils@7.4.2': {} + + '@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@prisma/client-runtime-utils': 7.4.2 optionalDependencies: - prisma: 6.19.2(magicast@0.3.5)(typescript@5.9.3) + prisma: 7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@6.19.2(magicast@0.3.5)': + '@prisma/config@7.4.2(magicast@0.3.5)': dependencies: c12: 3.1.0(magicast@0.3.5) deepmerge-ts: 7.1.5 @@ -14953,45 +15086,68 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.19.1': {} + '@prisma/debug@7.2.0': {} - '@prisma/debug@6.19.2': {} + '@prisma/debug@7.4.2': {} - '@prisma/dmmf@6.19.1': {} - - '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {} - - '@prisma/engines@6.19.2': + '@prisma/dev@0.20.0(typescript@5.9.3)': dependencies: - '@prisma/debug': 6.19.2 - '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 - '@prisma/fetch-engine': 6.19.2 - '@prisma/get-platform': 6.19.2 - - '@prisma/fetch-engine@6.19.2': - dependencies: - '@prisma/debug': 6.19.2 - '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 - '@prisma/get-platform': 6.19.2 - - '@prisma/generator-helper@6.19.1': - dependencies: - '@prisma/debug': 6.19.1 - '@prisma/dmmf': 6.19.1 - '@prisma/generator': 6.19.1 - - '@prisma/generator@6.19.1': {} - - '@prisma/get-platform@6.19.2': - dependencies: - '@prisma/debug': 6.19.2 - - '@prisma/instrumentation@6.19.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) + '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15) + '@electric-sql/pglite-tools': 0.2.20(@electric-sql/pglite@0.3.15) + '@hono/node-server': 1.19.9(hono@4.11.4) + '@mrleebo/prisma-ast': 0.13.1 + '@prisma/get-platform': 7.2.0 + '@prisma/query-plan-executor': 7.2.0 + foreground-child: 3.3.1 + get-port-please: 3.2.0 + hono: 4.11.4 + http-status-codes: 2.3.0 + pathe: 2.0.3 + proper-lockfile: 4.1.2 + remeda: 2.33.4 + std-env: 3.10.0 + valibot: 1.2.0(typescript@5.9.3) + zeptomatch: 2.1.0 transitivePeerDependencies: - - supports-color + - typescript + + '@prisma/dmmf@7.4.2': {} + + '@prisma/driver-adapter-utils@7.4.2': + dependencies: + '@prisma/debug': 7.4.2 + + '@prisma/engines-version@7.5.0-10.94a226be1cf2967af2541cca5529f0f7ba866919': {} + + '@prisma/engines@7.4.2': + dependencies: + '@prisma/debug': 7.4.2 + '@prisma/engines-version': 7.5.0-10.94a226be1cf2967af2541cca5529f0f7ba866919 + '@prisma/fetch-engine': 7.4.2 + '@prisma/get-platform': 7.4.2 + + '@prisma/fetch-engine@7.4.2': + dependencies: + '@prisma/debug': 7.4.2 + '@prisma/engines-version': 7.5.0-10.94a226be1cf2967af2541cca5529f0f7ba866919 + '@prisma/get-platform': 7.4.2 + + '@prisma/generator-helper@7.4.2': + dependencies: + '@prisma/debug': 7.4.2 + '@prisma/dmmf': 7.4.2 + '@prisma/generator': 7.4.2 + + '@prisma/generator@7.4.2': {} + + '@prisma/get-platform@7.2.0': + dependencies: + '@prisma/debug': 7.2.0 + + '@prisma/get-platform@7.4.2': + dependencies: + '@prisma/debug': 7.4.2 '@prisma/instrumentation@7.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -15000,6 +15156,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@prisma/instrumentation@7.4.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@prisma/query-plan-executor@7.2.0': {} + + '@prisma/studio-core@0.13.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@types/react': 19.2.14 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -15708,8 +15879,6 @@ snapshots: dependencies: '@redis/client': 5.11.0 - '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/plugin-commonjs@28.0.1(rollup@4.59.0)': @@ -15882,7 +16051,7 @@ snapshots: '@rushstack/eslint-patch@1.15.0': {} - '@rushstack/node-core-library@5.20.3(@types/node@22.19.13)': + '@rushstack/node-core-library@5.20.3(@types/node@25.3.3)': dependencies: ajv: 8.18.0 ajv-draft-04: 1.0.0(ajv@8.18.0) @@ -15893,34 +16062,36 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 - '@rushstack/problem-matcher@0.2.1(@types/node@22.19.13)': + '@rushstack/problem-matcher@0.2.1(@types/node@25.3.3)': optionalDependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@rushstack/rig-package@0.7.2': dependencies: resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.22.3(@types/node@22.19.13)': + '@rushstack/terminal@0.22.3(@types/node@25.3.3)': dependencies: - '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) - '@rushstack/problem-matcher': 0.2.1(@types/node@22.19.13) + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.3) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.3.3) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 - '@rushstack/ts-command-line@5.3.3(@types/node@22.19.13)': + '@rushstack/ts-command-line@5.3.3(@types/node@25.3.3)': dependencies: - '@rushstack/terminal': 0.22.3(@types/node@22.19.13) + '@rushstack/terminal': 0.22.3(@types/node@25.3.3) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' + '@scure/base@2.0.0': {} + '@selderee/plugin-htmlparser2@0.11.0': dependencies: domhandler: 5.0.3 @@ -16013,7 +16184,7 @@ snapshots: '@sentry/core@10.42.0': {} - '@sentry/nextjs@10.42.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.3)': + '@sentry/nextjs@10.42.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.4)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 @@ -16022,10 +16193,10 @@ snapshots: '@sentry/bundler-plugin-core': 5.1.1(encoding@0.1.13) '@sentry/core': 10.42.0 '@sentry/node': 10.42.0 - '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) '@sentry/react': 10.42.0(react@19.2.4) '@sentry/vercel-edge': 10.42.0 - '@sentry/webpack-plugin': 5.1.1(encoding@0.1.13)(webpack@5.105.3) + '@sentry/webpack-plugin': 5.1.1(encoding@0.1.13)(webpack@5.105.4) next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) rollup: 4.59.0 stacktrace-parser: 0.1.11 @@ -16038,18 +16209,18 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@sentry/core': 10.42.0 - '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 2.0.6 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/node@10.42.0': @@ -16081,23 +16252,23 @@ snapshots: '@opentelemetry/instrumentation-redis': 0.59.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-tedious': 0.30.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-undici': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@prisma/instrumentation': 7.2.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.42.0 - '@sentry/node-core': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/node-core': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 2.0.6 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.42.0 @@ -16110,14 +16281,14 @@ snapshots: '@sentry/vercel-edge@10.42.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.42.0 - '@sentry/webpack-plugin@5.1.1(encoding@0.1.13)(webpack@5.105.3)': + '@sentry/webpack-plugin@5.1.1(encoding@0.1.13)(webpack@5.105.4)': dependencies: '@sentry/bundler-plugin-core': 5.1.1(encoding@0.1.13) uuid: 11.1.0 - webpack: 5.105.3 + webpack: 5.105.4 transitivePeerDependencies: - encoding - supports-color @@ -16127,6 +16298,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/abort-controller@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/abort-controller@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16141,6 +16317,15 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/config-resolver@4.4.10': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + tslib: 2.8.1 + '@smithy/config-resolver@4.4.6': dependencies: '@smithy/node-config-provider': 4.3.8 @@ -16172,17 +16357,17 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.23.6': + '@smithy/core@3.23.8': dependencies: - '@smithy/middleware-serde': 4.2.11 - '@smithy/protocol-http': 5.3.10 + '@smithy/middleware-serde': 4.2.12 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.15 - '@smithy/util-utf8': 4.2.1 - '@smithy/uuid': 1.1.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 '@smithy/credential-provider-imds@4.2.10': @@ -16193,6 +16378,14 @@ snapshots: '@smithy/url-parser': 4.2.10 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.11': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.7': dependencies: '@smithy/node-config-provider': 4.3.8 @@ -16239,12 +16432,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.11': + '@smithy/fetch-http-handler@5.3.13': dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 '@smithy/fetch-http-handler@5.3.9': @@ -16304,6 +16497,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/is-array-buffer@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/md5-js@4.2.10': dependencies: '@smithy/types': 4.13.0 @@ -16333,15 +16530,15 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.20': + '@smithy/middleware-endpoint@4.4.22': dependencies: - '@smithy/core': 3.23.6 - '@smithy/middleware-serde': 4.2.11 - '@smithy/node-config-provider': 4.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/core': 3.23.8 + '@smithy/middleware-serde': 4.2.12 + '@smithy/node-config-provider': 4.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-middleware': 4.2.10 + '@smithy/url-parser': 4.2.11 + '@smithy/util-middleware': 4.2.11 tslib: 2.8.1 '@smithy/middleware-retry@4.4.30': @@ -16356,16 +16553,16 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.37': + '@smithy/middleware-retry@4.4.39': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/service-error-classification': 4.2.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/service-error-classification': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/uuid': 1.1.1 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 '@smithy/middleware-serde@4.2.11': @@ -16374,6 +16571,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/middleware-serde@4.2.12': + dependencies: + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/middleware-serde@4.2.9': dependencies: '@smithy/protocol-http': 5.3.8 @@ -16385,6 +16588,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/middleware-stack@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/middleware-stack@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16397,6 +16605,13 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/node-config-provider@4.3.11': + dependencies: + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/node-config-provider@4.3.8': dependencies: '@smithy/property-provider': 4.2.8 @@ -16404,11 +16619,11 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.12': + '@smithy/node-http-handler@4.4.14': dependencies: - '@smithy/abort-controller': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 + '@smithy/abort-controller': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -16425,6 +16640,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/property-provider@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/property-provider@4.2.7': dependencies: '@smithy/types': 4.12.0 @@ -16440,6 +16660,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/protocol-http@5.3.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/protocol-http@5.3.8': dependencies: '@smithy/types': 4.12.0 @@ -16451,6 +16676,12 @@ snapshots: '@smithy/util-uri-escape': 4.2.1 tslib: 2.8.1 + '@smithy/querystring-builder@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + '@smithy/util-uri-escape': 4.2.2 + tslib: 2.8.1 + '@smithy/querystring-builder@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16462,6 +16693,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/querystring-parser@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/querystring-parser@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16471,6 +16707,10 @@ snapshots: dependencies: '@smithy/types': 4.13.0 + '@smithy/service-error-classification@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + '@smithy/service-error-classification@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16485,6 +16725,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.4.6': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/signature-v4@5.3.10': dependencies: '@smithy/is-array-buffer': 4.2.1 @@ -16517,14 +16762,14 @@ snapshots: '@smithy/util-stream': 4.5.11 tslib: 2.8.1 - '@smithy/smithy-client@4.12.0': + '@smithy/smithy-client@4.12.2': dependencies: - '@smithy/core': 3.23.6 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-stack': 4.2.10 - '@smithy/protocol-http': 5.3.10 + '@smithy/core': 3.23.8 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-stack': 4.2.11 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.15 + '@smithy/util-stream': 4.5.17 tslib: 2.8.1 '@smithy/types@4.12.0': @@ -16541,6 +16786,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/url-parser@4.2.11': + dependencies: + '@smithy/querystring-parser': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/url-parser@4.2.8': dependencies: '@smithy/querystring-parser': 4.2.8 @@ -16559,6 +16810,12 @@ snapshots: '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 + '@smithy/util-base64@4.3.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 @@ -16567,6 +16824,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-body-length-browser@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-body-length-node@4.2.1': dependencies: tslib: 2.8.1 @@ -16590,6 +16851,11 @@ snapshots: '@smithy/is-array-buffer': 4.2.1 tslib: 2.8.1 + '@smithy/util-buffer-from@4.2.2': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + tslib: 2.8.1 + '@smithy/util-config-provider@4.2.0': dependencies: tslib: 2.8.1 @@ -16598,6 +16864,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-config-provider@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.3.29': dependencies: '@smithy/property-provider': 4.2.8 @@ -16605,10 +16875,10 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.36': + '@smithy/util-defaults-mode-browser@4.3.38': dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -16622,13 +16892,13 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.39': + '@smithy/util-defaults-mode-node@4.2.41': dependencies: - '@smithy/config-resolver': 4.4.9 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.0 + '@smithy/config-resolver': 4.4.10 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -16644,6 +16914,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/util-endpoints@3.3.2': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 @@ -16652,11 +16928,20 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-hex-encoding@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-middleware@4.2.10': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/util-middleware@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-middleware@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -16668,6 +16953,12 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 + '@smithy/util-retry@4.2.11': + dependencies: + '@smithy/service-error-classification': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-retry@4.2.8': dependencies: '@smithy/service-error-classification': 4.2.8 @@ -16685,15 +16976,15 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.15': + '@smithy/util-stream@4.5.17': dependencies: - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/node-http-handler': 4.4.12 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 '@smithy/util-uri-escape@4.2.0': @@ -16704,6 +16995,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-uri-escape@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 @@ -16719,6 +17014,11 @@ snapshots: '@smithy/util-buffer-from': 4.2.1 tslib: 2.8.1 + '@smithy/util-utf8@4.2.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + tslib: 2.8.1 + '@smithy/util-waiter@4.2.10': dependencies: '@smithy/abort-controller': 4.2.10 @@ -16735,7 +17035,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/uuid@1.1.1': + '@smithy/uuid@1.1.2': dependencies: tslib: 2.8.1 @@ -16747,21 +17047,21 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@storybook/addon-a11y@10.2.14(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-a11y@10.2.15(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.0 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/addon-docs@10.2.14(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3))': + '@storybook/addon-docs@10.2.15(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) - '@storybook/csf-plugin': 10.2.14(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3)) + '@storybook/csf-plugin': 10.2.15(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-dom-shim': 10.2.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -16770,54 +17070,37 @@ snapshots: - vite - webpack - '@storybook/addon-links@10.2.14(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-links@10.2.15(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@storybook/global': 5.0.0 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: react: 19.2.4 - '@storybook/addon-onboarding@10.2.14(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-onboarding@10.2.15(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/builder-vite@10.2.14(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3))': + '@storybook/builder-vite@10.2.15(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3))': dependencies: - '@storybook/csf-plugin': 10.2.14(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3)) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/csf-plugin': 10.2.15(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/builder-vite@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/csf-plugin@10.2.15(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3))': dependencies: - '@storybook/csf-plugin': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - browser-assert: 1.2.1 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - ts-dedent: 2.2.0 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - - '@storybook/components@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - - '@storybook/csf-plugin@10.2.14(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.3 rollup: 4.59.0 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - webpack: 5.105.3(esbuild@0.27.3) - - '@storybook/csf-plugin@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - unplugin: 1.16.1 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + webpack: 5.105.4(esbuild@0.27.3) '@storybook/global@5.0.0': {} @@ -16826,41 +17109,27 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/manager-api@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - - '@storybook/preview-api@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - - '@storybook/react-dom-shim@10.2.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/react-dom-shim@10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-dom-shim@8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/react-vite@10.2.15(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3))': dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - - '@storybook/react-vite@10.2.14(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - '@storybook/builder-vite': 10.2.14(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.3(esbuild@0.27.3)) - '@storybook/react': 10.2.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + '@storybook/builder-vite': 10.2.15(esbuild@0.27.3)(rollup@4.59.0)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.3)) + '@storybook/react': 10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 react: 19.2.4 react-docgen: 8.0.2 react-dom: 19.2.4(react@19.2.4) resolve: 1.22.11 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tsconfig-paths: 4.2.0 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - esbuild - rollup @@ -16868,83 +17137,47 @@ snapshots: - typescript - webpack - '@storybook/react-vite@8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - '@storybook/builder-vite': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@storybook/react': 8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - find-up: 5.0.0 - magic-string: 0.30.21 - react: 19.2.4 - react-docgen: 7.1.1 - react-dom: 19.2.4(react@19.2.4) - resolve: 1.22.11 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tsconfig-paths: 4.2.0 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - rollup - - supports-color - - typescript - - '@storybook/react@10.2.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': + '@storybook/react@10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.2.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 react-docgen: 8.0.2 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@storybook/react@8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': - dependencies: - '@storybook/components': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - '@storybook/preview-api': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - '@storybook/react-dom-shim': 8.6.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - '@storybook/theming': 8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - optionalDependencies: - typescript: 5.9.3 - - '@storybook/theming@8.6.17(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': - dependencies: - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@streamparser/json@0.0.20': {} '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.13.10(arktype@2.1.29)(typescript@5.9.3)(zod@3.25.76)': + '@t3-oss/env-core@0.13.10(arktype@2.1.29)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(zod@4.3.6)': optionalDependencies: arktype: 2.1.29 typescript: 5.9.3 - zod: 3.25.76 + valibot: 1.2.0(typescript@5.9.3) + zod: 4.3.6 - '@t3-oss/env-nextjs@0.13.10(arktype@2.1.29)(typescript@5.9.3)(zod@3.25.76)': + '@t3-oss/env-nextjs@0.13.10(arktype@2.1.29)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(zod@4.3.6)': dependencies: - '@t3-oss/env-core': 0.13.10(arktype@2.1.29)(typescript@5.9.3)(zod@3.25.76) + '@t3-oss/env-core': 0.13.10(arktype@2.1.29)(typescript@5.9.3)(valibot@1.2.0(typescript@5.9.3))(zod@4.3.6) optionalDependencies: arktype: 2.1.29 typescript: 5.9.3 - zod: 3.25.76 + valibot: 1.2.0(typescript@5.9.3) + zod: 4.3.6 '@tabby_ai/hijri-converter@1.0.5': {} - '@tailwindcss/forms@0.5.11(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)))': + '@tailwindcss/forms@0.5.11(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + tailwindcss: 3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) '@tailwindcss/node@4.2.1': dependencies: @@ -17015,24 +17248,17 @@ snapshots: postcss: 8.5.8 tailwindcss: 4.2.1 - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)))': + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + tailwindcss: 3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) - '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - - '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - tailwindcss: 4.2.1 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@tanstack/react-table@8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -17086,14 +17312,16 @@ snapshots: '@tootallnate/once@1.1.2': optional: true - '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.8.1)': + '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1)': dependencies: - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 javascript-natural-sort: 0.7.1 - lodash: 4.17.23 + lodash-es: 4.17.23 + minimatch: 9.0.9 + parse-imports-exports: 0.2.4 prettier: 3.8.1 transitivePeerDependencies: - supports-color @@ -17144,7 +17372,7 @@ snapshots: '@types/bunyan@1.8.11': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/chai@5.2.3': dependencies: @@ -17153,11 +17381,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/cors@2.8.19': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/deep-eql@4.0.2': {} @@ -17203,27 +17431,27 @@ snapshots: '@types/memcached@2.2.10': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/ms@2.1.0': {} '@types/mysql@2.15.27': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 form-data: 4.0.5 - '@types/node@22.15.18': - dependencies: - undici-types: 6.21.0 - '@types/node@22.19.13': dependencies: undici-types: 6.21.0 + '@types/node@25.3.3': + dependencies: + undici-types: 7.18.2 + '@types/nodemailer@7.0.11': dependencies: '@types/node': 22.19.13 @@ -17232,7 +17460,7 @@ snapshots: '@types/oracledb@6.5.2': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/papaparse@5.5.2': dependencies: @@ -17244,7 +17472,7 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -17262,7 +17490,7 @@ snapshots: '@types/readable-stream@4.0.23': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/resolve@1.20.6': {} @@ -17274,7 +17502,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@types/trusted-types@2.0.7': optional: true @@ -17291,7 +17519,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: @@ -17626,7 +17854,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.5.12)(eslint@8.57.1)(prettier@3.8.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.5.12)(eslint@8.57.1)(prettier@3.8.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@8.57.1) @@ -17646,7 +17874,7 @@ snapshots: eslint-plugin-testing-library: 6.5.0(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 51.0.1(eslint@8.57.1) - eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) prettier-plugin-packagejson: 2.5.20(prettier@3.8.1) optionalDependencies: '@next/eslint-plugin-next': 15.5.12 @@ -17660,19 +17888,7 @@ snapshots: - supports-color - vitest - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -17680,37 +17896,32 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.18 ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 + magicast: 0.5.2 + obug: 2.1.1 std-env: 3.10.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color + tinyrainbow: 3.0.3 + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/eslint-plugin@1.6.9(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.6.9(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 optionalDependencies: typescript: 5.9.3 - vitest: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -17722,27 +17933,39 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/expect@4.0.18': dependencies: - '@vitest/spy': 3.2.4 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.4': + '@vitest/pretty-format@4.0.18': dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.1.0 + tinyrainbow: 3.0.3 - '@vitest/snapshot@3.2.4': + '@vitest/runner@4.0.18': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 @@ -17750,12 +17973,19 @@ snapshots: dependencies: tinyspy: 4.0.4 + '@vitest/spy@4.0.18': {} + '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.2.1 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + '@volar/language-core@2.4.27': dependencies: '@volar/source-map': 2.4.27 @@ -17877,7 +18107,7 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@wojtekmaj/date-utils@1.5.1': {} + '@wojtekmaj/date-utils@2.0.2': {} '@xmldom/is-dom-node@1.0.1': {} @@ -17903,17 +18133,17 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-walk@8.3.5: dependencies: @@ -17947,9 +18177,9 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: @@ -17963,9 +18193,9 @@ snapshots: dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.17.1): + ajv-keywords@5.1.0(ajv@8.18.0): dependencies: - ajv: 8.17.1 + ajv: 8.18.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -18195,8 +18425,6 @@ snapshots: baseline-browser-mapping@2.9.11: {} - bcryptjs@2.4.3: {} - bcryptjs@3.0.3: {} bidi-js@1.0.3: @@ -18252,8 +18480,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-assert@1.2.1: {} - browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.11 @@ -18301,8 +18527,6 @@ snapshots: optionalDependencies: magicast: 0.3.5 - cac@6.7.14: {} - cacache@15.3.0: dependencies: '@npmcli/fs': 1.1.1 @@ -18362,6 +18586,8 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chai@6.2.2: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -18371,6 +18597,15 @@ snapshots: check-error@2.1.1: {} + chevrotain@10.5.0: + dependencies: + '@chevrotain/cst-dts-gen': 10.5.0 + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + '@chevrotain/utils': 10.5.0 + lodash: 4.17.21 + regexp-to-ast: 0.5.0 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -18595,16 +18830,16 @@ snapshots: csstype@3.2.3: {} - csv-parse@5.6.0: {} + csv-parse@6.1.0: {} damerau-levenshtein@1.0.8: {} data-uri-to-buffer@4.0.1: {} - data-urls@7.0.0(@noble/hashes@1.8.0): + data-urls@7.0.0(@noble/hashes@2.0.1): dependencies: whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@1.8.0) + whatwg-url: 16.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' @@ -18787,19 +19022,23 @@ snapshots: dependencies: type-fest: 5.3.1 - dotenv-cli@8.0.0: + dotenv-cli@11.0.0: dependencies: cross-spawn: 7.0.6 - dotenv: 16.6.1 - dotenv-expand: 10.0.0 + dotenv: 17.3.1 + dotenv-expand: 12.0.3 minimist: 1.2.8 - dotenv-expand@10.0.0: {} + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.6.1 dotenv@16.0.3: {} dotenv@16.6.1: {} + dotenv@17.3.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -18842,7 +19081,7 @@ snapshots: engine.io@6.6.5: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.19.13 + '@types/node': 25.3.3 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -18876,6 +19115,8 @@ snapshots: err-code@2.0.3: optional: true + error-causes@3.0.2: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -19124,11 +19365,11 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-turbo@2.8.12(eslint@8.57.1)(turbo@2.8.12): + eslint-config-turbo@2.8.12(eslint@8.57.1)(turbo@2.8.13): dependencies: eslint: 8.57.1 - eslint-plugin-turbo: 2.8.12(eslint@8.57.1)(turbo@2.8.12) - turbo: 2.8.12 + eslint-plugin-turbo: 2.8.12(eslint@8.57.1)(turbo@2.8.13) + turbo: 2.8.13 eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0): dependencies: @@ -19317,11 +19558,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.2.14(eslint@8.57.1)(storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.2.14(eslint@8.57.1)(storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.53.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 - storybook: 10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - supports-color - typescript @@ -19339,11 +19580,11 @@ snapshots: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - eslint-plugin-turbo@2.8.12(eslint@8.57.1)(turbo@2.8.12): + eslint-plugin-turbo@2.8.12(eslint@8.57.1)(turbo@2.8.13): dependencies: dotenv: 16.0.3 eslint: 8.57.1 - turbo: 2.8.12 + turbo: 2.8.13 eslint-plugin-unicorn@51.0.1(eslint@8.57.1): dependencies: @@ -19367,13 +19608,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - vitest: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript @@ -19441,8 +19682,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -19538,11 +19779,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.105.3): + file-loader@6.2.0(webpack@5.105.4): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.3 + webpack: 5.105.4 file-uri-to-path@1.0.0: {} @@ -19597,9 +19838,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.34.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@12.35.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - motion-dom: 12.34.3 + motion-dom: 12.35.0 motion-utils: 12.29.2 tslib: 2.8.1 optionalDependencies: @@ -19663,6 +19904,15 @@ snapshots: - encoding - supports-color + gaxios@7.1.3: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + gaxios@7.1.4: dependencies: extend: 3.0.2 @@ -19719,6 +19969,8 @@ snapshots: get-nonce@1.0.1: {} + get-port-please@3.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -19734,9 +19986,9 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-user-locale@2.3.2: + get-user-locale@3.0.0: dependencies: - mem: 8.1.1 + memoize: 10.2.0 giget@2.0.0: dependencies: @@ -19765,7 +20017,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.5 + minimatch: 9.0.9 minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -19818,6 +20070,17 @@ snapshots: dependencies: csstype: 3.2.3 + google-auth-library@10.6.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.3 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + google-auth-library@9.15.1(encoding@0.1.13): dependencies: base64-js: 1.5.1 @@ -19846,20 +20109,33 @@ snapshots: - encoding - supports-color - googleapis@148.0.0(encoding@0.1.13): + googleapis-common@8.0.1: dependencies: - google-auth-library: 9.15.1(encoding@0.1.13) - googleapis-common: 7.2.0(encoding@0.1.13) + extend: 3.0.2 + gaxios: 7.1.4 + google-auth-library: 10.6.1 + qs: 6.14.1 + url-template: 2.0.8 + transitivePeerDependencies: + - supports-color + + googleapis@171.4.0: + dependencies: + google-auth-library: 10.6.1 + googleapis-common: 8.0.1 transitivePeerDependencies: - - encoding - supports-color gopd@1.2.0: {} graceful-fs@4.2.11: {} + grammex@3.1.12: {} + graphemer@1.4.0: {} + graphmatch@1.1.1: {} + gtoken@7.1.0(encoding@0.1.13): dependencies: gaxios: 6.7.1(encoding@0.1.13) @@ -19914,11 +20190,13 @@ snapshots: help-me@5.0.0: {} + hono@4.11.4: {} + hosted-git-info@2.8.9: {} - html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0): + html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): dependencies: - '@exodus/bytes': 1.14.1(@noble/hashes@1.8.0) + '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' @@ -19962,6 +20240,8 @@ snapshots: transitivePeerDependencies: - supports-color + http-status-codes@2.3.0: {} + https-proxy-agent@5.0.0: dependencies: agent-base: 6.0.2 @@ -20000,7 +20280,7 @@ snapshots: dependencies: '@babel/runtime': 7.28.4 - i18next@25.8.13(typescript@5.9.3): + i18next@25.8.14(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 optionalDependencies: @@ -20010,6 +20290,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -20023,8 +20307,15 @@ snapshots: import-in-the-middle@2.0.6: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + + import-in-the-middle@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) cjs-module-lexer: 2.2.0 module-details-from-path: 1.0.4 @@ -20139,7 +20430,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.4.0 + get-east-asian-width: 1.5.0 is-generator-function@1.1.2: dependencies: @@ -20153,6 +20444,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -20244,10 +20537,10 @@ snapshots: isexe@2.0.0: {} - isomorphic-dompurify@2.36.0(@noble/hashes@1.8.0): + isomorphic-dompurify@3.0.0(@noble/hashes@2.0.1): dependencies: dompurify: 3.3.1 - jsdom: 28.1.0(@noble/hashes@1.8.0) + jsdom: 28.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' - canvas @@ -20263,14 +20556,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 @@ -20299,7 +20584,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20329,22 +20614,20 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsdom@28.1.0(@noble/hashes@1.8.0): + jsdom@28.1.0(@noble/hashes@2.0.1): dependencies: '@acemir/cssom': 0.9.31 '@asamuzakjp/dom-selector': 6.8.1 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.14.1(@noble/hashes@1.8.0) + '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) cssstyle: 6.2.0 - data-urls: 7.0.0(@noble/hashes@1.8.0) + data-urls: 7.0.0(@noble/hashes@2.0.1) decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) + html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 @@ -20356,7 +20639,7 @@ snapshots: w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@1.8.0) + whatwg-url: 16.0.1(@noble/hashes@2.0.1) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -20503,6 +20786,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + lilconfig@2.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -20511,7 +20796,7 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.3.1: + lint-staged@16.3.2: dependencies: commander: 14.0.3 listr2: 9.0.5 @@ -20551,6 +20836,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.23: {} + lodash.camelcase@4.3.0: {} lodash.includes@4.3.0: {} @@ -20613,24 +20900,27 @@ snapshots: lru.min@1.1.3: {} - lucide-react@0.576.0(react@19.2.4): + lucide-react@0.577.0(react@19.2.4): dependencies: react: 19.2.4 lz-string@1.5.0: {} - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.3.5: dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + optional: true + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 source-map-js: 1.2.1 make-dir@4.0.0: @@ -20663,10 +20953,6 @@ snapshots: - supports-color optional: true - map-age-cleaner@0.1.3: - dependencies: - p-defer: 1.0.0 - markdown-it@14.1.1: dependencies: argparse: 2.0.1 @@ -20686,10 +20972,9 @@ snapshots: mdurl@2.0.0: {} - mem@8.1.1: + memoize@10.2.0: dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 3.1.0 + mimic-function: 5.0.1 memory-pager@1.5.0: {} @@ -20714,8 +20999,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mimic-fn@3.1.0: {} - mimic-function@5.0.1: {} mimic-response@3.1.0: {} @@ -20815,7 +21098,7 @@ snapshots: mlly@1.8.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.1 @@ -20840,7 +21123,7 @@ snapshots: '@aws-sdk/credential-providers': 3.817.0 socks: 2.8.7 - motion-dom@12.34.3: + motion-dom@12.35.0: dependencies: motion-utils: 12.29.2 @@ -20873,6 +21156,18 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.2 + long: 5.3.2 + lru.min: 1.1.3 + named-placeholders: 1.1.6 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -20913,7 +21208,7 @@ snapshots: neo-async@2.6.2: {} - next-auth@4.24.13(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nodemailer@7.0.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-auth@4.24.13(patch_hash=7ac5717a8d7d2049442182b5d83ab492d33fe774ff51ff5ea3884628b77df87b)(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nodemailer@8.0.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@babel/runtime': 7.28.4 '@panva/hkdf': 1.2.1 @@ -20928,15 +21223,14 @@ snapshots: react-dom: 19.2.4(react@19.2.4) uuid: 11.1.0 optionalDependencies: - nodemailer: 7.0.13 + nodemailer: 8.0.1 - next-safe-action@7.10.8(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76): + next-safe-action@8.1.5(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: + deepmerge-ts: 7.1.5 next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - zod: 3.25.76 next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: @@ -21017,7 +21311,7 @@ snapshots: node-releases@2.0.27: {} - nodemailer@7.0.13: {} + nodemailer@8.0.1: {} nopt@5.0.0: dependencies: @@ -21110,6 +21404,8 @@ snapshots: obliterator@1.6.1: {} + obug@2.1.1: {} + ohash@2.0.11: {} oidc-token-hash@5.2.0: {} @@ -21131,6 +21427,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + openid-client@5.7.1: dependencies: jose: 4.15.9 @@ -21164,22 +21469,25 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.2 - otlp-logger@1.1.13(@opentelemetry/api@1.9.0): + otlp-logger@2.0.0(@opentelemetry/api@1.9.0): dependencies: - '@opentelemetry/api-logs': 0.206.0 - '@opentelemetry/exporter-logs-otlp-grpc': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.212.0 + '@opentelemetry/exporter-logs-otlp-grpc': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - '@opentelemetry/api' - otplib@12.0.1: + otplib@13.3.0: dependencies: - '@otplib/core': 12.0.1 - '@otplib/preset-default': 12.0.1 - '@otplib/preset-v11': 12.0.1 + '@otplib/core': 13.3.0 + '@otplib/hotp': 13.3.0 + '@otplib/plugin-base32-scure': 13.3.0 + '@otplib/plugin-crypto-noble': 13.3.0 + '@otplib/totp': 13.3.0 + '@otplib/uri': 13.3.0 own-keys@1.0.1: dependencies: @@ -21187,8 +21495,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-defer@1.0.0: {} - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -21220,6 +21526,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 @@ -21229,6 +21539,8 @@ snapshots: parse-srcset@1.0.2: {} + parse-statements@1.0.11: {} + parse5@8.0.0: dependencies: entities: 6.0.1 @@ -21276,6 +21588,11 @@ snapshots: pg-cloudflare@1.2.7: optional: true + pg-cloudflare@1.3.0: + optional: true + + pg-connection-string@2.12.0: {} + pg-connection-string@2.9.1: {} pg-int8@1.0.1: {} @@ -21284,8 +21601,14 @@ snapshots: dependencies: pg: 8.16.0 + pg-pool@3.13.0(pg@8.20.0): + dependencies: + pg: 8.20.0 + pg-protocol@1.10.3: {} + pg-protocol@1.13.0: {} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -21304,6 +21627,16 @@ snapshots: optionalDependencies: pg-cloudflare: 1.2.7 + pg@8.20.0: + dependencies: + pg-connection-string: 2.12.0 + pg-pool: 3.13.0(pg@8.20.0) + pg-protocol: 1.13.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.3.0 + pgpass@1.0.5: dependencies: split2: 4.2.0 @@ -21320,9 +21653,9 @@ snapshots: dependencies: split2: 4.2.0 - pino-opentelemetry-transport@2.0.0(@opentelemetry/api@1.9.0)(pino@10.3.1): + pino-opentelemetry-transport@3.0.0(@opentelemetry/api@1.9.0)(pino@10.3.1): dependencies: - otlp-logger: 1.1.13(@opentelemetry/api@1.9.0) + otlp-logger: 2.0.0(@opentelemetry/api@1.9.0) pino: 10.3.1 pino-abstract-transport: 3.0.0 transitivePeerDependencies: @@ -21402,13 +21735,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.8 - postcss-load-config@4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)): + postcss-load-config@4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.2 optionalDependencies: postcss: 8.5.8 - ts-node: 10.9.2(@types/node@22.19.13)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) postcss-nested@6.2.0(postcss@8.5.8): dependencies: @@ -21447,6 +21780,8 @@ snapshots: postgres-array@2.0.0: {} + postgres-array@3.0.4: {} + postgres-bytea@1.0.1: {} postgres-date@1.0.7: {} @@ -21455,6 +21790,10 @@ snapshots: dependencies: xtend: 4.0.2 + postgres@3.4.7: {} + + powershell-utils@0.1.0: {} + preact-render-to-string@5.2.6(preact@10.28.2): dependencies: preact: 10.28.2 @@ -21490,11 +21829,11 @@ snapshots: dependencies: prettier: 3.8.1 - prettier-plugin-tailwindcss@0.7.2(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.8.1))(prettier@3.8.1): + prettier-plugin-tailwindcss@0.7.2(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1))(prettier@3.8.1): dependencies: prettier: 3.8.1 optionalDependencies: - '@trivago/prettier-plugin-sort-imports': 5.2.2(prettier@3.8.1) + '@trivago/prettier-plugin-sort-imports': 6.0.2(prettier@3.8.1) prettier@3.8.1: {} @@ -21506,23 +21845,31 @@ snapshots: pretty-format@3.8.0: {} - prisma-json-types-generator@3.6.2(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3): + prisma-json-types-generator@4.1.1(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@prisma/client': 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) - '@prisma/generator-helper': 6.19.1 - prisma: 6.19.2(magicast@0.3.5)(typescript@5.9.3) + '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/generator-helper': 7.4.2 + prisma: 7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) semver: 7.7.3 + try: 1.0.3 tslib: 2.8.1 typescript: 5.9.3 - prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3): + prisma@7.4.2(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: - '@prisma/config': 6.19.2(magicast@0.3.5) - '@prisma/engines': 6.19.2 + '@prisma/config': 7.4.2(magicast@0.3.5) + '@prisma/dev': 0.20.0(typescript@5.9.3) + '@prisma/engines': 7.4.2 + '@prisma/studio-core': 0.13.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + mysql2: 3.15.3 + postgres: 3.4.7 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: + - '@types/react' - magicast + - react + - react-dom prismjs@1.30.0: {} @@ -21554,6 +21901,12 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -21566,7 +21919,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.13 + '@types/node': 25.3.3 long: 5.3.2 protobufjs@8.0.0: @@ -21581,7 +21934,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.13 + '@types/node': 25.3.3 long: 5.3.2 proxy-from-env@1.1.0: {} @@ -21619,10 +21972,6 @@ snapshots: quick-format-unescaped@4.0.4: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - rc9@2.1.2: dependencies: defu: 6.1.4 @@ -21635,11 +21984,11 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-calendar@5.1.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-calendar@6.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@wojtekmaj/date-utils': 1.5.1 + '@wojtekmaj/date-utils': 2.0.2 clsx: 2.1.1 - get-user-locale: 2.3.2 + get-user-locale: 3.0.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) warning: 4.0.3 @@ -21668,26 +22017,11 @@ snapshots: dependencies: typescript: 5.9.3 - react-docgen@7.1.1: - dependencies: - '@babel/core': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.11 - strip-indent: 4.1.1 - transitivePeerDependencies: - - supports-color - react-docgen@8.0.2: dependencies: - '@babel/core': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -21743,12 +22077,13 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-i18next@15.7.4(i18next@25.8.13(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + react-i18next@16.5.4(i18next@25.8.14(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.8.13(typescript@5.9.3) + i18next: 25.8.14(typescript@5.9.3) react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 @@ -21757,8 +22092,6 @@ snapshots: react-is@17.0.2: {} - react-refresh@0.17.0: {} - react-refresh@0.18.0: {} react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): @@ -21913,6 +22246,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regexp-to-ast@0.5.0: {} + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.4: @@ -21928,6 +22263,8 @@ snapshots: dependencies: jsesc: 0.5.0 + remeda@2.33.4: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -21969,8 +22306,7 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry@0.12.0: - optional: true + retry@0.12.0: {} reusify@1.1.0: {} @@ -21980,6 +22316,10 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@5.0.10: + dependencies: + glob: 10.5.0 + rimraf@6.1.3: dependencies: glob: 13.0.6 @@ -21990,9 +22330,9 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 - rollup-plugin-visualizer@6.0.8(rollup@4.59.0): + rollup-plugin-visualizer@7.0.1(rollup@4.59.0): dependencies: - open: 10.2.0 + open: 11.0.0 picomatch: 4.0.3 source-map: 0.7.6 yargs: 18.0.0 @@ -22125,9 +22465,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 2.1.1(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.18.0) screenfull@5.2.0: {} @@ -22149,10 +22489,6 @@ snapshots: seq-queue@0.0.5: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -22256,8 +22592,7 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: - optional: true + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -22445,7 +22780,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.2.14(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + storybook@10.2.15(@testing-library/dom@8.20.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -22573,14 +22908,9 @@ snapshots: strip-json-comments@5.0.3: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - - stripe@16.12.0: - dependencies: - '@types/node': 22.15.18 - qs: 6.14.1 + stripe@20.4.0(@types/node@25.3.3): + optionalDependencies: + '@types/node': 25.3.3 strnum@2.1.2: {} @@ -22629,7 +22959,7 @@ snapshots: tailwind-merge@3.5.0: {} - tailwindcss@3.4.19(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)): + tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -22648,7 +22978,7 @@ snapshots: postcss: 8.5.8 postcss-import: 15.1.0(postcss@8.5.8) postcss-js: 4.1.0(postcss@8.5.8) - postcss-load-config: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)) + postcss-load-config: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) postcss-nested: 6.2.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -22691,7 +23021,7 @@ snapshots: '@azure/identity': 4.13.0 '@azure/keyvault-keys': 4.10.0 '@js-joda/core': 5.6.5 - '@types/node': 22.19.13 + '@types/node': 25.3.3 bl: 6.1.6 iconv-lite: 0.6.3 js-md4: 0.3.2 @@ -22700,26 +23030,24 @@ snapshots: transitivePeerDependencies: - supports-color - terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.105.3(esbuild@0.27.3)): + terser-webpack-plugin@5.3.17(esbuild@0.27.3)(webpack@5.105.4(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.3(esbuild@0.27.3) + webpack: 5.105.4(esbuild@0.27.3) optionalDependencies: esbuild: 0.27.3 optional: true - terser-webpack-plugin@5.3.16(webpack@5.105.3): + terser-webpack-plugin@5.3.17(webpack@5.105.4): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.3 + webpack: 5.105.4 terser@5.46.0: dependencies: @@ -22728,12 +23056,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.5.0 - minimatch: 9.0.5 - text-table@0.2.0: {} thenify-all@1.6.0: @@ -22744,8 +23066,6 @@ snapshots: dependencies: any-promise: 1.3.0 - thirty-two@1.0.2: {} - thread-stream@4.0.0: dependencies: real-require: 0.2.0 @@ -22756,8 +23076,6 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} - tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -22765,10 +23083,10 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.4: {} tldts-core@7.0.19: {} @@ -22805,6 +23123,8 @@ snapshots: tree-kill@1.2.2: {} + try@1.0.3: {} + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -22823,14 +23143,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.13 + '@types/node': 25.3.3 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -22879,32 +23199,32 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo-darwin-64@2.8.12: + turbo-darwin-64@2.8.13: optional: true - turbo-darwin-arm64@2.8.12: + turbo-darwin-arm64@2.8.13: optional: true - turbo-linux-64@2.8.12: + turbo-linux-64@2.8.13: optional: true - turbo-linux-arm64@2.8.12: + turbo-linux-arm64@2.8.13: optional: true - turbo-windows-64@2.8.12: + turbo-windows-64@2.8.13: optional: true - turbo-windows-arm64@2.8.12: + turbo-windows-arm64@2.8.13: optional: true - turbo@2.8.12: + turbo@2.8.13: optionalDependencies: - turbo-darwin-64: 2.8.12 - turbo-darwin-arm64: 2.8.12 - turbo-linux-64: 2.8.12 - turbo-linux-arm64: 2.8.12 - turbo-windows-64: 2.8.12 - turbo-windows-arm64: 2.8.12 + turbo-darwin-64: 2.8.13 + turbo-darwin-arm64: 2.8.13 + turbo-linux-64: 2.8.13 + turbo-linux-arm64: 2.8.13 + turbo-windows-64: 2.8.13 + turbo-windows-arm64: 2.8.13 tween-functions@1.2.0: {} @@ -22957,7 +23277,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typeorm@0.3.28(mongodb@6.16.0(@aws-sdk/credential-providers@3.817.0)(socks@2.8.7))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.16.0)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.19.13)(typescript@5.9.3)): + typeorm@0.3.28(mongodb@6.16.0(@aws-sdk/credential-providers@3.817.0)(socks@2.8.7))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.16.0)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 @@ -22981,7 +23301,7 @@ snapshots: pg: 8.16.0 redis: 4.7.0 sqlite3: 5.1.7 - ts-node: 10.9.2(@types/node@22.19.13)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23013,6 +23333,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.18.2: {} + undici@7.22.0: {} unique-filename@1.1.1: @@ -23027,15 +23349,10 @@ snapshots: universalify@2.0.1: {} - unplugin@1.16.1: - dependencies: - acorn: 8.15.0 - webpack-virtual-modules: 0.6.2 - unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 + acorn: 8.16.0 picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 @@ -23101,6 +23418,10 @@ snapshots: v8-compile-cache-lib@3.0.1: optional: true + valibot@1.2.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -23108,30 +23429,9 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite-plugin-dts@4.5.4(@types/node@25.3.3)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-plugin-dts@4.5.4(@types/node@22.19.13)(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@microsoft/api-extractor': 7.57.6(@types/node@22.19.13) + '@microsoft/api-extractor': 7.57.6(@types/node@25.3.3) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@volar/typescript': 2.4.27 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -23142,13 +23442,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-prerender-plugin@0.5.12(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-prerender-plugin@0.5.12(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -23156,37 +23456,19 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - optionalDependencies: - vite: 6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@6.4.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.54.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.19.13 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.31.1 - terser: 5.46.0 - tsx: 4.21.0 - yaml: 2.8.2 - - vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -23195,7 +23477,7 @@ snapshots: rollup: 4.54.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.13 + '@types/node': 25.3.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.31.1 @@ -23203,40 +23485,38 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest-mock-extended@3.1.0(typescript@5.9.3)(vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vitest-mock-extended@3.1.0(typescript@5.9.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: ts-essentials: 10.1.1(typescript@5.9.3) typescript: 5.9.3 - vitest: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitest@3.2.4(@types/node@22.19.13)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@1.8.0))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.3)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.13)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.13 - jsdom: 28.1.0(@noble/hashes@1.8.0) + '@opentelemetry/api': 1.9.0 + '@types/node': 25.3.3 + jsdom: 28.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - jiti - less @@ -23246,7 +23526,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -23280,7 +23559,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.105.3: + webpack@5.105.4: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -23304,7 +23583,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.105.3) + terser-webpack-plugin: 5.3.17(webpack@5.105.4) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -23312,7 +23591,7 @@ snapshots: - esbuild - uglify-js - webpack@5.105.3(esbuild@0.27.3): + webpack@5.105.4(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -23336,7 +23615,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.105.3(esbuild@0.27.3)) + terser-webpack-plugin: 5.3.17(esbuild@0.27.3)(webpack@5.105.4(esbuild@0.27.3)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -23352,9 +23631,9 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 - whatwg-url@16.0.1(@noble/hashes@1.8.0): + whatwg-url@16.0.1(@noble/hashes@2.0.1): dependencies: - '@exodus/bytes': 1.14.1(@noble/hashes@1.8.0) + '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -23460,6 +23739,11 @@ snapshots: dependencies: is-wsl: 3.1.0 + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + xlsx@file:apps/web/vendor/xlsx-0.20.3.tgz: {} xml-crypto@6.1.2: @@ -23558,8 +23842,13 @@ snapshots: yoctocolors@2.1.2: {} - zod-openapi@4.2.4(zod@3.25.76): + zeptomatch@2.1.0: dependencies: - zod: 3.25.76 + grammex: 3.1.12 + graphmatch: 1.1.1 - zod@3.25.76: {} + zod-openapi@5.4.6(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod@4.3.6: {} diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 0000000000..69423b9896 --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,16 @@ +import "dotenv/config"; +import { defineConfig, env } from "prisma/config"; + +const hasShadowDatabaseUrl = Boolean(process.env.SHADOW_DATABASE_URL); + +export default defineConfig({ + schema: "packages/database/schema.prisma", + migrations: { + path: "packages/database/migrations", + seed: "pnpm --filter @formbricks/database db:seed", + }, + datasource: { + url: env("DATABASE_URL"), + ...(hasShadowDatabaseUrl ? { shadowDatabaseUrl: env("SHADOW_DATABASE_URL") } : {}), + }, +});