From c9a50a6ff21c65fec3059821f5e5b9fb3982450f Mon Sep 17 00:00:00 2001 From: Matti Nannt Date: Thu, 23 Oct 2025 12:09:57 +0200 Subject: [PATCH 1/7] =?UTF-8?q?chore(deps-dev):=20bump=20the=20npm=5Fand?= =?UTF-8?q?=5Fyarn=20group=20across=209=20directories=20wit=E2=80=A6=20(#6?= =?UTF-8?q?730)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/storybook/package.json | 2 +- apps/web/package.json | 2 +- packages/cache/package.json | 2 +- packages/database/package.json | 2 +- packages/i18n-utils/package.json | 2 +- packages/js-core/package.json | 2 +- packages/logger/package.json | 2 +- packages/storage/package.json | 2 +- packages/surveys/package.json | 2 +- packages/vite-plugins/package.json | 2 +- pnpm-lock.yaml | 416 +++++++++++++++-------------- 11 files changed, 232 insertions(+), 204 deletions(-) diff --git a/apps/storybook/package.json b/apps/storybook/package.json index 24ad2bafe8..85ff2a6110 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -26,7 +26,7 @@ "eslint-plugin-storybook": "9.0.15", "prop-types": "15.8.1", "storybook": "9.0.15", - "vite": "6.3.6", + "vite": "6.4.1", "@storybook/addon-docs": "9.0.15" } } diff --git a/apps/web/package.json b/apps/web/package.json index 1aa01044f2..e5360cb509 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -158,7 +158,7 @@ "postcss": "8.5.3", "resize-observer-polyfill": "1.5.1", "ts-node": "10.9.2", - "vite": "6.3.6", + "vite": "6.4.1", "vite-tsconfig-paths": "5.1.4", "vitest": "3.1.3", "vitest-mock-extended": "3.1.0" diff --git a/packages/cache/package.json b/packages/cache/package.json index e7a96455f8..56cb9436c2 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -44,7 +44,7 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "vite": "6.3.6", + "vite": "6.4.1", "vitest": "3.1.3", "@vitest/coverage-v8": "3.1.3" } diff --git a/packages/database/package.json b/packages/database/package.json index 948514326a..46887c5131 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -56,7 +56,7 @@ "prisma": "6.14.0", "prisma-json-types-generator": "3.5.4", "ts-node": "10.9.2", - "vite": "6.3.6", + "vite": "6.4.1", "vite-plugin-dts": "4.5.3" } } diff --git a/packages/i18n-utils/package.json b/packages/i18n-utils/package.json index 16d7303e09..bf4ccafef8 100644 --- a/packages/i18n-utils/package.json +++ b/packages/i18n-utils/package.json @@ -31,7 +31,7 @@ "build": "tsc && vite build" }, "devDependencies": { - "vite": "6.3.6", + "vite": "6.4.1", "@formbricks/config-typescript": "workspace:*", "vitest": "3.1.3", "@formbricks/eslint-config": "workspace:*", diff --git a/packages/js-core/package.json b/packages/js-core/package.json index 39ce986378..ecb34ec4c8 100644 --- a/packages/js-core/package.json +++ b/packages/js-core/package.json @@ -48,7 +48,7 @@ "@formbricks/eslint-config": "workspace:*", "@vitest/coverage-v8": "3.1.3", "terser": "5.39.1", - "vite": "6.3.6", + "vite": "6.4.1", "vite-plugin-dts": "4.5.3", "vitest": "3.1.3" } diff --git a/packages/logger/package.json b/packages/logger/package.json index 7648618334..8b5557433f 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -40,7 +40,7 @@ "pino-pretty": "13.1.1" }, "devDependencies": { - "vite": "6.3.6", + "vite": "6.4.1", "@formbricks/config-typescript": "workspace:*", "vitest": "3.1.3", "@formbricks/eslint-config": "workspace:*", diff --git a/packages/storage/package.json b/packages/storage/package.json index 4eecb1ae59..81166951d8 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -44,7 +44,7 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", - "vite": "6.3.6", + "vite": "6.4.1", "vite-plugin-dts": "4.5.3", "vitest": "3.1.3", "@vitest/coverage-v8": "3.1.3" diff --git a/packages/surveys/package.json b/packages/surveys/package.json index 41d8c1a532..a2b7eb6daa 100644 --- a/packages/surveys/package.json +++ b/packages/surveys/package.json @@ -61,7 +61,7 @@ "postcss": "8.5.3", "tailwindcss": "3.4.17", "terser": "5.39.1", - "vite": "6.3.6", + "vite": "6.4.1", "vite-plugin-dts": "4.5.3", "vite-tsconfig-paths": "5.1.4" } diff --git a/packages/vite-plugins/package.json b/packages/vite-plugins/package.json index b736607183..1d9911c7e5 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.3.6" + "vite": "6.4.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cec7efc209..648c2c793d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,7 +75,7 @@ importers: version: 9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3)) '@storybook/react-vite': specifier: 9.0.15 - version: 9.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.50.1)(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 9.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.52.5)(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@typescript-eslint/eslint-plugin': specifier: 8.32.0 version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) @@ -84,7 +84,7 @@ importers: version: 8.32.0(eslint@8.57.0)(typescript@5.8.3) '@vitejs/plugin-react': specifier: 4.4.1 - version: 4.4.1(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.4.1(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) esbuild: specifier: 0.25.4 version: 0.25.4 @@ -98,8 +98,8 @@ importers: specifier: 9.0.15 version: 9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3) vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) apps/web: dependencies: @@ -519,11 +519,11 @@ importers: specifier: 10.9.2 version: 10.9.2(@types/node@22.15.18)(typescript@5.8.3) vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -553,8 +553,8 @@ importers: specifier: 3.1.3 version: 3.1.3(vitest@3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -668,11 +668,11 @@ importers: specifier: 10.9.2 version: 10.9.2(@types/node@22.15.18)(typescript@5.8.3) vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) packages/i18n-utils: devDependencies: @@ -683,11 +683,11 @@ importers: specifier: workspace:* version: link:../config-eslint vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -710,11 +710,11 @@ importers: specifier: 5.39.1 version: 5.39.1 vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -738,11 +738,11 @@ importers: specifier: workspace:* version: link:../config-eslint vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -772,11 +772,11 @@ importers: specifier: 3.1.3 version: 3.1.3(vitest@3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 version: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) @@ -825,7 +825,7 @@ importers: version: link:../types '@preact/preset-vite': specifier: 2.10.1 - version: 2.10.1(@babel/core@7.28.0)(preact@10.26.6)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 2.10.1(@babel/core@7.28.0)(preact@10.26.6)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@testing-library/preact': specifier: 3.2.4 version: 3.2.4(preact@10.26.6) @@ -848,14 +848,14 @@ importers: specifier: 5.39.1 version: 5.39.1 vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) packages/types: dependencies: @@ -885,8 +885,8 @@ importers: specifier: workspace:* version: link:../config-eslint vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) packages: @@ -3688,8 +3688,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.50.1': - resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] @@ -3698,8 +3698,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.50.1': - resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] @@ -3708,8 +3708,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.50.1': - resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] @@ -3718,8 +3718,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': - resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] @@ -3728,8 +3728,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.50.1': - resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] @@ -3738,8 +3738,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': - resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] @@ -3748,8 +3748,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': - resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] @@ -3758,8 +3758,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': - resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] @@ -3768,8 +3768,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.1': - resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] @@ -3778,28 +3778,28 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.1': - resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.46.1': resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.1': resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] @@ -3808,8 +3808,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': - resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] @@ -3818,8 +3818,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.1': - resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] @@ -3828,8 +3828,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.1': - resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] @@ -3838,8 +3838,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.1': - resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] @@ -3848,13 +3848,13 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.1': - resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.1': - resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} cpu: [arm64] os: [openharmony] @@ -3863,8 +3863,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.50.1': - resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] @@ -3873,18 +3873,23 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': - resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.46.1': resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': - resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] @@ -4687,6 +4692,9 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -6089,6 +6097,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -8518,10 +8535,6 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -9062,8 +9075,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.50.1: - resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -9372,6 +9385,9 @@ packages: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -9468,8 +9484,8 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + 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==} @@ -10048,8 +10064,8 @@ packages: vite: optional: true - vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + 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: @@ -12676,12 +12692,12 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: glob: 10.4.5 magic-string: 0.30.17 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: typescript: 5.8.3 @@ -13471,18 +13487,18 @@ snapshots: '@posthog/core@1.2.2': {} - '@preact/preset-vite@2.10.1(@babel/core@7.28.0)(preact@10.26.6)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@preact/preset-vite@2.10.1(@babel/core@7.28.0)(preact@10.26.6)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.8(preact@10.26.6)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@prefresh/vite': 2.4.8(preact@10.26.6)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.1 kolorist: 1.8.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - vite-prerender-plugin: 0.5.11(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite-prerender-plugin: 0.5.11(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) transitivePeerDependencies: - preact - supports-color @@ -13497,7 +13513,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.8(preact@10.26.6)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@prefresh/vite@2.4.8(preact@10.26.6)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -13505,7 +13521,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.26.6 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -14297,135 +14313,138 @@ snapshots: optionalDependencies: rollup: 4.46.1 - '@rollup/pluginutils@5.2.0(rollup@4.50.1)': + '@rollup/pluginutils@5.2.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.1 + rollup: 4.52.5 '@rollup/rollup-android-arm-eabi@4.46.1': optional: true - '@rollup/rollup-android-arm-eabi@4.50.1': + '@rollup/rollup-android-arm-eabi@4.52.5': optional: true '@rollup/rollup-android-arm64@4.46.1': optional: true - '@rollup/rollup-android-arm64@4.50.1': + '@rollup/rollup-android-arm64@4.52.5': optional: true '@rollup/rollup-darwin-arm64@4.46.1': optional: true - '@rollup/rollup-darwin-arm64@4.50.1': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true '@rollup/rollup-darwin-x64@4.46.1': optional: true - '@rollup/rollup-darwin-x64@4.50.1': + '@rollup/rollup-darwin-x64@4.52.5': optional: true '@rollup/rollup-freebsd-arm64@4.46.1': optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true '@rollup/rollup-freebsd-x64@4.46.1': optional: true - '@rollup/rollup-freebsd-x64@4.50.1': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true '@rollup/rollup-linux-arm-musleabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true '@rollup/rollup-linux-arm64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true '@rollup/rollup-linux-arm64-musl@4.46.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true '@rollup/rollup-linux-riscv64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true '@rollup/rollup-linux-riscv64-musl@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true '@rollup/rollup-linux-s390x-gnu@4.46.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true '@rollup/rollup-linux-x64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true '@rollup/rollup-linux-x64-musl@4.46.1': optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-openharmony-arm64@4.50.1': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true '@rollup/rollup-win32-arm64-msvc@4.46.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true '@rollup/rollup-win32-ia32-msvc@4.46.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true '@rollup/rollup-win32-x64-msvc@4.46.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@rtsao/scc@1.1.0': {} @@ -15307,12 +15326,12 @@ snapshots: dependencies: storybook: 9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3) - '@storybook/builder-vite@9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@storybook/builder-vite@9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@storybook/csf-plugin': 9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3)) storybook: 9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) '@storybook/csf-plugin@9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))': dependencies: @@ -15332,11 +15351,11 @@ snapshots: react-dom: 19.1.0(react@19.1.0) storybook: 9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3) - '@storybook/react-vite@9.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.50.1)(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@storybook/react-vite@9.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.52.5)(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) - '@rollup/pluginutils': 5.2.0(rollup@4.50.1) - '@storybook/builder-vite': 9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@storybook/builder-vite': 9.0.15(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@storybook/react': 9.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3))(typescript@5.8.3) find-up: 7.0.0 magic-string: 0.30.17 @@ -15346,7 +15365,7 @@ snapshots: resolve: 1.22.10 storybook: 9.0.15(@testing-library/dom@8.20.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - rollup - supports-color @@ -15538,6 +15557,12 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + optional: true + '@types/connect@3.4.38': dependencies: '@types/node': 22.15.18 @@ -16121,14 +16146,14 @@ snapshots: - supports-color - vitest - '@vitejs/plugin-react@4.4.1(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -16191,29 +16216,29 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.3(vite@6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.1.3(vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.1.3(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.1.3(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) optional: true '@vitest/pretty-format@3.1.3': @@ -16233,7 +16258,7 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 - strip-literal: 3.0.0 + strip-literal: 3.1.0 optional: true '@vitest/snapshot@3.1.3': @@ -17155,6 +17180,11 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + optional: true + decamelize@1.2.0: {} decimal.js@10.6.0: {} @@ -19896,12 +19926,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -20449,31 +20473,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.46.1 fsevents: 2.3.3 - rollup@4.50.1: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.1 - '@rollup/rollup-android-arm64': 4.50.1 - '@rollup/rollup-darwin-arm64': 4.50.1 - '@rollup/rollup-darwin-x64': 4.50.1 - '@rollup/rollup-freebsd-arm64': 4.50.1 - '@rollup/rollup-freebsd-x64': 4.50.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 - '@rollup/rollup-linux-arm-musleabihf': 4.50.1 - '@rollup/rollup-linux-arm64-gnu': 4.50.1 - '@rollup/rollup-linux-arm64-musl': 4.50.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 - '@rollup/rollup-linux-ppc64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-musl': 4.50.1 - '@rollup/rollup-linux-s390x-gnu': 4.50.1 - '@rollup/rollup-linux-x64-gnu': 4.50.1 - '@rollup/rollup-linux-x64-musl': 4.50.1 - '@rollup/rollup-openharmony-arm64': 4.50.1 - '@rollup/rollup-win32-arm64-msvc': 4.50.1 - '@rollup/rollup-win32-ia32-msvc': 4.50.1 - '@rollup/rollup-win32-x64-msvc': 4.50.1 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -20861,6 +20886,9 @@ snapshots: dependencies: type-fest: 0.7.1 + std-env@3.10.0: + optional: true + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: @@ -20991,7 +21019,7 @@ snapshots: strip-json-comments@5.0.3: {} - strip-literal@3.0.0: + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 optional: true @@ -21534,7 +21562,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -21555,7 +21583,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -21573,10 +21601,10 @@ snapshots: vite-node@3.2.4(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -21592,10 +21620,10 @@ snapshots: - yaml optional: true - vite-plugin-dts@4.5.3(@types/node@22.15.18)(rollup@4.50.1)(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): + vite-plugin-dts@4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.52.9(@types/node@22.15.18) - '@rollup/pluginutils': 5.2.0(rollup@4.50.1) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) '@volar/typescript': 2.4.22 '@vue/language-core': 2.2.0(typescript@5.8.3) compare-versions: 6.1.1 @@ -21605,13 +21633,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.3 optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-prerender-plugin@0.5.11(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): + vite-prerender-plugin@0.5.11(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.17 @@ -21619,37 +21647,37 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): + vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: - esbuild: 0.25.4 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.50.1 + postcss: 8.5.3 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.15.18 @@ -21659,13 +21687,13 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): + vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: - esbuild: 0.25.4 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.50.1 + postcss: 8.5.3 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.15.18 @@ -21684,7 +21712,7 @@ snapshots: vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.1.3(vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 @@ -21701,7 +21729,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -21724,7 +21752,7 @@ snapshots: vitest@3.1.3(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.1.3(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 @@ -21741,7 +21769,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.1.3(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -21763,27 +21791,27 @@ snapshots: vitest@3.2.4(@types/node@22.15.18)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: - '@types/chai': 5.2.2 + '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@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.1 + debug: 4.4.3 expect-type: 1.2.2 magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.4(@types/node@22.15.18)(jiti@2.5.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: From a5fa876aa307d8b1a552de9900ba42be2cf57f46 Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Thu, 23 Oct 2025 20:23:11 +0530 Subject: [PATCH 2/7] feat: refactor translation key management (#6717) Co-authored-by: Piyush Gupta Co-authored-by: Piyush Gupta <56182734+gupta-piyush19@users.noreply.github.com> Co-authored-by: Victor Hugo dos Santos <115753265+victorvhs017@users.noreply.github.com> Co-authored-by: pandeymangg Co-authored-by: Matti Nannt Co-authored-by: Matti Nannt Co-authored-by: Johannes Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com> --- .cursor/rules/i18n-management.mdc | 457 +++ .env.example | 4 + .../workflows/tolgee-missing-key-check.yml | 51 - .github/workflows/tolgee.yml | 95 - .github/workflows/translation-check.yml | 63 + .husky/pre-commit | 34 +- .tolgeerc.json | 51 - .vscode/settings.json | 6 +- apps/storybook/.storybook/preview.ts | 29 +- .../components/ConnectWithFormbricks.tsx | 4 +- .../OnboardingSetupInstructions.tsx | 4 +- .../[environmentId]/connect/page.tsx | 2 +- .../components/XMTemplateList.tsx | 4 +- .../xm-templates/lib/xm-templates.test.ts | 8 +- .../xm-templates/lib/xm-templates.ts | 18 +- .../[environmentId]/xm-templates/page.tsx | 2 +- .../landing/components/landing-sidebar.tsx | 4 +- .../[organizationId]/landing/page.tsx | 2 +- .../organizations/[organizationId]/layout.tsx | 2 +- .../projects/new/channel/page.tsx | 2 +- .../[organizationId]/projects/new/layout.tsx | 2 +- .../projects/new/mode/page.tsx | 2 +- .../settings/components/ProjectSettings.tsx | 4 +- .../projects/new/settings/page.tsx | 2 +- .../components/ConfirmationPage.tsx | 4 +- .../components/EnvironmentLayout.tsx | 2 +- .../components/EnvironmentSwitch.tsx | 4 +- .../components/MainNavigation.tsx | 4 +- .../components/WidgetStatusIndicator.tsx | 4 +- .../components/environment-breadcrumb.tsx | 4 +- .../components/organization-breadcrumb.tsx | 4 +- .../components/project-breadcrumb.tsx | 4 +- .../components/AddIntegrationModal.tsx | 9 +- .../components/BaseSelectDropdown.tsx | 4 +- .../airtable/components/ManageIntegration.tsx | 4 +- .../project/integrations/airtable/page.tsx | 2 +- .../components/AddIntegrationModal.tsx | 4 +- .../components/ManageIntegration.tsx | 4 +- .../integrations/google-sheets/loading.tsx | 4 +- .../integrations/google-sheets/page.tsx | 2 +- .../notion/components/AddIntegrationModal.tsx | 4 +- .../notion/components/ManageIntegration.tsx | 4 +- .../project/integrations/notion/loading.tsx | 4 +- .../project/integrations/notion/page.tsx | 2 +- .../project/integrations/page.tsx | 6 +- .../components/AddChannelMappingModal.tsx | 4 +- .../slack/components/ManageIntegration.tsx | 10 +- .../project/integrations/slack/page.tsx | 2 +- .../components/AccountSettingsNavbar.tsx | 4 +- .../settings/(account)/layout.tsx | 2 +- .../notifications/components/EditAlerts.tsx | 4 +- .../components/IntegrationsTip.tsx | 4 +- .../components/NotificationSwitch.tsx | 4 +- .../(account)/notifications/loading.tsx | 4 +- .../settings/(account)/notifications/page.tsx | 2 +- .../profile/components/AccountSecurity.tsx | 4 +- .../profile/components/DeleteAccount.tsx | 4 +- .../components/EditProfileDetailsForm.tsx | 4 +- .../password-confirmation-modal.tsx | 4 +- .../settings/(account)/profile/loading.tsx | 4 +- .../settings/(account)/profile/page.tsx | 2 +- .../(organization)/billing/loading.tsx | 2 +- .../components/OrganizationSettingsNavbar.tsx | 4 +- .../(organization)/enterprise/loading.tsx | 2 +- .../(organization)/enterprise/page.tsx | 2 +- .../general/components/DeleteOrganization.tsx | 6 +- .../components/EditOrganizationNameForm.tsx | 4 +- .../(organization)/general/loading.tsx | 2 +- .../settings/(organization)/general/page.tsx | 2 +- .../settings/(organization)/layout.tsx | 2 +- .../settings/components/SettingsCard.tsx | 4 +- .../components/EmptyInAppSurveys.tsx | 4 +- .../components/SurveyAnalysisNavigation.tsx | 4 +- .../responses/components/ResponseDataView.tsx | 7 +- .../responses/components/ResponseTable.tsx | 4 +- .../components/ResponseTableColumns.tsx | 8 +- .../(analysis)/responses/lib/utils.ts | 8 +- .../[surveyId]/(analysis)/responses/page.tsx | 2 +- .../summary/components/AddressSummary.tsx | 4 +- .../summary/components/CTASummary.tsx | 4 +- .../summary/components/CalSummary.tsx | 4 +- .../summary/components/ConsentSummary.tsx | 4 +- .../summary/components/ContactInfoSummary.tsx | 4 +- .../components/DateQuestionSummary.tsx | 4 +- .../summary/components/FileUploadSummary.tsx | 4 +- .../components/HiddenFieldsSummary.tsx | 4 +- .../components/MatrixQuestionSummary.tsx | 4 +- .../components/MultipleChoiceSummary.tsx | 4 +- .../summary/components/NPSSummary.tsx | 4 +- .../summary/components/OpenTextSummary.tsx | 4 +- .../components/PictureChoiceSummary.tsx | 4 +- .../components/QuestionSummaryHeader.tsx | 4 +- .../summary/components/RankingSummary.tsx | 4 +- .../summary/components/RatingSummary.tsx | 4 +- .../summary/components/SuccessMessage.tsx | 4 +- .../summary/components/SummaryDropOffs.tsx | 4 +- .../summary/components/SummaryList.tsx | 4 +- .../summary/components/SummaryMetadata.tsx | 4 +- .../summary/components/SurveyAnalysisCTA.tsx | 4 +- .../summary/components/share-survey-modal.tsx | 4 +- .../shareEmbedModal/anonymous-links-tab.tsx | 4 +- .../components/shareEmbedModal/app-tab.tsx | 10 +- .../shareEmbedModal/disable-link-modal.tsx | 4 +- .../documentation-links-section.tsx | 4 +- .../shareEmbedModal/documentation-links.tsx | 4 +- .../shareEmbedModal/dynamic-popup-tab.tsx | 4 +- .../components/shareEmbedModal/email-tab.tsx | 4 +- .../shareEmbedModal/link-settings-tab.tsx | 4 +- .../shareEmbedModal/personal-links-tab.tsx | 4 +- .../shareEmbedModal/qr-code-tab.tsx | 4 +- .../components/shareEmbedModal/share-view.tsx | 4 +- .../shareEmbedModal/social-media-tab.tsx | 4 +- .../shareEmbedModal/success-view.tsx | 4 +- .../shareEmbedModal/website-embed-tab.tsx | 4 +- .../(analysis)/summary/lib/emailTemplate.tsx | 2 +- .../(analysis)/summary/lib/utils.ts | 4 +- .../[surveyId]/(analysis)/summary/loading.tsx | 4 +- .../[surveyId]/(analysis)/summary/page.tsx | 2 +- .../[surveyId]/components/CustomFilter.tsx | 9 +- .../components/QuestionFilterComboBox.tsx | 4 +- .../components/QuestionsComboBox.tsx | 4 +- .../[surveyId]/components/ResponseFilter.tsx | 4 +- .../components/SurveyStatusDropdown.tsx | 4 +- apps/web/app/error.tsx | 8 +- apps/web/app/layout.tsx | 21 +- apps/web/app/lib/survey-builder.test.ts | 1 - apps/web/app/lib/survey-builder.ts | 26 +- apps/web/app/lib/templates.ts | 106 +- apps/web/i18n.json | 13 + apps/web/i18n.lock | 2761 +++++++++++++++++ apps/web/lib/i18n/constants.ts | 2 - apps/web/lib/i18n/utils.ts | 8 +- apps/web/lingodotdev/client.tsx | 66 + apps/web/lingodotdev/language.test.ts | 77 + apps/web/{tolgee => lingodotdev}/language.ts | 14 +- apps/web/lingodotdev/server.test.ts | 25 + apps/web/lingodotdev/server.ts | 29 + apps/web/locales/de-DE.json | 61 +- apps/web/locales/en-US.json | 13 +- apps/web/locales/fr-FR.json | 61 +- apps/web/locales/ja-JP.json | 61 +- apps/web/locales/pt-BR.json | 61 +- apps/web/locales/pt-PT.json | 61 +- apps/web/locales/ro-RO.json | 61 +- apps/web/locales/zh-Hans-CN.json | 61 +- apps/web/locales/zh-Hant-TW.json | 61 +- .../components/DeleteAccountModal/index.tsx | 9 +- .../components/ShareSurveyLink/index.tsx | 4 +- .../components/HiddenFields.tsx | 4 +- .../components/QuestionSkip.tsx | 4 +- .../components/ResponseTagsWrapper.tsx | 4 +- .../components/ResponseVariables.tsx | 4 +- .../components/SingleResponseCardBody.tsx | 4 +- .../components/SingleResponseCardHeader.tsx | 4 +- .../components/VerifiedEmail.tsx | 4 +- .../components/SingleResponseCard/index.tsx | 4 +- .../auth/components/back-to-login-button.tsx | 2 +- .../page.tsx | 2 +- .../components/forgot-password-form.tsx | 4 +- .../auth/forgot-password/email-sent/page.tsx | 2 +- .../reset/components/reset-password-form.tsx | 4 +- .../forgot-password/reset/success/page.tsx | 2 +- apps/web/modules/auth/invite/page.tsx | 2 +- .../auth/login/components/login-form.tsx | 4 +- .../page.tsx | 7 +- .../signup/components/password-checks.tsx | 4 +- .../auth/signup/components/signup-form.tsx | 4 +- .../signup/components/terms-privacy-links.tsx | 4 +- .../components/request-verification-email.tsx | 4 +- .../components/verification-message.tsx | 19 + .../auth/verification-requested/page.tsx | 10 +- .../components/email-change-sign-in.tsx | 4 +- apps/web/modules/auth/verify/page.tsx | 2 +- .../modules/ee/billing/api/lib/constants.ts | 4 +- .../ee/billing/components/billing-slider.tsx | 4 +- .../ee/billing/components/pricing-card.tsx | 4 +- .../ee/billing/components/pricing-table.tsx | 4 +- apps/web/modules/ee/billing/page.tsx | 2 +- .../components/attributes-section.tsx | 2 +- .../components/delete-contact-button.tsx | 4 +- .../components/response-section.tsx | 2 +- .../components/response-timeline.tsx | 4 +- .../modules/ee/contacts/[contactId]/page.tsx | 2 +- .../contacts-secondary-navigation.tsx | 2 +- .../ee/contacts/components/contacts-table.tsx | 4 +- .../upload-contacts-attribute-combobox.tsx | 4 +- .../components/upload-contacts-attribute.tsx | 4 +- .../components/upload-contacts-button.tsx | 4 +- apps/web/modules/ee/contacts/layout.tsx | 2 +- apps/web/modules/ee/contacts/page.tsx | 2 +- .../segments/components/add-filter-modal.tsx | 4 +- .../components/attribute-tab-content.tsx | 4 +- .../components/create-segment-modal.tsx | 4 +- .../components/edit-segment-modal.tsx | 4 +- .../components/segment-activity-tab.tsx | 4 +- .../segments/components/segment-editor.tsx | 4 +- .../segments/components/segment-filter.tsx | 14 +- .../segments/components/segment-settings.tsx | 4 +- .../segments/components/segment-table.tsx | 2 +- .../segments/components/targeting-card.tsx | 4 +- .../modules/ee/contacts/segments/loading.tsx | 2 +- .../web/modules/ee/contacts/segments/page.tsx | 2 +- apps/web/modules/ee/languages/loading.tsx | 4 +- apps/web/modules/ee/languages/page.tsx | 2 +- .../components/default-language-select.tsx | 4 +- .../components/edit-language.tsx | 9 +- .../components/language-labels.tsx | 7 +- .../components/language-row.tsx | 4 +- .../components/language-select.tsx | 4 +- .../components/language-toggle.tsx | 4 +- .../components/localized-editor.tsx | 4 +- .../components/multi-language-card.tsx | 4 +- .../components/secondary-language-select.tsx | 4 +- .../components/ending-card-selector.tsx | 4 +- .../components/quota-condition-builder.tsx | 4 +- .../ee/quotas/components/quota-list.tsx | 4 +- .../ee/quotas/components/quota-modal.tsx | 4 +- .../ee/quotas/components/quotas-card.tsx | 7 +- .../ee/quotas/components/quotas-summary.tsx | 4 +- .../single-response-card-quotas.tsx | 4 +- .../components/add-member-role.tsx | 4 +- .../components/edit-membership-role.tsx | 4 +- .../ee/sso/components/azure-button.tsx | 4 +- .../ee/sso/components/github-button.tsx | 4 +- .../ee/sso/components/google-button.tsx | 4 +- .../ee/sso/components/open-id-button.tsx | 4 +- .../modules/ee/sso/components/saml-button.tsx | 4 +- .../modules/ee/sso/components/sso-options.tsx | 4 +- .../project-teams/components/access-table.tsx | 4 +- .../project-teams/components/access-view.tsx | 4 +- .../project-teams/components/manage-team.tsx | 4 +- .../ee/teams/project-teams/loading.tsx | 4 +- .../modules/ee/teams/project-teams/page.tsx | 2 +- .../components/create-team-button.tsx | 4 +- .../components/create-team-modal.tsx | 4 +- .../components/manage-team-button.tsx | 4 +- .../components/team-settings/delete-team.tsx | 4 +- .../team-settings/team-settings-modal.tsx | 4 +- .../team-list/components/teams-table.tsx | 4 +- .../teams/team-list/components/teams-view.tsx | 2 +- .../components/confirm-password-form.tsx | 4 +- .../components/disable-two-factor-modal.tsx | 4 +- .../components/display-backup-codes.tsx | 4 +- .../components/enable-two-factor-modal.tsx | 4 +- .../two-factor-auth/components/enter-code.tsx | 4 +- .../components/scan-qr-code.tsx | 4 +- .../components/two-factor-backup.tsx | 4 +- .../two-factor-auth/components/two-factor.tsx | 4 +- .../email-customization-settings.tsx | 4 +- .../components/branding-settings-card.tsx | 2 +- .../components/edit-branding.tsx | 4 +- .../modules/email/components/email-footer.tsx | 4 +- .../email/components/email-template.tsx | 4 +- .../components/preview-email-template.tsx | 6 +- .../emails/auth/forgot-password-email.tsx | 2 +- .../emails/auth/new-email-verification.tsx | 2 +- .../auth/password-reset-notify-email.tsx | 2 +- .../email/emails/auth/verification-email.tsx | 2 +- .../email-customization-preview-email.tsx | 2 +- .../emails/invite/invite-accepted-email.tsx | 2 +- .../email/emails/invite/invite-email.tsx | 2 +- apps/web/modules/email/emails/lib/utils.tsx | 4 +- .../survey/embed-survey-preview-email.tsx | 2 +- .../email/emails/survey/link-survey-email.tsx | 2 +- .../emails/survey/response-finished-email.tsx | 2 +- apps/web/modules/email/index.tsx | 2 +- .../modules/environments/lib/utils.test.ts | 8 +- apps/web/modules/environments/lib/utils.ts | 2 +- .../components/add-webhook-button.tsx | 4 +- .../webhooks/components/add-webhook-modal.tsx | 4 +- .../components/survey-checkbox-group.tsx | 4 +- .../components/trigger-checkbox-group.tsx | 4 +- .../components/webhook-detail-modal.tsx | 4 +- .../components/webhook-overview-tab.tsx | 7 +- .../webhooks/components/webhook-row-data.tsx | 7 +- .../components/webhook-settings-tab.tsx | 4 +- .../components/webhook-table-heading.tsx | 2 +- .../webhooks/components/webhook-table.tsx | 4 +- .../modules/integrations/webhooks/page.tsx | 2 +- .../CreateOrganizationModal/index.tsx | 4 +- .../modules/organization/lib/utils.test.ts | 2 +- apps/web/modules/organization/lib/utils.ts | 2 +- .../api-keys/components/add-api-key-modal.tsx | 4 +- .../api-keys/components/edit-api-keys.tsx | 4 +- .../components/view-permission-modal.tsx | 4 +- .../settings/api-keys/loading.tsx | 6 +- .../organization/settings/api-keys/page.tsx | 2 +- .../edit-memberships/edit-memberships.tsx | 2 +- .../edit-memberships/member-actions.tsx | 4 +- .../edit-memberships/members-info.tsx | 4 +- .../edit-memberships/organization-actions.tsx | 4 +- .../invite-member/bulk-invite-tab.tsx | 4 +- .../invite-member/individual-invite-tab.tsx | 4 +- .../invite-member/invite-member-modal.tsx | 4 +- .../invite-member/share-invite-modal.tsx | 4 +- .../teams/components/members-view.tsx | 2 +- .../organization/settings/teams/page.tsx | 2 +- .../components/create-project-modal/index.tsx | 4 +- .../components/project-limit-modal/index.tsx | 4 +- .../(setup)/app-connection/loading.tsx | 4 +- .../settings/(setup)/app-connection/page.tsx | 2 +- .../(setup)/components/ActionActivityTab.tsx | 4 +- .../(setup)/components/ActionDetailModal.tsx | 4 +- .../(setup)/components/ActionSettingsTab.tsx | 4 +- .../(setup)/components/ActionTableHeading.tsx | 4 +- .../(setup)/components/AddActionModal.tsx | 4 +- .../components/action-settings-card.tsx | 4 +- .../components/project-config-navigation.tsx | 4 +- .../components/delete-project-render.tsx | 4 +- .../general/components/delete-project.tsx | 2 +- .../components/edit-project-name-form.tsx | 4 +- .../components/edit-waiting-time-form.tsx | 4 +- .../projects/settings/general/loading.tsx | 4 +- .../projects/settings/general/page.tsx | 2 +- .../settings/look/components/edit-logo.tsx | 4 +- .../look/components/edit-placement-form.tsx | 4 +- .../look/components/theme-styling.tsx | 4 +- .../projects/settings/look/loading.tsx | 4 +- .../modules/projects/settings/look/page.tsx | 2 +- .../tags/components/edit-tags-wrapper.tsx | 4 +- .../tags/components/merge-tags-combobox.tsx | 4 +- .../settings/tags/components/single-tag.tsx | 4 +- .../projects/settings/tags/loading.tsx | 4 +- .../modules/projects/settings/tags/page.tsx | 2 +- .../setup/(fresh-instance)/intro/page.tsx | 9 +- .../setup/(fresh-instance)/signup/page.tsx | 2 +- .../invite/components/invite-members.tsx | 4 +- .../[organizationId]/invite/page.tsx | 2 +- .../create/components/create-organization.tsx | 4 +- .../components/removed-from-organization.tsx | 4 +- .../setup/organization/create/page.tsx | 2 +- .../edit-public-survey-alert-dialog/index.tsx | 4 +- .../components/fallback-input.tsx | 4 +- .../components/multi-lang-wrapper.tsx | 4 +- .../components/recall-item-select.tsx | 4 +- .../components/recall-wrapper.tsx | 4 +- .../components/question-form-input/index.tsx | 4 +- .../question-form-input/utils.test.ts | 8 +- .../components/question-form-input/utils.ts | 4 +- .../start-from-scratch-template.tsx | 4 +- .../components/template-filters.tsx | 4 +- .../components/template-tags.tsx | 7 +- .../template-list/components/template.tsx | 4 +- .../survey/components/template-list/index.tsx | 4 +- .../components/template-list/lib/utils.ts | 8 +- .../editor/components/add-action-modal.tsx | 4 +- .../components/add-ending-card-button.tsx | 4 +- .../editor/components/add-question-button.tsx | 4 +- .../components/address-question-form.tsx | 4 +- .../editor/components/cal-question-form.tsx | 4 +- .../editor/components/conditional-logic.tsx | 4 +- .../components/consent-question-form.tsx | 4 +- .../components/contact-info-question-form.tsx | 4 +- .../components/create-new-action-tab.tsx | 4 +- .../editor/components/cta-question-form.tsx | 4 +- .../editor/components/date-question-form.tsx | 4 +- .../editor/components/edit-ending-card.tsx | 4 +- .../editor/components/edit-welcome-card.tsx | 5 +- .../editor/components/editor-card-menu.tsx | 4 +- .../editor/components/end-screen-form.tsx | 4 +- .../components/file-upload-question-form.tsx | 4 +- .../components/form-styling-settings.tsx | 4 +- .../editor/components/hidden-fields-card.tsx | 4 +- .../editor/components/how-to-send-card.tsx | 4 +- .../components/logic-editor-actions.tsx | 4 +- .../components/logic-editor-conditions.tsx | 4 +- .../survey/editor/components/logic-editor.tsx | 4 +- .../components/matrix-question-form.tsx | 4 +- .../components/matrix-sortable-item.tsx | 4 +- .../multiple-choice-question-form.tsx | 4 +- .../editor/components/nps-question-form.tsx | 4 +- .../editor/components/open-question-form.tsx | 4 +- .../survey/editor/components/option-ids.tsx | 4 +- .../components/picture-selection-form.tsx | 4 +- .../survey/editor/components/placement.tsx | 4 +- .../editor/components/question-card.tsx | 4 +- .../components/question-option-choice.tsx | 4 +- .../editor/components/questions-view.tsx | 4 +- .../components/ranking-question-form.tsx | 4 +- .../components/rating-question-form.tsx | 4 +- .../components/recontact-options-card.tsx | 4 +- .../editor/components/redirect-url-form.tsx | 4 +- .../components/response-options-card.tsx | 4 +- .../editor/components/saved-actions-tab.tsx | 4 +- .../survey/editor/components/styling-view.tsx | 4 +- .../editor/components/survey-editor-tabs.tsx | 4 +- .../editor/components/survey-menu-bar.tsx | 4 +- .../components/survey-placement-card.tsx | 4 +- .../components/survey-variables-card-item.tsx | 4 +- .../components/survey-variables-card.tsx | 4 +- .../components/targeting-locked-card.tsx | 4 +- .../editor/components/unsplash-images.tsx | 4 +- .../editor/components/update-question-id.tsx | 4 +- .../editor/components/when-to-send-card.tsx | 4 +- .../survey/editor/lib/action-builder.test.ts | 4 +- .../survey/editor/lib/action-builder.ts | 8 +- .../modules/survey/editor/lib/action-utils.ts | 14 +- .../editor/lib/logic-rule-engine.test.ts | 4 +- .../survey/editor/lib/logic-rule-engine.ts | 4 +- .../editor/lib/shared-conditions-factory.ts | 4 +- apps/web/modules/survey/editor/lib/utils.tsx | 24 +- .../survey/editor/lib/validation.test.ts | 4 +- .../modules/survey/editor/lib/validation.ts | 4 +- apps/web/modules/survey/editor/page.tsx | 2 +- .../follow-ups/components/follow-up-email.tsx | 2 +- .../follow-ups/components/follow-up-item.tsx | 4 +- .../follow-ups/components/follow-up-modal.tsx | 4 +- .../follow-ups/components/follow-ups-view.tsx | 4 +- .../survey/follow-ups/lib/follow-ups.test.ts | 6 + apps/web/modules/survey/lib/questions.tsx | 18 +- .../survey/link/components/legal-footer.tsx | 4 +- .../survey/link/components/pin-screen.tsx | 4 +- .../link/components/survey-inactive.tsx | 2 +- .../link/components/survey-link-used.tsx | 4 +- .../survey/link/components/verify-email.tsx | 4 +- .../survey/link/contact-survey/page.tsx | 2 +- .../list/components/copy-survey-form.tsx | 4 +- .../list/components/copy-survey-modal.tsx | 4 +- .../survey/list/components/survey-card.tsx | 4 +- .../list/components/survey-dropdown-menu.tsx | 4 +- .../survey/list/components/survey-filters.tsx | 11 +- .../survey/list/components/survey-list.tsx | 4 +- .../list/components/survey-type-indicator.tsx | 4 +- apps/web/modules/survey/list/loading.tsx | 4 +- apps/web/modules/survey/list/page.tsx | 2 +- .../templates/components/back-button.tsx | 4 +- .../components/template-container.tsx | 4 +- .../survey/templates/lib/minimal-survey.ts | 4 +- apps/web/modules/survey/templates/page.tsx | 2 +- .../ui/components/action-class-info/index.tsx | 4 +- .../action-name-description-fields/index.tsx | 4 +- .../additional-integration-settings/index.tsx | 4 +- .../background-styling-card/index.tsx | 4 +- .../survey-bg-selector-tab.tsx | 4 +- .../card-arrangement-tabs/index.tsx | 4 +- .../card-styling-settings/index.tsx | 4 +- .../ui/components/client-logo/index.tsx | 4 +- .../ui/components/code-action-form/index.tsx | 4 +- .../ui/components/code-block/index.tsx | 4 +- .../ui/components/conditions-editor/index.tsx | 4 +- .../confirm-delete-segment-modal/index.tsx | 4 +- .../components/confirmation-modal/index.tsx | 4 +- .../components/connect-integration/index.tsx | 4 +- .../connect-integration/lib/utils.ts | 4 +- .../components/column-settings-dropdown.tsx | 4 +- .../components/data-table-settings-modal.tsx | 4 +- .../components/data-table-toolbar.tsx | 4 +- .../components/selected-row-settings.tsx | 4 +- .../ui/components/date-picker/index.tsx | 4 +- .../decrement-quotas-checkbox/index.tsx | 4 +- .../ui/components/default-tag/index.tsx | 4 +- .../ui/components/delete-dialog/index.tsx | 4 +- .../editor/components/link-editor.tsx | 4 +- .../editor/components/toolbar-plugin.tsx | 4 +- .../components/empty-space-filler/index.tsx | 4 +- .../components/environment-notice/index.tsx | 2 +- .../ui/components/error-component/index.tsx | 4 +- .../file-input/components/video-settings.tsx | 4 +- .../ui/components/file-input/index.tsx | 4 +- .../components/file-upload-response/index.tsx | 4 +- .../ui/components/go-back-button/index.tsx | 4 +- .../id-badge/components/badge-content.tsx | 4 +- .../modules/ui/components/id-badge/index.tsx | 4 +- .../ui/components/input-combo-box/index.tsx | 4 +- .../limits-reached-banner/index.tsx | 4 +- .../components/load-segment-modal/index.tsx | 4 +- .../ui/components/media-background/index.tsx | 4 +- .../components/css-selector.tsx | 4 +- .../components/inner-html-selector.tsx | 4 +- .../components/page-url-selector.tsx | 9 +- .../components/no-code-action-form/index.tsx | 4 +- .../ui/components/no-mobile-overlay/index.tsx | 4 +- .../pending-downgrade-banner/index.tsx | 4 +- .../ui/components/preview-survey/index.tsx | 4 +- .../question-toggle-table/index.tsx | 4 +- .../reset-progress-button/index.tsx | 4 +- .../save-as-new-segment-modal/index.tsx | 4 +- .../ui/components/segment-title/index.tsx | 4 +- .../shuffle-option-select/index.tsx | 4 +- .../survey-status-indicator/index.tsx | 4 +- .../ui/components/tags-combobox/index.tsx | 4 +- .../components/targeting-indicator/index.tsx | 4 +- .../theme-styling-preview-survey/index.tsx | 4 +- apps/web/package.json | 9 +- apps/web/tolgee/client.tsx | 45 - apps/web/tolgee/server.tsx | 26 - apps/web/tolgee/shared.test.ts | 102 - apps/web/tolgee/shared.ts | 40 - apps/web/vite.config.mts | 2 +- apps/web/vitestSetup.ts | 71 +- package.json | 8 +- packages/i18n-utils/package.json | 13 +- .../i18n-utils/src/scan-translations.test.ts | 664 ++++ packages/i18n-utils/src/scan-translations.ts | 525 ++++ packages/i18n-utils/vite.config.ts | 10 +- packages/surveys/i18n.lock | 1 - packages/surveys/locales/ar.json | 1 - packages/surveys/locales/de.json | 1 - packages/surveys/locales/en.json | 1 - packages/surveys/locales/es.json | 1 - packages/surveys/locales/fr.json | 1 - packages/surveys/locales/hi.json | 1 - packages/surveys/locales/it.json | 1 - packages/surveys/locales/ja.json | 1 - packages/surveys/locales/pt.json | 1 - packages/surveys/locales/ro.json | 1 - packages/surveys/locales/ru.json | 1 - packages/surveys/locales/uz.json | 1 - packages/surveys/locales/zh-Hans.json | 1 - pnpm-lock.yaml | 193 +- 510 files changed, 6129 insertions(+), 1883 deletions(-) create mode 100644 .cursor/rules/i18n-management.mdc delete mode 100644 .github/workflows/tolgee-missing-key-check.yml delete mode 100644 .github/workflows/tolgee.yml create mode 100644 .github/workflows/translation-check.yml delete mode 100644 .tolgeerc.json create mode 100644 apps/web/i18n.json create mode 100644 apps/web/i18n.lock delete mode 100644 apps/web/lib/i18n/constants.ts create mode 100644 apps/web/lingodotdev/client.tsx create mode 100644 apps/web/lingodotdev/language.test.ts rename apps/web/{tolgee => lingodotdev}/language.ts (55%) create mode 100644 apps/web/lingodotdev/server.test.ts create mode 100644 apps/web/lingodotdev/server.ts create mode 100644 apps/web/modules/auth/verification-requested/components/verification-message.tsx delete mode 100644 apps/web/tolgee/client.tsx delete mode 100644 apps/web/tolgee/server.tsx delete mode 100644 apps/web/tolgee/shared.test.ts delete mode 100644 apps/web/tolgee/shared.ts create mode 100644 packages/i18n-utils/src/scan-translations.test.ts create mode 100644 packages/i18n-utils/src/scan-translations.ts diff --git a/.cursor/rules/i18n-management.mdc b/.cursor/rules/i18n-management.mdc new file mode 100644 index 0000000000..f36338d6c6 --- /dev/null +++ b/.cursor/rules/i18n-management.mdc @@ -0,0 +1,457 @@ +--- +title: i18n Management with Lingo.dev +description: Guidelines for managing internationalization (i18n) with Lingo.dev, including translation workflow, key validation, and best practices +--- + +# i18n Management with Lingo.dev + +This rule defines the workflow and best practices for managing internationalization (i18n) in the Formbricks project using Lingo.dev. + +## Overview + +Formbricks uses [Lingo.dev](https://lingo.dev) for managing translations across multiple languages. The translation workflow includes: + +1. **Translation Keys**: Defined in code using the `t()` function from `react-i18next` +2. **Translation Files**: JSON files stored in `apps/web/locales/` for each supported language +3. **Validation**: Automated scanning to detect missing and unused translation keys +4. **CI/CD**: Pre-commit hooks and GitHub Actions to enforce translation quality + +## Translation Workflow + +### 1. Using Translations in Code + +When adding translatable text in the web app, use the `t()` function or `` component: + +**Using the `t()` function:** +```tsx +import { useTranslate } from "@/lib/i18n/translate"; + +const MyComponent = () => { + const { t } = useTranslate(); + + return ( +
+

{t("common.welcome")}

+

{t("pages.dashboard.description")}

+
+ ); +}; +``` + +**Using the `` component (for text with HTML elements):** +```tsx +import { Trans } from "react-i18next"; + +const MyComponent = () => { + return ( +
+

+ , + b: + }} + /> +

