chore: update dependencies and fix build/lint/test regressions (#7403)

This commit is contained in:
Matti Nannt
2026-03-03 18:03:03 +01:00
committed by GitHub
parent d939263472
commit d5fdacadd7
27 changed files with 5184 additions and 6722 deletions

View File

@@ -14,21 +14,21 @@
"@formbricks/survey-ui": "workspace:*"
},
"devDependencies": {
"@chromatic-com/storybook": "^5.0.0",
"@storybook/addon-a11y": "10.1.11",
"@storybook/addon-links": "10.1.11",
"@storybook/addon-onboarding": "10.1.11",
"@storybook/react-vite": "10.1.11",
"@typescript-eslint/eslint-plugin": "8.53.0",
"@tailwindcss/vite": "4.1.18",
"@typescript-eslint/parser": "8.53.0",
"@vitejs/plugin-react": "5.1.2",
"esbuild": "0.25.12",
"@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",
"@typescript-eslint/eslint-plugin": "8.56.1",
"@tailwindcss/vite": "4.2.1",
"@typescript-eslint/parser": "8.56.1",
"@vitejs/plugin-react": "5.1.4",
"esbuild": "0.27.3",
"eslint-plugin-react-refresh": "0.4.26",
"eslint-plugin-storybook": "10.1.11",
"eslint-plugin-storybook": "10.2.14",
"prop-types": "15.8.1",
"storybook": "10.1.11",
"storybook": "10.2.14",
"vite": "7.3.1",
"@storybook/addon-docs": "10.1.11"
"@storybook/addon-docs": "10.2.14"
}
}

View File

