import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Reusable path to an empty shim for optional/native modules (used by Turbopack aliases) const emptyShim = './src/empty/shims/empty.ts'; // `ee/server` is the enterprise app, so default to EE wiring unless explicitly forced off. const isEE = process.env.EDITION !== 'ce' && process.env.NEXT_PUBLIC_EDITION !== 'community'; const nextConfig = { // Transpile shared product packages used by EE server transpilePackages: [ '@product/extensions', '@product/extensions-pages', '@alga-psa/event-schemas', '@alga-psa/core', '@alga-psa/user-activities', ], // Turbopack-specific aliases turbopack: { resolveAlias: { '@': './src', // EE source alias '@ee/*': './src/*', '@enterprise/*': './src/*', '@enterprise': './src', // Feature swap: product pages and entries '@product/extensions/entry': isEE ? '../../packages/product-extensions/ee/entry' : '../../packages/product-extensions/oss/entry', '@product/extensions/pages/list': isEE ? '../../packages/product-extensions-pages/ee/list' : '../../packages/product-extensions-pages/oss/list', '@product/extensions/pages/details': isEE ? '../../packages/product-extensions-pages/ee/details' : '../../packages/product-extensions-pages/oss/details', '@product/extensions/pages/settings': isEE ? '../../packages/product-extensions-pages/ee/settings' : '../../packages/product-extensions-pages/oss/settings', '@product/ext-proxy/handler': isEE ? '../../packages/product-ext-proxy/ee/handler' : '../../packages/product-ext-proxy/oss/handler', '@alga-psa/integrations/entra/components/entry': isEE ? '../../packages/integrations/src/entra/components/ee/entry' : '../../packages/integrations/src/entra/components/oss/entry', '@alga-psa/integrations/entra/routes/entry': isEE ? '../../packages/integrations/src/entra/routes/ee/entry' : '../../packages/integrations/src/entra/routes/oss/entry', // Event schemas package '@alga-psa/event-schemas': '../../packages/event-schemas/src', '@alga-psa/event-schemas/': '../../packages/event-schemas/src/', // SSO provider buttons - always use EE implementation in EE server '@alga-psa/auth/sso/entry': './src/components/auth/SsoProviderButtons.tsx', '@alga-psa/ee-stubs': './src', '@alga-psa/ee-stubs/': './src/', '@alga-psa/workflows/entry': './src/workflows/entry.tsx', // user-activities workflow-task seam — EE app always uses the real implementations. '@alga-psa/user-activities/server/workflow-tasks': './src/user-activities/workflowTasks.server.ts', '@alga-psa/user-activities/client/workflow-tasks': './src/user-activities/workflowTasks.client.tsx', '@alga-psa/product-extension-actions': '../../packages/product-extension-actions/ee/entry.ts', '@alga-psa/product-extension-initialization': './src/lib/extensions/initialize.ts', '@alga-psa/product-auth-ee': '../../packages/product-auth-ee/ee/entry.ts', '@alga-psa/storage': '../../packages/storage/src', '@alga-psa/storage/StorageService': '../../packages/storage/src/StorageService.ts', '@/empty/workflows/entry': './src/empty/workflows/entry.tsx', // Native DB drivers not used 'better-sqlite3': emptyShim, 'sqlite3': emptyShim, 'mysql': emptyShim, 'mysql2': emptyShim, 'oracledb': emptyShim, 'tedious': emptyShim, }, }, experimental: { // Allow importing code from outside this directory (monorepo OSS server code) externalDir: true, // Increase middleware body size limit for extension installs middlewareClientMaxBodySize: '100mb', }, images: { // Avoid requiring the native `sharp` binary locally unoptimized: true, }, eslint: { ignoreDuringBuilds: true, }, productionBrowserSourceMaps: false, reactStrictMode: true, webpack: (config, { isServer }) => { // NOTE: This webpack config is kept for fallback compatibility when Turbopack isn't used // The equivalent settings are now configured in the turbopack section above // Speed up builds config.cache = true; // Helpful aliases and module resolution config.resolve = { ...config.resolve, // Allow .js imports to resolve to TS sources in the monorepo extensionAlias: { '.js': ['.js', '.ts', '.tsx'], }, alias: { ...config.resolve?.alias, '@': path.join(__dirname, 'src'), // Ensure EE imports resolve to this package's src (EE edition) '@ee': path.join(__dirname, 'src'), '@enterprise': path.join(__dirname, 'src'), // Hard-pin common EE import paths used by CE SettingsPage '@ee/lib/extensions/ExtensionComponentLoader': path.join(__dirname, 'src/lib/extensions/ExtensionComponentLoader.tsx'), '@ee/components': path.join(__dirname, 'src/components'), // Feature swap aliases (Webpack) '@product/extensions/entry': isEE ? path.join(__dirname, '../../packages/product-extensions/ee/entry.tsx') : path.join(__dirname, '../../packages/product-extensions/oss/entry.tsx'), '@product/extensions/pages/list': isEE ? path.join(__dirname, '../../packages/product-extensions-pages/ee/list.tsx') : path.join(__dirname, '../../packages/product-extensions-pages/oss/list.tsx'), '@product/extensions/pages/details': isEE ? path.join(__dirname, '../../packages/product-extensions-pages/ee/details.tsx') : path.join(__dirname, '../../packages/product-extensions-pages/oss/details.tsx'), '@product/extensions/pages/settings': isEE ? path.join(__dirname, '../../packages/product-extensions-pages/ee/settings.tsx') : path.join(__dirname, '../../packages/product-extensions-pages/oss/settings.tsx'), '@product/ext-proxy/handler': isEE ? path.join(__dirname, '../../packages/product-ext-proxy/ee/handler.ts') : path.join(__dirname, '../../packages/product-ext-proxy/oss/handler.ts'), '@alga-psa/integrations/entra/components/entry': isEE ? path.join(__dirname, '../../packages/integrations/src/entra/components/ee/entry.tsx') : path.join(__dirname, '../../packages/integrations/src/entra/components/oss/entry.tsx'), '@alga-psa/integrations/entra/routes/entry': isEE ? path.join(__dirname, '../../packages/integrations/src/entra/routes/ee/entry.ts') : path.join(__dirname, '../../packages/integrations/src/entra/routes/oss/entry.ts'), // Event schemas package '@alga-psa/event-schemas': path.join(__dirname, '../../packages/event-schemas/src'), // SSO provider buttons - always use EE implementation in EE server '@alga-psa/auth/sso/entry': path.join(__dirname, 'src/components/auth/SsoProviderButtons.tsx'), '@alga-psa/ee-stubs': path.join(__dirname, 'src'), '@alga-psa/ee-stubs/': path.join(__dirname, 'src/'), '@alga-psa/workflows/entry': path.join(__dirname, 'src/workflows/entry.tsx'), // user-activities workflow-task seam — EE app always uses the real implementations. '@alga-psa/user-activities/server/workflow-tasks': path.join(__dirname, 'src/user-activities/workflowTasks.server.ts'), '@alga-psa/user-activities/client/workflow-tasks': path.join(__dirname, 'src/user-activities/workflowTasks.client.tsx'), '@alga-psa/product-extension-actions': path.join(__dirname, '../../packages/product-extension-actions/ee/entry.ts'), '@alga-psa/product-extension-initialization': path.join(__dirname, 'src/lib/extensions/initialize.ts'), '@alga-psa/product-auth-ee': path.join(__dirname, '../../packages/product-auth-ee/ee/entry.ts'), '@alga-psa/storage': path.join(__dirname, '../../packages/storage/src'), '@alga-psa/storage/StorageService': path.join(__dirname, '../../packages/storage/src/StorageService.ts'), '@/empty/workflows/entry': path.join(__dirname, 'src/empty/workflows/entry.tsx'), // Stub native sharp during local dev to avoid platform build issues sharp: path.join(__dirname, 'src/empty/sharp.ts'), }, modules: [ ...(config.resolve?.modules || ['node_modules']), // Root workspace node_modules path.join(__dirname, '../../node_modules'), ], }; // Exclude optional DB drivers not used (prevents bundling/resolve errors) config.externals = [ ...(config.externals || []), 'oracledb', 'mysql', 'mysql2', 'sqlite3', 'better-sqlite3', 'tedious', ]; // Treat .mjs in node_modules as JS auto config.module.rules.push({ test: /\.mjs$/, include: /node_modules/, type: 'javascript/auto', resolve: { fullySpecified: false }, }); // Exclude flow CSS modules that can cause build issues config.module.rules.push({ test: /\.module\.css$/, include: path.resolve(__dirname, 'src/components/flow'), use: 'null-loader', }); return config; }, }; export default nextConfig;