Skip to content

Simplify how json imports workby turning it into a source transform#89631

Draft
lukesandberg wants to merge 1 commit intoimport_with_type_text_turbopackfrom
json_modules
Draft

Simplify how json imports workby turning it into a source transform#89631
lukesandberg wants to merge 1 commit intoimport_with_type_text_turbopackfrom
json_modules

Conversation

@lukesandberg
Copy link
Contributor

@lukesandberg lukesandberg commented Feb 7, 2026

Refactor JSON module handling in Turbopack

What?

Moves the JSON module handling from a separate crate (turbopack-json) into the turbopack-ecmascript crate as a source transform, similar to how text and binary files are handled.

Why?

This simplifies the codebase by:

  1. Removing a separate crate dependency
  2. Using a consistent pattern for handling non-JavaScript assets
  3. Improving error handling for invalid JSON files

How?

  • Removed the turbopack-json crate
  • Added a new json_source_transform.rs module to turbopack-ecmascript
  • Implemented two modes for JSON handling:
    • Spec-compliant ESM mode (for import ... with { type: 'json' })
    • Webpack-compatible CommonJS mode (for regular imports)
  • Added "no side effects" directive to JSON, text, and binary modules to preserve tree shaking
  • Updated error handling to provide better feedback for invalid JSON

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js. labels Feb 7, 2026
Copy link
Contributor Author

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

This stack of pull requests is managed by Graphite. Learn more about stacking.

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 7, 2026

Failing test suites

Commit: 808696f | About building and testing Next.js

pnpm test-start-turbo test/e2e/app-dir-export/test/start.test.ts (turbopack) (job)

  • required server files app router > should send the right cache headers for an app route (DD)
  • required server files app router > should handle optional catchall (DD)
  • required server files app router > should send the right cache headers for an app page (DD)
  • required server files app router > should not fail caching (DD)
  • required server files app router > should properly handle prerender for bot request (DD)
  • required server files app router > should properly handle fallback for bot request (DD)
  • required server files app router > should send cache tags in minimal mode for ISR (DD)
  • required server files app router > should not send cache tags in minimal mode for SSR (DD)
  • required server files app router > should not send invalid soft tags to cache handler (DD)
  • required server files app router > should not override params with query params (DD)
  • required server files app router > should de-dupe HTML/RSC requests for ISR pages (DD)
  • required server files app router > should isolate cache between different ISR request groups (DD)
Expand output

● required server files app router › should send the right cache headers for an app route

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should handle optional catchall

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should send the right cache headers for an app page

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should not fail caching

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should properly handle prerender for bot request

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should properly handle fallback for bot request

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should send cache tags in minimal mode for ISR

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should not send cache tags in minimal mode for SSR

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should not send invalid soft tags to cache handler

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should not override params with query params

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should de-dupe HTML/RSC requests for ISR pages

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● required server files app router › should isolate cache between different ISR request groups

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  100 |     delete process.env.NOW_BUILDER
  101 |     delete process.env.NEXT_PRIVATE_TEST_HEADERS
> 102 |     await next.destroy()
      |                ^
  103 |     if (server) await killApp(server)
  104 |   })
  105 |

  at Object.destroy (production/standalone-mode/required-server-files/required-server-files-app.test.ts:102:16)

pnpm test-start-turbo test/e2e/app-dir/app-esm-js/standalone.test.ts (turbopack) (job)

  • next-server-nft > default mode > should not trace too many files in next-minimal-server.js.nft.json (DD)
  • next-server-nft > with output:standalone > should not trace too many files in next-server.js.nft.json (DD)
Expand output

● next-server-nft › with output:standalone › should not trace too many files in next-server.js.nft.json

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● next-server-nft › default mode › should not trace too many files in next-minimal-server.js.nft.json

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `next-server-nft default mode should not trace too many files in next-minimal-server.js.nft.json 1`

- Snapshot  - 0
+ Received  + 1

@@ -65,7 +65,8 @@
    "/node_modules/next/dist/shared/lib/server-reference-info.js",
    "/node_modules/react/cjs/react.production.js",
    "/node_modules/react/index.js",
    "/node_modules/styled-jsx/dist/index/index.js",
    "/node_modules/styled-jsx/index.js",
+   "/node_modules/styled-jsx/package.json.[json].cjs",
    "/node_modules/styled-jsx/style.js",
  ]

  445 |           '.next/next-minimal-server.js.nft.json'
  446 |         )