@@ -1,44 +1,66 @@
import { beforeEach, describe, expect, test, vi } from "vitest";
// Mock constants module
const envMock = {
env: {
WEBAPP_URL: "http://localhost:3000",
PUBLIC_URL: undefined as string | undefined,
},
WEBAPP_URL: undefined as string | undefined,
VERCEL_URL: undefined as string | undefined,
PUBLIC_URL: undefined as string | undefined,
};
vi.mock("@/lib/env", () => envMock);
vi.mock("./env", () => ({
env: envMock,
}));
const loadGetPublicDomain = async () => {
vi.resetModules();
const { getPublicDomain } = await import("./getPublicUrl");
return getPublicDomain;
};
describe("getPublicDomain", () => {
beforeEach(() => {
vi.resetModules();
envMock.WEBAPP_URL = undefined;
envMock.VERCEL_URL = undefined;
envMock.PUBLIC_URL = undefined;
});
test("should return WEBAPP_URL when PUBLIC_URL is not set", async () => {
const { getPublicDomain } = await import("./getPublicUrl");
const domain = getPublicDomain();
expect(domain).toBe("http://localhost:3000");
test("returns trimmed WEBAPP_URL when configured", async () => {
envMock.WEBAPP_URL = " https://app.formbricks.com ";
const getPublicDomain = await loadGetPublicDomain();
expect(getPublicDomain()).toBe("https://app.formbricks.com");
});
test("should return PUBLIC_URL when it is set", async () => {
envMock.env.PUBLIC_URL = "https://surveys.example.com";
const { getPublicDomain } = await import("./getPublicUrl");
const domain = getPublicDomain();
expect(domain).toBe("https://surveys.example.com");
test("falls back to VERCEL_URL when WEBAPP_URL is empty", async () => {
envMock.WEBAPP_URL = " ";
envMock.VERCEL_URL = "preview.formbricks.com";
const getPublicDomain = await loadGetPublicDomain();
expect(getPublicDomain()).toBe("https://preview.formbricks.com");
});
test("should handle empty string PUBLIC_URL by returning WEBAPP_URL", async () => {
envMock.env.PUBLIC_URL = "";
const { getPublicDomain } = await import("./getPublicUrl");
const domain = getPublicDomain();
expect(domain).toBe("http://localhost:3000");
test("falls back to localhost when WEBAPP_URL and VERCEL_URL are not set", async () => {
const getPublicDomain = await loadGetPublicDomain();
expect(getPublicDomain()).toBe("http://localhost:3000");
});
test("should handle undefined PUBLIC_URL by returning WEBAPP_URL", async () => {
envMock.env.PUBLIC_URL = undefined;
const { getPublicDomain } = await import("./getPublicUrl");
const domain = getPublicDomain();
expect(domain).toBe("http://localhost:3000");
test("returns PUBLIC_URL when set", async () => {
envMock.WEBAPP_URL = "https://app.formbricks.com";
envMock.PUBLIC_URL = "https://surveys.formbricks.com";
const getPublicDomain = await loadGetPublicDomain();
expect(getPublicDomain()).toBe("https://surveys.formbricks.com");
});
test("falls back to WEBAPP_URL when PUBLIC_URL is empty", async () => {
envMock.WEBAPP_URL = "https://app.formbricks.com";
envMock.PUBLIC_URL = " ";
const getPublicDomain = await loadGetPublicDomain();
expect(getPublicDomain()).toBe("https://app.formbricks.com");
});
});

View File

@@ -1,8 +1,18 @@
import "server-only";
import { env } from "./env";
const WEBAPP_URL =
env.WEBAPP_URL ?? (env.VERCEL_URL ? `https://${env.VERCEL_URL}` : "") ?? "http://localhost:3000";
const configuredWebappUrl = env.WEBAPP_URL?.trim() ?? "";
const WEBAPP_URL = (() => {
if (configuredWebappUrl !== "") {
return configuredWebappUrl;
}
if (env.VERCEL_URL) {
return `https://${env.VERCEL_URL}`;
}
return "http://localhost:3000";
})();
/**
* Returns the public domain URL

View File

@@ -195,6 +195,7 @@ describe("authOptions", () => {
vi.mocked(applyIPRateLimit).mockRejectedValue(
new Error("Maximum number of requests reached. Please try again later.")
);
const findUniqueSpy = vi.spyOn(prisma.user, "findUnique");
const credentials = { email: mockUser.email, password: mockPassword };
@@ -202,7 +203,7 @@ describe("authOptions", () => {
"Maximum number of requests reached. Please try again later."
);
expect(prisma.user.findUnique).not.toHaveBeenCalled();
expect(findUniqueSpy).not.toHaveBeenCalled();
});
test("should use correct rate limit configuration", async () => {
@@ -281,6 +282,7 @@ describe("authOptions", () => {
vi.mocked(applyIPRateLimit).mockRejectedValue(
new Error("Maximum number of requests reached. Please try again later.")
);
const findUniqueSpy = vi.spyOn(prisma.user, "findUnique");
const credentials = { token: "sometoken" };
@@ -288,7 +290,7 @@ describe("authOptions", () => {
"Maximum number of requests reached. Please try again later."
);
expect(prisma.user.findUnique).not.toHaveBeenCalled();
expect(findUniqueSpy).not.toHaveBeenCalled();
});
});
});

View File

@@ -203,7 +203,7 @@ export const ThemeStyling = ({
</FormDescription>
<FormControl>
<ColorPicker
color={field.value ?? STYLE_DEFAULTS.brandColor?.light}
color={field.value ?? STYLE_DEFAULTS.brandColor?.light ?? COLOR_DEFAULTS.brandColor}
onChange={(color) => field.onChange(color)}
containerClass="w-full"
/>

View File

@@ -9,7 +9,12 @@ import toast from "react-hot-toast";
import { useTranslation } from "react-i18next";
import { TProjectStyling } from "@formbricks/types/project";
import { TSurvey, TSurveyStyling } from "@formbricks/types/surveys/types";
import { STYLE_DEFAULTS, deriveNewFieldsFromLegacy, getSuggestedColors } from "@/lib/styling/constants";
import {
COLOR_DEFAULTS,
STYLE_DEFAULTS,
deriveNewFieldsFromLegacy,
getSuggestedColors,
} from "@/lib/styling/constants";
import { FormStylingSettings } from "@/modules/survey/editor/components/form-styling-settings";
import { LogoSettingsCard } from "@/modules/survey/editor/components/logo-settings-card";
import { AlertDialog } from "@/modules/ui/components/alert-dialog";
@@ -92,7 +97,8 @@ export const StylingView = ({
const [confirmSuggestColorsOpen, setConfirmSuggestColorsOpen] = useState(false);
const handleSuggestColors = () => {
const currentBrandColor = form.getValues().brandColor?.light ?? STYLE_DEFAULTS.brandColor?.light;
const currentBrandColor =
form.getValues().brandColor?.light ?? STYLE_DEFAULTS.brandColor?.light ?? COLOR_DEFAULTS.brandColor;
const suggested = getSuggestedColors(currentBrandColor);
for (const [key, value] of Object.entries(suggested)) {
@@ -235,7 +241,7 @@ export const StylingView = ({
</FormDescription>
<FormControl>
<ColorPicker
color={field.value ?? STYLE_DEFAULTS.brandColor?.light}
color={field.value ?? STYLE_DEFAULTS.brandColor?.light ?? COLOR_DEFAULTS.brandColor}
onChange={(color) => field.onChange(color)}
containerClass="w-full"
/>

View File

@@ -1,7 +1,7 @@
{
"name": "@formbricks/web",
"version": "0.0.0",
"packageManager": "pnpm@10.28.2",
"packageManager": "pnpm@10.30.3",
"private": true,
"scripts": {
"clean": "rimraf .turbo node_modules .next coverage",
@@ -19,9 +19,9 @@
"i18n:generate": "npx lingo.dev@latest run && npx lingo.dev@latest lockfile --force"
},
"dependencies": {
"@aws-sdk/client-s3": "3.971.0",
"@aws-sdk/s3-presigned-post": "3.971.0",
"@aws-sdk/s3-request-presigner": "3.971.0",
"@aws-sdk/client-s3": "3.1000.0",
"@aws-sdk/s3-presigned-post": "3.1000.0",
"@aws-sdk/s3-request-presigner": "3.1000.0",
"@boxyhq/saml-jackson": "1.52.2",
"@dnd-kit/core": "6.3.1",
"@dnd-kit/modifiers": "9.0.0",
@@ -36,106 +36,106 @@
"@formbricks/storage": "workspace:*",
"@formbricks/surveys": "workspace:*",
"@formbricks/types": "workspace:*",
"@hookform/resolvers": "5.0.1",
"@hookform/resolvers": "5.2.2",
"@json2csv/node": "7.0.6",
"@lexical/code": "0.36.2",
"@lexical/link": "0.36.2",
"@lexical/list": "0.36.2",
"@lexical/markdown": "0.36.2",
"@lexical/react": "0.36.2",
"@lexical/rich-text": "0.36.2",
"@lexical/table": "0.36.2",
"@opentelemetry/auto-instrumentations-node": "0.69.0",
"@opentelemetry/exporter-metrics-otlp-http": "0.211.0",
"@opentelemetry/exporter-prometheus": "0.211.0",
"@opentelemetry/exporter-trace-otlp-http": "0.211.0",
"@opentelemetry/resources": "2.5.0",
"@opentelemetry/sdk-metrics": "2.5.0",
"@opentelemetry/sdk-node": "0.211.0",
"@opentelemetry/sdk-trace-base": "2.5.0",
"@opentelemetry/semantic-conventions": "1.38.0",
"@paralleldrive/cuid2": "2.2.2",
"@prisma/client": "6.14.0",
"@prisma/instrumentation": "6.14.0",
"@radix-ui/react-accordion": "1.2.10",
"@radix-ui/react-checkbox": "1.3.1",
"@radix-ui/react-collapsible": "1.1.10",
"@radix-ui/react-dialog": "1.1.13",
"@radix-ui/react-dropdown-menu": "2.1.14",
"@radix-ui/react-label": "2.1.6",
"@radix-ui/react-popover": "1.1.13",
"@radix-ui/react-radio-group": "1.3.6",
"@radix-ui/react-select": "2.2.4",
"@radix-ui/react-separator": "1.1.6",
"@radix-ui/react-slider": "1.3.4",
"@radix-ui/react-slot": "1.2.2",
"@radix-ui/react-switch": "1.2.4",
"@radix-ui/react-tabs": "1.1.11",
"@radix-ui/react-toggle": "1.1.8",
"@radix-ui/react-toggle-group": "1.1.9",
"@radix-ui/react-tooltip": "1.2.6",
"@sentry/nextjs": "10.5.0",
"@t3-oss/env-nextjs": "0.13.4",
"@tailwindcss/forms": "0.5.10",
"@tailwindcss/typography": "0.5.16",
"@lexical/code": "0.41.0",
"@lexical/link": "0.41.0",
"@lexical/list": "0.41.0",
"@lexical/markdown": "0.41.0",
"@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/semantic-conventions": "1.40.0",
"@paralleldrive/cuid2": "2.3.1",
"@prisma/client": "6.19.2",
"@prisma/instrumentation": "6.19.2",
"@radix-ui/react-accordion": "1.2.12",
"@radix-ui/react-checkbox": "1.3.3",
"@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-dialog": "1.1.15",
"@radix-ui/react-dropdown-menu": "2.1.16",
"@radix-ui/react-label": "2.1.8",
"@radix-ui/react-popover": "1.1.15",
"@radix-ui/react-radio-group": "1.3.8",
"@radix-ui/react-select": "2.2.6",
"@radix-ui/react-separator": "1.1.8",
"@radix-ui/react-slider": "1.3.6",
"@radix-ui/react-slot": "1.2.4",
"@radix-ui/react-switch": "1.2.6",
"@radix-ui/react-tabs": "1.1.13",
"@radix-ui/react-toggle": "1.1.10",
"@radix-ui/react-toggle-group": "1.1.11",
"@radix-ui/react-tooltip": "1.2.8",
"@sentry/nextjs": "10.41.0",
"@t3-oss/env-nextjs": "0.13.10",
"@tailwindcss/forms": "0.5.11",
"@tailwindcss/typography": "0.5.19",
"@tanstack/react-table": "8.21.3",
"@ungap/structured-clone": "1.3.0",
"@vercel/functions": "2.2.8",
"@vercel/og": "0.8.5",
"bcryptjs": "3.0.2",
"boring-avatars": "2.0.1",
"@vercel/functions": "2.2.13",
"@vercel/og": "0.10.0",
"bcryptjs": "3.0.3",
"boring-avatars": "2.0.4",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"cmdk": "1.1.1",
"csv-parse": "5.6.0",
"date-fns": "4.1.0",
"file-loader": "6.2.0",
"framer-motion": "12.10.0",
"framer-motion": "12.34.4",
"googleapis": "148.0.0",
"heic-convert": "2.1.0",
"https-proxy-agent": "7.0.6",
"i18next": "25.5.2",
"i18next-icu": "2.4.0",
"i18next": "25.8.13",
"i18next-icu": "2.4.3",
"i18next-resources-to-backend": "1.2.1",
"jiti": "2.4.2",
"jsonwebtoken": "9.0.2",
"lexical": "0.36.2",
"jiti": "2.6.1",
"jsonwebtoken": "9.0.3",
"lexical": "0.41.0",
"lodash": "4.17.23",
"lucide-react": "0.507.0",
"markdown-it": "14.1.0",
"mime-types": "3.0.1",
"lucide-react": "0.576.0",
"markdown-it": "14.1.1",
"mime-types": "3.0.2",
"next": "16.1.6",
"next-auth": "4.24.12",
"next-auth": "4.24.13",
"next-safe-action": "7.10.8",
"node-fetch": "3.3.2",
"nodemailer": "7.0.11",
"nodemailer": "7.0.13",
"otplib": "12.0.1",
"papaparse": "5.5.2",
"papaparse": "5.5.3",
"prismjs": "1.30.0",
"qr-code-styling": "1.9.2",
"qrcode": "1.5.4",
"react": "19.2.3",
"react": "19.2.4",
"react-calendar": "5.1.0",
"react-colorful": "5.6.1",
"react-confetti": "6.4.0",
"react-day-picker": "9.6.7",
"react-dom": "19.2.3",
"react-hook-form": "7.56.2",
"react-hot-toast": "2.5.2",
"react-i18next": "15.7.3",
"react-turnstile": "1.1.4",
"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-turnstile": "1.1.5",
"react-use": "17.6.0",
"redis": "4.7.0",
"sanitize-html": "2.17.0",
"redis": "4.7.1",
"sanitize-html": "2.17.1",
"server-only": "0.0.1",
"sharp": "0.34.1",
"sharp": "0.34.5",
"stripe": "16.12.0",
"superjson": "2.2.2",
"tailwind-merge": "3.2.0",
"tailwindcss": "3.4.17",
"ua-parser-js": "2.0.3",
"superjson": "2.2.6",
"tailwind-merge": "3.5.0",
"tailwindcss": "3.4.19",
"ua-parser-js": "2.0.9",
"uuid": "11.1.0",
"webpack": "5.99.8",
"webpack": "5.105.3",
"xlsx": "file:vendor/xlsx-0.20.3.tgz",
"zod": "3.25.76",
"zod-openapi": "4.2.4"
@@ -143,31 +143,31 @@
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.3.0",
"@testing-library/jest-dom": "6.9.1",
"@testing-library/react": "16.3.2",
"@types/bcryptjs": "2.4.6",
"@types/heic-convert": "2.1.0",
"@types/jsonwebtoken": "9.0.9",
"@types/lodash": "4.17.16",
"@types/jsonwebtoken": "9.0.10",
"@types/lodash": "4.17.24",
"@types/markdown-it": "14.1.2",
"@types/mime-types": "2.1.4",
"@types/nodemailer": "7.0.2",
"@types/papaparse": "5.3.15",
"@types/qrcode": "1.5.5",
"@types/nodemailer": "7.0.11",
"@types/papaparse": "5.5.2",
"@types/qrcode": "1.5.6",
"@types/sanitize-html": "2.16.0",
"@types/testing-library__react": "10.2.0",
"@types/ungap__structured-clone": "1.2.0",
"@vitest/coverage-v8": "3.1.3",
"autoprefixer": "10.4.21",
"cross-env": "10.0.0",
"dotenv": "16.5.0",
"esbuild": "0.25.12",
"postcss": "8.5.3",
"@vitest/coverage-v8": "3.2.4",
"autoprefixer": "10.4.27",
"cross-env": "10.1.0",
"dotenv": "16.6.1",
"esbuild": "0.27.3",
"postcss": "8.5.8",
"resize-observer-polyfill": "1.5.1",
"ts-node": "10.9.2",
"vite": "6.4.1",
"vite-tsconfig-paths": "5.1.4",
"vitest": "3.1.3",
"vitest": "3.2.4",
"vitest-mock-extended": "3.1.0"
}
}

View File

@@ -191,16 +191,16 @@ test.describe("Survey Create & Submit Response without logic", async () => {
page.getByRole("rowheader", { name: surveys.createAndSubmit.matrix.rows[2] })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[0], exact: true })
page.getByRole("columnheader", { name: surveys.createAndSubmit.matrix.columns[0], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[1], exact: true })
page.getByRole("columnheader", { name: surveys.createAndSubmit.matrix.columns[1], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[2], exact: true })
page.getByRole("columnheader", { name: surveys.createAndSubmit.matrix.columns[2], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[3], exact: true })
page.getByRole("columnheader", { name: surveys.createAndSubmit.matrix.columns[3], exact: true })
).toBeVisible();
await expect(page.locator("#questionCard-9").getByRole("button", { name: "Next" })).toBeVisible();
await expect(page.locator("#questionCard-9").getByRole("button", { name: "Back" })).toBeVisible();
@@ -895,16 +895,16 @@ test.describe("Testing Survey with advanced logic", async () => {
page.getByRole("rowheader", { name: surveys.createWithLogicAndSubmit.matrix.rows[2] })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[0], exact: true })
page.getByRole("columnheader", { name: surveys.createWithLogicAndSubmit.matrix.columns[0], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[1], exact: true })
page.getByRole("columnheader", { name: surveys.createWithLogicAndSubmit.matrix.columns[1], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[2], exact: true })
page.getByRole("columnheader", { name: surveys.createWithLogicAndSubmit.matrix.columns[2], exact: true })
).toBeVisible();
await expect(
page.getByRole("cell", { name: surveys.createWithLogicAndSubmit.matrix.columns[3], exact: true })
page.getByRole("columnheader", { name: surveys.createWithLogicAndSubmit.matrix.columns[3], exact: true })
).toBeVisible();
await expect(page.locator("#questionCard-7").getByRole("button", { name: "Next" })).toBeVisible();
await expect(page.locator("#questionCard-7").getByRole("button", { name: "Back" })).toBeVisible();
@@ -995,15 +995,15 @@ test.describe("Testing Survey with advanced logic", async () => {
const updatedUrl = currentUrl.replace("summary?share=true", "responses");
await page.goto(updatedUrl);
await page.waitForSelector("table#response-table");
await expect(page.getByRole("cell", { name: "score" })).toBeVisible();
const responseTable = page.locator("table#response-table");
await expect(responseTable).toBeVisible();
await expect(responseTable.getByRole("columnheader", { name: /^score$/i })).toBeVisible({
timeout: 15000,
});
await page.waitForLoadState("networkidle");
await page.waitForTimeout(5000);
await page.pause();
// Look for any cell containing "32" or a score-related value
const scoreCell = page.getByRole("cell").filter({ hasText: /^32/ });
await expect(scoreCell).toBeVisible({

View File

@@ -45,22 +45,22 @@
"i18n:validate": "pnpm scan-translations"
},
"dependencies": {
"react": "19.2.3",
"react-dom": "19.2.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"next": "16.1.6"
},
"devDependencies": {
"@azure/identity": "4.13.0",
"@azure/playwright": "1.0.0",
"@azure/playwright": "1.1.2",
"@formbricks/eslint-config": "workspace:*",
"@playwright/test": "1.56.1",
"eslint": "8.57.0",
"@playwright/test": "1.58.2",
"eslint": "8.57.1",
"glob": "^11.1.0",
"husky": "9.1.7",
"lint-staged": "16.0.0",
"rimraf": "6.0.1",
"tsx": "4.19.4",
"turbo": "2.5.3"
"lint-staged": "16.3.1",
"rimraf": "6.1.3",
"tsx": "4.21.0",
"turbo": "2.8.12"
},
"lint-staged": {
"(apps|packages)/**/*.{js,ts,jsx,tsx}": [
@@ -76,7 +76,7 @@
"engines": {
"node": ">=20.0.0"
},
"packageManager": "pnpm@10.28.2",
"packageManager": "pnpm@10.30.3",
"nextBundleAnalysis": {
"budget": 358400,
"budgetPercentIncreaseRed": 20,
@@ -101,7 +101,7 @@
"overrides": "Security fixes for transitive dependencies. Remove when upstream packages update: axios (CVE-2025-58754) - awaiting @boxyhq/saml-jackson update | node-forge (Dependabot #230) - awaiting @boxyhq/saml-jackson update | tar-fs (Dependabot #205) - awaiting upstream dependency updates | tar (Dependabot #249/#264) - awaiting @boxyhq/saml-jackson/sqlite3 dependency updates | typeorm (Dependabot #223) - awaiting @boxyhq/saml-jackson update | systeminformation (Dependabot #241) - awaiting @opentelemetry/host-metrics update | qs (Dependabot #245) - awaiting googleapis-common and stripe updates | preact (Dependabot #247) - awaiting next-auth update | fast-xml-parser (Dependabot #270) - awaiting @boxyhq/saml-jackson update | diff (Dependabot #269) - awaiting @microsoft/api-extractor update"
},
"patchedDependencies": {
"next-auth@4.24.12": "patches/next-auth@4.24.12.patch"
"next-auth@4.24.13": "patches/next-auth@4.24.13.patch"
}
}
}

View File

@@ -38,14 +38,14 @@
"author": "Formbricks <hola@formbricks.com>",
"dependencies": {
"@formbricks/logger": "workspace:*",
"redis": "5.8.1",
"redis": "5.11.0",
"zod": "3.25.76"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"vite": "6.4.1",
"vitest": "3.1.3",
"@vitest/coverage-v8": "3.1.3"
"vitest": "3.2.4",
"@vitest/coverage-v8": "3.2.4"
}
}

View File

@@ -3,16 +3,16 @@
"version": "0.0.0",
"private": true,
"devDependencies": {
"@next/eslint-plugin-next": "15.3.2",
"@typescript-eslint/eslint-plugin": "8.32.1",
"@typescript-eslint/parser": "8.32.1",
"@next/eslint-plugin-next": "15.5.12",
"@typescript-eslint/eslint-plugin": "8.56.1",
"@typescript-eslint/parser": "8.56.1",
"@vercel/style-guide": "6.0.0",
"eslint-config-next": "15.3.2",
"eslint-config-prettier": "10.1.5",
"eslint-config-turbo": "2.5.3",
"eslint-config-next": "15.5.12",
"eslint-config-prettier": "10.1.8",
"eslint-config-turbo": "2.8.12",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"eslint-plugin-react-refresh": "0.4.20",
"@vitest/eslint-plugin": "1.1.44"
"@vitest/eslint-plugin": "1.6.9"
}
}

View File

@@ -8,8 +8,8 @@
},
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "5.2.2",
"prettier": "3.5.3",
"prettier-plugin-tailwindcss": "0.6.11",
"prettier-plugin-sort-json": "4.1.1"
"prettier": "3.8.1",
"prettier-plugin-tailwindcss": "0.7.2",
"prettier-plugin-sort-json": "4.2.0"
}
}

View File

@@ -7,9 +7,9 @@
"clean": "rimraf node_modules dist turbo"
},
"devDependencies": {
"@types/node": "22.15.18",
"@types/react": "19.1.4",
"@types/react-dom": "19.1.5",
"typescript": "5.8.3"
"@types/node": "22.19.13",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"typescript": "5.9.3"
}
}

