Compare commits

...

2 Commits

Author SHA1 Message Date
Bhagya Amarasinghe 0df5e26381 fix: handle license 403 as instance mismatch (#7458)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2026-03-12 10:46:44 +00:00
Matti Nannt 89bb3bcd84 chore: apply NCU minor upgrades fixups (#7460) 2026-03-12 10:44:18 +00:00
42 changed files with 1203 additions and 1294 deletions
+9 -9
View File
@@ -12,18 +12,18 @@
},
"devDependencies": {
"@chromatic-com/storybook": "^5.0.1",
"@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",
"@storybook/addon-a11y": "10.2.17",
"@storybook/addon-links": "10.2.17",
"@storybook/addon-onboarding": "10.2.17",
"@storybook/react-vite": "10.2.17",
"@typescript-eslint/eslint-plugin": "8.57.0",
"@tailwindcss/vite": "4.2.1",
"@typescript-eslint/parser": "8.56.1",
"@typescript-eslint/parser": "8.57.0",
"@vitejs/plugin-react": "5.1.4",
"eslint-plugin-react-refresh": "0.4.26",
"eslint-plugin-storybook": "10.2.14",
"storybook": "10.2.15",
"eslint-plugin-storybook": "10.2.17",
"storybook": "10.2.17",
"vite": "7.3.1",
"@storybook/addon-docs": "10.2.15"
"@storybook/addon-docs": "10.2.17"
}
}
+6 -3
View File
@@ -122,8 +122,11 @@ RUN chown -R nextjs:nextjs ./node_modules/.prisma && chmod -R 755 ./node_modules
COPY --from=installer /app/node_modules/@paralleldrive/cuid2 ./node_modules/@paralleldrive/cuid2
RUN chmod -R 755 ./node_modules/@paralleldrive/cuid2
COPY --from=installer /app/node_modules/uuid ./node_modules/uuid
RUN chmod -R 755 ./node_modules/uuid
# Runtime migrations import uuid v7 from the database package, so copy the
# database package's resolved install instead of the repo-root hoisted version.
COPY --from=installer /app/packages/database/node_modules/uuid ./node_modules/uuid
RUN chmod -R 755 ./node_modules/uuid \
&& node --input-type=module -e "import('uuid').then((module) => { if (typeof module.v7 !== 'function') throw new Error('uuid v7 missing in runtime image'); })"
COPY --from=installer /app/node_modules/@noble/hashes ./node_modules/@noble/hashes
RUN chmod -R 755 ./node_modules/@noble/hashes
@@ -166,4 +169,4 @@ RUN mkdir -p /home/nextjs/apps/web/uploads/ && \
VOLUME /home/nextjs/apps/web/uploads/
VOLUME /home/nextjs/apps/web/saml-connection
CMD ["/home/nextjs/start.sh"]
CMD ["/home/nextjs/start.sh"]
@@ -22,12 +22,10 @@ export const getTeamsByOrganizationId = reactCache(
},
});
const projectTeams = teams.map((team) => ({
return teams.map((team: TOrganizationTeam) => ({
id: team.id,
name: team.name,
}));
return projectTeams;
} catch (error) {
if (error instanceof Prisma.PrismaClientKnownRequestError) {
throw new DatabaseError(error.message);
@@ -7,21 +7,20 @@ import { useState } from "react";
import toast from "react-hot-toast";
import { useTranslation } from "react-i18next";
import { recheckLicenseAction } from "@/modules/ee/license-check/actions";
import type { TLicenseStatus } from "@/modules/ee/license-check/types/enterprise-license";
import { Alert, AlertDescription } from "@/modules/ui/components/alert";
import { Badge } from "@/modules/ui/components/badge";
import { Button } from "@/modules/ui/components/button";
import { SettingsCard } from "../../../components/SettingsCard";
type LicenseStatus = "active" | "expired" | "unreachable" | "invalid_license";
interface EnterpriseLicenseStatusProps {
status: LicenseStatus;
status: TLicenseStatus;
gracePeriodEnd?: Date;
environmentId: string;
}
const getBadgeConfig = (
status: LicenseStatus,
status: TLicenseStatus,
t: TFunction
): { type: "success" | "error" | "warning" | "gray"; label: string } => {
switch (status) {
@@ -29,6 +28,11 @@ const getBadgeConfig = (
return { type: "success", label: t("environments.settings.enterprise.license_status_active") };
case "expired":
return { type: "error", label: t("environments.settings.enterprise.license_status_expired") };
case "instance_mismatch":
return {
type: "error",
label: t("environments.settings.enterprise.license_status_instance_mismatch"),
};
case "unreachable":
return { type: "warning", label: t("environments.settings.enterprise.license_status_unreachable") };
case "invalid_license":
@@ -59,6 +63,8 @@ export const EnterpriseLicenseStatus = ({
if (result?.data) {
if (result.data.status === "unreachable") {
toast.error(t("environments.settings.enterprise.recheck_license_unreachable"));
} else if (result.data.status === "instance_mismatch") {
toast.error(t("environments.settings.enterprise.recheck_license_instance_mismatch"));
} else if (result.data.status === "invalid_license") {
toast.error(t("environments.settings.enterprise.recheck_license_invalid"));
} else {
@@ -128,6 +134,13 @@ export const EnterpriseLicenseStatus = ({
</AlertDescription>
</Alert>
)}
{status === "instance_mismatch" && (
<Alert variant="error" size="small">
<AlertDescription className="overflow-visible whitespace-normal">
{t("environments.settings.enterprise.license_instance_mismatch_description")}
</AlertDescription>
</Alert>
)}
<p className="border-t border-slate-100 pt-4 text-sm text-slate-500">
{t("environments.settings.enterprise.questions_please_reach_out_to")}{" "}
<a
@@ -94,7 +94,7 @@ const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
</PageHeader>
{hasLicense ? (
<EnterpriseLicenseStatus
status={licenseState.status as "active" | "expired" | "unreachable" | "invalid_license"}
status={licenseState.status}
gracePeriodEnd={
licenseState.status === "unreachable"
? new Date(licenseState.lastChecked.getTime() + GRACE_PERIOD_MS)
+3
View File
@@ -972,11 +972,13 @@ checksums:
environments/settings/enterprise/enterprise_features: 3271476140733924b2a2477c4fdf3d12
environments/settings/enterprise/get_an_enterprise_license_to_get_access_to_all_features: afd3c00f19097e88ed051800979eea44
environments/settings/enterprise/keep_full_control_over_your_data_privacy_and_security: 43aa041cc3e2b2fdd35d2d34659a6b7a
environments/settings/enterprise/license_instance_mismatch_description: 00f47e33ff54fca52ce9b125cd77fda5
environments/settings/enterprise/license_invalid_description: b500c22ab17893fdf9532d2bd94aa526
environments/settings/enterprise/license_status: f6f85c59074ca2455321bd5288d94be8
environments/settings/enterprise/license_status_active: 3e1ec025c4a50830bbb9ad57a176630a
environments/settings/enterprise/license_status_description: 828e4527f606471cd8cf58b55ff824f6
environments/settings/enterprise/license_status_expired: 63b27cccba4ab2143e0f5f3d46e4168a
environments/settings/enterprise/license_status_instance_mismatch: 2c85ca34eef67c5ca34477dc1eda68c0
environments/settings/enterprise/license_status_invalid: a4bfd3787fc0bf0a38db61745bd25cec
environments/settings/enterprise/license_status_unreachable: 202b110dab099f1167b13c326349e570
environments/settings/enterprise/license_unreachable_grace_period: c0587c9d79ac55ff2035fb8b8eec4433
@@ -987,6 +989,7 @@ checksums:
environments/settings/enterprise/questions_please_reach_out_to: ac4be65ffef9349eaeb137c254d3fee7
environments/settings/enterprise/recheck_license: b913b64f89df184b5059710f4a0b26fa
environments/settings/enterprise/recheck_license_failed: dd410acbb8887625cf194189f832dd7c
environments/settings/enterprise/recheck_license_instance_mismatch: 655cd1cce2f25b100439d8725c1e72f2
environments/settings/enterprise/recheck_license_invalid: 58f41bc208692b7d53b975dfcf9f4ad8
environments/settings/enterprise/recheck_license_success: 700ddd805be904a415f614de3df1da78
environments/settings/enterprise/recheck_license_unreachable: 0ca81bd89595a9da24bc94dcef132175
+1 -1
View File
@@ -55,7 +55,7 @@ describe("Crypto Utils", () => {
// But both should verify correctly
expect(await verifySecret(secret, hash1)).toBe(true);
expect(await verifySecret(secret, hash2)).toBe(true);
});
}, 15000);
test("should use custom cost factor", async () => {
const secret = "test-secret-123";
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Unternehmensfunktionen",
"get_an_enterprise_license_to_get_access_to_all_features": "Hol dir eine Enterprise-Lizenz, um Zugriff auf alle Funktionen zu erhalten.",
"keep_full_control_over_your_data_privacy_and_security": "Behalte die volle Kontrolle über deine Daten, Privatsphäre und Sicherheit.",
"license_instance_mismatch_description": "Diese Lizenz ist derzeit an eine andere Formbricks-Instanz gebunden. Falls diese Installation neu aufgebaut oder verschoben wurde, bitte den Formbricks-Support, die vorherige Instanzbindung zu entfernen.",
"license_invalid_description": "Der Lizenzschlüssel in deiner ENTERPRISE_LICENSE_KEY-Umgebungsvariable ist nicht gültig. Bitte überprüfe auf Tippfehler oder fordere einen neuen Schlüssel an.",
"license_status": "Lizenzstatus",
"license_status_active": "Aktiv",
"license_status_description": "Status deiner Enterprise-Lizenz.",
"license_status_expired": "Abgelaufen",
"license_status_instance_mismatch": "An andere Instanz gebunden",
"license_status_invalid": "Ungültige Lizenz",
"license_status_unreachable": "Nicht erreichbar",
"license_unreachable_grace_period": "Der Lizenzserver ist nicht erreichbar. Deine Enterprise-Funktionen bleiben während einer 3-tägigen Kulanzfrist bis zum {gracePeriodEnd} aktiv.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Fragen? Bitte melde Dich bei",
"recheck_license": "Lizenz erneut prüfen",
"recheck_license_failed": "Lizenzprüfung fehlgeschlagen. Der Lizenzserver ist möglicherweise nicht erreichbar.",
"recheck_license_instance_mismatch": "Diese Lizenz ist an eine andere Formbricks-Instanz gebunden. Bitte den Formbricks-Support, die vorherige Bindung zu entfernen.",
"recheck_license_invalid": "Der Lizenzschlüssel ist ungültig. Bitte überprüfe deinen ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Lizenzprüfung erfolgreich",
"recheck_license_unreachable": "Lizenzserver ist nicht erreichbar. Bitte versuche es später erneut.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Enterprise Features",
"get_an_enterprise_license_to_get_access_to_all_features": "Get an Enterprise license to get access to all features.",
"keep_full_control_over_your_data_privacy_and_security": "Keep full control over your data privacy and security.",
"license_instance_mismatch_description": "This license is currently bound to a different Formbricks instance. If this installation was rebuilt or moved, ask Formbricks support to disconnect the previous instance binding.",
"license_invalid_description": "The license key in your ENTERPRISE_LICENSE_KEY environment variable is not valid. Please check for typos or request a new key.",
"license_status": "License Status",
"license_status_active": "Active",
"license_status_description": "Status of your enterprise license.",
"license_status_expired": "Expired",
"license_status_instance_mismatch": "Bound to Another Instance",
"license_status_invalid": "Invalid License",
"license_status_unreachable": "Unreachable",
"license_unreachable_grace_period": "License server cannot be reached. Your enterprise features remain active during a 3-day grace period ending {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Questions? Please reach out to",
"recheck_license": "Recheck license",
"recheck_license_failed": "License check failed. The license server may be unreachable.",
"recheck_license_instance_mismatch": "This license is bound to a different Formbricks instance. Ask Formbricks support to disconnect the previous binding.",
"recheck_license_invalid": "The license key is invalid. Please verify your ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "License check successful",
"recheck_license_unreachable": "License server is unreachable. Please try again later.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Características empresariales",
"get_an_enterprise_license_to_get_access_to_all_features": "Obtén una licencia empresarial para acceder a todas las características.",
"keep_full_control_over_your_data_privacy_and_security": "Mantén el control total sobre la privacidad y seguridad de tus datos.",
"license_instance_mismatch_description": "Esta licencia está actualmente vinculada a una instancia diferente de Formbricks. Si esta instalación fue reconstruida o migrada, solicita al soporte de Formbricks que desconecte la vinculación de la instancia anterior.",
"license_invalid_description": "La clave de licencia en tu variable de entorno ENTERPRISE_LICENSE_KEY no es válida. Por favor, comprueba si hay errores tipográficos o solicita una clave nueva.",
"license_status": "Estado de la licencia",
"license_status_active": "Activa",
"license_status_description": "Estado de tu licencia enterprise.",
"license_status_expired": "Caducada",
"license_status_instance_mismatch": "Vinculada a Otra Instancia",
"license_status_invalid": "Licencia no válida",
"license_status_unreachable": "Inaccesible",
"license_unreachable_grace_period": "No se puede acceder al servidor de licencias. Tus funciones empresariales permanecen activas durante un período de gracia de 3 días que finaliza el {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "¿Preguntas? Por favor, contacta con",
"recheck_license": "Volver a comprobar licencia",
"recheck_license_failed": "Error al comprobar la licencia. Es posible que el servidor de licencias no esté disponible.",
"recheck_license_instance_mismatch": "Esta licencia está vinculada a una instancia diferente de Formbricks. Solicita al soporte de Formbricks que desconecte la vinculación anterior.",
"recheck_license_invalid": "La clave de licencia no es válida. Por favor, verifica tu ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Comprobación de licencia correcta",
"recheck_license_unreachable": "El servidor de licencias no está disponible. Inténtalo de nuevo más tarde.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Fonctionnalités d'entreprise",
"get_an_enterprise_license_to_get_access_to_all_features": "Obtenez une licence Entreprise pour accéder à toutes les fonctionnalités.",
"keep_full_control_over_your_data_privacy_and_security": "Gardez un contrôle total sur la confidentialité et la sécurité de vos données.",
"license_instance_mismatch_description": "Cette licence est actuellement liée à une autre instance Formbricks. Si cette installation a été reconstruite ou déplacée, demande au support Formbricks de déconnecter la liaison de l'instance précédente.",
"license_invalid_description": "La clé de licence dans votre variable d'environnement ENTERPRISE_LICENSE_KEY n'est pas valide. Veuillez vérifier les fautes de frappe ou demander une nouvelle clé.",
"license_status": "Statut de la licence",
"license_status_active": "Active",
"license_status_description": "Statut de votre licence entreprise.",
"license_status_expired": "Expirée",
"license_status_instance_mismatch": "Liée à une autre instance",
"license_status_invalid": "Licence invalide",
"license_status_unreachable": "Inaccessible",
"license_unreachable_grace_period": "Le serveur de licence est injoignable. Vos fonctionnalités entreprise restent actives pendant une période de grâce de 3 jours se terminant le {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Des questions ? Veuillez contacter",
"recheck_license": "Revérifier la licence",
"recheck_license_failed": "La vérification de la licence a échoué. Le serveur de licences est peut-être inaccessible.",
"recheck_license_instance_mismatch": "Cette licence est liée à une autre instance Formbricks. Demande au support Formbricks de déconnecter la liaison précédente.",
"recheck_license_invalid": "La clé de licence est invalide. Veuillez vérifier votre ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Vérification de la licence réussie",
"recheck_license_unreachable": "Le serveur de licences est inaccessible. Veuillez réessayer plus tard.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Vállalati funkciók",
"get_an_enterprise_license_to_get_access_to_all_features": "Vállalati licenc megszerzése az összes funkcióhoz való hozzáféréshez.",
"keep_full_control_over_your_data_privacy_and_security": "Az adatvédelem és biztonság fölötti rendelkezés teljes kézben tartása.",
"license_instance_mismatch_description": "Ez a licenc jelenleg egy másik Formbricks példányhoz van kötve. Amennyiben ez a telepítés újra lett építve vagy áthelyezésre került, kérje a Formbricks ügyfélszolgálatát, hogy bontsa fel az előző példány kötését.",
"license_invalid_description": "Az ENTERPRISE_LICENSE_KEY környezeti változóban lévő licenckulcs nem érvényes. Ellenőrizze, hogy nem gépelte-e el, vagy kérjen új kulcsot.",
"license_status": "Licencállapot",
"license_status_active": "Aktív",
"license_status_description": "A vállalati licenc állapota.",
"license_status_expired": "Lejárt",
"license_status_instance_mismatch": "Másik Példányhoz Kötve",
"license_status_invalid": "Érvénytelen licenc",
"license_status_unreachable": "Nem érhető el",
"license_unreachable_grace_period": "A licenckiszolgálót nem lehet elérni. A vállalati funkciók egy 3 napos türelmi időszak alatt aktívak maradnak, egészen eddig: {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Kérdése van? Írjon nekünk erre az e-mail-címre:",
"recheck_license": "Licenc újraellenőrzése",
"recheck_license_failed": "A licencellenőrzés nem sikerült. Lehet, hogy a licenckiszolgáló nem érhető el.",
"recheck_license_instance_mismatch": "Ez a licenc egy másik Formbricks példányhoz van kötve. Kérje a Formbricks ügyfélszolgálatát, hogy bontsa fel az előző kötést.",
"recheck_license_invalid": "A licenckulcs érvénytelen. Ellenőrizze az ENTERPRISE_LICENSE_KEY értékét.",
"recheck_license_success": "A licencellenőrzés sikeres",
"recheck_license_unreachable": "A licenckiszolgáló nem érhető el. Próbálja meg később újra.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "エンタープライズ機能",
"get_an_enterprise_license_to_get_access_to_all_features": "すべての機能にアクセスするには、エンタープライズライセンスを取得してください。",
"keep_full_control_over_your_data_privacy_and_security": "データのプライバシーとセキュリティを完全に制御できます。",
"license_instance_mismatch_description": "このライセンスは現在、別のFormbricksインスタンスに紐付けられています。このインストールが再構築または移動された場合は、Formbricksサポートに連絡して、以前のインスタンスの紐付けを解除してもらってください。",
"license_invalid_description": "ENTERPRISE_LICENSE_KEY環境変数のライセンスキーが無効です。入力ミスがないか確認するか、新しいキーをリクエストしてください。",
"license_status": "ライセンスステータス",
"license_status_active": "有効",
"license_status_description": "エンタープライズライセンスのステータス。",
"license_status_expired": "期限切れ",
"license_status_instance_mismatch": "別のインスタンスに紐付け済み",
"license_status_invalid": "無効なライセンス",
"license_status_unreachable": "接続不可",
"license_unreachable_grace_period": "ライセンスサーバーに接続できません。エンタープライズ機能は{gracePeriodEnd}までの3日間の猶予期間中は引き続き利用できます。",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "質問はありますか?こちらまでお問い合わせください",
"recheck_license": "ライセンスを再確認",
"recheck_license_failed": "ライセンスの確認に失敗しました。ライセンスサーバーに接続できない可能性があります。",
"recheck_license_instance_mismatch": "このライセンスは別のFormbricksインスタンスに紐付けられています。Formbricksサポートに連絡して、以前の紐付けを解除してもらってください。",
"recheck_license_invalid": "ライセンスキーが無効です。ENTERPRISE_LICENSE_KEYを確認してください。",
"recheck_license_success": "ライセンスの確認に成功しました",
"recheck_license_unreachable": "ライセンスサーバーに接続できません。後ほど再度お試しください。",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Enterprise-functies",
"get_an_enterprise_license_to_get_access_to_all_features": "Ontvang een Enterprise-licentie om toegang te krijgen tot alle functies.",
"keep_full_control_over_your_data_privacy_and_security": "Houd de volledige controle over de privacy en beveiliging van uw gegevens.",
"license_instance_mismatch_description": "Deze licentie is momenteel gekoppeld aan een andere Formbricks-instantie. Als deze installatie is herbouwd of verplaatst, vraag dan Formbricks-support om de vorige instantiekoppeling te verbreken.",
"license_invalid_description": "De licentiesleutel in je ENTERPRISE_LICENSE_KEY omgevingsvariabele is niet geldig. Controleer op typefouten of vraag een nieuwe sleutel aan.",
"license_status": "Licentiestatus",
"license_status_active": "Actief",
"license_status_description": "Status van je enterprise-licentie.",
"license_status_expired": "Verlopen",
"license_status_instance_mismatch": "Gekoppeld aan Andere Instantie",
"license_status_invalid": "Ongeldige licentie",
"license_status_unreachable": "Niet bereikbaar",
"license_unreachable_grace_period": "Licentieserver is niet bereikbaar. Je enterprise functies blijven actief tijdens een respijtperiode van 3 dagen die eindigt op {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Vragen? Neem contact op met",
"recheck_license": "Licentie opnieuw controleren",
"recheck_license_failed": "Licentiecontrole mislukt. De licentieserver is mogelijk niet bereikbaar.",
"recheck_license_instance_mismatch": "Deze licentie is gekoppeld aan een andere Formbricks-instantie. Vraag Formbricks-support om de vorige koppeling te verbreken.",
"recheck_license_invalid": "De licentiesleutel is ongeldig. Controleer je ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Licentiecontrole geslaagd",
"recheck_license_unreachable": "Licentieserver is niet bereikbaar. Probeer het later opnieuw.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Recursos Empresariais",
"get_an_enterprise_license_to_get_access_to_all_features": "Adquira uma licença Enterprise para ter acesso a todos os recursos.",
"keep_full_control_over_your_data_privacy_and_security": "Mantenha controle total sobre a privacidade e segurança dos seus dados.",
"license_instance_mismatch_description": "Esta licença está atualmente vinculada a uma instância diferente do Formbricks. Se esta instalação foi reconstruída ou movida, peça ao suporte do Formbricks para desconectar a vinculação da instância anterior.",
"license_invalid_description": "A chave de licença na sua variável de ambiente ENTERPRISE_LICENSE_KEY não é válida. Verifique se há erros de digitação ou solicite uma nova chave.",
"license_status": "Status da licença",
"license_status_active": "Ativa",
"license_status_description": "Status da sua licença enterprise.",
"license_status_expired": "Expirada",
"license_status_instance_mismatch": "Vinculada a Outra Instância",
"license_status_invalid": "Licença inválida",
"license_status_unreachable": "Inacessível",
"license_unreachable_grace_period": "O servidor de licenças não pode ser alcançado. Seus recursos empresariais permanecem ativos durante um período de carência de 3 dias que termina em {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Perguntas? Entre em contato com",
"recheck_license": "Verificar licença novamente",
"recheck_license_failed": "Falha na verificação da licença. O servidor de licenças pode estar inacessível.",
"recheck_license_instance_mismatch": "Esta licença está vinculada a uma instância diferente do Formbricks. Peça ao suporte do Formbricks para desconectar a vinculação anterior.",
"recheck_license_invalid": "A chave de licença é inválida. Verifique sua ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Verificação da licença bem-sucedida",
"recheck_license_unreachable": "Servidor de licenças inacessível. Por favor, tente novamente mais tarde.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Funcionalidades da Empresa",
"get_an_enterprise_license_to_get_access_to_all_features": "Obtenha uma licença Enterprise para ter acesso a todas as funcionalidades.",
"keep_full_control_over_your_data_privacy_and_security": "Mantenha controlo total sobre a privacidade e segurança dos seus dados.",
"license_instance_mismatch_description": "Esta licença está atualmente associada a uma instância Formbricks diferente. Se esta instalação foi reconstruída ou movida, pede ao suporte da Formbricks para desconectar a associação da instância anterior.",
"license_invalid_description": "A chave de licença na sua variável de ambiente ENTERPRISE_LICENSE_KEY não é válida. Por favor, verifique se existem erros de digitação ou solicite uma nova chave.",
"license_status": "Estado da licença",
"license_status_active": "Ativa",
"license_status_description": "Estado da sua licença empresarial.",
"license_status_expired": "Expirada",
"license_status_instance_mismatch": "Associada a Outra Instância",
"license_status_invalid": "Licença inválida",
"license_status_unreachable": "Inacessível",
"license_unreachable_grace_period": "Não é possível contactar o servidor de licenças. As suas funcionalidades empresariais permanecem ativas durante um período de tolerância de 3 dias que termina a {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Questões? Por favor entre em contacto com",
"recheck_license": "Verificar licença novamente",
"recheck_license_failed": "A verificação da licença falhou. O servidor de licenças pode estar inacessível.",
"recheck_license_instance_mismatch": "Esta licença está associada a uma instância Formbricks diferente. Pede ao suporte da Formbricks para desconectar a associação anterior.",
"recheck_license_invalid": "A chave de licença é inválida. Por favor, verifique a sua ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Verificação da licença bem-sucedida",
"recheck_license_unreachable": "O servidor de licenças está inacessível. Por favor, tenta novamente mais tarde.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Funcții Enterprise",
"get_an_enterprise_license_to_get_access_to_all_features": "Obțineți o licență Enterprise pentru a avea acces la toate funcționalitățile.",
"keep_full_control_over_your_data_privacy_and_security": "Mențineți controlul complet asupra confidențialității și securității datelor dumneavoastră.",
"license_instance_mismatch_description": "Această licență este în prezent asociată cu o altă instanță Formbricks. Dacă această instalare a fost reconstruită sau mutată, solicită echipei de suport Formbricks să deconecteze asocierea cu instanța anterioară.",
"license_invalid_description": "Cheia de licență din variabila de mediu ENTERPRISE_LICENSE_KEY nu este validă. Te rugăm să verifici dacă există greșeli de scriere sau să soliciți o cheie nouă.",
"license_status": "Stare licență",
"license_status_active": "Activă",
"license_status_description": "Starea licenței tale enterprise.",
"license_status_expired": "Expirată",
"license_status_instance_mismatch": "Asociată cu Altă Instanță",
"license_status_invalid": "Licență invalidă",
"license_status_unreachable": "Indisponibilă",
"license_unreachable_grace_period": "Serverul de licențe nu poate fi contactat. Funcționalitățile enterprise rămân active timp de 3 zile, până la data de {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Întrebări? Vă rugăm să trimiteți mesaj către",
"recheck_license": "Verifică din nou licența",
"recheck_license_failed": "Verificarea licenței a eșuat. Serverul de licențe poate fi indisponibil.",
"recheck_license_instance_mismatch": "Această licență este asociată cu o altă instanță Formbricks. Solicită echipei de suport Formbricks să deconecteze asocierea anterioară.",
"recheck_license_invalid": "Cheia de licență este invalidă. Te rugăm să verifici variabila ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Licența a fost verificată cu succes",
"recheck_license_unreachable": "Serverul de licențe este indisponibil. Te rugăm să încerci din nou mai târziu.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Функции для предприятий",
"get_an_enterprise_license_to_get_access_to_all_features": "Получите корпоративную лицензию для доступа ко всем функциям.",
"keep_full_control_over_your_data_privacy_and_security": "Полный контроль над конфиденциальностью и безопасностью ваших данных.",
"license_instance_mismatch_description": "Эта лицензия в данный момент привязана к другому экземпляру Formbricks. Если эта установка была пересобрана или перемещена, обратитесь в службу поддержки Formbricks для отключения предыдущей привязки экземпляра.",
"license_invalid_description": "Ключ лицензии в переменной окружения ENTERPRISE_LICENSE_KEY недействителен. Проверь, нет ли опечаток, или запроси новый ключ.",
"license_status": "Статус лицензии",
"license_status_active": "Активна",
"license_status_description": "Статус вашей корпоративной лицензии.",
"license_status_expired": "Срок действия истёк",
"license_status_instance_mismatch": "Привязана к другому экземпляру",
"license_status_invalid": "Недействительная лицензия",
"license_status_unreachable": "Недоступна",
"license_unreachable_grace_period": "Не удаётся подключиться к серверу лицензий. Корпоративные функции останутся активными в течение 3-дневного льготного периода, который закончится {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Вопросы? Свяжитесь с",
"recheck_license": "Проверить лицензию ещё раз",
"recheck_license_failed": "Не удалось проверить лицензию. Сервер лицензий может быть недоступен.",
"recheck_license_instance_mismatch": "Эта лицензия привязана к другому экземпляру Formbricks. Обратитесь в службу поддержки Formbricks для отключения предыдущей привязки.",
"recheck_license_invalid": "Ключ лицензии недействителен. Пожалуйста, проверь свою переменную ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Проверка лицензии прошла успешно",
"recheck_license_unreachable": "Сервер лицензий недоступен. Пожалуйста, попробуй позже.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "Enterprise-funktioner",
"get_an_enterprise_license_to_get_access_to_all_features": "Skaffa en Enterprise-licens för att få tillgång till alla funktioner.",
"keep_full_control_over_your_data_privacy_and_security": "Behåll full kontroll över din datasekretess och säkerhet.",
"license_instance_mismatch_description": "Den här licensen är för närvarande kopplad till en annan Formbricks-instans. Om den här installationen har återuppbyggts eller flyttats, be Formbricks support att koppla bort den tidigare instansbindningen.",
"license_invalid_description": "Licensnyckeln i din ENTERPRISE_LICENSE_KEY-miljövariabel är ogiltig. Kontrollera om det finns stavfel eller begär en ny nyckel.",
"license_status": "Licensstatus",
"license_status_active": "Aktiv",
"license_status_description": "Status för din företagslicens.",
"license_status_expired": "Utgången",
"license_status_instance_mismatch": "Kopplad till en annan instans",
"license_status_invalid": "Ogiltig licens",
"license_status_unreachable": "Otillgänglig",
"license_unreachable_grace_period": "Licensservern kan inte nås. Dina enterprise-funktioner är aktiva under en 3-dagars respitperiod som slutar {gracePeriodEnd}.",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "Frågor? Kontakta",
"recheck_license": "Kontrollera licensen igen",
"recheck_license_failed": "Licenskontrollen misslyckades. Licensservern kan vara otillgänglig.",
"recheck_license_instance_mismatch": "Den här licensen är kopplad till en annan Formbricks-instans. Be Formbricks support att koppla bort den tidigare bindningen.",
"recheck_license_invalid": "Licensnyckeln är ogiltig. Kontrollera din ENTERPRISE_LICENSE_KEY.",
"recheck_license_success": "Licenskontrollen lyckades",
"recheck_license_unreachable": "Licensservern är otillgänglig. Försök igen senare.",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "企业 功能",
"get_an_enterprise_license_to_get_access_to_all_features": "获取 企业 许可证 来 访问 所有 功能。",
"keep_full_control_over_your_data_privacy_and_security": "保持 对 您 的 数据 隐私 和 安全 的 完全 控制。",
"license_instance_mismatch_description": "此许可证目前绑定到另一个 Formbricks 实例。如果此安装已重建或迁移,请联系 Formbricks 支持团队解除先前的实例绑定。",
"license_invalid_description": "你在 ENTERPRISE_LICENSE_KEY 环境变量中填写的许可证密钥无效。请检查是否有拼写错误,或者申请一个新的密钥。",
"license_status": "许可证状态",
"license_status_active": "已激活",
"license_status_description": "你的企业许可证状态。",
"license_status_expired": "已过期",
"license_status_instance_mismatch": "已绑定到其他实例",
"license_status_invalid": "许可证无效",
"license_status_unreachable": "无法访问",
"license_unreachable_grace_period": "无法连接到许可证服务器。在为期 3 天的宽限期内,你的企业功能仍然可用,宽限期将于 {gracePeriodEnd} 结束。",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "问题 请 联系",
"recheck_license": "重新检查许可证",
"recheck_license_failed": "许可证检查失败。许可证服务器可能无法访问。",
"recheck_license_instance_mismatch": "此许可证已绑定到另一个 Formbricks 实例。请联系 Formbricks 支持团队解除先前的绑定。",
"recheck_license_invalid": "许可证密钥无效。请确认你的 ENTERPRISE_LICENSE_KEY。",
"recheck_license_success": "许可证检查成功",
"recheck_license_unreachable": "许可证服务器无法访问,请稍后再试。",
+3
View File
@@ -1031,11 +1031,13 @@
"enterprise_features": "企業版功能",
"get_an_enterprise_license_to_get_access_to_all_features": "取得企業授權以存取所有功能。",
"keep_full_control_over_your_data_privacy_and_security": "完全掌控您的資料隱私權和安全性。",
"license_instance_mismatch_description": "此授權目前綁定至不同的 Formbricks 執行個體。如果此安裝已重建或移動,請聯繫 Formbricks 支援以解除先前執行個體的綁定。",
"license_invalid_description": "你在 ENTERPRISE_LICENSE_KEY 環境變數中填寫的授權金鑰無效。請檢查是否有輸入錯誤,或申請新的金鑰。",
"license_status": "授權狀態",
"license_status_active": "有效",
"license_status_description": "你的企業授權狀態。",
"license_status_expired": "已過期",
"license_status_instance_mismatch": "已綁定至其他執行個體",
"license_status_invalid": "授權無效",
"license_status_unreachable": "無法連線",
"license_unreachable_grace_period": "無法連線至授權伺服器。在 3 天的寬限期內,你的企業功能仍可使用,寬限期將於 {gracePeriodEnd} 結束。",
@@ -1046,6 +1048,7 @@
"questions_please_reach_out_to": "有任何問題?請聯絡",
"recheck_license": "重新檢查授權",
"recheck_license_failed": "授權檢查失敗。授權伺服器可能無法連線。",
"recheck_license_instance_mismatch": "此授權已綁定至不同的 Formbricks 執行個體。請聯繫 Formbricks 支援以解除先前的綁定。",
"recheck_license_invalid": "授權金鑰無效。請確認你的 ENTERPRISE_LICENSE_KEY。",
"recheck_license_success": "授權檢查成功",
"recheck_license_unreachable": "授權伺服器無法連線,請稍後再試。",
+1 -1
View File
@@ -125,7 +125,7 @@ describe("Auth Utils", () => {
expect(hash1).not.toBe(hash2);
expect(await verifyPassword(password, hash1)).toBe(true);
expect(await verifyPassword(password, hash2)).toBe(true);
});
}, 15000);
test("should hash complex passwords correctly", async () => {
const complexPassword = "MyC0mpl3x!P@ssw0rd#2024$%^&*()";
+7 -3
View File
@@ -75,9 +75,13 @@ export const recheckLicenseAction = authenticatedActionClient
try {
freshLicense = await fetchLicenseFresh();
} catch (error) {
// 400 = invalid license key — return directly so the UI shows the correct message
if (error instanceof LicenseApiError && error.status === 400) {
return { active: false, status: "invalid_license" as const };
// 400 = invalid license key, 403 = license bound to another instance.
// Return directly so the UI shows the correct message.
if (error instanceof LicenseApiError && (error.status === 400 || error.status === 403)) {
return {
active: false,
status: error.status === 400 ? ("invalid_license" as const) : ("instance_mismatch" as const),
};
}
throw error;
}
@@ -462,6 +462,37 @@ describe("License Core Logic", () => {
});
});
test("should return instance_mismatch when API returns 403", async () => {
vi.resetModules();
vi.doMock("@/lib/env", () => ({
env: {
ENTERPRISE_LICENSE_KEY: "test-license-key",
ENVIRONMENT: "production",
VERCEL_URL: "some.vercel.url",
FORMBRICKS_COM_URL: "https://app.formbricks.com",
HTTPS_PROXY: undefined,
HTTP_PROXY: undefined,
},
}));
const { getEnterpriseLicense } = await import("./license");
const fetch = (await import("node-fetch")).default as Mock;
mockCache.get.mockResolvedValue({ ok: true, data: null });
fetch.mockResolvedValueOnce({ ok: false, status: 403 } as any);
const license = await getEnterpriseLicense();
expect(license).toEqual({
active: false,
features: expect.objectContaining({ projects: 3 }),
lastChecked: expect.any(Date),
isPendingDowngrade: false,
fallbackLevel: "default" as const,
status: "instance_mismatch" as const,
});
});
test("should skip polling and fetch directly when Redis is unavailable (tryLock error)", async () => {
vi.resetModules();
vi.doMock("@/lib/env", () => ({
@@ -14,7 +14,7 @@ import { getInstanceId } from "@/lib/instance";
import {
TEnterpriseLicenseDetails,
TEnterpriseLicenseFeatures,
TEnterpriseLicenseStatusReturn,
TLicenseStatus,
} from "@/modules/ee/license-check/types/enterprise-license";
// Configuration
@@ -52,7 +52,7 @@ type TEnterpriseLicenseResult = {
lastChecked: Date;
isPendingDowngrade: boolean;
fallbackLevel: FallbackLevel;
status: TEnterpriseLicenseStatusReturn;
status: TLicenseStatus;
};
type TPreviousResult = {
@@ -407,8 +407,9 @@ const fetchLicenseFromServerInternal = async (retryCount = 0): Promise<TEnterpri
return fetchLicenseFromServerInternal(retryCount + 1);
}
// 400 = invalid license key — propagate so callers can distinguish from unreachable
if (res.status === 400) {
// 400 = invalid license key, 403 = license bound to another instance.
// Propagate both so callers can distinguish them from unreachable.
if (res.status === 400 || res.status === 403) {
throw error;
}
@@ -585,7 +586,7 @@ const computeLicenseState = async (
lastChecked: previousResult.lastChecked,
isPendingDowngrade: true,
fallbackLevel: "grace" as const,
status: (liveLicenseDetails?.status as TEnterpriseLicenseStatusReturn) ?? "unreachable",
status: liveLicenseDetails?.status ?? "unreachable",
};
memoryCache = { data: graceResult, timestamp: Date.now() };
return graceResult;
@@ -632,14 +633,15 @@ export const getEnterpriseLicense = reactCache(async (): Promise<TEnterpriseLice
try {
liveLicenseDetails = await fetchLicense();
} catch (error) {
if (error instanceof LicenseApiError && error.status === 400) {
if (error instanceof LicenseApiError && (error.status === 400 || error.status === 403)) {
const status = error.status === 400 ? "invalid_license" : "instance_mismatch";
const invalidResult: TEnterpriseLicenseResult = {
active: false,
features: DEFAULT_FEATURES,
lastChecked: new Date(),
isPendingDowngrade: false,
fallbackLevel: "default" as const,
status: "invalid_license" as const,
status,
};
memoryCache = { data: invalidResult, timestamp: Date.now() };
return invalidResult;
@@ -29,9 +29,10 @@ export const ZEnterpriseLicenseDetails = z.object({
export type TEnterpriseLicenseDetails = z.infer<typeof ZEnterpriseLicenseDetails>;
export type TEnterpriseLicenseStatusReturn =
export type TLicenseStatus =
| "active"
| "expired"
| "instance_mismatch"
| "unreachable"
| "invalid_license"
| "no-license";
+2 -2
View File
@@ -2,7 +2,7 @@ import type { TOrganizationStripeSubscriptionStatus } from "@formbricks/types/or
import { CLOUD_STRIPE_FEATURE_LOOKUP_KEYS } from "@/modules/billing/lib/stripe-catalog";
import type {
TEnterpriseLicenseFeatures,
TEnterpriseLicenseStatusReturn,
TLicenseStatus,
} from "@/modules/ee/license-check/types/enterprise-license";
export type TEntitlementSource = "cloud_stripe" | "self_hosted_license";
@@ -33,7 +33,7 @@ export type TOrganizationEntitlementsContext = {
source: TEntitlementSource;
features: TEntitlementFeature[];
limits: TEntitlementLimits;
licenseStatus: TEnterpriseLicenseStatusReturn;
licenseStatus: TLicenseStatus;
licenseFeatures: TEnterpriseLicenseFeatures | null;
stripeCustomerId: string | null;
subscriptionStatus: TOrganizationStripeSubscriptionStatus | null;
@@ -5,7 +5,10 @@ import { TMembership, ZMembership } from "@formbricks/types/memberships";
import { TOrganization, ZOrganization } from "@formbricks/types/organizations";
import { TProject, ZProject } from "@formbricks/types/project";
import { TUser, ZUser } from "@formbricks/types/user";
import { TEnterpriseLicenseFeatures } from "@/modules/ee/license-check/types/enterprise-license";
import {
TEnterpriseLicenseFeatures,
TLicenseStatus,
} from "@/modules/ee/license-check/types/enterprise-license";
import { TTeamPermission, ZTeamPermission } from "@/modules/ee/teams/project-teams/types/team";
// Type for the enterprise license returned by getEnterpriseLicense()
@@ -15,7 +18,7 @@ type TEnterpriseLicense = {
lastChecked: Date;
isPendingDowngrade: boolean;
fallbackLevel: string;
status: "active" | "expired" | "unreachable" | "no-license" | "invalid_license";
status: TLicenseStatus;
};
export const ZEnvironmentAuth = z.object({
@@ -5,6 +5,7 @@ import Link from "next/link";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { TUserLocale } from "@formbricks/types/user";
import type { TLicenseStatus } from "@/modules/ee/license-check/types/enterprise-license";
interface PendingDowngradeBannerProps {
lastChecked: Date;
@@ -12,7 +13,7 @@ interface PendingDowngradeBannerProps {
isPendingDowngrade: boolean;
environmentId: string;
locale: TUserLocale;
status: "active" | "expired" | "unreachable" | "no-license" | "invalid_license";
status: TLicenseStatus;
}
export const PendingDowngradeBanner = ({
+9 -9
View File
@@ -1,7 +1,7 @@
{
"name": "@formbricks/web",
"version": "0.0.0",
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.32.1",
"private": true,
"scripts": {
"clean": "rimraf .turbo node_modules .next coverage",
@@ -68,7 +68,7 @@
"@radix-ui/react-switch": "1.2.6",
"@radix-ui/react-tabs": "1.1.13",
"@radix-ui/react-tooltip": "1.2.8",
"@sentry/nextjs": "10.42.0",
"@sentry/nextjs": "10.43.0",
"@t3-oss/env-nextjs": "0.13.10",
"@tailwindcss/forms": "0.5.11",
"@tailwindcss/typography": "0.5.19",
@@ -82,11 +82,11 @@
"csv-parse": "6.1.0",
"date-fns": "4.1.0",
"file-loader": "6.2.0",
"framer-motion": "12.35.0",
"framer-motion": "12.35.2",
"googleapis": "171.4.0",
"heic-convert": "2.1.0",
"https-proxy-agent": "7.0.6",
"i18next": "25.8.14",
"i18next": "25.8.18",
"i18next-icu": "2.4.3",
"i18next-resources-to-backend": "1.2.1",
"jiti": "2.6.1",
@@ -97,9 +97,9 @@
"markdown-it": "14.1.1",
"next": "16.1.6",
"next-auth": "4.24.13",
"next-safe-action": "8.1.5",
"next-safe-action": "8.1.8",
"node-fetch": "3.3.2",
"nodemailer": "8.0.1",
"nodemailer": "8.0.2",
"otplib": "12.0.1",
"papaparse": "5.5.3",
"posthog-js": "1.360.0",
@@ -114,13 +114,13 @@
"react-dom": "19.2.4",
"react-hook-form": "7.71.2",
"react-hot-toast": "2.6.0",
"react-i18next": "16.5.4",
"react-i18next": "16.5.8",
"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": "20.4.0",
"stripe": "20.4.1",
"tailwind-merge": "3.5.0",
"tailwindcss": "3.4.19",
"ua-parser-js": "2.0.9",
@@ -142,7 +142,7 @@
"@types/nodemailer": "7.0.11",
"@types/papaparse": "5.5.2",
"@types/qrcode": "1.5.6",
"@types/sanitize-html": "2.16.0",
"@types/sanitize-html": "2.16.1",
"@types/ungap__structured-clone": "1.2.0",
"@vitest/coverage-v8": "4.0.18",
"autoprefixer": "10.4.27",
+1 -1
View File
@@ -181,7 +181,7 @@ afterEach(() => {
export const testInputValidation = async (service: Function, ...args: any[]): Promise<void> => {
test("throws a ValidationError if the inputs are invalid", async () => {
await expect(service(...args)).rejects.toThrow(ValidationError);
});
}, 15000);
};
vi.mock("@/lib/constants", () => ({
+5 -13
View File
@@ -54,10 +54,10 @@
"@playwright/test": "1.58.2",
"eslint": "8.57.1",
"husky": "9.1.7",
"lint-staged": "16.3.2",
"lint-staged": "16.3.3",
"rimraf": "6.1.3",
"tsx": "4.21.0",
"turbo": "2.8.13"
"turbo": "2.8.16"
},
"lint-staged": {
"(apps|packages)/**/*.{js,ts,jsx,tsx}": [
@@ -73,7 +73,7 @@
"engines": {
"node": ">=20.0.0"
},
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.32.1",
"nextBundleAnalysis": {
"budget": 358400,
"budgetPercentIncreaseRed": 20,
@@ -83,22 +83,14 @@
"pnpm": {
"overrides": {
"axios": ">=1.12.2",
"uuid": "11.1.0",
"node-forge": ">=1.3.2",
"tar-fs": "2.1.4",
"tar": ">=7.5.11",
"minimatch@~9.0": "9.0.9",
"typeorm": ">=0.3.26",
"systeminformation": "5.27.14",
"qs": ">=6.14.1",
"preact": ">=10.26.10",
"fast-xml-parser": "5.4.2",
"diff": ">=8.0.3",
"@isaacs/brace-expansion": ">=5.0.1",
"@microsoft/api-extractor": ">=7.57.6"
"diff": ">=8.0.3"
},
"comments": {
"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 (CVE-2026-23745/23950/24842/26960) - 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 (CVE-2026-25896/26278) - awaiting @boxyhq/saml-jackson update | diff (Dependabot #269) - awaiting @microsoft/api-extractor update | @isaacs/brace-expansion (Dependabot #271) - awaiting upstream updates | @microsoft/api-extractor - overridden until vite-plugin-dts lock resolution catches up | minimatch (CVE-2026-26996/27903/27904) - awaiting upstream updates"
"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 (CVE-2026-23745/23950/24842/26960) - awaiting @boxyhq/saml-jackson/sqlite3 dependency updates | typeorm (Dependabot #223) - awaiting @boxyhq/saml-jackson update | fast-xml-parser (CVE-2026-25896/26278) - awaiting exact upstream pin updates | diff (Dependabot #269) - awaiting upstream patch range adoption"
},
"patchedDependencies": {
"next-auth@4.24.13": "patches/next-auth@4.24.13.patch"
+5 -5
View File
@@ -4,15 +4,15 @@
"private": true,
"devDependencies": {
"@next/eslint-plugin-next": "15.5.12",
"@typescript-eslint/eslint-plugin": "8.56.1",
"@typescript-eslint/parser": "8.56.1",
"@typescript-eslint/eslint-plugin": "8.57.0",
"@typescript-eslint/parser": "8.57.0",
"@vercel/style-guide": "6.0.0",
"eslint-config-next": "15.5.12",
"eslint-config-prettier": "10.1.8",
"eslint-config-turbo": "2.8.12",
"eslint-config-turbo": "2.8.16",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"eslint-plugin-react-refresh": "0.4.20",
"@vitest/eslint-plugin": "1.6.9"
"eslint-plugin-react-refresh": "0.5.2",
"@vitest/eslint-plugin": "1.6.10"
}
}
+1 -1
View File
@@ -7,7 +7,7 @@
"clean": "rimraf node_modules dist turbo"
},
"devDependencies": {
"@types/node": "25.3.3",
"@types/node": "25.4.0",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"typescript": "5.9.3"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@formbricks/database",
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.32.1",
"private": true,
"version": "0.1.0",
"main": "./dist/index.cjs",
+1 -1
View File
@@ -13,7 +13,7 @@
"clean": "rimraf .turbo node_modules dist"
},
"dependencies": {
"@react-email/components": "1.0.8",
"@react-email/components": "1.0.9",
"react-email": "5.2.9"
},
"devDependencies": {
+1 -1
View File
@@ -40,7 +40,7 @@
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@types/node": "^25.3.3",
"@types/node": "^25.4.0",
"tsx": "^4.21.0",
"vite": "7.3.1",
"vite-plugin-dts": "4.5.4",
+1 -1
View File
@@ -38,7 +38,7 @@
"go": "vite build --watch --mode dev",
"lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"clean": "rimraf .turbo node_modules dist coverage",
"test": "vitest",
"test": "vitest run",
"test:coverage": "vitest run --coverage"
},
"author": "Formbricks <hola@formbricks.com>",
+3 -3
View File
@@ -37,9 +37,9 @@
"author": "Formbricks <hola@formbricks.com>",
"dependencies": {
"@formbricks/logger": "workspace:*",
"@aws-sdk/client-s3": "3.1002.0",
"@aws-sdk/s3-presigned-post": "3.1002.0",
"@aws-sdk/s3-request-presigner": "3.1002.0"
"@aws-sdk/client-s3": "3.1007.0",
"@aws-sdk/s3-presigned-post": "3.1007.0",
"@aws-sdk/s3-request-presigner": "3.1007.0"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
+4 -4
View File
@@ -59,7 +59,7 @@
"preview": "vite preview",
"clean": "rimraf .turbo node_modules dist coverage",
"ui:add": "npx shadcn@latest add",
"test": "vitest",
"test": "vitest run",
"test:coverage": "vitest run --coverage"
},
"peerDependencies": {
@@ -77,7 +77,7 @@
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"date-fns": "4.1.0",
"isomorphic-dompurify": "3.0.0",
"isomorphic-dompurify": "3.1.0",
"lucide-react": "0.577.0",
"react-day-picker": "9.14.0",
"tailwind-merge": "3.5.0"
@@ -85,8 +85,8 @@
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
"@formbricks/eslint-config": "workspace:*",
"@storybook/react": "10.2.15",
"@storybook/react-vite": "10.2.15",
"@storybook/react": "10.2.17",
"@storybook/react-vite": "10.2.17",
"@tailwindcss/postcss": "4.2.1",
"@tailwindcss/vite": "4.2.1",
"@types/react": "19.2.14",
+4 -4
View File
@@ -45,11 +45,11 @@
"dependencies": {
"@calcom/embed-snippet": "1.3.3",
"@formbricks/survey-ui": "workspace:*",
"i18next": "25.8.14",
"i18next": "25.8.18",
"i18next-icu": "2.4.3",
"isomorphic-dompurify": "3.0.0",
"preact": "10.28.4",
"react-i18next": "16.5.4"
"isomorphic-dompurify": "3.1.0",
"preact": "10.29.0",
"react-i18next": "16.5.8"
},
"devDependencies": {
"@formbricks/config-typescript": "workspace:*",
+1028 -1212
View File
File diff suppressed because it is too large Load Diff