From 79d41b6a73ae5582c109f9dcc4d4fa4d1af67b4b Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 3 Feb 2026 16:55:20 +0100 Subject: [PATCH] feat: conditionally apply next-intl plugin and fix shared eslint ignore patterns --- packages/eslint-config/next.js | 4 ++ packages/gatekeeper/package.json | 2 +- packages/next-config/index.js | 28 ++++++++-- packages/next-config/package.json | 2 +- packages/next-utils/package.json | 2 +- pnpm-lock.yaml | 88 +++---------------------------- 6 files changed, 37 insertions(+), 89 deletions(-) diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js index e4adbbb..2ebc9d5 100644 --- a/packages/eslint-config/next.js +++ b/packages/eslint-config/next.js @@ -13,10 +13,14 @@ export const nextConfig = [ { ignores: [ "**/dist/**", + "**/build/**", + "**/out/**", + "**/coverage/**", "**/.next/**", "**/node_modules/**", "**/.gitea/**", "**/.changeset/**", + "**/.vercel/**", ], }, ...compat.extends("next/core-web-vitals", "next/typescript"), diff --git a/packages/gatekeeper/package.json b/packages/gatekeeper/package.json index a4f46ed..d839fc3 100644 --- a/packages/gatekeeper/package.json +++ b/packages/gatekeeper/package.json @@ -15,7 +15,7 @@ "clsx": "^2.1.1", "lucide-react": "^0.474.0", "next": "15.1.6", - "next-intl": "^3.26.5", + "next-intl": "^4.8.2", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwind-merge": "^2.6.0" diff --git a/packages/next-config/index.js b/packages/next-config/index.js index d7b75d7..063ffff 100644 --- a/packages/next-config/index.js +++ b/packages/next-config/index.js @@ -1,7 +1,7 @@ import createNextIntlPlugin from "next-intl/plugin"; import { withSentryConfig } from "@sentry/nextjs"; - -const withNextIntl = createNextIntlPlugin(); +import fs from "node:fs"; +import path from "node:path"; /** @type {import('next').NextConfig} */ export const baseNextConfig = { @@ -34,10 +34,30 @@ export const baseNextConfig = { }; const withMintelConfig = (config) => { - const nextIntlConfig = withNextIntl({ ...baseNextConfig, ...config }); + const i18nPaths = [ + "src/i18n/request.ts", + "src/i18n/request.tsx", + "i18n/request.ts", + "i18n/request.tsx", + "src/i18n.ts", + "src/i18n.tsx", + "i18n.ts", + "i18n.tsx", + ]; + + const hasI18nConfig = i18nPaths.some((p) => + fs.existsSync(path.resolve(process.cwd(), p)), + ); + + let nextConfig = { ...baseNextConfig, ...config }; + + if (hasI18nConfig) { + const withNextIntl = createNextIntlPlugin(); + nextConfig = withNextIntl(nextConfig); + } return withSentryConfig( - nextIntlConfig, + nextConfig, { silent: !process.env.CI, treeshake: { removeDebugLogging: true }, diff --git a/packages/next-config/package.json b/packages/next-config/package.json index faed777..82589f3 100644 --- a/packages/next-config/package.json +++ b/packages/next-config/package.json @@ -15,7 +15,7 @@ } }, "dependencies": { - "next-intl": "^3.0.0", + "next-intl": "^4.8.2", "@sentry/nextjs": "^8.0.0" } } diff --git a/packages/next-utils/package.json b/packages/next-utils/package.json index 51fd977..e956a54 100644 --- a/packages/next-utils/package.json +++ b/packages/next-utils/package.json @@ -17,7 +17,7 @@ "dependencies": { "@directus/sdk": "^21.0.0", "next": "15.1.6", - "next-intl": "^3.0.0", + "next-intl": "^4.8.2", "zod": "^3.0.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b156de8..f598753 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -179,8 +179,8 @@ importers: specifier: 15.1.6 version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-intl: - specifier: ^3.26.5 - version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + specifier: ^4.8.2 + version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3) react: specifier: ^19.0.0 version: 19.2.4 @@ -249,8 +249,8 @@ importers: specifier: ^8.0.0 version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.104.1) next-intl: - specifier: ^3.0.0 - version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + specifier: ^4.8.2 + version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3) packages/next-utils: dependencies: @@ -261,8 +261,8 @@ importers: specifier: 15.1.6 version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-intl: - specifier: ^3.0.0 - version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + specifier: ^4.8.2 + version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3) zod: specifier: ^3.0.0 version: 3.25.76 @@ -764,36 +764,21 @@ packages: '@noble/hashes': optional: true - '@formatjs/ecma402-abstract@2.3.6': - resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} - '@formatjs/ecma402-abstract@3.1.1': resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==} - '@formatjs/fast-memoize@2.2.7': - resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - '@formatjs/fast-memoize@3.1.0': resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} - '@formatjs/icu-messageformat-parser@2.11.4': - resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} - '@formatjs/icu-messageformat-parser@3.5.1': resolution: {integrity: sha512-sSDmSvmmoVQ92XqWb499KrIhv/vLisJU8ITFrx7T7NZHUmMY7EL9xgRowAosaljhqnj/5iufG24QrdzB6X3ItA==} - '@formatjs/icu-skeleton-parser@1.8.16': - resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} - '@formatjs/icu-skeleton-parser@2.1.1': resolution: {integrity: sha512-PSFABlcNefjI6yyk8f7nyX1DC7NHmq6WaCHZLySEXBrXuLOB2f935YsnzuPjlz+ibhb9yWTdPeVX1OVcj24w2Q==} '@formatjs/intl-localematcher@0.5.10': resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} - '@formatjs/intl-localematcher@0.6.2': - resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@formatjs/intl-localematcher@0.8.1': resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==} @@ -3060,9 +3045,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - intl-messageformat@10.7.18: - resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} - intl-messageformat@11.1.2: resolution: {integrity: sha512-ucSrQmZGAxfiBHfBRXW/k7UC8MaGFlEj4Ry1tKiDcmgwQm1y3EDl40u+4VNHYomxJQMJi9NEI3riDRlth96jKg==} @@ -3497,12 +3479,6 @@ packages: next-intl-swc-plugin-extractor@4.8.2: resolution: {integrity: sha512-sHDs36L1VZmFHj3tPHsD+KZJtnsRudHlNvT0ieIe3iFVn5OpGLTxW3d/Zc/2LXSj5GpGuR6wQeikbhFjU9tMQQ==} - next-intl@3.26.5: - resolution: {integrity: sha512-EQlCIfY0jOhRldiFxwSXG+ImwkQtDEfQeSOEQp6ieAGSLWGlgjdb/Ck/O7wMfC430ZHGeUKVKax8KGusTPKCgg==} - peerDependencies: - next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - next-intl@4.8.2: resolution: {integrity: sha512-GuuwyvyEI49/oehQbBXEoY8KSIYCzmfMLhmIwhMXTb+yeBmly1PnJcpgph3KczQ+HTJMXwXCmkizgtT8jBMf3A==} peerDependencies: @@ -4377,11 +4353,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-intl@3.26.5: - resolution: {integrity: sha512-OdsJnC/znPvHCHLQH/duvQNXnP1w0hPfS+tkSi3mAbfjYBGh4JnyfdwkQBfIVf7t8gs9eSX/CntxUMvtKdG2MQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - use-intl@4.8.2: resolution: {integrity: sha512-3VNXZgDnPFqhIYosQ9W1Hc6K5q+ZelMfawNbexdwL/dY7BTHbceLUBX5Eeex9lgogxTp0pf1SjHuhYNAjr9H3g==} peerDependencies: @@ -5168,13 +5139,6 @@ snapshots: '@exodus/bytes@1.10.0': {} - '@formatjs/ecma402-abstract@2.3.6': - dependencies: - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.2 - decimal.js: 10.6.0 - tslib: 2.8.1 - '@formatjs/ecma402-abstract@3.1.1': dependencies: '@formatjs/fast-memoize': 3.1.0 @@ -5182,31 +5146,16 @@ snapshots: decimal.js: 10.6.0 tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.7': - dependencies: - tslib: 2.8.1 - '@formatjs/fast-memoize@3.1.0': dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.11.4': - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/icu-skeleton-parser': 1.8.16 - tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@3.5.1': dependencies: '@formatjs/ecma402-abstract': 3.1.1 '@formatjs/icu-skeleton-parser': 2.1.1 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.16': - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@2.1.1': dependencies: '@formatjs/ecma402-abstract': 3.1.1 @@ -5216,10 +5165,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@formatjs/intl-localematcher@0.6.2': - dependencies: - tslib: 2.8.1 - '@formatjs/intl-localematcher@0.8.1': dependencies: '@formatjs/fast-memoize': 3.1.0 @@ -7723,13 +7668,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - intl-messageformat@10.7.18: - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.4 - tslib: 2.8.1 - intl-messageformat@11.1.2: dependencies: '@formatjs/ecma402-abstract': 3.1.1 @@ -8151,14 +8089,6 @@ snapshots: next-intl-swc-plugin-extractor@4.8.2: {} - next-intl@3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4): - dependencies: - '@formatjs/intl-localematcher': 0.5.10 - negotiator: 1.0.0 - next: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - use-intl: 3.26.5(react@19.2.4) - next-intl@4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 @@ -9163,12 +9093,6 @@ snapshots: dependencies: punycode: 2.3.1 - use-intl@3.26.5(react@19.2.4): - dependencies: - '@formatjs/fast-memoize': 2.2.7 - intl-messageformat: 10.7.18 - react: 19.2.4 - use-intl@4.8.2(react@19.2.4): dependencies: '@formatjs/fast-memoize': 3.1.0