diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/app/layout.tsx b/test/development/app-dir/turbopack-loader-file-dependencies/app/layout.tsx new file mode 100644 index 000000000000..888614deda3b --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/app/layout.tsx @@ -0,0 +1,8 @@ +import { ReactNode } from 'react' +export default function Root({ children }: { children: ReactNode }) { + return ( + +
{children} + + ) +} diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/app/page.tsx b/test/development/app-dir/turbopack-loader-file-dependencies/app/page.tsx new file mode 100644 index 000000000000..9337b26e7a0c --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/app/page.tsx @@ -0,0 +1,5 @@ +import { utilFn } from '../utils/file-to-transform' + +export default function Page() { + return{utilFn()}
+} diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/loader.js b/test/development/app-dir/turbopack-loader-file-dependencies/loader.js new file mode 100644 index 000000000000..2cf8c8202945 --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/loader.js @@ -0,0 +1,22 @@ +const path = require('node:path') + +const loader = async function (content) { + this.async() + + if (!this.resourcePath.endsWith('file-to-transform.ts')) { + return this.callback(null, content) + } + + const dependencyFile = './file-dependency.ts' + const context = path.dirname(this.resourcePath) + const resolve = this.getResolve({}) + const result = await resolve(context, dependencyFile) + this.addDependency(result) + + this.callback( + null, + `export const utilFn = () => 'Generated at ${new Date().toISOString()}';` + ) +} + +module.exports = loader diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/next.config.js b/test/development/app-dir/turbopack-loader-file-dependencies/next.config.js new file mode 100644 index 000000000000..4ed4ed232afd --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/next.config.js @@ -0,0 +1,23 @@ +const path = require('node:path') + +/** + * @type {import('next').NextConfig} + */ +const nextConfig = { + turbopack: { + rules: { + '*.ts': { + loaders: [path.resolve(__dirname, './loader.js')], + }, + }, + }, + webpack: (config) => { + config.module.rules.push({ + test: /\.ts$/, + use: [path.resolve(__dirname, './loader.js')], + }) + return config + }, +} + +module.exports = nextConfig diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts b/test/development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts new file mode 100644 index 000000000000..78532925b8a4 --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts @@ -0,0 +1,25 @@ +import { nextTestSetup } from 'e2e-utils' +import { waitFor } from 'next-test-utils' + +describe('turbopack-loader-file-dependencies', () => { + const { next } = nextTestSetup({ + files: __dirname, + }) + + it('should update when the dependency file changes', async () => { + const $ = await next.render$('/') + const initialText = await $('p').text() + expect(initialText).toBeTruthy() + + await next.patchFile( + 'utils/file-dependency.ts', + 'export const magicValue = "magic-value-2";' + ) + + await waitFor(1000) + + const $2 = await next.render$('/') + const newText = await $2('p').text() + expect(newText).not.toBe(initialText) + }) +}) diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-dependency.ts b/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-dependency.ts new file mode 100644 index 000000000000..a0e44359d9db --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-dependency.ts @@ -0,0 +1 @@ +export const magicValue = 'magic-value' diff --git a/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-to-transform.ts b/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-to-transform.ts new file mode 100644 index 000000000000..287bcf9d232d --- /dev/null +++ b/test/development/app-dir/turbopack-loader-file-dependencies/utils/file-to-transform.ts @@ -0,0 +1,5 @@ +import { magicValue } from './file-dependency' + +export const utilFn = () => { + return magicValue +} diff --git a/turbopack/crates/turbopack-node/src/transforms/webpack.rs b/turbopack/crates/turbopack-node/src/transforms/webpack.rs index 9986f5627316..8cacb6e71bac 100644 --- a/turbopack/crates/turbopack-node/src/transforms/webpack.rs +++ b/turbopack/crates/turbopack-node/src/transforms/webpack.rs @@ -362,6 +362,7 @@ pub enum InfoMessage { // Sent to inform Turbopack about the dependencies of the task. // All fields are `default` since it is ok for the client to // simply omit instead of sending empty arrays. + #[serde(rename_all = "camelCase")] Dependencies { #[serde(default)] env_variables: Vec