> 447 |         expect(trace).toMatchInlineSnapshot(`
      |                       ^
  448 |                 [
  449 |                   "/node_modules/client-only/index.js",
  450 |                   "/node_modules/next/dist/client/components/app-router-headers.js",

  at Object.toMatchInlineSnapshot (production/next-server-nft/next-server-nft.test.ts:447:23)

pnpm test-start-turbo test/production/standalone-mode/no-app-routes/index.test.ts (turbopack) (job)

  • minimal-mode-response-cache > app router revalidate should work with previous response cache dynamic (DD)
  • minimal-mode-response-cache > app router revalidate should work with previous response cache (DD)
  • minimal-mode-response-cache > should have correct "Started server on" log (DD)
  • minimal-mode-response-cache > should have correct responses (DD)
Expand output

● minimal-mode-response-cache › app router revalidate should work with previous response cache dynamic

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● minimal-mode-response-cache › app router revalidate should work with previous response cache

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● minimal-mode-response-cache › should have correct "Started server on" log

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● minimal-mode-response-cache › should have correct responses

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'destroy')

  88 |     delete process.env.NOW_BUILDER
  89 |     delete process.env.NEXT_PRIVATE_TEST_HEADERS
> 90 |     await next.destroy()
     |                ^
  91 |     if (server) await killApp(server)
  92 |   })
  93 |

  at Object.destroy (production/standalone-mode/response-cache/index.test.ts:90:16)

pnpm test-start-turbo test/production/standalone-mode/runtimeServerDeploymentId/index.test.ts (turbopack) (job)

  • standalone mode: runtimeServerDeploymentId > it should load app-page (DD)
  • standalone mode: runtimeServerDeploymentId > it should load app-page-edge (DD)
  • standalone mode: runtimeServerDeploymentId > it should load app-route (DD)
  • standalone mode: runtimeServerDeploymentId > it should load app-route-edge (DD)
  • standalone mode: runtimeServerDeploymentId > it should load pages-page (DD)
  • standalone mode: runtimeServerDeploymentId > it should load pages-page-edge (DD)
  • standalone mode: runtimeServerDeploymentId > it should load api/pages-route (DD)
  • standalone mode: runtimeServerDeploymentId > it should load api/pages-route-edge (DD)
Expand output

● standalone mode: runtimeServerDeploymentId › it should load app-page

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load app-page-edge

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load app-route

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load app-route-edge

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load pages-page

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load pages-page-edge

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load api/pages-route

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

● standalone mode: runtimeServerDeploymentId › it should load api/pages-route-edge

expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 1

  27 |     let { exitCode } = await next.build()
  28 |     // eslint-disable-next-line jest/no-standalone-expect
> 29 |     expect(exitCode).toBe(0)
     |                      ^
  30 |
  31 |     await fs.move(
  32 |       join(next.testDir, '.next/standalone'),

  at Object.toBe (production/standalone-mode/runtimeServerDeploymentId/index.test.ts:29:22)

pnpm test-start-turbo test/production/standalone-mode/required-server-files/required-server-files-node-middleware.test.ts (turbopack) (job)

  • standalone mode - metadata routes > should handle metadata icons correctly (DD)
  • standalone mode - metadata routes > should handle correctly not-found.js (DD)
  • standalone mode - metadata routes > should handle private _next unmatched route correctly (DD)
  • standalone mode - metadata routes > should handle pages rendering correctly (DD)
Expand output

● standalone mode - metadata routes › should handle metadata icons correctly

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● standalone mode - metadata routes › should handle metadata icons correctly

next instance is not initialized yet, make sure you call methods on next instance in test body.

  283 |     get: function (_target, property) {
  284 |       if (!next) {
> 285 |         throw new Error(
      |               ^
  286 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  287 |         )
  288 |       }

  at Object.get (lib/e2e-utils/index.ts:285:15)
  at Object.renameFolder (production/standalone-mode/basic/index.test.ts:14:16)

● standalone mode - metadata routes › should handle correctly not-found.js

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● standalone mode - metadata routes › should handle correctly not-found.js

next instance is not initialized yet, make sure you call methods on next instance in test body.

  283 |     get: function (_target, property) {
  284 |       if (!next) {
> 285 |         throw new Error(
      |               ^
  286 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  287 |         )
  288 |       }

  at Object.get (lib/e2e-utils/index.ts:285:15)
  at Object.renameFolder (production/standalone-mode/basic/index.test.ts:14:16)

● standalone mode - metadata routes › should handle private _next unmatched route correctly

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● standalone mode - metadata routes › should handle private _next unmatched route correctly

next instance is not initialized yet, make sure you call methods on next instance in test body.

  283 |     get: function (_target, property) {
  284 |       if (!next) {
> 285 |         throw new Error(
      |               ^
  286 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  287 |         )
  288 |       }

  at Object.get (lib/e2e-utils/index.ts:285:15)
  at Object.renameFolder (production/standalone-mode/basic/index.test.ts:14:16)

● standalone mode - metadata routes › should handle pages rendering correctly

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● standalone mode - metadata routes › should handle pages rendering correctly

next instance is not initialized yet, make sure you call methods on next instance in test body.

  283 |     get: function (_target, property) {
  284 |       if (!next) {
> 285 |         throw new Error(
      |               ^
  286 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  287 |         )
  288 |       }

  at Object.get (lib/e2e-utils/index.ts:285:15)
  at Object.renameFolder (production/standalone-mode/basic/index.test.ts:14:16)

pnpm test-start-turbo test/e2e/twoslash/standalone.test.ts (turbopack) (job)

  • output: standalone with twoslash > should annotate twoslash types default (DD)
  • output: standalone with twoslash > should annotate twoslash types esnext (DD)
Expand output

● output: standalone with twoslash › should annotate twoslash types default

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  30 |     let tmpFolder: string
  31 |
> 32 |     beforeAll(async () => {
     |     ^
  33 |       await next.patchFile(
  34 |         'next.config.js',
  35 |         (await next.readFile('next.config.js')).replace('// output', 'output')

  at beforeAll (e2e/twoslash/standalone.test.ts:32:5)
  at Object.describe (e2e/twoslash/standalone.test.ts:15:3)

● output: standalone with twoslash › should annotate twoslash types esnext

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  30 |     let tmpFolder: string
  31 |
> 32 |     beforeAll(async () => {
     |     ^
  33 |       await next.patchFile(
  34 |         'next.config.js',
  35 |         (await next.readFile('next.config.js')).replace('// output', 'output')

  at beforeAll (e2e/twoslash/standalone.test.ts:32:5)
  at Object.describe (e2e/twoslash/standalone.test.ts:15:3)

pnpm test-start test/e2e/app-dir/segment-cache/prefetch-runtime/prefetch-runtime.test.ts (job)

  • runtime prefetching > passed to a public cache > can completely prefetch a page that uses cookies and no uncached IO (DD)
Expand output

● runtime prefetching › passed to a public cache › can completely prefetch a page that uses cookies and no uncached IO

apiRequestContext.fetch: read ECONNRESET
Call log:
  - → GET http://localhost:35465/passed-to-public-cache/cookies-only?_rsc=gtqjj
  -   user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/130.0.6723.31 Safari/537.36
  -   accept: */*
  -   accept-encoding: gzip,deflate,br
  -   cookie: testCookie=initialValue
  -   next-test-fetch-priority: low
  -   referer: http://localhost:35465/
  -   next-router-prefetch: 1
  -   next-router-segment-prefetch: /!KGRlZmF1bHQp/passed-to-public-cache
  -   next-url: /
  -   rsc: 1
  -   sec-ch-ua: "Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"
  -   sec-ch-ua-mobile: ?0
  -   sec-ch-ua-platform: "Linux"

  225 |             // server; we pass the request to the server the immediately.
  226 |             result: (async () => {
> 227 |               const originalResponse = await page.request.fetch(request, {
      |                                                           ^
  228 |                 maxRedirects: 0,
  229 |               })
  230 |

  at fetch (lib/router-act.ts:227:59)
  at lib/router-act.ts:245:13
  at routeHandler (lib/router-act.ts:257:7)

● runtime prefetching › passed to a public cache › can completely prefetch a page that uses cookies and no uncached IO

apiRequestContext.fetch: read ECONNRESET
Call log:
  - → GET http://localhost:35465/passed-to-public-cache/cookies-only?_rsc=gtqjj
  -   user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/130.0.6723.31 Safari/537.36
  -   accept: */*
  -   accept-encoding: gzip,deflate,br
  -   cookie: testCookie=initialValue
  -   next-test-fetch-priority: low
  -   referer: http://localhost:35465/
  -   next-router-prefetch: 1
  -   next-router-segment-prefetch: /!KGRlZmF1bHQp/passed-to-public-cache
  -   next-url: /
  -   rsc: 1
  -   sec-ch-ua: "Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"
  -   sec-ch-ua-mobile: ?0
  -   sec-ch-ua-platform: "Linux"

  225 |             // server; we pass the request to the server the immediately.
  226 |             result: (async () => {
> 227 |               const originalResponse = await page.request.fetch(request, {
      |                                                           ^
  228 |                 maxRedirects: 0,
  229 |               })
  230 |

  at fetch (lib/router-act.ts:227:59)
  at lib/router-act.ts:245:13
  at routeHandler (lib/router-act.ts:257:7)

pnpm test-start-turbo test/e2e/og-api/index.test.ts (turbopack) (job)

  • pnpm support > should build with dependencies installed via pnpm (DD)
  • pnpm support > should execute client-side JS on each page in output: "standalone" (DD)
Expand output

● pnpm support › should build with dependencies installed via pnpm

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

● pnpm support › should execute client-side JS on each page in output: "standalone"

next build failed with code/signal 1

  77 |             if (code || signal)
  78 |               reject(
> 79 |                 new Error(
     |                 ^
  80 |                   `next build failed with code/signal ${code || signal}`
  81 |                 )
  82 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:79:17)

@lukesandberg lukesandberg changed the title Simplify how json imports workby turning it into a source transform fix it to be Simplify how json imports workby turning it into a source transform Feb 7, 2026
@codspeed-hq
Copy link

codspeed-hq bot commented Feb 7, 2026

Merging this PR will not alter performance

✅ 17 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing json_modules (808696f) with import_with_type_text_turbopack (4f31ce0)2

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

  2. No successful run was found on import_with_type_text_turbopack (6194f5d) during the generation of this report, so 6264c6d was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 7, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁█▁▁▁
Cold (Ready in log) 436ms 436ms ▂█▁▁▂
Cold (First Request) 1.179s 1.156s ▃█▄▁▃
Warm (Listen) 456ms 456ms ▁█▁▁▁
Warm (Ready in log) 439ms 440ms ▁█▁▁▁
Warm (First Request) 338ms 339ms ▂█▂▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁▅▁▁▁
Cold (Ready in log) 438ms 438ms ▅▅▄▁▁
Cold (First Request) 1.853s 1.849s ▃▄▃▁▁
Warm (Listen) 455ms 455ms ▁▄▁▁▁
Warm (Ready in log) 437ms 438ms ▃▄▅▁▁
Warm (First Request) 1.843s 1.849s ▂▄▃▁▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.908s 3.856s ▁█▁▁▁
Cached Build 3.975s 3.936s ▁█▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 13.916s 13.849s ▁▄▂▁▁
Cached Build 13.903s 13.933s ▁▃▂▁▁
node_modules Size 467 MB 467 MB █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles: **437 kB** → **437 kB** ⚠️ +13 B

81 files with content-based hashes (individual files not comparable between builds)

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 766 B 762 B
Total 766 B 762 B ✅ -4 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 451 B 450 B
Total 451 B 450 B ✅ -1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.47 kB N/A -
6280-HASH.js gzip 56.9 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.53 kB N/A -
e8aec2e4-HASH.js gzip 62.5 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 256 B 253 B 🟢 3 B (-1%)
main-HASH.js gzip 39.1 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.52 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.48 kB -
6948ada0-HASH.js gzip N/A 62.5 kB -
9544-HASH.js gzip N/A 57.5 kB -
Total 230 kB 231 kB ⚠️ +612 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.49 kB 2.49 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.97 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 249 kB 249 kB
Total 375 kB 375 kB ⚠️ +497 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 617 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 33.3 kB 33 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 34.9 kB 34.6 kB ✅ -323 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 732 B 736 B
Total 732 B 736 B ⚠️ +4 B
Build Cache
Canary PR Change
0.pack gzip 3.84 MB 3.85 MB 🔴 +13.3 kB (+0%)
index.pack gzip 103 kB 104 kB
index.pack.old gzip 103 kB 103 kB
Total 4.05 MB 4.06 MB ⚠️ +14.3 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 315 kB 315 kB
app-page-exp..prod.js gzip 167 kB 167 kB
app-page-tur...dev.js gzip 315 kB 315 kB
app-page-tur..prod.js gzip 167 kB 167 kB
app-page-tur...dev.js gzip 312 kB 312 kB
app-page-tur..prod.js gzip 165 kB 165 kB
app-page.run...dev.js gzip 312 kB 312 kB
app-page.run..prod.js gzip 165 kB 165 kB
app-route-ex...dev.js gzip 70.5 kB 70.5 kB
app-route-ex..prod.js gzip 49 kB 49 kB
app-route-tu...dev.js gzip 70.5 kB 70.5 kB
app-route-tu..prod.js gzip 49 kB 49 kB
app-route-tu...dev.js gzip 70.1 kB 70.1 kB
app-route-tu..prod.js gzip 48.8 kB 48.8 kB
app-route.ru...dev.js gzip 70.1 kB 70.1 kB
app-route.ru..prod.js gzip 48.7 kB 48.7 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.2 kB 43.2 kB
pages-api-tu..prod.js gzip 32.9 kB 32.9 kB
pages-api.ru...dev.js gzip 43.1 kB 43.1 kB
pages-api.ru..prod.js gzip 32.8 kB 32.8 kB
pages-turbo....dev.js gzip 52.5 kB 52.5 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 52.5 kB 52.5 kB
pages.runtim..prod.js gzip 39.3 kB 39.3 kB
server.runti..prod.js gzip 62.7 kB 62.7 kB
Total 2.8 MB 2.8 MB

@lukesandberg lukesandberg force-pushed the import_with_type_text_turbopack branch from f5b9826 to 4f31ce0 Compare February 7, 2026 08:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants