mirror of
https://github.com/yusufipk/OpenFrame.git
synced 2026-09-11 17:46:06 +00:00
78 lines
1.9 KiB
TypeScript
78 lines
1.9 KiB
TypeScript
import type { NextConfig } from "next";
|
|
import type { RemotePattern } from "next/dist/shared/lib/image-config";
|
|
|
|
function resolveBunnyCdnHostname(): string | null {
|
|
const raw = process.env.BUNNY_CDN_URL || process.env.NEXT_PUBLIC_BUNNY_CDN_URL;
|
|
if (!raw) return null;
|
|
try {
|
|
const parsed = new URL(raw);
|
|
return parsed.hostname || null;
|
|
} catch {
|
|
return raw.replace(/^https?:\/\//, '').replace(/\/+$/, '') || null;
|
|
}
|
|
}
|
|
|
|
const bunnyCdnHostname = resolveBunnyCdnHostname();
|
|
const remotePatterns: RemotePattern[] = [
|
|
{ protocol: 'https', hostname: 'img.youtube.com' },
|
|
{ protocol: 'https', hostname: 'i.ytimg.com' },
|
|
{ protocol: 'https', hostname: 'images.unsplash.com' },
|
|
{ protocol: 'https', hostname: 'vz-thumbnail.b-cdn.net' },
|
|
...(bunnyCdnHostname ? [{ protocol: 'https' as const, hostname: bunnyCdnHostname }] : []),
|
|
];
|
|
|
|
const nextConfig: NextConfig = {
|
|
images: {
|
|
remotePatterns,
|
|
formats: ['image/avif', 'image/webp'],
|
|
},
|
|
experimental: {
|
|
optimizePackageImports: ['lucide-react', 'radix-ui'],
|
|
serverMinification: true,
|
|
},
|
|
poweredByHeader: false,
|
|
compress: true,
|
|
async headers() {
|
|
return [
|
|
{
|
|
source: '/_next/static/:path*',
|
|
headers: [
|
|
{
|
|
key: 'Cache-Control',
|
|
value: 'public, max-age=31536000, immutable',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
source: '/images/:path*',
|
|
headers: [
|
|
{
|
|
key: 'Cache-Control',
|
|
value: 'public, max-age=2592000',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
source: '/:path*.ico',
|
|
headers: [
|
|
{
|
|
key: 'Cache-Control',
|
|
value: 'public, max-age=604800',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
source: '/:path*.svg',
|
|
headers: [
|
|
{
|
|
key: 'Cache-Control',
|
|
value: 'public, max-age=2592000',
|
|
},
|
|
],
|
|
},
|
|
];
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|