diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..2443def --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,109 @@ +import nextMDX from "@next/mdx"; +import path from "path"; + +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + optimizePackageImports: [ + 'lucide-react', + 'react-icons', + '@tabler/icons-react', + 'framer-motion', + 'react-hook-form', + '@radix-ui/react-label', + '@radix-ui/react-slot', + ], + }, + + reactStrictMode: false, + + images: { + remotePatterns: [ + { protocol: 'https', hostname: 'i.pravatar.cc' }, + { protocol: 'https', hostname: 'images.unsplash.com' }, + { protocol: 'https', hostname: '*.supabase.co' }, + { protocol: 'https', hostname: 'www.robot-speed.com' }, + { protocol: 'https', hostname: 'robot-speed.com' }, + ], + formats: ['image/avif', 'image/webp'], + loader: 'default', + dangerouslyAllowSVG: true, + contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;", + }, + + pageExtensions: ["js", "jsx", "ts", "tsx", "md", "mdx"], + poweredByHeader: false, + compress: true, + + typescript: { + ignoreBuildErrors: true + }, + + eslint: { + ignoreDuringBuilds: true + }, + + productionBrowserSourceMaps: false, + + compiler: { + removeConsole: process.env.NODE_ENV === 'production' ? { exclude: ['error'] } : false, + reactRemoveProperties: process.env.NODE_ENV === 'production' ? { properties: ['^data-testid$'] } : false, + }, + + transpilePackages: ['geist', 'cobe'], + + webpack: (config, { isServer, webpack }) => { + config.resolve.alias = { + ...config.resolve.alias, + '@': path.resolve('.'), + '@components': path.resolve('./components'), + '@lib': path.resolve('./lib'), + '@constants': path.resolve('./constants'), + '@context': path.resolve('./context'), + }; + + const isVercel = !!(process.env.VERCEL || process.env.NEXT_PUBLIC_VERCEL || process.env.VERCEL_ENV); + const isProduction = process.env.NODE_ENV === 'production'; + + if (isVercel || isProduction) { + config.plugins.push( + new webpack.NormalModuleReplacementPlugin( + /tailwind-cdn-loader/, + path.resolve('./components/empty-loader.tsx') + ) + ); + } + + return config; + }, + + async headers() { + return [ + { + source: '/:path*', + headers: [ + { key: 'X-Frame-Options', value: 'ALLOWALL' }, + { key: 'Cache-Control', value: 'no-store, no-cache, must-revalidate, proxy-revalidate' }, + { key: 'Pragma', value: 'no-cache' }, + { key: 'Expires', value: '0' }, + ], + }, + { + source: '/_next/static/:path*', + headers: [ + { key: 'Cache-Control', value: 'no-cache, no-store, must-revalidate' }, + ], + }, + ]; + }, +}; + +const withMDX = nextMDX({ + extension: /\.mdx?$/, + options: { + remarkPlugins: [], + rehypePlugins: [], + }, +}); + +export default withMDX(nextConfig);