diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index b5a6ac4ba3e8e..99831dcf438b2 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -1378,29 +1378,34 @@ export default async function build( const startTime = process.hrtime() const bindings = await loadBindings(config?.experimental?.useWasmBinary) const dev = false - const project = await bindings.turbo.createProject({ - projectPath: dir, - rootPath: config.experimental.outputFileTracingRoot || dir, - nextConfig: config, - jsConfig: await getTurbopackJsConfig(dir, config), - watch: false, - dev, - env: process.env as Record, - defineEnv: createDefineEnv({ - isTurbopack: true, - clientRouterFilters: NextBuildContext.clientRouterFilters, - config, + const project = await bindings.turbo.createProject( + { + projectPath: dir, + rootPath: config.experimental.outputFileTracingRoot || dir, + nextConfig: config, + jsConfig: await getTurbopackJsConfig(dir, config), + watch: false, dev, - distDir, - fetchCacheKeyPrefix: config.experimental.fetchCacheKeyPrefix, - hasRewrites, - // TODO: Implement - middlewareMatchers: undefined, - }), - buildId: NextBuildContext.buildId!, - encryptionKey: NextBuildContext.encryptionKey!, - previewProps: NextBuildContext.previewProps!, - }) + env: process.env as Record, + defineEnv: createDefineEnv({ + isTurbopack: true, + clientRouterFilters: NextBuildContext.clientRouterFilters, + config, + dev, + distDir, + fetchCacheKeyPrefix: config.experimental.fetchCacheKeyPrefix, + hasRewrites, + // TODO: Implement + middlewareMatchers: undefined, + }), + buildId: NextBuildContext.buildId!, + encryptionKey: NextBuildContext.encryptionKey!, + previewProps: NextBuildContext.previewProps!, + }, + { + memoryLimit: config.experimental.turbo?.memoryLimit, + } + ) await fs.mkdir(path.join(distDir, 'server'), { recursive: true }) await fs.mkdir(path.join(distDir, 'static', buildId), { diff --git a/packages/next/src/server/config-schema.ts b/packages/next/src/server/config-schema.ts index 5fbcf7832ef52..70c5d86afc335 100644 --- a/packages/next/src/server/config-schema.ts +++ b/packages/next/src/server/config-schema.ts @@ -386,6 +386,7 @@ export const configSchema: zod.ZodType = z.lazy(() => .optional(), resolveExtensions: z.array(z.string()).optional(), useSwcCss: z.boolean().optional(), + memoryLimit: z.number().optional(), }) .optional(), optimizePackageImports: z.array(z.string()).optional(), diff --git a/packages/next/src/server/config-shared.ts b/packages/next/src/server/config-shared.ts index 3331a943047e5..a9e7bd444e8d7 100644 --- a/packages/next/src/server/config-shared.ts +++ b/packages/next/src/server/config-shared.ts @@ -148,6 +148,11 @@ export interface ExperimentalTurboOptions { * Use swc_css instead of lightningcss for turbopakc */ useSwcCss?: boolean + + /** + * A target memory limit for turbo, in bytes. + */ + memoryLimit?: number } export interface WebpackConfigContext { diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index f6409ae24184f..6932168af4856 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -123,30 +123,35 @@ export async function createHotReloaderTurbopack( hotReloaderSpan.stop() const encryptionKey = await generateEncryptionKeyBase64(true) - const project = await bindings.turbo.createProject({ - projectPath: dir, - rootPath: opts.nextConfig.experimental.outputFileTracingRoot || dir, - nextConfig: opts.nextConfig, - jsConfig: await getTurbopackJsConfig(dir, nextConfig), - watch: true, - dev: true, - env: process.env as Record, - defineEnv: createDefineEnv({ - isTurbopack: true, - // TODO: Implement - clientRouterFilters: undefined, - config: nextConfig, + const project = await bindings.turbo.createProject( + { + projectPath: dir, + rootPath: opts.nextConfig.experimental.outputFileTracingRoot || dir, + nextConfig: opts.nextConfig, + jsConfig: await getTurbopackJsConfig(dir, nextConfig), + watch: true, dev: true, - distDir, - fetchCacheKeyPrefix: opts.nextConfig.experimental.fetchCacheKeyPrefix, - hasRewrites, - // TODO: Implement - middlewareMatchers: undefined, - }), - buildId, - encryptionKey, - previewProps: opts.fsChecker.prerenderManifest.preview, - }) + env: process.env as Record, + defineEnv: createDefineEnv({ + isTurbopack: true, + // TODO: Implement + clientRouterFilters: undefined, + config: nextConfig, + dev: true, + distDir, + fetchCacheKeyPrefix: opts.nextConfig.experimental.fetchCacheKeyPrefix, + hasRewrites, + // TODO: Implement + middlewareMatchers: undefined, + }), + buildId, + encryptionKey, + previewProps: opts.fsChecker.prerenderManifest.preview, + }, + { + memoryLimit: opts.nextConfig.experimental.turbo?.memoryLimit, + } + ) const entrypointsSubscription = project.entrypointsSubscribe() const currentEntrypoints: Entrypoints = {