diff --git a/packages/nextjs/src/config/loaders/index.ts b/packages/nextjs/src/config/loaders/index.ts index 27620e004f39..bed3aef3a046 100644 --- a/packages/nextjs/src/config/loaders/index.ts +++ b/packages/nextjs/src/config/loaders/index.ts @@ -2,3 +2,4 @@ export { default as valueInjectionLoader } from './valueInjectionLoader'; export { default as prefixLoader } from './prefixLoader'; export { default as wrappingLoader } from './wrappingLoader'; export { default as sdkMultiplexerLoader } from './sdkMultiplexerLoader'; +export { default as turboTestLoader } from './turboTestLoader'; diff --git a/packages/nextjs/src/config/loaders/turboTestLoader.ts b/packages/nextjs/src/config/loaders/turboTestLoader.ts new file mode 100644 index 000000000000..d5d3676e07a4 --- /dev/null +++ b/packages/nextjs/src/config/loaders/turboTestLoader.ts @@ -0,0 +1,14 @@ +import type { LoaderThis } from './types'; + +/** + * Test loader for turbopack + */ +export default function (this: LoaderThis, source: string, map: any): void { + this.async(); + + // @ts-expect-error this.context is not typed + // eslint-disable-next-line no-console + console.log({ t: this, resourcePath: this.resourcePath, context: this.context }); + + this.callback(null, source, map); +} diff --git a/packages/nextjs/src/config/turbopack.ts b/packages/nextjs/src/config/turbopack.ts new file mode 100644 index 000000000000..37ab7cd2a5a5 --- /dev/null +++ b/packages/nextjs/src/config/turbopack.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import type { NextConfigObject } from './types'; + +/** + * Applies the config for turbopack mode. + */ +export function applyTurbopackOptions(nextConfig: NextConfigObject): void { + nextConfig.experimental ??= {}; + nextConfig.experimental.turbo ??= {}; + nextConfig.experimental.turbo.rules ??= {}; + + const rules = nextConfig.experimental.turbo.rules; + + rules['**/app/**/page.tsx'] ??= []; + rules['**/app/**/page.tsx'].unshift({ + loader: path.resolve(__dirname, 'loaders', 'turboTestLoader.js'), + options: {}, + }); +} diff --git a/packages/nextjs/src/config/types.ts b/packages/nextjs/src/config/types.ts index 7b439a3c5d44..aa2ccbb8b885 100644 --- a/packages/nextjs/src/config/types.ts +++ b/packages/nextjs/src/config/types.ts @@ -60,6 +60,12 @@ export type NextConfigObject = { fallback?: NextRewrite[]; } >; + experimental?: { + turbo?: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + rules?: Record; + }; + }; }; export type UserSentryOptions = { diff --git a/packages/nextjs/src/config/withSentryConfig.ts b/packages/nextjs/src/config/withSentryConfig.ts index 07a22a815ade..4e6edfaafb0d 100644 --- a/packages/nextjs/src/config/withSentryConfig.ts +++ b/packages/nextjs/src/config/withSentryConfig.ts @@ -1,5 +1,6 @@ import { isThenable } from '@sentry/utils'; +import { applyTurbopackOptions } from './turbopack'; import type { ExportedNextConfig, NextConfigFunction, @@ -74,6 +75,8 @@ function getFinalConfigObject( } } + applyTurbopackOptions(incomingUserNextConfigObject); + return { ...incomingUserNextConfigObject, webpack: constructWebpackConfigFunction(