135 lines
3 KiB
JavaScript
135 lines
3 KiB
JavaScript
![]() |
/** @type {import('next').NextConfig} */
|
||
|
const nextConfig = {
|
||
|
output: 'standalone',
|
||
|
experimental: {
|
||
|
appDir: true,
|
||
|
},
|
||
|
|
||
|
// Environment variables
|
||
|
env: {
|
||
|
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001',
|
||
|
NEXT_PUBLIC_WS_URL: process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:3001',
|
||
|
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,
|
||
|
NEXT_PUBLIC_GOOGLE_CLIENT_ID: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID,
|
||
|
},
|
||
|
|
||
|
// Image configuration for external sources
|
||
|
images: {
|
||
|
remotePatterns: [
|
||
|
{
|
||
|
protocol: 'https',
|
||
|
hostname: 'lh3.googleusercontent.com',
|
||
|
port: '',
|
||
|
pathname: '/a/**',
|
||
|
},
|
||
|
{
|
||
|
protocol: 'http',
|
||
|
hostname: 'localhost',
|
||
|
port: '3001',
|
||
|
pathname: '/api/images/**',
|
||
|
},
|
||
|
],
|
||
|
dangerouslyAllowSVG: true,
|
||
|
contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
|
||
|
},
|
||
|
|
||
|
// Headers for security
|
||
|
async headers() {
|
||
|
return [
|
||
|
{
|
||
|
source: '/(.*)',
|
||
|
headers: [
|
||
|
{
|
||
|
key: 'X-Frame-Options',
|
||
|
value: 'DENY',
|
||
|
},
|
||
|
{
|
||
|
key: 'X-Content-Type-Options',
|
||
|
value: 'nosniff',
|
||
|
},
|
||
|
{
|
||
|
key: 'Referrer-Policy',
|
||
|
value: 'strict-origin-when-cross-origin',
|
||
|
},
|
||
|
{
|
||
|
key: 'X-XSS-Protection',
|
||
|
value: '1; mode=block',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
];
|
||
|
},
|
||
|
|
||
|
// Rewrites for API proxy in development
|
||
|
async rewrites() {
|
||
|
if (process.env.NODE_ENV === 'development') {
|
||
|
return [
|
||
|
{
|
||
|
source: '/api/:path*',
|
||
|
destination: `${process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'}/api/:path*`,
|
||
|
},
|
||
|
];
|
||
|
}
|
||
|
return [];
|
||
|
},
|
||
|
|
||
|
// Webpack configuration
|
||
|
webpack: (config, { dev, isServer }) => {
|
||
|
// Optimization for production
|
||
|
if (!dev && !isServer) {
|
||
|
config.optimization.splitChunks.cacheGroups = {
|
||
|
...config.optimization.splitChunks.cacheGroups,
|
||
|
vendor: {
|
||
|
test: /[\\/]node_modules[\\/]/,
|
||
|
name: 'vendors',
|
||
|
chunks: 'all',
|
||
|
priority: 10,
|
||
|
},
|
||
|
common: {
|
||
|
name: 'common',
|
||
|
minChunks: 2,
|
||
|
chunks: 'all',
|
||
|
priority: 5,
|
||
|
reuseExistingChunk: true,
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return config;
|
||
|
},
|
||
|
|
||
|
// TypeScript configuration
|
||
|
typescript: {
|
||
|
ignoreBuildErrors: false,
|
||
|
},
|
||
|
|
||
|
// ESLint configuration
|
||
|
eslint: {
|
||
|
ignoreDuringBuilds: false,
|
||
|
},
|
||
|
|
||
|
// Compression and optimization
|
||
|
compress: true,
|
||
|
poweredByHeader: false,
|
||
|
generateEtags: true,
|
||
|
|
||
|
// Redirects
|
||
|
async redirects() {
|
||
|
return [
|
||
|
{
|
||
|
source: '/dashboard',
|
||
|
destination: '/',
|
||
|
permanent: false,
|
||
|
has: [
|
||
|
{
|
||
|
type: 'cookie',
|
||
|
key: 'authenticated',
|
||
|
value: undefined,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
];
|
||
|
},
|
||
|
};
|
||
|
|
||
|
module.exports = nextConfig;
|