import { withPayload } from '@payloadcms/next/withPayload' import type { NextConfig } from 'next' const ONE_YEAR = 'public, max-age=31536000, immutable' const ONE_DAY = 'public, max-age=86400, must-revalidate' const nextConfig: NextConfig = { output: 'standalone', reactStrictMode: true, async headers() { return [ { // public/ images are mutable (replaced in-place) — allow daily revalidation source: '/images/:path*', headers: [{ key: 'Cache-Control', value: ONE_DAY }], }, { // _next/static/ assets have content-hashed filenames — safe to cache forever source: '/_next/static/:path*', headers: [{ key: 'Cache-Control', value: ONE_YEAR }], }, ] }, webpack: (config) => { config.watchOptions = { ...config.watchOptions, ignored: /node_modules|importMap\.js|\.next/, } return config }, images: { formats: ['image/avif', 'image/webp'], deviceSizes: [375, 640, 768, 1024, 1280, 1536, 1920], imageSizes: [16, 32, 64, 96, 128, 256, 384, 512, 694], minimumCacheTTL: 31536000, remotePatterns: [ { protocol: 'http', hostname: 'localhost', port: '3000', pathname: '/media/**' }, { protocol: 'https', hostname: 'shumiland.com.ua', pathname: '/media/**' }, { protocol: 'https', hostname: 'shumi.ai-impress.com', pathname: '/api/media/**' }, { protocol: 'http', hostname: 'localhost', port: '3000', pathname: '/api/media/**' }, ], }, } export default withPayload(nextConfig)