import type { NextConfig } from "next"; import createNextIntlPlugin from "next-intl/plugin"; import withPWAInit from "@ducanh2912/next-pwa"; const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts"); const withPWA = withPWAInit({ dest: "public", cacheOnFrontEndNav: true, aggressiveFrontEndNavCaching: true, reloadOnOnline: true, disable: process.env.NODE_ENV === "development", workboxOptions: { disableDevLogs: true, runtimeCaching: [ // App shell: cache-first, very long TTL { urlPattern: /\/_next\/static\//, handler: "CacheFirst", options: { cacheName: "static-assets", expiration: { maxEntries: 200, maxAgeSeconds: 30 * 24 * 60 * 60 }, }, }, // API: NetworkFirst — show cached data when offline { urlPattern: /\/api\//, handler: "NetworkFirst", options: { cacheName: "api-data", networkTimeoutSeconds: 5, expiration: { maxEntries: 300, maxAgeSeconds: 10 * 60 }, }, }, // Menu images & media { urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp|ico)$/, handler: "StaleWhileRevalidate", options: { cacheName: "media-cache", expiration: { maxEntries: 300, maxAgeSeconds: 7 * 24 * 60 * 60 }, }, }, ], }, }); const adminWebOrigin = process.env.ADMIN_WEB_ORIGIN ?? "http://localhost:3102"; const nextConfig: NextConfig = { output: "standalone", experimental: { optimizePackageImports: ["recharts", "lucide-react"], }, async redirects() { return [ { source: "/:locale(fa|ar|en)/admin", destination: `${adminWebOrigin}/:locale/admin`, permanent: false, }, { source: "/:locale(fa|ar|en)/admin/:path*", destination: `${adminWebOrigin}/:locale/admin/:path*`, permanent: false, }, ]; }, }; export default withPWA(withNextIntl(nextConfig));