View File

@@ -48,8 +48,8 @@
},
"dependencies": {
"@formbricks/logger": "workspace:*",
"@paralleldrive/cuid2": "2.2.2",
"@prisma/client": "6.14.0",
"@paralleldrive/cuid2": "2.3.1",
"@prisma/client": "6.19.2",
"bcryptjs": "2.4.3",
"uuid": "11.1.0",
"zod": "3.25.76",
@@ -61,11 +61,11 @@
"@types/bcryptjs": "2.4.6",
"dotenv-cli": "8.0.0",
"glob": "11.1.0",
"prisma": "6.14.0",
"prisma-json-types-generator": "3.5.4",
"prisma": "6.19.2",
"prisma-json-types-generator": "3.6.2",
"ts-node": "10.9.2",
"tsx": "4.19.2",
"tsx": "4.21.0",
"vite": "6.4.1",
"vite-plugin-dts": "4.5.3"
"vite-plugin-dts": "4.5.4"
}
}

View File

@@ -1,8 +1,8 @@
import { createId } from "@paralleldrive/cuid2";
import fs from "node:fs/promises";
import path from "node:path";
import readline from "node:readline";
import { fileURLToPath } from "node:url";
import { createId } from "@paralleldrive/cuid2";
import { logger } from "@formbricks/logger";
const __filename = fileURLToPath(import.meta.url);