+
+ ); +}; +``` + +**Key Naming Conventions:** +- Use dot notation for nested keys: `section.subsection.key` +- Use descriptive names: `auth.login.success_message` not `auth.msg1` +- Group related keys together: `auth.*`, `errors.*`, `common.*` +- Use lowercase with underscores: `user_profile_settings` not `UserProfileSettings` + +### 2. Translation File Structure + +Translation files are located in `apps/web/locales/` and use the following naming convention: +- `en-US.json` (English - United States, default) +- `de-DE.json` (German) +- `fr-FR.json` (French) +- `pt-BR.json` (Portuguese - Brazil) +- etc. + +**File Structure:** +```json +{ + "common": { + "welcome": "Welcome", + "save": "Save", + "cancel": "Cancel" + }, + "auth": { + "login": { + "title": "Login", + "email_placeholder": "Enter your email", + "password_placeholder": "Enter your password" + } + } +} +``` + +### 3. Adding New Translation Keys + +When adding new translation keys: + +1. **Add the key in your code** using `t("your.new.key")` +2. **Add translation for that key in en-US.json file** +3. **Run the translation workflow:** + ```bash + pnpm i18n + ``` + This will: + - Generate translations for all languages using Lingo.dev + - Validate that all keys are present and used + +4. **Review and commit** the generated translation files + +### 4. Available Scripts + +```bash +# Generate translations using Lingo.dev +pnpm generate-translations + +# Scan and validate translation keys +pnpm scan-translations + +# Full workflow: generate + validate +pnpm i18n + +# Validate only (without generation) +pnpm i18n:validate +``` + +## Translation Key Validation + +### Automated Validation + +The project includes automated validation that runs: +- **Pre-commit hook**: Validates translations before allowing commits (when `LINGODOTDEV_API_KEY` is set) +- **GitHub Actions**: Validates translations on every PR and push to main + +### Validation Rules + +The validation script (`scan-translations.ts`) checks for: + +1. **Missing Keys**: Translation keys used in code but not present in translation files +2. **Unused Keys**: Translation keys present in translation files but not used in code +3. **Incomplete Translations**: Keys that exist in the default language (`en-US`) but are missing in target languages + +**What gets scanned:** +- All `.ts` and `.tsx` files in `apps/web/` +- Both `t()` function calls and `` components +- All locale files (`de-DE.json`, `fr-FR.json`, `ja-JP.json`, etc.) + +**What gets excluded:** +- Test files (`*.test.ts`, `*.test.tsx`, `*.spec.ts`, `*.spec.tsx`) +- Build directories (`node_modules`, `dist`, `build`, `.next`, `coverage`) +- Locale files themselves (from code scanning) + +**Note:** Test files are excluded because they often use mock or example translation keys for testing purposes that don't need to exist in production translation files. + +### Fixing Validation Errors + +#### Missing Keys + +If you encounter missing key errors: + +``` +❌ MISSING KEYS (2): + + These keys are used in code but not found in translation files: + + • auth.signup.email_required + • settings.profile.update_success +``` + +**Resolution:** +1. Ensure that translations for those keys are present in en-US.json . +2. Run `pnpm generate-translations` to have Lingo.dev generate the missing translations +3. OR manually add the keys to `apps/web/locales/en-US.json`: + ```json + { + "auth": { + "signup": { + "email_required": "Email is required" + } + }, + "settings": { + "profile": { + "update_success": "Profile updated successfully" + } + } + } + ``` +3. Run `pnpm scan-translations` to verify +4. Commit the changes + +#### Unused Keys + +If you encounter unused key errors: + +``` +⚠️ UNUSED KEYS (1): + + These keys exist in translation files but are not used in code: + + • old.deprecated.key +``` + +**Resolution:** +1. If the key is truly unused, remove it from all translation files +2. If the key should be used, add it to your code using `t("old.deprecated.key")` +3. Run `pnpm scan-translations` to verify +4. Commit the changes + +#### Incomplete Translations + +If you encounter incomplete translation errors: + +``` +⚠️ INCOMPLETE TRANSLATIONS: + + Some keys from en-US are missing in target languages: + + 📝 de-DE (5 missing keys): + • auth.new_feature.title + • auth.new_feature.description + • settings.advanced.option + ... and 2 more +``` + +**Resolution:** +1. **Recommended:** Run `pnpm generate-translations` to have Lingo.dev automatically translate the missing keys +2. **Manual:** Add the missing keys to the target language files: + ```bash + # Copy the structure from en-US.json and translate the values + # For example, in de-DE.json: + { + "auth": { + "new_feature": { + "title": "Neues Feature", + "description": "Beschreibung des neuen Features" + } + } + } + ``` +3. Run `pnpm scan-translations` to verify all translations are complete +4. Commit the changes + +## Pre-commit Hook Behavior + +The pre-commit hook will: + +1. Run `lint-staged` for code formatting +2. If `LINGODOTDEV_API_KEY` is set: + - Generate translations using Lingo.dev + - Validate translation keys + - Auto-add updated locale files to the commit + - **Block the commit** if validation fails +3. If `LINGODOTDEV_API_KEY` is not set: + - Skip translation validation (for community contributors) + - Show a warning message + +## Environment Variables + +### LINGODOTDEV_API_KEY + +This is the API key for Lingo.dev integration. + +**For Core Team:** +- Add to your local `.env` file +- Required for running translation generation + +**For Community Contributors:** +- Not required for local development +- Translation validation will be skipped +- The CI will still validate translations + +## Best Practices + +### 1. Keep Keys Organized + +Group related keys together: +```json +{ + "auth": { + "login": { ... }, + "signup": { ... }, + "forgot_password": { ... } + }, + "dashboard": { + "header": { ... }, + "sidebar": { ... } + } +} +``` + +### 2. Avoid Hardcoded Strings + +**❌ Bad:** +```tsx + +``` + +**✅ Good:** +```tsx + +``` + +### 3. Use Interpolation for Dynamic Content + +**❌ Bad:** +```tsx +{t("welcome")} {userName}! +``` + +**✅ Good:** +```tsx +{t("auth.welcome_message", { userName })} +``` + +With translation: +```json +{ + "auth": { + "welcome_message": "Welcome, {userName}!" + } +} +``` + +### 4. Avoid Dynamic Key Construction + +**❌ Bad:** +```tsx +const key = `errors.${errorCode}`; +t(key); +``` + +**✅ Good:** +```tsx +switch (errorCode) { + case "401": + return t("errors.unauthorized"); + case "404": + return t("errors.not_found"); + default: + return t("errors.unknown"); +} +``` + +### 5. Test Translation Keys + +When adding new features: +1. Add translation keys +2. Test in multiple languages using the language switcher +3. Ensure text doesn't overflow in longer translations (German, French) +4. Run `pnpm scan-translations` before committing + +## Troubleshooting + +### Issue: Pre-commit hook fails with validation errors + +**Solution:** +```bash +# Run the full i18n workflow +pnpm i18n + +# Fix any missing or unused keys +# Then commit again +git add . +git commit -m "your message" +``` + +### Issue: Translation validation passes locally but fails in CI + +**Solution:** +- Ensure all translation files are committed +- Check that `scan-translations.ts` hasn't been modified +- Verify that locale files are properly formatted JSON + +### Issue: Cannot commit because of missing translations + +**Solution:** +```bash +# If you have LINGODOTDEV_API_KEY: +pnpm generate-translations + +# If you don't have the API key (community contributor): +# Manually add the missing keys to en-US.json +# Then run validation: +pnpm scan-translations +``` + +### Issue: Getting "unused keys" for keys that are used + +**Solution:** +- The script scans `.ts` and `.tsx` files only +- If keys are used in other file types, they may be flagged +- Verify the key is actually used with `grep -r "your.key" apps/web/` +- If it's a false positive, consider updating the scanning patterns in `scan-translations.ts` + +## AI Assistant Guidelines + +When assisting with i18n-related tasks, always: + +1. **Use the `t()` function** for all user-facing text +2. **Follow key naming conventions** (lowercase, dots for nesting) +3. **Run validation** after making changes: `pnpm scan-translations` +4. **Fix missing keys** by adding them to `en-US.json` +5. **Remove unused keys** from all translation files +6. **Test the pre-commit hook** if making changes to translation workflow +7. **Update this rule file** if translation workflow changes + +### Fixing Missing Translation Keys + +When the AI encounters missing translation key errors: + +1. Identify the missing keys from the error output +2. Determine the appropriate section and naming for each key +3. Add the keys to `apps/web/locales/en-US.json` with meaningful English text +4. Ensure proper JSON structure and nesting +5. Run `pnpm scan-translations` to verify +6. Inform the user that other language files will be updated via Lingo.dev + +**Example:** +```typescript +// Error: Missing key "settings.api.rate_limit_exceeded" + +// Add to en-US.json: +{ + "settings": { + "api": { + "rate_limit_exceeded": "API rate limit exceeded. Please try again later." + } + } +} +``` + +### Removing Unused Translation Keys + +When the AI encounters unused translation key errors: + +1. Verify the keys are truly unused by searching the codebase +2. Remove the keys from `apps/web/locales/en-US.json` +3. Note that removal from other language files can be handled via Lingo.dev +4. Run `pnpm scan-translations` to verify + +## Migration Notes + +This project previously used Tolgee for translations. As of this migration: + +- **Old scripts**: `tolgee-pull` is deprecated (kept for reference) +- **New scripts**: Use `pnpm i18n` or `pnpm generate-translations` +- **Old workflows**: `tolgee.yml` and `tolgee-missing-key-check.yml` removed +- **New workflow**: `translation-check.yml` handles all validation + +--- + +**Last Updated:** October 14, 2025 +**Related Files:** +- `scan-translations.ts` - Translation validation script +- `.husky/pre-commit` - Pre-commit hook with i18n validation +- `.github/workflows/translation-check.yml` - CI workflow for translation validation +- `apps/web/locales/*.json` - Translation files diff --git a/.env.example b/.env.example index 8da4aad855..2441c96863 100644 --- a/.env.example +++ b/.env.example @@ -214,3 +214,7 @@ REDIS_URL=redis://localhost:6379 # AUDIT_LOG_ENABLED=0 # If the ip should be added in the log or not. Default 0 # AUDIT_LOG_GET_USER_IP=0 + + +# Lingo.dev API key for translation generation +LINGODOTDEV_API_KEY=your_api_key_here \ No newline at end of file diff --git a/.github/workflows/tolgee-missing-key-check.yml b/.github/workflows/tolgee-missing-key-check.yml deleted file mode 100644 index 7d5a4927ac..0000000000 --- a/.github/workflows/tolgee-missing-key-check.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Check Missing Translations - -permissions: - contents: read - -on: - workflow_dispatch: - pull_request_target: - types: [opened, synchronize, reopened] - -jobs: - check-missing-translations: - runs-on: ubuntu-latest - steps: - - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 - with: - egress-policy: audit - - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - with: - ref: ${{ github.event.pull_request.base.ref }} - - - name: Checkout PR - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: Setup Node.js - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 - with: - node-version: 18 - - - name: Install Tolgee CLI - run: npm install -g @tolgee/cli - - - name: Compare Tolgee Keys - id: compare - run: | - tolgee compare --api-key ${{ secrets.TOLGEE_API_KEY }} > compare_output.txt - cat compare_output.txt - - - name: Check for Missing Translations - run: | - if grep -q "new key found" compare_output.txt; then - echo "New keys found that may require translations:" - exit 1 - else - echo "No new keys found." - fi diff --git a/.github/workflows/tolgee.yml b/.github/workflows/tolgee.yml deleted file mode 100644 index 7ac8b940ae..0000000000 --- a/.github/workflows/tolgee.yml +++ /dev/null @@ -1,95 +0,0 @@ -name: Tolgee Tagging on PR Merge -permissions: - contents: read - -on: - pull_request_target: - types: [closed] - branches: - - main - -jobs: - tag-production-keys: - name: Tag Production Keys - runs-on: ubuntu-latest - if: github.event.pull_request.merged == true - - steps: - - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 - with: - egress-policy: audit - - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - fetch-depth: 0 # This ensures we get the full git history - - - name: Get source branch name - id: branch-name - env: - RAW_BRANCH: ${{ github.head_ref }} - run: | - # Validate and sanitize branch name - only allow alphanumeric, dots, underscores, hyphens, and forward slashes - SOURCE_BRANCH=$(echo "$RAW_BRANCH" | sed 's/[^a-zA-Z0-9._\/-]//g') - - # Additional validation - ensure branch name is not empty after sanitization - if [[ -z "$SOURCE_BRANCH" ]]; then - echo "❌ Error: Branch name is empty after sanitization" - echo "Original branch: $RAW_BRANCH" - exit 1 - fi - - # Safely add to environment variables using GitHub's recommended method - # This prevents environment variable injection attacks - echo "SOURCE_BRANCH<> $GITHUB_ENV - echo "$SOURCE_BRANCH" >> $GITHUB_ENV - echo "EOF" >> $GITHUB_ENV - - echo "Detected source branch: $SOURCE_BRANCH" - - - name: Setup Node.js - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 - with: - node-version: 18 # Ensure compatibility with your project - - - name: Install Tolgee CLI - run: npm install -g @tolgee/cli - - - name: Tag Production Keys - run: | - npx tolgee tag \ - --api-key ${{ secrets.TOLGEE_API_KEY }} \ - --filter-extracted \ - --filter-tag "draft:${SOURCE_BRANCH}" \ - --tag production \ - --untag "draft:${SOURCE_BRANCH}" - - - name: Tag unused production keys as Deprecated - run: | - npx tolgee tag \ - --api-key ${{ secrets.TOLGEE_API_KEY }} \ - --filter-not-extracted --filter-tag production \ - --tag deprecated --untag production - - - name: Tag unused draft:current-branch keys as Deprecated - run: | - npx tolgee tag \ - --api-key ${{ secrets.TOLGEE_API_KEY }} \ - --filter-not-extracted --filter-tag "draft:${SOURCE_BRANCH}" \ - --tag deprecated --untag "draft:${SOURCE_BRANCH}" - - - name: Sync with backup - run: | - npx tolgee sync \ - --api-key ${{ secrets.TOLGEE_API_KEY }} \ - --backup ./tolgee-backup \ - --continue-on-warning \ - --yes - - - name: Upload backup as artifact - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 - with: - name: tolgee-backup-${{ github.sha }} - path: ./tolgee-backup - retention-days: 90 diff --git a/.github/workflows/translation-check.yml b/.github/workflows/translation-check.yml new file mode 100644 index 0000000000..c901eb5832 --- /dev/null +++ b/.github/workflows/translation-check.yml @@ -0,0 +1,63 @@ +name: Translation Validation + +permissions: + contents: read + +on: + pull_request: + types: [opened, synchronize, reopened] + paths: + - "apps/web/**/*.ts" + - "apps/web/**/*.tsx" + - "apps/web/locales/**/*.json" + - "scan-translations.ts" + push: + branches: + - main + paths: + - "apps/web/**/*.ts" + - "apps/web/**/*.tsx" + - "apps/web/locales/**/*.json" + - "scan-translations.ts" + +jobs: + validate-translations: + name: Validate Translation Keys + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 + with: + egress-policy: audit + + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version: 18 + + - name: Setup pnpm + uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d # v3.0.0 + with: + version: 9.15.9 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Validate translation keys + run: | + echo "" + echo "🔍 Validating translation keys..." + echo "" + pnpm run scan-translations + + - name: Summary + if: success() + run: | + echo "" + echo "✅ Translation validation completed successfully!" + echo "" diff --git a/.husky/pre-commit b/.husky/pre-commit index 7c3821438c..8371e9c20a 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -10,12 +10,34 @@ fi pnpm lint-staged -# Run tolgee-pull if branch.json exists and NEXT_PUBLIC_TOLGEE_API_KEY is not set -if [ -f branch.json ]; then - if [ -z "$NEXT_PUBLIC_TOLGEE_API_KEY" ]; then - echo "Skipping tolgee-pull: NEXT_PUBLIC_TOLGEE_API_KEY is not set" +# Run Lingo.dev i18n workflow if LINGODOTDEV_API_KEY is set +if [ -n "$LINGODOTDEV_API_KEY" ]; then + echo "" + echo "🌍 Running Lingo.dev translation workflow..." + echo "" + + # Run translation generation and validation + if pnpm run i18n; then + echo "" + echo "✅ Translation validation passed" + echo "" + # Add updated locale files to git + git add apps/web/locales/*.json else - pnpm run tolgee-pull - git add apps/web/locales + echo "" + echo "❌ Translation validation failed!" + echo "" + echo "Please fix the translation issues above before committing:" + echo " • Add missing translation keys to your locale files" + echo " • Remove unused translation keys" + echo "" + echo "Or run 'pnpm i18n' to see the detailed report" + echo "" + exit 1 fi +else + echo "" + echo "⚠️ Skipping translation validation: LINGODOTDEV_API_KEY is not set" + echo " (This is expected for community contributors)" + echo "" fi \ No newline at end of file diff --git a/.tolgeerc.json b/.tolgeerc.json deleted file mode 100644 index 4163248837..0000000000 --- a/.tolgeerc.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "https://docs.tolgee.io/cli-schema.json", - "format": "JSON_TOLGEE", - "patterns": ["./apps/web/**/*.ts?(x)"], - "projectId": 10304, - "pull": { - "path": "./apps/web/locales" - }, - "push": { - "files": [ - { - "language": "en-US", - "path": "./apps/web/locales/en-US.json" - }, - { - "language": "de-DE", - "path": "./apps/web/locales/de-DE.json" - }, - { - "language": "fr-FR", - "path": "./apps/web/locales/fr-FR.json" - }, - { - "language": "pt-BR", - "path": "./apps/web/locales/pt-BR.json" - }, - { - "language": "zh-Hant-TW", - "path": "./apps/web/locales/zh-Hant-TW.json" - }, - { - "language": "pt-PT", - "path": "./apps/web/locales/pt-PT.json" - }, - { - "language": "ro-RO", - "path": "./apps/web/locales/ro-RO.json" - }, - { - "language": "ja-JP", - "path": "./apps/web/locales/ja-JP.json" - }, - { - "language": "zh-Hans-CN", - "path": "./apps/web/locales/zh-Hans-CN.json" - } - ], - "forceMode": "OVERRIDE" - }, - "strictNamespace": false -} diff --git a/.vscode/settings.json b/.vscode/settings.json index f5383fc66f..de352c7bc6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,10 @@ { "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], - "eslint.workingDirectories": [{ "mode": "auto" }], + "eslint.workingDirectories": [ + { + "mode": "auto" + } + ], "javascript.updateImportsOnFileMove.enabled": "always", "sonarlint.connectedMode.project": { "connectionId": "formbricks", diff --git a/apps/storybook/.storybook/preview.ts b/apps/storybook/.storybook/preview.ts index 5d55cce53b..b0c7224444 100644 --- a/apps/storybook/.storybook/preview.ts +++ b/apps/storybook/.storybook/preview.ts @@ -1,29 +1,16 @@ import type { Preview } from "@storybook/react-vite"; -import { TolgeeProvider } from "@tolgee/react"; import React from "react"; -// Import translation data for Storybook -import enUSTranslations from "../../web/locales/en-US.json"; +import { I18nProvider } from "../../web/lingodotdev/client"; import "../../web/modules/ui/globals.css"; -import { TolgeeBase } from "../../web/tolgee/shared"; - -// Create a Storybook-specific Tolgee decorator -const withTolgee = (Story: any) => { - const tolgee = TolgeeBase().init({ - tagNewKeys: [], // No branch tagging in Storybook - }); +// Create a Storybook-specific Lingodot Dev decorator +const withLingodotDev = (Story: any) => { return React.createElement( - TolgeeProvider, + I18nProvider, { - tolgee, - fallback: "Loading", - ssr: { - language: "en-US", - staticData: { - "en-US": enUSTranslations, - }, - }, - }, + language: "en-US", + defaultLanguage: "en-US", + } as any, React.createElement(Story) ); }; @@ -37,7 +24,7 @@ const preview: Preview = { }, }, }, - decorators: [withTolgee], + decorators: [withLingodotDev], }; export default preview; diff --git a/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks.tsx b/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks.tsx index 6ea3a154e7..293224138e 100644 --- a/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks.tsx +++ b/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks.tsx @@ -1,9 +1,9 @@ "use client"; -import { useTranslate } from "@tolgee/react"; import { ArrowRight } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect } from "react"; +import { useTranslation } from "react-i18next"; import { TEnvironment } from "@formbricks/types/environment"; import { TProjectConfigChannel } from "@formbricks/types/project"; import { cn } from "@/lib/cn"; @@ -23,7 +23,7 @@ export const ConnectWithFormbricks = ({ appSetupCompleted, channel, }: ConnectWithFormbricksProps) => { - const { t } = useTranslate(); + const { t } = useTranslation(); const router = useRouter(); const handleFinishOnboarding = async () => { router.push(`/environments/${environment.id}/surveys`); diff --git a/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/OnboardingSetupInstructions.tsx b/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/OnboardingSetupInstructions.tsx index 404b10ce41..d5e705e501 100644 --- a/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/OnboardingSetupInstructions.tsx +++ b/apps/web/app/(app)/(onboarding)/environments/[environmentId]/connect/components/OnboardingSetupInstructions.tsx @@ -1,10 +1,10 @@ "use client"; -import { useTranslate } from "@tolgee/react"; import Link from "next/link"; import "prismjs/themes/prism.css"; import { useState } from "react"; import toast from "react-hot-toast"; +import { useTranslation } from "react-i18next"; import { TProjectConfigChannel } from "@formbricks/types/project"; import { Button } from "@/modules/ui/components/button"; import { CodeBlock } from "@/modules/ui/components/code-block"; @@ -29,7 +29,7 @@ export const OnboardingSetupInstructions = ({ channel, appSetupCompleted, }: OnboardingSetupInstructionsProps) => { - const { t } = useTranslate(); + const { t } = useTranslation(); const [activeTab, setActiveTab] = useState(tabs[0].id); const htmlSnippetForAppSurveys = `