-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnext.config.ts
More file actions
129 lines (119 loc) · 2.98 KB
/
next.config.ts
File metadata and controls
129 lines (119 loc) · 2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// Image optimization and remote patterns
images: {
remotePatterns: [
{
protocol: "https",
hostname: "v5.airtableusercontent.com",
pathname: "/**",
},
{ protocol: "https", hostname: "i.ytimg.com", pathname: "/**" },
{
protocol: "https",
hostname: "blogger.googleusercontent.com",
pathname: "/**",
},
{
protocol: "https",
hostname: "jahannuma.vercel.app",
pathname: "/metaImages/**",
},
],
},
// Experimental features for better performance
experimental: {
// Enable optimizePackageImports for better bundle size
optimizePackageImports: ["@clerk/nextjs", "swr"],
// Enable partial prerendering for better performance
ppr: false, // Enable when stable
},
// Redirects for SEO and URL management (empty for now)
async redirects() {
return [];
},
// Enable strict mode for better development experience
reactStrictMode: true,
// Compress responses
compress: true,
// Enable powered by header removal for security
poweredByHeader: false,
// Security headers
async headers() {
return [
{
// CSS files should have proper MIME type
source: "/:path*.css",
headers: [
{
key: "Content-Type",
value: "text/css",
},
],
},
{
// JavaScript files should have proper MIME type
source: "/:path*.js",
headers: [
{
key: "Content-Type",
value: "application/javascript",
},
],
},
{
// All other routes get security headers
source: "/(.*)",
headers: [
{
key: "X-Content-Type-Options",
value: "nosniff",
},
{
key: "Referrer-Policy",
value: "strict-origin-when-cross-origin",
},
{
key: "X-DNS-Prefetch-Control",
value: "on",
},
{
key: "Strict-Transport-Security",
value: "max-age=31536000; includeSubDomains",
},
{
key: "Permissions-Policy",
value: "camera=(), microphone=(), geolocation=()",
},
],
},
{
// Service Worker should not be cached
source: "/sw.js",
headers: [
{
key: "Cache-Control",
value: "no-cache, no-store, must-revalidate",
},
{
key: "Service-Worker-Allowed",
value: "/",
},
],
},
{
// Manifest is now handled by app/manifest.ts
source: "/manifest.webmanifest",
headers: [
{
key: "Cache-Control",
value: "public, max-age=3600",
},
],
},
];
},
// Trailing slash handling
trailingSlash: false,
};
export default nextConfig;