View File

@@ -1,9 +1,9 @@
import { type Prisma, 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 { type Prisma, PrismaClient } from "@prisma/client";
import { logger } from "@formbricks/logger";
const __filename = fileURLToPath(import.meta.url);

View File

@@ -13,18 +13,18 @@
"clean": "rimraf .turbo node_modules dist"
},
"dependencies": {
"@react-email/components": "1.0.6",
"react-email": "5.2.5"
"@react-email/components": "1.0.8",
"react-email": "5.2.9"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@formbricks/types": "workspace:*",
"@react-email/preview-server": "5.2.8",
"autoprefixer": "10.4.21",
"@react-email/preview-server": "5.2.9",
"autoprefixer": "10.4.27",
"clsx": "2.1.1",
"postcss": "8.5.3",
"tailwind-merge": "3.2.0",
"tailwindcss": "3.4.17"
"postcss": "8.5.8",
"tailwind-merge": "3.5.0",
"tailwindcss": "3.4.19"
}
}

View File

@@ -40,10 +40,10 @@
"devDependencies": {
"vite": "6.4.1",
"@formbricks/config-typescript": "workspace:*",
"vitest": "3.1.3",
"vitest": "3.2.4",
"@formbricks/eslint-config": "workspace:*",
"vite-plugin-dts": "4.5.3",
"@types/node": "^22.10.5",
"tsx": "^4.19.4"
"vite-plugin-dts": "4.5.4",
"@types/node": "^22.19.13",
"tsx": "^4.21.0"
}
}

