import fs from 'node:fs'; import path from 'node:path'; import type { NextConfig } from 'next'; const isStaticExportBuild = process.env.NEXT_EXPORT === '1'; const runtimeConfigOrigin = process.env.FUNNEL_RUNTIME_CONFIG_ORIGIN?.trim().replace(/\/+$/, '') || ''; // Inside the funnelsgrove monorepo, alias @funnelsgrove/* to the package // sources so changes there rebuild live. Standalone copies (funnels created // from this template) resolve the published packages from node_modules. const insideMonorepo = fs.existsSync(path.resolve(__dirname, '../funnel-runtime/src/index.ts')); const sourcePackageAliases: Record = insideMonorepo ? { '@funnelsgrove/runtime/config/env.config': path.resolve(__dirname, '../funnel-runtime/src/config/env.config.ts'), '@funnelsgrove/runtime': path.resolve(__dirname, '../funnel-runtime/src/index.ts'), '@funnelsgrove/analytics': path.resolve(__dirname, '../funnel-analytics/src/index.ts'), '@funnelsgrove/payments': path.resolve(__dirname, '../funnel-payments/src/index.ts'), } : {}; const turbopackSourcePackageAliases: Record = insideMonorepo ? { '@funnelsgrove/runtime/config/env.config': '../funnel-runtime/src/config/env.config.ts', '@funnelsgrove/runtime': '../funnel-runtime/src/index.ts', '@funnelsgrove/analytics': '../funnel-analytics/src/index.ts', '@funnelsgrove/payments': '../funnel-payments/src/index.ts', } : {}; const nextConfig: NextConfig = { ...(isStaticExportBuild ? { output: 'export' as const } : { rewrites: async () => [ ...(runtimeConfigOrigin ? [{ source: '/api/funnel-config/:path*', destination: `${runtimeConfigOrigin}/api/funnel-config/:path*`, }] : []), { source: '/ingest/static/:path*', destination: 'https://us-assets.i.posthog.com/static/:path*', }, { source: '/ingest/array/:path*', destination: 'https://us-assets.i.posthog.com/array/:path*', }, { source: '/ingest/:path*', destination: 'https://us.i.posthog.com/:path*', }, ], }), compress: true, transpilePackages: ['@funnelsgrove/runtime', '@funnelsgrove/analytics', '@funnelsgrove/payments'], turbopack: { resolveAlias: turbopackSourcePackageAliases, }, webpack: (config) => { config.resolve ??= {}; config.resolve.alias = { ...(config.resolve.alias ?? {}), ...sourcePackageAliases, }; return config; }, images: { unoptimized: isStaticExportBuild, formats: ['image/avif', 'image/webp'], minimumCacheTTL: 60 * 60 * 24 * 30, dangerouslyAllowSVG: true, }, }; export default nextConfig;