@wular/pnext 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1992
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -10,42 +10,39 @@
|
|
|
10
10
|
// own. This file re-runs that registrar (idempotent) so calling it alone still yields a fully wired
|
|
11
11
|
// compat layer.
|
|
12
12
|
|
|
13
|
-
import type { ResolvedConfig } from '../../config'
|
|
14
|
-
import { registerCompatBootExtensions } from './boot'
|
|
15
|
-
import type * as BuildTier from './build-tier'
|
|
16
|
-
import { registerCacheExtensions } from './cache'
|
|
17
|
-
import { registerActionExtensions } from './actions'
|
|
18
|
-
import { registerRenderExtensions } from './render'
|
|
19
|
-
import { registerProxyExtensions } from './proxy'
|
|
20
|
-
import { registerConfigSource } from './config'
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
} from './
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import { registerBundlerExtensions } from './bundler';
|
|
40
|
-
import { registerPagesApiExtensions } from './pages-api';
|
|
41
|
-
import { registerEdgeRuntimeExtensions } from './edge-runtime';
|
|
13
|
+
import type { ResolvedConfig } from '../../config'
|
|
14
|
+
import { registerCompatBootExtensions } from './boot'
|
|
15
|
+
import type * as BuildTier from './build-tier'
|
|
16
|
+
import { registerCacheExtensions } from './cache'
|
|
17
|
+
import { registerActionExtensions } from './actions'
|
|
18
|
+
import { registerRenderExtensions } from './render'
|
|
19
|
+
import { registerProxyExtensions } from './proxy'
|
|
20
|
+
import { registerConfigSource } from './config'
|
|
21
|
+
import { registerProtocolExtensions, registerProtocolRequestValidation } from './protocol'
|
|
22
|
+
import { registerLifecycleExtensions } from './lifecycle'
|
|
23
|
+
import { registerImageExtensions } from './image'
|
|
24
|
+
import { registerErrorExtensions } from './errors'
|
|
25
|
+
import { registerFontExtensions } from './font'
|
|
26
|
+
import { registerStaticImageExtensions } from './static-image'
|
|
27
|
+
import { registerUseCacheExtensions } from './use-cache'
|
|
28
|
+
import { registerClientErrorExtensions } from './client-errors'
|
|
29
|
+
import { registerPprExtensions } from './ppr'
|
|
30
|
+
import { registerMdxExtensions } from './mdx'
|
|
31
|
+
import { registerOtelExtensions, registerOtelRootInterceptor } from './otel'
|
|
32
|
+
import { registerInstrumentationClientExtensions } from './instrumentation-client'
|
|
33
|
+
import { registerMiscExtensions } from './taint'
|
|
34
|
+
import { registerCssExtrasExtensions } from './css-extras'
|
|
35
|
+
import { registerSegmentExtensions } from './segment'
|
|
36
|
+
import { registerBundlerExtensions } from './bundler'
|
|
37
|
+
import { registerPagesApiExtensions } from './pages-api'
|
|
38
|
+
import { registerEdgeRuntimeExtensions } from './edge-runtime'
|
|
42
39
|
|
|
43
40
|
export interface RegisterCompatOptions {
|
|
44
41
|
/**
|
|
45
42
|
* Serving only (the dev server). Skips the build-only domains — nothing on a
|
|
46
43
|
* request path reads what they register — so their module graphs never load.
|
|
47
44
|
*/
|
|
48
|
-
serve?: boolean
|
|
45
|
+
serve?: boolean
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
export async function registerCompatExtensions(
|
|
@@ -56,56 +53,56 @@ export async function registerCompatExtensions(
|
|
|
56
53
|
// outright when only serving (see RegisterCompatOptions.serve).
|
|
57
54
|
const build: typeof BuildTier | undefined = options.serve
|
|
58
55
|
? undefined
|
|
59
|
-
: await import('./build-tier')
|
|
56
|
+
: await import('./build-tier')
|
|
60
57
|
// Route conventions, page/CSS extensions, module aliases, proxy names and the
|
|
61
58
|
// lifecycle init hooks — already done when the boot tier ran first.
|
|
62
|
-
registerCompatBootExtensions(config)
|
|
63
|
-
build?.registerBuildCompatExtensions()
|
|
64
|
-
registerConfigSource()
|
|
59
|
+
registerCompatBootExtensions(config)
|
|
60
|
+
build?.registerBuildCompatExtensions()
|
|
61
|
+
registerConfigSource()
|
|
65
62
|
// The otel ROOT-span interceptor must run before every short-circuiting
|
|
66
63
|
// interceptor (segment prefetch, RSC protocol, action dispatch) so those
|
|
67
64
|
// responses are traced too; the rest of otel registers last (below).
|
|
68
|
-
registerOtelRootInterceptor(config)
|
|
65
|
+
registerOtelRootInterceptor(config)
|
|
69
66
|
// Protocol validation next: an invalid next-router-state-tree must 500 before
|
|
70
67
|
// the segment/action interceptors answer the request.
|
|
71
|
-
registerProtocolRequestValidation(config)
|
|
68
|
+
registerProtocolRequestValidation(config)
|
|
72
69
|
// Typed-routes typegen and typecheck run before structural validation so a type error surfaces ahead of
|
|
73
70
|
// runtime checks, matching `next build`, which runs tsc before its own validations. The typecheck only
|
|
74
71
|
// covers .ts/.tsx pages/layouts/handlers via the generated validator, so JS-only fixtures still fall
|
|
75
72
|
// through to the structural validation below with their runtime error message.
|
|
76
|
-
build?.registerTypedRoutesExtensions(config)
|
|
73
|
+
build?.registerTypedRoutesExtensions(config)
|
|
77
74
|
// Build validation fails fast before the remaining build steps run.
|
|
78
|
-
build?.registerValidationExtensions(config)
|
|
79
|
-
registerCacheExtensions(config)
|
|
75
|
+
build?.registerValidationExtensions(config)
|
|
76
|
+
registerCacheExtensions(config)
|
|
80
77
|
// Before actions: the /_tree prefetch responder must intercept ahead of the
|
|
81
78
|
// action dispatch interceptor.
|
|
82
|
-
registerSegmentExtensions(config)
|
|
83
|
-
registerActionExtensions(config)
|
|
84
|
-
registerPagesApiExtensions(config)
|
|
85
|
-
registerEdgeRuntimeExtensions()
|
|
86
|
-
registerRenderExtensions(config)
|
|
87
|
-
registerProxyExtensions(config)
|
|
88
|
-
registerProtocolExtensions(config)
|
|
89
|
-
registerLifecycleExtensions(config)
|
|
90
|
-
registerImageExtensions(config)
|
|
91
|
-
registerErrorExtensions(config)
|
|
92
|
-
registerFontExtensions(config)
|
|
93
|
-
build?.registerMiddlewareExtensions()
|
|
94
|
-
build?.registerExportExtensions(config)
|
|
95
|
-
registerStaticImageExtensions()
|
|
96
|
-
registerUseCacheExtensions(config)
|
|
97
|
-
registerClientErrorExtensions(config)
|
|
98
|
-
registerPprExtensions(config)
|
|
99
|
-
registerMiscExtensions(config)
|
|
100
|
-
registerBundlerExtensions(config)
|
|
79
|
+
registerSegmentExtensions(config)
|
|
80
|
+
registerActionExtensions(config)
|
|
81
|
+
registerPagesApiExtensions(config)
|
|
82
|
+
registerEdgeRuntimeExtensions()
|
|
83
|
+
registerRenderExtensions(config)
|
|
84
|
+
registerProxyExtensions(config)
|
|
85
|
+
registerProtocolExtensions(config)
|
|
86
|
+
registerLifecycleExtensions(config)
|
|
87
|
+
registerImageExtensions(config)
|
|
88
|
+
registerErrorExtensions(config)
|
|
89
|
+
registerFontExtensions(config)
|
|
90
|
+
build?.registerMiddlewareExtensions()
|
|
91
|
+
build?.registerExportExtensions(config)
|
|
92
|
+
registerStaticImageExtensions()
|
|
93
|
+
registerUseCacheExtensions(config)
|
|
94
|
+
registerClientErrorExtensions(config)
|
|
95
|
+
registerPprExtensions(config)
|
|
96
|
+
registerMiscExtensions(config)
|
|
97
|
+
registerBundlerExtensions(config)
|
|
101
98
|
// After registerActionExtensions: composes (not clobbers) clientEsbuildPlugins.
|
|
102
|
-
registerCssExtrasExtensions(config)
|
|
99
|
+
registerCssExtrasExtensions(config)
|
|
103
100
|
// MDX last: it composes (not clobbers) clientEsbuildPlugins, so it must
|
|
104
101
|
// capture every previously-registered plugin factory.
|
|
105
|
-
registerMdxExtensions(config)
|
|
102
|
+
registerMdxExtensions(config)
|
|
106
103
|
// Otel after everything: its route re-stamp interceptor must observe the
|
|
107
104
|
// post-rewrite request (the root span opens in the EARLY interceptor above).
|
|
108
|
-
registerOtelExtensions(config)
|
|
105
|
+
registerOtelExtensions(config)
|
|
109
106
|
// After otel: composes (not clobbers) the documentHeadTags extension.
|
|
110
|
-
registerInstrumentationClientExtensions(config)
|
|
107
|
+
registerInstrumentationClientExtensions(config)
|
|
111
108
|
}
|
|
@@ -11,25 +11,25 @@
|
|
|
11
11
|
// The router-side hook is surfaced through the `window.__PNEXT_ON_ROUTER_TRANSITION_START__` global the
|
|
12
12
|
// bundle registers; the client router calls it at the start of push/replace/traverse navigations.
|
|
13
13
|
|
|
14
|
-
import type { ResolvedConfig } from '../../config'
|
|
15
|
-
import { registerBuildSteps } from '../../extensions'
|
|
16
|
-
import { getDocumentScriptExtensions, setDocumentScriptExtensions } from '../../render/hooks'
|
|
17
|
-
import { nextCompatEnabled } from '../
|
|
14
|
+
import type { ResolvedConfig } from '../../config'
|
|
15
|
+
import { registerBuildSteps } from '../../extensions'
|
|
16
|
+
import { getDocumentScriptExtensions, setDocumentScriptExtensions } from '../../render/hooks'
|
|
17
|
+
import { nextCompatEnabled } from '../aliases'
|
|
18
18
|
import {
|
|
19
19
|
buildInstrumentationClient,
|
|
20
20
|
instrumentationClientHeadTag,
|
|
21
|
-
} from '../lifecycle/instrumentation-client'
|
|
21
|
+
} from '../lifecycle/instrumentation-client'
|
|
22
22
|
|
|
23
23
|
export function registerInstrumentationClientExtensions(config: ResolvedConfig): void {
|
|
24
|
-
if (!nextCompatEnabled(config)) return
|
|
24
|
+
if (!nextCompatEnabled(config)) return
|
|
25
25
|
|
|
26
26
|
registerBuildSteps(async ctx => {
|
|
27
|
-
await buildInstrumentationClient(ctx.config)
|
|
28
|
-
})
|
|
27
|
+
await buildInstrumentationClient(ctx.config)
|
|
28
|
+
})
|
|
29
29
|
|
|
30
|
-
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
30
|
+
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
31
31
|
setDocumentScriptExtensions({
|
|
32
32
|
documentHeadTags: (cfg, ctx) =>
|
|
33
33
|
`${previousHeadTags?.(cfg, ctx) ?? ''}${instrumentationClientHeadTag(cfg)}`,
|
|
34
|
-
})
|
|
34
|
+
})
|
|
35
35
|
}
|
|
@@ -14,73 +14,70 @@
|
|
|
14
14
|
// registerLifecycleBootHooks(), while the request interceptor registers with the rest of the graph so its
|
|
15
15
|
// position in the interceptor chain is unchanged.
|
|
16
16
|
|
|
17
|
-
import type { ResolvedConfig } from '../../config'
|
|
17
|
+
import type { ResolvedConfig } from '../../config'
|
|
18
18
|
import {
|
|
19
19
|
registerInitHooks,
|
|
20
20
|
registerRequestInterceptors,
|
|
21
21
|
setRequestExtensions,
|
|
22
22
|
type RequestInterceptor,
|
|
23
|
-
} from '../../extensions'
|
|
24
|
-
import { nextCompatEnabled } from '../
|
|
25
|
-
import { getNextConfig } from '../next/config-loader'
|
|
26
|
-
import { instrumentationReady, loadInstrumentation } from '../lifecycle/instrumentation'
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
} from '../lifecycle/
|
|
31
|
-
import { activateTestProxy, installTestProxyFetch } from '../lifecycle/testmode';
|
|
32
|
-
import { recordRequestPath } from '../lifecycle/after-scope';
|
|
33
|
-
import { installNodeConsoleFormat } from '../lifecycle/node-console';
|
|
23
|
+
} from '../../extensions'
|
|
24
|
+
import { nextCompatEnabled } from '../aliases'
|
|
25
|
+
import { getNextConfig } from '../next/config-loader'
|
|
26
|
+
import { instrumentationReady, loadInstrumentation } from '../lifecycle/instrumentation'
|
|
27
|
+
import { installUnhandledRejectionGuard, reportRequestErrorToUser } from '../lifecycle/error-funnel'
|
|
28
|
+
import { activateTestProxy, installTestProxyFetch } from '../lifecycle/testmode'
|
|
29
|
+
import { recordRequestPath } from '../lifecycle/after-scope'
|
|
30
|
+
import { installNodeConsoleFormat } from '../lifecycle/node-console'
|
|
34
31
|
|
|
35
32
|
/** experimental.testProxy from the loaded next.config. */
|
|
36
33
|
function testProxyEnabled(): boolean {
|
|
37
|
-
const experimental = getNextConfig().experimental as { testProxy?: boolean } | undefined
|
|
38
|
-
return experimental?.testProxy === true
|
|
34
|
+
const experimental = getNextConfig().experimental as { testProxy?: boolean } | undefined
|
|
35
|
+
return experimental?.testProxy === true
|
|
39
36
|
}
|
|
40
37
|
|
|
41
38
|
/** Boot tier: everything that must be installed before the server starts. */
|
|
42
39
|
export function registerLifecycleBootHooks(config: ResolvedConfig): void {
|
|
43
|
-
if (!nextCompatEnabled(config)) return
|
|
44
|
-
installNodeConsoleFormat()
|
|
40
|
+
if (!nextCompatEnabled(config)) return
|
|
41
|
+
installNodeConsoleFormat()
|
|
45
42
|
|
|
46
43
|
// The user's onRequestError hook (once instrumentation has loaded) receives
|
|
47
44
|
// every real request error; control-flow errors are filtered in the funnel.
|
|
48
|
-
setRequestExtensions({ onRequestError: reportRequestErrorToUser })
|
|
45
|
+
setRequestExtensions({ onRequestError: reportRequestErrorToUser })
|
|
49
46
|
|
|
50
47
|
// Keep the server alive when an SSR error escapes as an unhandled rejection
|
|
51
48
|
// (a client component that throws during server render — preact resolves the
|
|
52
49
|
// string pass to '' and floats the rejection). Without this the process
|
|
53
50
|
// crashes and every later request in the shared harness server fails.
|
|
54
|
-
installUnhandledRejectionGuard()
|
|
51
|
+
installUnhandledRejectionGuard()
|
|
55
52
|
|
|
56
53
|
// Load instrumentation and patch fetch at server start. The fetch patch is a no-op until a request
|
|
57
54
|
// activates the test proxy. Instrumentation register() must NOT run during a build: Next only detects
|
|
58
55
|
// the file at build and runs register() at server boot, so build prerenders see a noop tracer - a live
|
|
59
56
|
// TracerProvider at build would bake real span ids into the static shell and 'use cache' entries.
|
|
60
57
|
registerInitHooks((cfg, context) => {
|
|
61
|
-
if (!context.build) loadInstrumentation(cfg)
|
|
62
|
-
installTestProxyFetch()
|
|
63
|
-
})
|
|
58
|
+
if (!context.build) loadInstrumentation(cfg)
|
|
59
|
+
installTestProxyFetch()
|
|
60
|
+
})
|
|
64
61
|
}
|
|
65
62
|
|
|
66
63
|
export function registerLifecycleExtensions(config: ResolvedConfig): void {
|
|
67
|
-
if (!nextCompatEnabled(config)) return
|
|
64
|
+
if (!nextCompatEnabled(config)) return
|
|
68
65
|
|
|
69
66
|
const lifecycleInterceptor: RequestInterceptor = async request => {
|
|
70
67
|
// Block the very first requests until instrumentation register() settles.
|
|
71
|
-
await instrumentationReady()
|
|
68
|
+
await instrumentationReady()
|
|
72
69
|
// Remember the route pathname so an after() callback that runs detached
|
|
73
70
|
// (after a page render) can name the route in its "used ... inside after()"
|
|
74
71
|
// error, matching Next's message.
|
|
75
72
|
try {
|
|
76
|
-
recordRequestPath(new URL(request.url).pathname)
|
|
73
|
+
recordRequestPath(new URL(request.url).pathname)
|
|
77
74
|
} catch {
|
|
78
75
|
// ignore malformed URLs
|
|
79
76
|
}
|
|
80
77
|
// Route this request's outgoing fetch through the test proxy when it carries
|
|
81
78
|
// Next-Test-* headers (gated on experimental.testProxy in next.config).
|
|
82
|
-
if (testProxyEnabled()) activateTestProxy(request.headers)
|
|
83
|
-
return undefined
|
|
84
|
-
}
|
|
85
|
-
registerRequestInterceptors(lifecycleInterceptor)
|
|
79
|
+
if (testProxyEnabled()) activateTestProxy(request.headers)
|
|
80
|
+
return undefined
|
|
81
|
+
}
|
|
82
|
+
registerRequestInterceptors(lifecycleInterceptor)
|
|
86
83
|
}
|
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
// extensions at boot, so the registration itself lives in register-boot.ts; only the compilation
|
|
23
23
|
// wiring is here.
|
|
24
24
|
|
|
25
|
-
import type { Plugin } from 'esbuild'
|
|
26
|
-
import type { ResolvedConfig } from '../../config'
|
|
27
|
-
import { getBundlerExtensions, setBundlerExtensions } from '../../extensions'
|
|
28
|
-
import { nextCompatEnabled } from '../../render/hooks'
|
|
29
|
-
import { mdxEsbuildPlugin } from '../mdx/plugin'
|
|
25
|
+
import type { Plugin } from 'esbuild'
|
|
26
|
+
import type { ResolvedConfig } from '../../config'
|
|
27
|
+
import { getBundlerExtensions, setBundlerExtensions } from '../../extensions'
|
|
28
|
+
import { nextCompatEnabled } from '../../render/hooks'
|
|
29
|
+
import { mdxEsbuildPlugin } from '../mdx/plugin'
|
|
30
30
|
|
|
31
31
|
export function registerMdxExtensions(config: ResolvedConfig): void {
|
|
32
|
-
if (!nextCompatEnabled(config)) return
|
|
32
|
+
if (!nextCompatEnabled(config)) return
|
|
33
33
|
|
|
34
|
-
const existing = getBundlerExtensions()
|
|
35
|
-
const priorClient = existing.clientEsbuildPlugins
|
|
36
|
-
const priorServer = existing.serverEsbuildPlugins
|
|
34
|
+
const existing = getBundlerExtensions()
|
|
35
|
+
const priorClient = existing.clientEsbuildPlugins
|
|
36
|
+
const priorServer = existing.serverEsbuildPlugins
|
|
37
37
|
|
|
38
38
|
setBundlerExtensions({
|
|
39
39
|
clientEsbuildPlugins: (cfg: ResolvedConfig): Plugin[] => [
|
|
@@ -44,5 +44,5 @@ export function registerMdxExtensions(config: ResolvedConfig): void {
|
|
|
44
44
|
...priorServer(cfg, opts),
|
|
45
45
|
mdxEsbuildPlugin(config.root),
|
|
46
46
|
],
|
|
47
|
-
})
|
|
47
|
+
})
|
|
48
48
|
}
|
|
@@ -3,21 +3,29 @@
|
|
|
3
3
|
// functions-config-manifest.json). The middleware runtime itself is the existing proxy machinery; this
|
|
4
4
|
// module owns only the build-time manifest output.
|
|
5
5
|
|
|
6
|
-
import path from 'node:path'
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import { mkdir, writeFile } from 'node:fs/promises'
|
|
8
|
+
import { fileURLToPath } from 'node:url'
|
|
9
|
+
import { registerBuildSteps } from '../../extensions'
|
|
10
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
11
|
+
import {
|
|
12
|
+
findProxyFile,
|
|
13
|
+
proxyExternalLoadTarget,
|
|
14
|
+
type ProxyConfig,
|
|
15
|
+
type ProxyModule,
|
|
16
|
+
} from '../../routing/proxy'
|
|
17
|
+
import { devServerModuleHref } from '../../runtime/modules'
|
|
18
|
+
import { pathToFileHref, type ResolvedConfig } from '../../config'
|
|
19
|
+
import { toPosixPath } from '../../utils/fs'
|
|
20
|
+
import type { RouteManifestEntry } from '../../types'
|
|
21
|
+
import { readMiddlewareWasmBindingsForOutPath } from '../bundler/wasm'
|
|
22
|
+
import { preferredRegionForRoute } from '../next/preferred-region'
|
|
15
23
|
|
|
16
24
|
export function registerMiddlewareExtensions(): void {
|
|
17
25
|
registerBuildSteps(async ({ config, routes }) => {
|
|
18
|
-
if (!nextCompatEnabled(config)) return
|
|
19
|
-
const file = findProxyFile(config)
|
|
20
|
-
let relative: string | undefined
|
|
26
|
+
if (!nextCompatEnabled(config)) return
|
|
27
|
+
const file = findProxyFile(config)
|
|
28
|
+
let relative: string | undefined
|
|
21
29
|
if (file) {
|
|
22
30
|
// Must name the SAME artifact buildProxyModule emits (the build copies it to
|
|
23
31
|
// .next/server/middleware.js), so every option that keys the compile profile is spelled out here - a
|
|
@@ -27,10 +35,212 @@ export function registerMiddlewareExtensions(): void {
|
|
|
27
35
|
conditionTarget: 'edge',
|
|
28
36
|
externalLoadTarget: proxyExternalLoadTarget(file),
|
|
29
37
|
reactServerLayer: true,
|
|
30
|
-
})
|
|
31
|
-
relative = toPosixPath(path.relative(config.outPath, fileURLToPath(href)))
|
|
38
|
+
})
|
|
39
|
+
relative = toPosixPath(path.relative(config.outPath, fileURLToPath(href)))
|
|
32
40
|
}
|
|
33
41
|
// Edge-runtime segments produce manifest entries even with no middleware.
|
|
34
|
-
await writeMiddlewareManifests(config, relative, routes as RouteManifestEntry[])
|
|
35
|
-
})
|
|
42
|
+
await writeMiddlewareManifests(config, relative, routes as RouteManifestEntry[])
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Middleware manifest emission.
|
|
47
|
+
//
|
|
48
|
+
// Writes the two Next-shaped manifests a few suites read directly from the build output:
|
|
49
|
+
// - `<out>/server/middleware-manifest.json`: the edge-middleware entry with its compiled matchers,
|
|
50
|
+
// entrypoint and files list.
|
|
51
|
+
// - `<out>/server/functions-config-manifest.json`: the node-runtime variant, when the middleware opts
|
|
52
|
+
// into `runtime: 'nodejs'`.
|
|
53
|
+
//
|
|
54
|
+
// Only the fields the tests read are populated. A pure-core app writes neither.
|
|
55
|
+
|
|
56
|
+
interface ManifestMatcher {
|
|
57
|
+
regexp: string
|
|
58
|
+
originalSource: string
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface MiddlewareEntry {
|
|
62
|
+
name: string
|
|
63
|
+
page: string
|
|
64
|
+
matchers: ManifestMatcher[]
|
|
65
|
+
wasm: { name: string; filePath: string }[]
|
|
66
|
+
assets: never[]
|
|
67
|
+
files: string[]
|
|
68
|
+
entrypoint: string
|
|
69
|
+
env: Record<string, string>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface MiddlewareManifest {
|
|
73
|
+
version: number
|
|
74
|
+
sortedMiddleware: string[]
|
|
75
|
+
middleware: Record<string, MiddlewareEntry>
|
|
76
|
+
functions: Record<string, unknown>
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface FunctionsConfigManifest {
|
|
80
|
+
version: number
|
|
81
|
+
functions: Record<string, { runtime: string; matchers: ManifestMatcher[] }>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Emit the middleware manifests for the resolved proxy file, if any. `entryFile`
|
|
86
|
+
* is the compiled proxy module path (relative to `outPath`, posix) produced by
|
|
87
|
+
* the build; it is recorded as the manifest `entrypoint` under `server/`.
|
|
88
|
+
*/
|
|
89
|
+
export async function writeMiddlewareManifests(
|
|
90
|
+
config: ResolvedConfig,
|
|
91
|
+
entryFile: string | undefined,
|
|
92
|
+
routes: RouteManifestEntry[] = [],
|
|
93
|
+
): Promise<void> {
|
|
94
|
+
const source = findProxyFile(config)
|
|
95
|
+
// Edge-runtime app segments are manifest `functions` entries alongside the
|
|
96
|
+
// middleware, keyed by their app path (route groups included) — an app with
|
|
97
|
+
// an edge page and no middleware still writes the manifest for them.
|
|
98
|
+
const functions = edgeFunctionEntries(config, routes)
|
|
99
|
+
if (!source || !entryFile) {
|
|
100
|
+
if (Object.keys(functions).length === 0) return
|
|
101
|
+
const serverDir = path.join(config.outPath, 'server')
|
|
102
|
+
await mkdir(serverDir, { recursive: true })
|
|
103
|
+
await writeFile(
|
|
104
|
+
path.join(serverDir, 'middleware-manifest.json'),
|
|
105
|
+
`${JSON.stringify({ ...emptyMiddlewareManifest(), functions }, null, 2)}\n`,
|
|
106
|
+
)
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const moduleFile = path.resolve(config.outPath, entryFile)
|
|
111
|
+
const module = (await import(pathToFileHref(moduleFile))) as ProxyModule
|
|
112
|
+
const matchers = manifestMatchers(module.config)
|
|
113
|
+
const runtime = proxyRuntime(module.config)
|
|
114
|
+
const entrypoint = toServerEntrypoint(entryFile)
|
|
115
|
+
|
|
116
|
+
const serverDir = path.join(config.outPath, 'server')
|
|
117
|
+
await mkdir(serverDir, { recursive: true })
|
|
118
|
+
|
|
119
|
+
if (runtime === 'nodejs') {
|
|
120
|
+
const functionsConfig: FunctionsConfigManifest = {
|
|
121
|
+
version: 1,
|
|
122
|
+
functions: { '/_middleware': { runtime: 'nodejs', matchers } },
|
|
123
|
+
}
|
|
124
|
+
await writeFile(
|
|
125
|
+
path.join(serverDir, 'functions-config-manifest.json'),
|
|
126
|
+
`${JSON.stringify(functionsConfig, null, 2)}\n`,
|
|
127
|
+
)
|
|
128
|
+
// A node-runtime middleware still lists an empty edge middleware manifest so
|
|
129
|
+
// consumers that always read it find a valid (empty) shape.
|
|
130
|
+
await writeFile(
|
|
131
|
+
path.join(serverDir, 'middleware-manifest.json'),
|
|
132
|
+
`${JSON.stringify({ ...emptyMiddlewareManifest(), functions }, null, 2)}\n`,
|
|
133
|
+
)
|
|
134
|
+
return
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const entry: MiddlewareEntry = {
|
|
138
|
+
name: 'middleware',
|
|
139
|
+
page: '/',
|
|
140
|
+
matchers,
|
|
141
|
+
wasm: readMiddlewareWasmBindingsForOutPath(config.outPath),
|
|
142
|
+
assets: [],
|
|
143
|
+
files: [entrypoint],
|
|
144
|
+
entrypoint,
|
|
145
|
+
env: {},
|
|
146
|
+
}
|
|
147
|
+
const manifest: MiddlewareManifest = {
|
|
148
|
+
version: 3,
|
|
149
|
+
sortedMiddleware: ['/'],
|
|
150
|
+
middleware: { '/': entry },
|
|
151
|
+
functions,
|
|
152
|
+
}
|
|
153
|
+
await writeFile(
|
|
154
|
+
path.join(serverDir, 'middleware-manifest.json'),
|
|
155
|
+
`${JSON.stringify(manifest, null, 2)}\n`,
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function emptyMiddlewareManifest(): MiddlewareManifest {
|
|
160
|
+
return { version: 3, sortedMiddleware: [], middleware: {}, functions: {} }
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Manifest `functions` entries for app segments that declared
|
|
165
|
+
* `export const runtime = 'edge'`. Next keys them by the segment's app path
|
|
166
|
+
* (route groups kept, e.g. `/(group)/group/page`) and records the URL the
|
|
167
|
+
* segment answers as its matcher.
|
|
168
|
+
*/
|
|
169
|
+
function edgeFunctionEntries(
|
|
170
|
+
config: ResolvedConfig,
|
|
171
|
+
routes: RouteManifestEntry[],
|
|
172
|
+
): Record<string, unknown> {
|
|
173
|
+
const entries: Record<string, unknown> = {}
|
|
174
|
+
if (!config.appPath) return entries
|
|
175
|
+
for (const route of routes) {
|
|
176
|
+
const runtime = route.segmentConfig?.runtime
|
|
177
|
+
if (runtime !== 'edge' && runtime !== 'experimental-edge') continue
|
|
178
|
+
const page = appManifestKey(config.appPath, route.file)
|
|
179
|
+
if (!page) continue
|
|
180
|
+
const regions = preferredRegionForRoute(route)
|
|
181
|
+
entries[page] = {
|
|
182
|
+
files: [],
|
|
183
|
+
name: `app${page}`,
|
|
184
|
+
page,
|
|
185
|
+
matchers: [{ regexp: `^${routeMatcherRegexp(route.route)}$`, originalSource: route.route }],
|
|
186
|
+
wasm: [],
|
|
187
|
+
assets: [],
|
|
188
|
+
env: {},
|
|
189
|
+
...(regions ? { regions } : {}),
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return entries
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// `<app>/(group)/group/page.tsx` → `/(group)/group/page`.
|
|
196
|
+
function appManifestKey(appPath: string, file: string): string | undefined {
|
|
197
|
+
const relative = toPosixPath(path.relative(appPath, file))
|
|
198
|
+
if (!relative || relative.startsWith('..')) return undefined
|
|
199
|
+
return `/${relative.replace(/\.[^./]+$/, '')}`
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// The URL regexp Next records for a segment: literal path with each dynamic
|
|
203
|
+
// segment widened to a single path part.
|
|
204
|
+
function routeMatcherRegexp(route: string): string {
|
|
205
|
+
return route.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/:([^/\\]+)/g, '[^/]+')
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Compile config.matcher entries into { regexp, originalSource } pairs. With no
|
|
209
|
+
// matcher, the middleware runs on every path: Next records the `/:path*` source
|
|
210
|
+
// and its `^/.*$` regexp.
|
|
211
|
+
function manifestMatchers(config: ProxyConfig | undefined): ManifestMatcher[] {
|
|
212
|
+
const matcher = config?.matcher
|
|
213
|
+
if (!matcher) return [{ regexp: '^/.*$', originalSource: '/:path*' }]
|
|
214
|
+
const list = Array.isArray(matcher) ? matcher : [matcher]
|
|
215
|
+
return list.map(item => {
|
|
216
|
+
const originalSource = typeof item === 'string' ? item : item.source
|
|
217
|
+
return { regexp: `^${matcherRegexp(originalSource)}$`, originalSource }
|
|
218
|
+
})
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Mirror src/proxy.ts matcherPattern for the manifest regexp string (kept in
|
|
222
|
+
// sync with the runtime matcher). Raw regex sources pass through unchanged.
|
|
223
|
+
function matcherRegexp(matcher: string): string {
|
|
224
|
+
if (matcher.includes('(')) return matcher
|
|
225
|
+
if (matcher === '/') return '/'
|
|
226
|
+
let source = ''
|
|
227
|
+
for (const segment of matcher.split('/').filter(Boolean)) {
|
|
228
|
+
if (/^:[^/]+\*$/.test(segment)) source += '(?:/.*)?'
|
|
229
|
+
else if (/^:[^/]+$/.test(segment)) source += '/[^/]+'
|
|
230
|
+
else source += `/${segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`
|
|
231
|
+
}
|
|
232
|
+
return source || '/'
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function proxyRuntime(config: ProxyConfig | undefined): 'edge' | 'nodejs' {
|
|
236
|
+
const runtime = (config as { runtime?: unknown } | undefined)?.runtime
|
|
237
|
+
return runtime === 'nodejs' ? 'nodejs' : 'edge'
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Record the compiled entry under the `server/` prefix Next uses, forcing a
|
|
241
|
+
// `.js` extension (the manifest tests assert `^server/.+\.(js|mjs|cjs)$`).
|
|
242
|
+
function toServerEntrypoint(entryFile: string): string {
|
|
243
|
+
const posix = toPosixPath(entryFile).replace(/^\.?\//, '')
|
|
244
|
+
const withinServer = posix.startsWith('server/') ? posix : `server/${path.posix.basename(posix)}`
|
|
245
|
+
return withinServer.replace(/\.[^./]+$/, '.js')
|
|
36
246
|
}
|