View File

@@ -46,10 +46,10 @@
"@formbricks/config-typescript": "workspace:*",
"@trivago/prettier-plugin-sort-imports": "5.2.2",
"@formbricks/eslint-config": "workspace:*",
"@vitest/coverage-v8": "3.1.3",
"terser": "5.39.1",
"@vitest/coverage-v8": "3.2.4",
"terser": "5.46.0",
"vite": "6.4.1",
"vite-plugin-dts": "4.5.3",
"vitest": "3.1.3"
"vite-plugin-dts": "4.5.4",
"vitest": "3.2.4"
}
}

View File

@@ -1,9 +1,13 @@
/// <reference types="vitest" />
import { resolve } from "path";
import { defineConfig } from "vite";
import dts from "vite-plugin-dts";
import { defineConfig } from "vitest/config";
import type { ViteUserConfig } from "vitest/config";
import webPackageJson from "../../apps/web/package.json";
import { copyCompiledAssetsPlugin } from "../vite-plugins/copy-compiled-assets";
type VitestPluginOption = NonNullable<ViteUserConfig["plugins"]>[number];
export default defineConfig({
resolve: {
alias: {
@@ -29,12 +33,12 @@ export default defineConfig({
plugins: [
dts({
rollupTypes: true,
}),
}) as VitestPluginOption,
copyCompiledAssetsPlugin({
filename: "formbricks",
distDir: resolve(__dirname, "dist"),
skipDirectoryCheck: true, // Skip checking for subdirectories that might not exist
}),
}) as VitestPluginOption,
],
test: {
environment: "node",

View File

@@ -36,15 +36,15 @@
"author": "Formbricks <hola@formbricks.com>",
"dependencies": {
"zod": "3.25.76",
"pino": "10.0.0",
"pino": "10.3.1",
"pino-opentelemetry-transport": "2.0.0",
"pino-pretty": "13.1.1"
"pino-pretty": "13.1.3"
},
"devDependencies": {
"vite": "6.4.1",
"@formbricks/config-typescript": "workspace:*",
"vitest": "3.1.3",
"vitest": "3.2.4",
"@formbricks/eslint-config": "workspace:*",
"vite-plugin-dts": "4.5.3"
"vite-plugin-dts": "4.5.4"
}
}

View File

@@ -37,16 +37,16 @@
"author": "Formbricks <hola@formbricks.com>",
"dependencies": {
"@formbricks/logger": "workspace:*",
"@aws-sdk/client-s3": "3.971.0",
"@aws-sdk/s3-presigned-post": "3.971.0",
"@aws-sdk/s3-request-presigner": "3.971.0"
"@aws-sdk/client-s3": "3.1000.0",
"@aws-sdk/s3-presigned-post": "3.1000.0",
"@aws-sdk/s3-request-presigner": "3.1000.0"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"vite": "6.4.1",
"vite-plugin-dts": "4.5.3",
"vitest": "3.1.3",
"@vitest/coverage-v8": "3.1.3"
"vite-plugin-dts": "4.5.4",
"vitest": "3.2.4",
"@vitest/coverage-v8": "3.2.4"
}
}

View File

@@ -67,39 +67,39 @@
"react-dom": "^19.0.0"
},
"dependencies": {
"@formkit/auto-animate": "0.8.2",
"@radix-ui/react-checkbox": "1.3.1",
"@radix-ui/react-dropdown-menu": "2.1.14",
"@radix-ui/react-popover": "1.1.13",
"@formkit/auto-animate": "0.9.0",
"@radix-ui/react-checkbox": "1.3.3",
"@radix-ui/react-dropdown-menu": "2.1.16",
"@radix-ui/react-popover": "1.1.15",
"@radix-ui/react-progress": "1.1.8",
"@radix-ui/react-radio-group": "1.3.6",
"@radix-ui/react-slot": "1.2.2",
"@radix-ui/react-radio-group": "1.3.8",
"@radix-ui/react-slot": "1.2.4",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"date-fns": "4.1.0",
"isomorphic-dompurify": "2.33.0",
"lucide-react": "0.507.0",
"react-day-picker": "9.6.7",
"tailwind-merge": "3.2.0"
"isomorphic-dompurify": "2.36.0",
"lucide-react": "0.576.0",
"react-day-picker": "9.14.0",
"tailwind-merge": "3.5.0"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@storybook/react": "8.5.4",
"@storybook/react-vite": "8.5.4",
"@tailwindcss/postcss": "4.0.0",
"@tailwindcss/vite": "4.1.17",
"@types/react": "19.2.1",
"@types/react-dom": "19.2.1",
"@vitejs/plugin-react": "4.3.4",
"react": "19.2.1",
"react-dom": "19.2.1",
"rimraf": "6.0.1",
"tailwindcss": "4.1.1",
"@storybook/react": "8.6.17",
"@storybook/react-vite": "8.6.17",
"@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",
"react": "19.2.4",
"react-dom": "19.2.4",
"rimraf": "6.1.3",
"tailwindcss": "4.2.1",
"vite": "6.4.1",
"vite-plugin-dts": "4.5.3",
"vite-plugin-dts": "4.5.4",
"vite-tsconfig-paths": "5.1.4",
"@vitest/coverage-v8": "3.1.3",
"vitest": "3.1.3"
"@vitest/coverage-v8": "3.2.4",
"vitest": "3.2.4"
}
}

