User search in the admin users page now queries the backend instead of filtering on the client, and resets pagination on search. Next.js config adds production compression, removes console logs in production (except error/warn), disables the poweredByHeader, and introduces custom webpack code splitting for better bundle optimization. Updated tsconfig target to ES2020.
123 lines
3.2 KiB
JavaScript
123 lines
3.2 KiB
JavaScript
import bundleAnalyzer from '@next/bundle-analyzer';
|
|
|
|
const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === 'true' });
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const baseConfig = {
|
|
output: 'standalone',
|
|
reactStrictMode: false,
|
|
compress: process.env.NODE_ENV === 'production',
|
|
images: {
|
|
remotePatterns: [
|
|
{
|
|
protocol: "https",
|
|
hostname: "api.telegram.org",
|
|
},
|
|
{
|
|
protocol: "https",
|
|
hostname: "telegram.org",
|
|
},
|
|
...(process.env.API_HOSTNAME ? [{
|
|
protocol: "https",
|
|
hostname: process.env.API_HOSTNAME,
|
|
}] : []),
|
|
],
|
|
},
|
|
async rewrites() {
|
|
const apiBaseUrl = process.env.API_BASE_URL;
|
|
|
|
if (!apiBaseUrl || apiBaseUrl === 'undefined') {
|
|
console.warn('⚠️ API_BASE_URL not set! Set it to your backend domain');
|
|
console.warn('⚠️ Using localhost fallback - this will fail in production!');
|
|
return [
|
|
{
|
|
source: '/api/:path*',
|
|
destination: 'http://localhost:3001/api/:path*',
|
|
},
|
|
];
|
|
}
|
|
|
|
console.log(`🔗 API rewrites pointing to: ${apiBaseUrl}`);
|
|
return [
|
|
{
|
|
source: '/api/:path*',
|
|
destination: `${apiBaseUrl}/api/:path*`,
|
|
},
|
|
];
|
|
},
|
|
compiler: {
|
|
removeConsole: process.env.NODE_ENV === 'production' ? {
|
|
exclude: ['error', 'warn'],
|
|
} : false,
|
|
},
|
|
poweredByHeader: false,
|
|
webpack: (config, { isServer, dev }) => {
|
|
if (!isServer && !dev) {
|
|
// Only apply aggressive code splitting in production
|
|
config.optimization = {
|
|
...config.optimization,
|
|
moduleIds: 'deterministic',
|
|
splitChunks: {
|
|
chunks: 'all',
|
|
cacheGroups: {
|
|
default: false,
|
|
vendors: false,
|
|
recharts: {
|
|
test: /[\\/]node_modules[\\/]recharts[\\/]/,
|
|
name: 'recharts',
|
|
chunks: 'all',
|
|
priority: 30,
|
|
},
|
|
radix: {
|
|
test: /[\\/]node_modules[\\/]@radix-ui[\\/]/,
|
|
name: 'radix-ui',
|
|
chunks: 'all',
|
|
priority: 25,
|
|
},
|
|
reactMarkdown: {
|
|
test: /[\\/]node_modules[\\/]react-markdown[\\/]/,
|
|
name: 'react-markdown',
|
|
chunks: 'all',
|
|
priority: 20,
|
|
},
|
|
dateFns: {
|
|
test: /[\\/]node_modules[\\/]date-fns[\\/]/,
|
|
name: 'date-fns',
|
|
chunks: 'all',
|
|
priority: 15,
|
|
},
|
|
framework: {
|
|
name: 'framework',
|
|
chunks: 'all',
|
|
test: /[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/,
|
|
priority: 40,
|
|
enforce: true,
|
|
},
|
|
commons: {
|
|
name: 'commons',
|
|
minChunks: 2,
|
|
priority: 10,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
return config;
|
|
},
|
|
onDemandEntries: {
|
|
maxInactiveAge: 15 * 1000,
|
|
pagesBufferLength: 2,
|
|
},
|
|
productionBrowserSourceMaps: false,
|
|
typescript: {
|
|
ignoreBuildErrors: true,
|
|
},
|
|
eslint: {
|
|
ignoreDuringBuilds: true,
|
|
},
|
|
};
|
|
|
|
const nextConfig = withBundleAnalyzer(baseConfig);
|
|
|
|
export default nextConfig;
|