@wular/pnext 0.0.4 → 0.0.7
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 +22 -16
- package/bin/pnext +6 -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 +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- 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 +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -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 +802 -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 +32 -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 +2022 -1995
- package/src/{api → client}/router/types.ts +98 -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 +86 -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 +2087 -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 +87 -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 +954 -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 +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -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/reference/overview.md +0 -35
- 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
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
// opentelemetry suite. Everything is inert unless next compat is on AND @opentelemetry/api resolves from
|
|
15
15
|
// the app.
|
|
16
16
|
|
|
17
|
-
import { readFileSync } from 'node:fs'
|
|
18
|
-
import path from 'node:path'
|
|
19
|
-
import type { ResolvedConfig } from '../../config'
|
|
20
|
-
import type { RouteManifestEntry } from '../../types'
|
|
17
|
+
import { readFileSync } from 'node:fs'
|
|
18
|
+
import path from 'node:path'
|
|
19
|
+
import type { ResolvedConfig } from '../../config'
|
|
20
|
+
import type { RouteManifestEntry } from '../../types'
|
|
21
21
|
import {
|
|
22
22
|
registerInitHooks,
|
|
23
23
|
registerRequestInterceptors,
|
|
@@ -27,18 +27,18 @@ import {
|
|
|
27
27
|
setRequestExtensions,
|
|
28
28
|
type RequestInterceptor,
|
|
29
29
|
type ResponseFinalizer,
|
|
30
|
-
} from '../../extensions'
|
|
31
|
-
import { nextCompatEnabled } from '../
|
|
32
|
-
import { getRequestRuntime } from '../../routing/request-
|
|
33
|
-
import { selectRouteForRequest } from '../../routing/routes'
|
|
34
|
-
import { queueAfterTask } from '../../request/context'
|
|
30
|
+
} from '../../extensions'
|
|
31
|
+
import { nextCompatEnabled } from '../aliases'
|
|
32
|
+
import { getRequestRuntime } from '../../routing/request-environment'
|
|
33
|
+
import { selectRouteForRequest } from '../../routing/routes'
|
|
34
|
+
import { queueAfterTask } from '../../request/context'
|
|
35
35
|
import {
|
|
36
36
|
getDocumentScriptExtensions,
|
|
37
37
|
setRenderSpanExtensions,
|
|
38
38
|
setDocumentScriptExtensions,
|
|
39
39
|
setStreamBoundaryExtensions,
|
|
40
|
-
} from '../../render/hooks'
|
|
41
|
-
import { setProxyRunObserver } from '../../proxy'
|
|
40
|
+
} from '../../render/hooks'
|
|
41
|
+
import { setProxyRunObserver } from '../../routing/proxy'
|
|
42
42
|
import {
|
|
43
43
|
SPAN_TYPE,
|
|
44
44
|
emitClientComponentLoadingSpan,
|
|
@@ -56,11 +56,11 @@ import {
|
|
|
56
56
|
withPagesDataSpan,
|
|
57
57
|
withRenderBodySpan,
|
|
58
58
|
withRouteHandlerSpan,
|
|
59
|
-
} from '../otel/tracer'
|
|
60
|
-
import { getOtelApi } from '../otel/api'
|
|
61
|
-
import { installFetchSpan } from '../otel/fetch-span'
|
|
62
|
-
import { clientTraceMetadataTags } from '../otel/client-trace-metadata'
|
|
63
|
-
import { instrumentationReady } from '../lifecycle/instrumentation'
|
|
59
|
+
} from '../otel/tracer'
|
|
60
|
+
import { getOtelApi } from '../otel/api'
|
|
61
|
+
import { installFetchSpan } from '../otel/fetch-span'
|
|
62
|
+
import { clientTraceMetadataTags } from '../otel/client-trace-metadata'
|
|
63
|
+
import { instrumentationReady } from '../lifecycle/instrumentation'
|
|
64
64
|
|
|
65
65
|
/**
|
|
66
66
|
* The ROOT-span interceptor. Registered FIRST, before every other sub-registrar, so the
|
|
@@ -70,73 +70,73 @@ import { instrumentationReady } from '../lifecycle/instrumentation';
|
|
|
70
70
|
* immediately from the pre-rewrite match; the LATE interceptor re-stamps them after rewrites.
|
|
71
71
|
*/
|
|
72
72
|
export function registerOtelRootInterceptor(config: ResolvedConfig): void {
|
|
73
|
-
if (!nextCompatEnabled(config)) return
|
|
74
|
-
setOtelAppRoot(config.root)
|
|
73
|
+
if (!nextCompatEnabled(config)) return
|
|
74
|
+
setOtelAppRoot(config.root)
|
|
75
75
|
|
|
76
76
|
const rootInterceptor: RequestInterceptor = async request => {
|
|
77
77
|
try {
|
|
78
78
|
// Instrumentation register() installs the app's TracerProvider; opening
|
|
79
79
|
// the root span before it completes would produce a non-recording span.
|
|
80
|
-
await instrumentationReady()
|
|
81
|
-
const url = new URL(request.url)
|
|
80
|
+
await instrumentationReady()
|
|
81
|
+
const url = new URL(request.url)
|
|
82
82
|
startRootSpan({
|
|
83
83
|
method: request.method.toUpperCase(),
|
|
84
84
|
target: url.pathname + url.search,
|
|
85
85
|
rsc: request.headers.get('rsc') === '1',
|
|
86
86
|
headers: request.headers,
|
|
87
|
-
})
|
|
88
|
-
stampMatchedRoute(url.pathname)
|
|
87
|
+
})
|
|
88
|
+
stampMatchedRoute(url.pathname)
|
|
89
89
|
// Safety net for the synchronous-500 error path: core's top-level catch
|
|
90
90
|
// returns a bare 500 WITHOUT running responseFinalizers, so the finalizer
|
|
91
91
|
// never closes the root span there. The work-unit after-queue DOES flush
|
|
92
92
|
// on that path (flushWorkUnit in the catch), so end the span as 500 from
|
|
93
93
|
// an after-task. Idempotent: on success paths the finalizer ends it first.
|
|
94
|
-
queueAfterTask(() => endRootSpanIfUnclosed(500))
|
|
94
|
+
queueAfterTask(() => endRootSpanIfUnclosed(500))
|
|
95
95
|
} catch {
|
|
96
96
|
// Never let tracing break the request.
|
|
97
97
|
}
|
|
98
|
-
return undefined
|
|
99
|
-
}
|
|
100
|
-
registerRequestInterceptors(rootInterceptor)
|
|
98
|
+
return undefined
|
|
99
|
+
}
|
|
100
|
+
registerRequestInterceptors(rootInterceptor)
|
|
101
101
|
// Resolving @opentelemetry/api out of the app loads the whole package inside this interceptor on
|
|
102
102
|
// the first request. The result is memoized, so paying it in the dev warm just moves it off that
|
|
103
103
|
// request.
|
|
104
|
-
registerRequestWarmHooks(() => void getOtelApi(config.root))
|
|
104
|
+
registerRequestWarmHooks(() => void getOtelApi(config.root))
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
/** Resolve the matched route for `pathname` and stamp it on the root span. */
|
|
108
108
|
function stampMatchedRoute(pathname: string): void {
|
|
109
|
-
const runtime = getRequestRuntime()
|
|
110
|
-
if (!runtime) return
|
|
111
|
-
const matched = selectRouteForRequest(runtime.routes, pathname, undefined)
|
|
112
|
-
if (!matched) return
|
|
113
|
-
const routeRuntime = matched.route.segmentConfig?.runtime
|
|
109
|
+
const runtime = getRequestRuntime()
|
|
110
|
+
if (!runtime) return
|
|
111
|
+
const matched = selectRouteForRequest(runtime.routes, pathname, undefined)
|
|
112
|
+
if (!matched) return
|
|
113
|
+
const routeRuntime = matched.route.segmentConfig?.runtime
|
|
114
114
|
setRootSpanRoute(routeEntryToDisplay(matched.route), {
|
|
115
115
|
edge: routeRuntime === 'edge' || routeRuntime === 'experimental-edge',
|
|
116
116
|
kind: matched.route.kind === 'handler' ? 'handler' : 'page',
|
|
117
117
|
params: matched.params,
|
|
118
|
-
})
|
|
118
|
+
})
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
122
|
-
if (!nextCompatEnabled(config)) return
|
|
122
|
+
if (!nextCompatEnabled(config)) return
|
|
123
123
|
|
|
124
|
-
const appRoot = config.root
|
|
125
|
-
setOtelAppRoot(appRoot)
|
|
124
|
+
const appRoot = config.root
|
|
125
|
+
setOtelAppRoot(appRoot)
|
|
126
126
|
|
|
127
127
|
// Install the fetch span wrapper at server (and build) start, AFTER the cache
|
|
128
128
|
// fetch-patch has wrapped globalThis.fetch (register order: cache before otel).
|
|
129
129
|
registerInitHooks(() => {
|
|
130
|
-
installFetchSpan(appRoot)
|
|
131
|
-
})
|
|
130
|
+
installFetchSpan(appRoot)
|
|
131
|
+
})
|
|
132
132
|
|
|
133
133
|
// Materialized pages wrappers (compat/pages wrapperSource) call this global —
|
|
134
134
|
// when present — around their getServerSideProps/getStaticProps invocation so
|
|
135
135
|
// the `Render.<kind>` span lands beside the document render span. A global
|
|
136
136
|
// (not an import) keeps the generated bundles pnext-agnostic.
|
|
137
|
-
(
|
|
137
|
+
;(
|
|
138
138
|
globalThis as { __PNEXT_PAGES_DATA_SPAN__?: typeof withPagesDataSpan }
|
|
139
|
-
).__PNEXT_PAGES_DATA_SPAN__ = withPagesDataSpan
|
|
139
|
+
).__PNEXT_PAGES_DATA_SPAN__ = withPagesDataSpan
|
|
140
140
|
|
|
141
141
|
// Render-internal spans (nest under the request root span via the work-unit
|
|
142
142
|
// ALS the tracer threads): the render-body span (`render route (app)`), the
|
|
@@ -144,7 +144,7 @@ export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
|
144
144
|
// segment-module spans. All inert when no root span is open.
|
|
145
145
|
setRenderSpanExtensions({
|
|
146
146
|
withRenderBodySpan: (route, fn) => {
|
|
147
|
-
const displayRoute = routePatternToDisplay(route)
|
|
147
|
+
const displayRoute = routePatternToDisplay(route)
|
|
148
148
|
// A materialized pages route renders through the app pipeline, but Next
|
|
149
149
|
// reports it as the pages-router document render span.
|
|
150
150
|
if (isPagesCompatRoute(route)) {
|
|
@@ -153,26 +153,22 @@ export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
|
153
153
|
displayRoute,
|
|
154
154
|
fn,
|
|
155
155
|
SPAN_TYPE.renderDocument,
|
|
156
|
-
)
|
|
156
|
+
)
|
|
157
157
|
}
|
|
158
|
-
return withRenderBodySpan(
|
|
159
|
-
`render route (app) ${displayRoute}`,
|
|
160
|
-
displayRoute,
|
|
161
|
-
fn,
|
|
162
|
-
);
|
|
158
|
+
return withRenderBodySpan(`render route (app) ${displayRoute}`, displayRoute, fn)
|
|
163
159
|
},
|
|
164
160
|
withFindPageComponentsSpan: (route, fn) => {
|
|
165
|
-
const entry = routeEntryFor(route)
|
|
161
|
+
const entry = routeEntryFor(route)
|
|
166
162
|
// A materialized pages-API route reports ONLY its Node.runHandler span
|
|
167
163
|
// (Next's pages-api dispatch has no findPageComponents phase).
|
|
168
|
-
if (entry?.kind === 'handler' && isPagesCompatEntry(entry)) return fn()
|
|
169
|
-
const displayRoute = routePatternToDisplay(route)
|
|
164
|
+
if (entry?.kind === 'handler' && isPagesCompatEntry(entry)) return fn()
|
|
165
|
+
const displayRoute = routePatternToDisplay(route)
|
|
170
166
|
return withChildSpan(
|
|
171
167
|
'resolve page components',
|
|
172
168
|
SPAN_TYPE.findPageComponents,
|
|
173
169
|
{ 'next.route': displayRoute },
|
|
174
170
|
fn,
|
|
175
|
-
)
|
|
171
|
+
)
|
|
176
172
|
},
|
|
177
173
|
emitResolveSegmentSpan: segment =>
|
|
178
174
|
emitLeafSpan('resolve segment modules', SPAN_TYPE.getLayoutOrPageModule, {
|
|
@@ -182,31 +178,31 @@ export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
|
182
178
|
isPagesCompatRoute(route)
|
|
183
179
|
? withPagesApiHandlerSpan(routePatternToDisplay(route), fn)
|
|
184
180
|
: withRouteHandlerSpan(routePatternToDisplay(route), fn),
|
|
185
|
-
})
|
|
186
|
-
setStreamBoundaryExtensions({ onStreamBoundaryError: markRenderSpanError })
|
|
181
|
+
})
|
|
182
|
+
setStreamBoundaryExtensions({ onStreamBoundaryError: markRenderSpanError })
|
|
187
183
|
|
|
188
184
|
// clientTraceMetadata meta tags injected once into the document head (dynamic pages only; a production
|
|
189
185
|
// start skips static). Composed with register-render's documentBodyScripts under a separate key.
|
|
190
186
|
// The renderer's `ctx.dynamic` already encodes Next's gating: dev renders are always dynamic, a prod
|
|
191
187
|
// STATIC page is dynamic:false, a prod DYNAMIC page is dynamic:true. So isNextStart:true is safe -
|
|
192
188
|
// clientTraceMetadataTags only drops when isNextStart && !dynamic, exactly the prod-static case.
|
|
193
|
-
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
189
|
+
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
194
190
|
setDocumentScriptExtensions({
|
|
195
191
|
documentHeadTags: (cfg, ctx) =>
|
|
196
192
|
`${previousHeadTags?.(cfg, ctx) ?? ''}${clientTraceMetadataTags({ dynamic: ctx.dynamic, isNextStart: true, rsc: ctx.rsc })}`,
|
|
197
|
-
})
|
|
193
|
+
})
|
|
198
194
|
|
|
199
195
|
// Middleware.execute span around the proxy/middleware handler run. Parents
|
|
200
196
|
// under the incoming traceparent (top-level trace), NOT the request root span.
|
|
201
|
-
setProxyRunObserver((request, fn) => withMiddlewareSpan(request, fn))
|
|
197
|
+
setProxyRunObserver((request, fn) => withMiddlewareSpan(request, fn))
|
|
202
198
|
|
|
203
|
-
const previousOnRequestError = getRequestExtensions().onRequestError
|
|
199
|
+
const previousOnRequestError = getRequestExtensions().onRequestError
|
|
204
200
|
setRequestExtensions({
|
|
205
201
|
onRequestError: async (error, requestInfo, context) => {
|
|
206
|
-
markRenderSpanError(error)
|
|
207
|
-
await previousOnRequestError(error, requestInfo, context)
|
|
202
|
+
markRenderSpanError(error)
|
|
203
|
+
await previousOnRequestError(error, requestInfo, context)
|
|
208
204
|
},
|
|
209
|
-
})
|
|
205
|
+
})
|
|
210
206
|
|
|
211
207
|
// Late interceptor: re-stamp the route attributes after the rewrite/action
|
|
212
208
|
// interceptors ran, so a rewritten request reports its DESTINATION route
|
|
@@ -214,13 +210,13 @@ export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
|
214
210
|
// original target — see registerOtelRootInterceptor).
|
|
215
211
|
const otelRouteInterceptor: RequestInterceptor = request => {
|
|
216
212
|
try {
|
|
217
|
-
stampMatchedRoute(new URL(request.url).pathname)
|
|
213
|
+
stampMatchedRoute(new URL(request.url).pathname)
|
|
218
214
|
} catch {
|
|
219
215
|
// Never let tracing break the request.
|
|
220
216
|
}
|
|
221
|
-
return Promise.resolve(undefined)
|
|
222
|
-
}
|
|
223
|
-
registerRequestInterceptors(otelRouteInterceptor)
|
|
217
|
+
return Promise.resolve(undefined)
|
|
218
|
+
}
|
|
219
|
+
registerRequestInterceptors(otelRouteInterceptor)
|
|
224
220
|
|
|
225
221
|
// Close the root span pre-flush with the final status. Runs on every response-producing path (page
|
|
226
222
|
// render, route handler, static file, redirect, 404). Before closing, emit the pre-flush leaf spans Next
|
|
@@ -228,61 +224,57 @@ export function registerOtelExtensions(config: ResolvedConfig): void {
|
|
|
228
224
|
// render span for pages, or the root for handlers.
|
|
229
225
|
const otelFinalizer: ResponseFinalizer = ctx => {
|
|
230
226
|
try {
|
|
231
|
-
if (ctx.routeKind === 'html') emitClientComponentLoadingSpan(0)
|
|
227
|
+
if (ctx.routeKind === 'html') emitClientComponentLoadingSpan(0)
|
|
232
228
|
if (ctx.routeKind === 'html' || ctx.routeKind === 'route-handler') {
|
|
233
|
-
emitStartResponseSpan()
|
|
229
|
+
emitStartResponseSpan()
|
|
234
230
|
}
|
|
235
|
-
endRootSpan(ctx.status)
|
|
231
|
+
endRootSpan(ctx.status)
|
|
236
232
|
} catch {
|
|
237
233
|
// ignore
|
|
238
234
|
}
|
|
239
|
-
}
|
|
240
|
-
registerResponseFinalizers(otelFinalizer)
|
|
235
|
+
}
|
|
236
|
+
registerResponseFinalizers(otelFinalizer)
|
|
241
237
|
}
|
|
242
238
|
|
|
243
239
|
/** The runtime route entry matching a raw route pattern. */
|
|
244
240
|
function routeEntryFor(routePattern: string): RouteManifestEntry | undefined {
|
|
245
|
-
return getRequestRuntime()?.routes.find(r => r.route === routePattern)
|
|
241
|
+
return getRequestRuntime()?.routes.find(r => r.route === routePattern)
|
|
246
242
|
}
|
|
247
243
|
|
|
248
244
|
// A hybrid app materializes BOTH trees under `pnext-pages-compat`: native app
|
|
249
245
|
// files become `source-app/...` shims, pages files become `source-pages/...`
|
|
250
246
|
// wrappers. Only the latter are pages-router routes. The import specifier is a
|
|
251
247
|
// stable generator-owned marker; cache per file (routes don't change at start).
|
|
252
|
-
const pagesCompatFileCache = new Map<string, boolean>()
|
|
248
|
+
const pagesCompatFileCache = new Map<string, boolean>()
|
|
253
249
|
function isPagesCompatEntry(entry: RouteManifestEntry | undefined): boolean {
|
|
254
|
-
if (!entry?.file.includes(`${path.sep}pnext-pages-compat${path.sep}`)) return false
|
|
255
|
-
let cached = pagesCompatFileCache.get(entry.file)
|
|
250
|
+
if (!entry?.file.includes(`${path.sep}pnext-pages-compat${path.sep}`)) return false
|
|
251
|
+
let cached = pagesCompatFileCache.get(entry.file)
|
|
256
252
|
if (cached === undefined) {
|
|
257
253
|
try {
|
|
258
|
-
cached = readFileSync(entry.file, 'utf8').includes('source-pages/')
|
|
254
|
+
cached = readFileSync(entry.file, 'utf8').includes('source-pages/')
|
|
259
255
|
} catch {
|
|
260
|
-
cached = false
|
|
256
|
+
cached = false
|
|
261
257
|
}
|
|
262
|
-
pagesCompatFileCache.set(entry.file, cached)
|
|
258
|
+
pagesCompatFileCache.set(entry.file, cached)
|
|
263
259
|
}
|
|
264
|
-
return cached
|
|
260
|
+
return cached
|
|
265
261
|
}
|
|
266
262
|
|
|
267
263
|
/** Whether `routePattern` matches a route materialized from `pages/`. */
|
|
268
264
|
function isPagesCompatRoute(routePattern: string): boolean {
|
|
269
|
-
return isPagesCompatEntry(routeEntryFor(routePattern))
|
|
265
|
+
return isPagesCompatEntry(routeEntryFor(routePattern))
|
|
270
266
|
}
|
|
271
267
|
|
|
272
268
|
function routeEntryToDisplay(route: RouteManifestEntry): string {
|
|
273
|
-
let value = route.route || '/'
|
|
269
|
+
let value = route.route || '/'
|
|
274
270
|
if (route.catchAll) {
|
|
275
|
-
const token = route.catchAllOptional
|
|
276
|
-
|
|
277
|
-
: `[...${route.catchAll}]`;
|
|
278
|
-
value = value.replace(`:${route.catchAll}*`, token);
|
|
271
|
+
const token = route.catchAllOptional ? `[[...${route.catchAll}]]` : `[...${route.catchAll}]`
|
|
272
|
+
value = value.replace(`:${route.catchAll}*`, token)
|
|
279
273
|
}
|
|
280
|
-
for (const param of route.params) value = value.replace(`:${param}`, `[${param}]`)
|
|
281
|
-
return value
|
|
274
|
+
for (const param of route.params) value = value.replace(`:${param}`, `[${param}]`)
|
|
275
|
+
return value
|
|
282
276
|
}
|
|
283
277
|
|
|
284
278
|
function routePatternToDisplay(route: string): string {
|
|
285
|
-
return route
|
|
286
|
-
.replace(/:([A-Za-z0-9_]+)\*/g, '[...$1]')
|
|
287
|
-
.replace(/:([A-Za-z0-9_]+)/g, '[$1]');
|
|
279
|
+
return route.replace(/:([A-Za-z0-9_]+)\*/g, '[...$1]').replace(/:([A-Za-z0-9_]+)/g, '[$1]')
|
|
288
280
|
}
|