View File

@@ -31,9 +31,9 @@
},
"scripts": {
"dev": "concurrently -n \"ESM,UMD\" \"vite build --watch --mode dev\" \"BUILD_UMD=true vite build --watch --mode dev\"",
"build": "tsc && vite build && BUILD_UMD=true vite build",
"build:analyze": "tsc && ANALYZE=true vite build",
"build:dev": "tsc && vite build --mode dev",
"build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc && cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build && cross-env NODE_OPTIONS=--max-old-space-size=8192 BUILD_UMD=true vite build",
"build:analyze": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc && cross-env NODE_OPTIONS=--max-old-space-size=8192 ANALYZE=true vite build",
"build:dev": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc && cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode dev",
"go": "concurrently -n \"ESM,UMD\" \"vite build --watch --mode dev\" \"BUILD_UMD=true vite build --watch --mode dev\"",
"lint": "eslint src --fix --ext .ts,.js,.tsx,.jsx",
"preview": "vite preview",
@@ -45,29 +45,29 @@
"dependencies": {
"@calcom/embed-snippet": "1.3.3",
"@formbricks/survey-ui": "workspace:*",
"i18next": "25.5.2",
"i18next-icu": "2.4.0",
"isomorphic-dompurify": "2.33.0",
"preact": "10.28.2",
"react-i18next": "15.7.3"
"i18next": "25.8.13",
"i18next-icu": "2.4.3",
"isomorphic-dompurify": "2.36.0",
"preact": "10.28.4",
"react-i18next": "15.7.4"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@formbricks/i18n-utils": "workspace:*",
"@formbricks/types": "workspace:*",
"@preact/preset-vite": "2.10.1",
"@tailwindcss/postcss": "4.1.17",
"@preact/preset-vite": "2.10.3",
"@tailwindcss/postcss": "4.2.1",
"@testing-library/preact": "3.2.4",
"@types/react": "19.1.4",
"autoprefixer": "10.4.21",
"concurrently": "9.1.2",
"postcss": "8.5.3",
"rollup-plugin-visualizer": "6.0.5",
"tailwindcss": "4.1.17",
"terser": "5.39.1",
"@types/react": "19.2.14",
"autoprefixer": "10.4.27",
"concurrently": "9.2.1",
"postcss": "8.5.8",
"rollup-plugin-visualizer": "6.0.8",
"tailwindcss": "4.2.1",
"terser": "5.46.0",
"vite": "6.4.1",
"vite-plugin-dts": "4.5.3",
"vite-plugin-dts": "4.5.4",
"vite-tsconfig-paths": "5.1.4"
}
}

View File

@@ -9,10 +9,10 @@
"clean": "rimraf node_modules .turbo"
},
"dependencies": {
"@prisma/client": "6.14.0",
"@prisma/client": "6.19.2",
"zod": "3.25.76",
"zod-openapi": "4.2.4",
"node-html-parser": "7.0.1"
"node-html-parser": "7.1.0"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",

11346
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff