Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

fix: handle node_modules in standalone's dist dir#3282

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
pieh wants to merge7 commits intomain
base:main
Choose a base branch
Loading
fromfix/turbopack-hashed-symlinks-in-dist-dir

Conversation

@pieh
Copy link
Contributor

@piehpieh commentedNov 27, 2025
edited
Loading

Description

Adjustments to handle recent e2e failures on next@canary (https://github.com/opennextjs/opennextjs-netlify/actions/runs/19727042798 ).

Some details:

It seems like imports in pages router with turbopack builds now generate additionalnode_modules directory with symlinks.

image

We currently don't handlestandalone/.next/node_modules (marked with red on above screenshot). We only handlestandalone/node_modules (marked with green). This adds handling for "new" node_modules location, preserving hierarchy (so no merging of them, we will havenode_modules and.next/node_modules in lambda)

It does look likevercel/next.js@7905cb4#diff-86d6014a082abde94fef6b35552605715afe6eb9e7e467ac931d2f153cd3b934 is what introduced change. It does seem to me that that there is some kind of bug there to be honest, because we are hitting case of producing those hashed symlinks on DIRECT dependencies that we don't even declare as external in config and because of that I'm expanding our tests (following tests added in that commit) to ensure we have coverage in future as well in case it is indeed a bug that we fell into this new behavior despite seemingly not meeting criteria for it.

Additionally ... while expanding test fixture I've hit yet another unhandled edge case, where we were not copying some some top-level directories from root of standalone directory (marked directory missing in NF)

image

@piehpieh added the test all versionsRun e2e tests against old and canary versions of Next.js labelNov 27, 2025
@github-actions
Copy link
Contributor

github-actionsbot commentedNov 27, 2025
edited
Loading

📊 Package size report   0.03%↑

FileBefore (Size / Gzip)After (Size / Gzip)
dist/build/content/server.js11.9 kB /3.6 kB3%↑12.3 kB /2%↑3.6 kB
dist/build/plugin-context.js12.4 kB /3.6 kB4%↑12.9 kB /3%↑3.7 kB
Total(Includes all files)2.9 MB /824.0 kB0.03%↑2.9 MB /0.02%↑824.2 kB
Tarball size780.3 kB0.04%↑780.6 kB
Unchanged files
FileSize (Size / Gzip)
dist/build/advanced-api-routes.js4.6 kB /1.4 kB
dist/build/cache.js1.0 kB /416 B
dist/build/content/next-shims/telemetry-storage.cjs1.6 kB /659 B
dist/build/content/prerendered.js11.5 kB /3.2 kB
dist/build/content/static.js4.2 kB /1.4 kB
dist/build/functions/edge.js24.9 kB /6.6 kB
dist/build/functions/server.js4.9 kB /1.6 kB
dist/build/image-cdn.js54.0 kB /11.1 kB
dist/build/skew-protection.js4.1 kB /1.3 kB
dist/build/templates/handler-monorepo.tmpl.js1.6 kB /648 B
dist/build/templates/handler.tmpl.js1.5 kB /601 B
dist/build/verification.js4.5 kB /1.5 kB
dist/esm-chunks/chunk-5V5HA6YA.js27.0 kB /5.4 kB
dist/esm-chunks/chunk-6BT4RYQJ.js1.9 kB /862 B
dist/esm-chunks/chunk-TVEBGDAB.js63.1 kB /11.3 kB
dist/esm-chunks/chunk-YUXQHOYO.js187.9 kB /33.2 kB
dist/index.js4.1 kB /1.2 kB
dist/run/config.js1.4 kB /654 B
dist/run/constants.js526 B /319 B
dist/run/handlers/cache.cjs16.5 kB /4.0 kB
dist/run/handlers/request-context.cjs5.3 kB /1.7 kB
dist/run/handlers/server.js142.7 kB /33.5 kB
dist/run/handlers/tags-handler.cjs8.9 kB /2.8 kB
dist/run/handlers/tracer.cjs29.1 kB /6.1 kB
dist/run/handlers/use-cache-handler.js48.8 kB /11.0 kB
dist/run/handlers/wait-until.cjs1.4 kB /665 B
dist/run/headers.js8.2 kB /2.6 kB
dist/run/next.cjs23.8 kB /6.0 kB
dist/run/revalidate.js1.0 kB /479 B
dist/run/storage/regional-blob-store.cjs28.0 kB /7.3 kB
dist/run/storage/request-scoped-in-memory-cache.cjs48.6 kB /11.2 kB
dist/run/storage/storage.cjs5.0 kB /1.6 kB
dist/shared/blob-types.cjs1.6 kB /648 B
dist/shared/blobkey.js742 B /400 B
dist/shared/cache-types.cjs1.3 kB /566 B
edge-runtime/lib/cjs.ts10.7 kB /3.1 kB
edge-runtime/lib/headers.ts1.9 kB /841 B
edge-runtime/lib/logging.ts115 B /121 B
edge-runtime/lib/middleware.ts3.6 kB /1.4 kB
edge-runtime/lib/next-request.ts3.3 kB /1.1 kB
edge-runtime/lib/response.ts10.0 kB /3.0 kB
edge-runtime/lib/routing.ts15.3 kB /4.0 kB
edge-runtime/lib/util.ts3.7 kB /1.3 kB
edge-runtime/matchers.json3 B /23 B
edge-runtime/middleware.ts2.4 kB /1.0 kB
edge-runtime/next.config.json3 B /23 B
edge-runtime/README.md992 B /509 B
edge-runtime/shim/edge.js1.6 kB /788 B
edge-runtime/shim/node.js766 B /397 B
edge-runtime/vendor.ts1.1 kB /360 B
edge-runtime/vendor/deno.land/std@0.175.0/_util/asserts.ts854 B /461 B
edge-runtime/vendor/deno.land/std@0.175.0/_util/os.ts644 B /355 B
edge-runtime/vendor/deno.land/std@0.175.0/async/abortable.ts4.0 kB /1.0 kB
edge-runtime/vendor/deno.land/std@0.175.0/async/deadline.ts974 B /544 B
edge-runtime/vendor/deno.land/std@0.175.0/async/debounce.ts2.2 kB /956 B
edge-runtime/vendor/deno.land/std@0.175.0/async/deferred.ts1.5 kB /798 B
edge-runtime/vendor/deno.land/std@0.175.0/async/delay.ts1.8 kB /845 B
edge-runtime/vendor/deno.land/std@0.175.0/async/mod.ts465 B /241 B
edge-runtime/vendor/deno.land/std@0.175.0/async/mux_async_iterator.ts2.5 kB /1.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/async/pool.ts3.2 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/async/retry.ts2.4 kB /1.0 kB
edge-runtime/vendor/deno.land/std@0.175.0/async/tee.ts2.1 kB /924 B
edge-runtime/vendor/deno.land/std@0.175.0/bytes/index_of_needle.ts1.4 kB /668 B
edge-runtime/vendor/deno.land/std@0.175.0/crypto/timing_safe_equal.ts875 B /442 B
edge-runtime/vendor/deno.land/std@0.175.0/datetime/to_imf.ts1.3 kB /681 B
edge-runtime/vendor/deno.land/std@0.175.0/encoding/base64.ts2.5 kB /1.0 kB
edge-runtime/vendor/deno.land/std@0.175.0/encoding/base64url.ts2.0 kB /872 B
edge-runtime/vendor/deno.land/std@0.175.0/flags/mod.ts22.6 kB /5.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/fmt/colors.ts12.4 kB /2.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/fmt/printf.ts27.7 kB /7.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/http/cookie.ts11.5 kB /3.6 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_core.ts2.3 kB /716 B
edge-runtime/vendor/deno.land/std@0.175.0/node/_events.d.ts27.2 kB /5.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_events.mjs28.0 kB /7.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_global.d.ts1.7 kB /650 B
edge-runtime/vendor/deno.land/std@0.175.0/node/_next_tick.ts5.0 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_process/exiting.ts138 B /138 B
edge-runtime/vendor/deno.land/std@0.175.0/node/_process/process.ts3.8 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_process/stdio.mjs336 B /233 B
edge-runtime/vendor/deno.land/std@0.175.0/node/_process/streams.mjs4.0 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_stream.d.ts53.2 kB /11.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_stream.mjs91.2 kB /25.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_util/_util_callbackify.ts4.3 kB /1.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/_utils.ts5.9 kB /2.0 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/assert.ts23.1 kB /4.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/assertion_error.ts19.6 kB /6.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/async_hooks.ts7.7 kB /2.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/buffer.ts262 B /204 B
edge-runtime/vendor/deno.land/std@0.175.0/node/events.ts303 B /221 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/_libuv_winerror.ts7.8 kB /1.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/_listen.ts561 B /342 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/_node.ts443 B /335 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/_utils.ts2.4 kB /938 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/_winerror.ts354.4 kB /64.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/#_timingsafeequal_bd5c8.ts479 B /268 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/ares.ts2.4 kB /1.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/async_wrap.ts4.0 kB /1.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/buffer.ts3.5 kB /1.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/cares_wrap.ts15.2 kB /3.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/config.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/connection_wrap.ts2.6 kB /1.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/constants.ts21.5 kB /5.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/contextify.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/credentials.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/crypto.ts448 B /244 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/errors.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/fs_dir.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/fs_event_wrap.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/fs.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/handle_wrap.ts1.8 kB /1.0 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/heap_utils.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/http_parser.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/icu.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/inspector.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/js_stream.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/messaging.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/mod.ts3.1 kB /955 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/module_wrap.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/native_module.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/natives.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/node_file.ts2.9 kB /1.5 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/node_options.ts1.8 kB /989 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/options.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/os.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/performance.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/pipe_wrap.ts10.4 kB /3.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/process_methods.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/report.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/serdes.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/signal_wrap.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/spawn_sync.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/stream_wrap.ts9.3 kB /2.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/string_decoder.ts504 B /261 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/symbols.ts1.4 kB /828 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/task_queue.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/tcp_wrap.ts13.1 kB /3.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/timers.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/tls_wrap.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/trace_events.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/tty_wrap.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/types.ts5.7 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/udp_wrap.ts12.4 kB /3.6 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/url.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/util.ts4.0 kB /1.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/uv.ts20.1 kB /3.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/v8.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/worker.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal_binding/zlib.ts87 B /104 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/buffer.d.ts73.6 kB /12.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/buffer.mjs66.1 kB /10.6 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/crypto/_keys.ts463 B /262 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/crypto/constants.ts252 B /173 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/error_codes.ts322 B /250 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/errors.ts78.9 kB /17.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/fixed_queue.ts4.4 kB /1.2 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/hide_stack_frames.ts550 B /377 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/net.ts3.1 kB /1.5 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/normalize_encoding.mjs2.1 kB /500 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/options.ts1.7 kB /959 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/primordials.mjs1.8 kB /431 B
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/process/per_thread.mjs7.8 kB /2.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/readline/callbacks.mjs3.8 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/readline/utils.mjs14.3 kB /3.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/streams/destroy.mjs6.9 kB /1.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/streams/end-of-stream.mjs7.1 kB /1.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/streams/utils.mjs5.9 kB /1.2 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/util.mjs4.0 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/util/comparisons.ts16.6 kB /3.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/util/debuglog.ts3.2 kB /1.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/util/inspect.mjs71.5 kB /19.8 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/util/types.ts3.7 kB /1.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/internal/validators.mjs8.0 kB /2.1 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/process.ts19.4 kB /5.2 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/stream.ts671 B /346 B
edge-runtime/vendor/deno.land/std@0.175.0/node/string_decoder.ts10.3 kB /3.3 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/util.ts7.8 kB /2.2 kB
edge-runtime/vendor/deno.land/std@0.175.0/node/util/types.ts199 B /153 B
edge-runtime/vendor/deno.land/std@0.175.0/path/_constants.ts2.0 kB /727 B
edge-runtime/vendor/deno.land/std@0.175.0/path/_interface.ts728 B /369 B
edge-runtime/vendor/deno.land/std@0.175.0/path/_util.ts5.0 kB /1.6 kB
edge-runtime/vendor/deno.land/std@0.175.0/path/common.ts1.2 kB /607 B
edge-runtime/vendor/deno.land/std@0.175.0/path/glob.ts12.7 kB /3.9 kB
edge-runtime/vendor/deno.land/std@0.175.0/path/mod.ts1.4 kB /690 B
edge-runtime/vendor/deno.land/std@0.175.0/path/posix.ts13.9 kB /3.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/path/separator.ts259 B /209 B
edge-runtime/vendor/deno.land/std@0.175.0/path/win32.ts28.5 kB /6.4 kB
edge-runtime/vendor/deno.land/std@0.175.0/streams/write_all.ts2.2 kB /598 B
edge-runtime/vendor/deno.land/std@0.175.0/testing/_diff.ts11.6 kB /3.6 kB
edge-runtime/vendor/deno.land/std@0.175.0/testing/_format.ts705 B /462 B
edge-runtime/vendor/deno.land/std@0.175.0/testing/asserts.ts25.5 kB /5.7 kB
edge-runtime/vendor/deno.land/std@0.175.0/types.d.ts4.2 kB /1.2 kB
edge-runtime/vendor/deno.land/x/htmlrewriter@v1.0.0/pkg/htmlrewriter_bg.wasm573.2 kB /262.7 kB
edge-runtime/vendor/deno.land/x/htmlrewriter@v1.0.0/pkg/htmlrewriter.js31.0 kB /4.7 kB
edge-runtime/vendor/deno.land/x/htmlrewriter@v1.0.0/src/index.ts2.6 kB /989 B
edge-runtime/vendor/deno.land/x/htmlrewriter@v1.0.0/src/types.d.ts2.1 kB /446 B
edge-runtime/vendor/deno.land/x/path_to_regexp@v6.2.1/index.ts15.4 kB /4.2 kB
edge-runtime/vendor/manifest.json104 B /119 B
edge-runtime/vendor/v1-7-0--edge-utils.netlify.app/logger/logger.ts3.2 kB /747 B
edge-runtime/vendor/v1-7-0--edge-utils.netlify.app/logger/mod.ts29 B /49 B
LICENSE1.1 kB /661 B
manifest.yml31 B /51 B
package.json3.5 kB /1.3 kB
README.md2.8 kB /1.2 kB

🤖 This report was automatically generated bypkg-size-action

@piehpiehforce-pushed thefix/turbopack-hashed-symlinks-in-dist-dir branch from774696c toab01d87CompareNovember 27, 2025 18:41
@piehpiehforce-pushed thefix/turbopack-hashed-symlinks-in-dist-dir branch fromf0746ea tod58ed23CompareNovember 28, 2025 21:29
Comment on lines +148 to +163
// this is different node_modules than ones handled by `copyNextDependencies`
// this is under the standalone/.next folder (not standalone/node_modules or standalone/<some-workspace/node_modules)
// and started to be created by Next.js in some cases in next@16.1.0-canary.3
// this node_modules is artificially created and doesn't have equivalent in the repo
// so we only copy it, without additional symlinks handling
if(existsSync(join(srcDir,'node_modules'))){
constfilter=ctx.constants.IS_LOCAL ?undefined :nodeModulesFilter
constsrc=join(srcDir,'node_modules')
constdest=join(destDir,'node_modules')
awaitcp(src,dest,{
recursive:true,
verbatimSymlinks:true,
force:true,
filter,
})
}
Copy link
ContributorAuthor

@piehpiehNov 28, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This part is fix for next@canary change to ensure the "hashed" artificialnode_modules are included in NF (see first part of description for more details including first screenshot)

Comment on lines -293 to -328
constentries=awaitreaddir(ctx.standaloneDir)
constfilter=ctx.constants.IS_LOCAL ?undefined :nodeModulesFilter
constpromises:Promise<void>[]=[]

constnodeModulesLocationsInStandalone=newSet<string>()
constcommonFilter=ctx.constants.IS_LOCAL ?undefined :nodeModulesFilter

constdotNextDir=join(ctx.standaloneDir,ctx.nextDistDir)

awaitcp(ctx.standaloneRootDir,ctx.serverHandlerRootDir,{
recursive:true,
verbatimSymlinks:true,
force:true,
filter:async(sourcePath:string)=>{
if(sourcePath===dotNextDir){
// copy all except the distDir (.next) folder as this is handled in a separate function
// this will include the node_modules folder as well
returnfalse
}

constpromises:Promise<void>[]=entries.map(async(entry)=>{
// copy all except the distDir (.next) folder as this is handled in a separate function
// this will include the node_modules folder as well
if(entry===ctx.nextDistDir){
return
}
constsrc=join(ctx.standaloneDir,entry)
constdest=join(ctx.serverHandlerDir,entry)
awaitcp(src,dest,{
recursive:true,
verbatimSymlinks:true,
force:true,
filter,
})
if(sourcePath.endsWith('node_modules')){
// keep track of node_modules as we might need to recreate symlinks
// we are still copying them
nodeModulesLocationsInStandalone.add(sourcePath)
}

if(entry==='node_modules'){
awaitrecreateNodeModuleSymlinks(ctx.resolveFromSiteDir('node_modules'),dest)
}
// finally apply common filter if defined
returncommonFilter?.(sourcePath)??true
},
})

// inside a monorepo there is a root `node_modules` folder that contains all the dependencies
constrootSrcDir=join(ctx.standaloneRootDir,'node_modules')
constrootDestDir=join(ctx.serverHandlerRootDir,'node_modules')

// use the node_modules tree from the process.cwd() and not the one from the standalone output
// as the standalone node_modules are already wrongly assembled by Next.js.
// see: https://github.com/vercel/next.js/issues/50072
if(existsSync(rootSrcDir)&&ctx.standaloneRootDir!==ctx.standaloneDir){
promises.push(
cp(rootSrcDir,rootDestDir,{recursive:true,verbatimSymlinks:true, filter}).then(()=>
recreateNodeModuleSymlinks(resolve('node_modules'),rootDestDir),
),
)
Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This change is for the edge case encountered after I expanded test case (last paragraph + second screenshot). It starts with change of "traversing" fromctx.standaloneDir (which in monorepos will bestandalone/path/to/workspace) toctx.standaloneRootDir (juststandalone).

and required adjustments to logic to still handle some special cases (like skippingctx.nextDistDir here and callingrecreateNodeModuleSymlinks, which now no longer have explicit special case for monorepo and instead have streamlined handling for it)

@piehpieh marked this pull request as ready for reviewDecember 1, 2025 12:26
@piehpieh requested a review froma team as acode ownerDecember 1, 2025 12:26
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

No reviews

Assignees

No one assigned

Labels

test all versionsRun e2e tests against old and canary versions of Next.js

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

2 participants

@pieh

[8]ページ先頭

©2009-2025 Movatter.jp