@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
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
//
|
|
18
18
|
// Zero-cost: apps without an instrumentation-client file get no bundle, no build work, no head tag.
|
|
19
19
|
|
|
20
|
-
import { existsSync, mkdirSync } from 'node:fs'
|
|
21
|
-
import path from 'node:path'
|
|
22
|
-
import { build } from '../../utils/esbuild'
|
|
23
|
-
import type { ResolvedConfig } from '../../config'
|
|
24
|
-
import { getNextConfig } from '../next/config-loader'
|
|
25
|
-
import { instrumentationLookupRoots } from './instrumentation'
|
|
20
|
+
import { existsSync, mkdirSync } from 'node:fs'
|
|
21
|
+
import path from 'node:path'
|
|
22
|
+
import { build } from '../../utils/esbuild'
|
|
23
|
+
import type { ResolvedConfig } from '../../config'
|
|
24
|
+
import { getNextConfig } from '../next/config-loader'
|
|
25
|
+
import { instrumentationLookupRoots } from './instrumentation'
|
|
26
26
|
|
|
27
27
|
const CLIENT_BASENAMES = [
|
|
28
28
|
'instrumentation-client.ts',
|
|
@@ -30,28 +30,28 @@ const CLIENT_BASENAMES = [
|
|
|
30
30
|
'instrumentation-client.js',
|
|
31
31
|
'instrumentation-client.mjs',
|
|
32
32
|
'instrumentation-client.mts',
|
|
33
|
-
]
|
|
33
|
+
]
|
|
34
34
|
|
|
35
35
|
/** The served pathname of the bundled instrumentation-client asset. */
|
|
36
|
-
export const INSTRUMENTATION_CLIENT_ASSET = 'assets/instrumentation-client.js'
|
|
36
|
+
export const INSTRUMENTATION_CLIENT_ASSET = 'assets/instrumentation-client.js'
|
|
37
37
|
|
|
38
38
|
function findInstrumentationClient(config: ResolvedConfig): string | undefined {
|
|
39
39
|
for (const root of instrumentationLookupRoots(config)) {
|
|
40
40
|
for (const name of CLIENT_BASENAMES) {
|
|
41
|
-
const candidate = path.join(root, name)
|
|
42
|
-
if (existsSync(candidate)) return candidate
|
|
41
|
+
const candidate = path.join(root, name)
|
|
42
|
+
if (existsSync(candidate)) return candidate
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
return undefined
|
|
45
|
+
return undefined
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/** `instrumentationClientInject` module paths from next.config, root-resolved. */
|
|
49
49
|
function injectEntries(config: ResolvedConfig): string[] {
|
|
50
|
-
const value = getNextConfig().instrumentationClientInject
|
|
51
|
-
if (!Array.isArray(value)) return []
|
|
50
|
+
const value = getNextConfig().instrumentationClientInject
|
|
51
|
+
if (!Array.isArray(value)) return []
|
|
52
52
|
return value
|
|
53
53
|
.filter((entry): entry is string => typeof entry === 'string')
|
|
54
|
-
.map(entry => path.resolve(config.root, entry))
|
|
54
|
+
.map(entry => path.resolve(config.root, entry))
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/**
|
|
@@ -61,8 +61,8 @@ function injectEntries(config: ResolvedConfig): string[] {
|
|
|
61
61
|
function entrySource(modules: string[]): string {
|
|
62
62
|
const imports = modules
|
|
63
63
|
.map((file, index) => `import * as mod${index} from ${JSON.stringify(file)};`)
|
|
64
|
-
.join('\n')
|
|
65
|
-
const names = modules.map((_file, index) => `mod${index}`).join(', ')
|
|
64
|
+
.join('\n')
|
|
65
|
+
const names = modules.map((_file, index) => `mod${index}`).join(', ')
|
|
66
66
|
return `${imports}
|
|
67
67
|
const hooks = [${names}]
|
|
68
68
|
.map(mod => (mod && typeof mod.onRouterTransitionStart === 'function' ? mod.onRouterTransitionStart : null))
|
|
@@ -78,7 +78,7 @@ if (hooks.length > 0) {
|
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
-
|
|
81
|
+
`
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/**
|
|
@@ -87,16 +87,16 @@ if (hooks.length > 0) {
|
|
|
87
87
|
* step (before prerendering, so prerendered documents include the head tag).
|
|
88
88
|
*/
|
|
89
89
|
export async function buildInstrumentationClient(config: ResolvedConfig): Promise<void> {
|
|
90
|
-
const userFile = findInstrumentationClient(config)
|
|
91
|
-
if (!userFile) return
|
|
92
|
-
const modules = [...injectEntries(config), userFile]
|
|
93
|
-
const workDir = path.join(config.outPath, 'cache', 'instrumentation-client')
|
|
94
|
-
mkdirSync(workDir, { recursive: true })
|
|
95
|
-
const entryFile = path.join(workDir, 'entry.ts')
|
|
96
|
-
const outfile = path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET)
|
|
97
|
-
mkdirSync(path.dirname(outfile), { recursive: true })
|
|
98
|
-
await Bun.write(entryFile, entrySource(modules))
|
|
99
|
-
const tsconfig = path.join(config.root, 'tsconfig.json')
|
|
90
|
+
const userFile = findInstrumentationClient(config)
|
|
91
|
+
if (!userFile) return
|
|
92
|
+
const modules = [...injectEntries(config), userFile]
|
|
93
|
+
const workDir = path.join(config.outPath, 'cache', 'instrumentation-client')
|
|
94
|
+
mkdirSync(workDir, { recursive: true })
|
|
95
|
+
const entryFile = path.join(workDir, 'entry.ts')
|
|
96
|
+
const outfile = path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET)
|
|
97
|
+
mkdirSync(path.dirname(outfile), { recursive: true })
|
|
98
|
+
await Bun.write(entryFile, entrySource(modules))
|
|
99
|
+
const tsconfig = path.join(config.root, 'tsconfig.json')
|
|
100
100
|
await build({
|
|
101
101
|
entryPoints: [entryFile],
|
|
102
102
|
outfile,
|
|
@@ -108,23 +108,21 @@ export async function buildInstrumentationClient(config: ResolvedConfig): Promis
|
|
|
108
108
|
...(existsSync(tsconfig) ? { tsconfig } : {}),
|
|
109
109
|
logLevel: 'silent',
|
|
110
110
|
sourcemap: false,
|
|
111
|
-
})
|
|
112
|
-
bundlePresence = true
|
|
111
|
+
})
|
|
112
|
+
bundlePresence = true
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
let bundlePresence: boolean | undefined
|
|
115
|
+
let bundlePresence: boolean | undefined
|
|
116
116
|
|
|
117
117
|
/** Whether the built instrumentation-client bundle exists (cached). */
|
|
118
118
|
function hasInstrumentationClientBundle(config: ResolvedConfig): boolean {
|
|
119
|
-
bundlePresence ??= existsSync(
|
|
120
|
-
|
|
121
|
-
);
|
|
122
|
-
return bundlePresence;
|
|
119
|
+
bundlePresence ??= existsSync(path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET))
|
|
120
|
+
return bundlePresence
|
|
123
121
|
}
|
|
124
122
|
|
|
125
123
|
/** Test-only reset for the bundle-presence cache. */
|
|
126
124
|
export function resetInstrumentationClientForTest(): void {
|
|
127
|
-
bundlePresence = undefined
|
|
125
|
+
bundlePresence = undefined
|
|
128
126
|
}
|
|
129
127
|
|
|
130
128
|
/**
|
|
@@ -132,7 +130,7 @@ export function resetInstrumentationClientForTest(): void {
|
|
|
132
130
|
* app has none. basePath-prefixed like every other asset href.
|
|
133
131
|
*/
|
|
134
132
|
export function instrumentationClientHeadTag(config: ResolvedConfig): string {
|
|
135
|
-
if (!hasInstrumentationClientBundle(config)) return ''
|
|
136
|
-
const prefix = config.basePath ?? ''
|
|
137
|
-
return `<script type="module" src="${prefix}/${INSTRUMENTATION_CLIENT_ASSET}"></script
|
|
133
|
+
if (!hasInstrumentationClientBundle(config)) return ''
|
|
134
|
+
const prefix = config.basePath ?? ''
|
|
135
|
+
return `<script type="module" src="${prefix}/${INSTRUMENTATION_CLIENT_ASSET}"></script>`
|
|
138
136
|
}
|
|
@@ -12,15 +12,15 @@
|
|
|
12
12
|
// separate module state) and calling its register() with NEXT_RUNTIME='edge' set for the duration.
|
|
13
13
|
// Apps without edge entities never get the pass.
|
|
14
14
|
|
|
15
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'
|
|
16
|
-
import path from 'node:path'
|
|
17
|
-
import { pathToFileURL } from 'node:url'
|
|
18
|
-
import { createRequire } from 'node:module'
|
|
19
|
-
import type { Plugin } from 'esbuild'
|
|
20
|
-
import { build } from '../../utils/esbuild'
|
|
21
|
-
import type { ResolvedConfig } from '../../config'
|
|
22
|
-
import { resolveExternalLoadTarget } from '../../resolve/imports'
|
|
23
|
-
import { compatAliases, reactServerLayerAliases } from '../
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'
|
|
16
|
+
import path from 'node:path'
|
|
17
|
+
import { pathToFileURL } from 'node:url'
|
|
18
|
+
import { createRequire } from 'node:module'
|
|
19
|
+
import type { Plugin } from 'esbuild'
|
|
20
|
+
import { build } from '../../utils/esbuild'
|
|
21
|
+
import type { ResolvedConfig } from '../../config'
|
|
22
|
+
import { resolveExternalLoadTarget } from '../../resolve/imports'
|
|
23
|
+
import { compatAliases, reactServerLayerAliases } from '../aliases'
|
|
24
24
|
|
|
25
25
|
const INSTRUMENTATION_BASENAMES = [
|
|
26
26
|
'instrumentation.ts',
|
|
@@ -28,7 +28,7 @@ const INSTRUMENTATION_BASENAMES = [
|
|
|
28
28
|
'instrumentation.js',
|
|
29
29
|
'instrumentation.mjs',
|
|
30
30
|
'instrumentation.tsx',
|
|
31
|
-
]
|
|
31
|
+
]
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* The instrumentation bundle keeps node_modules external, so every bare specifier it emits is resolved
|
|
@@ -40,84 +40,84 @@ const INSTRUMENTATION_BASENAMES = [
|
|
|
40
40
|
* server layer, so register() must observe the hook-free React.
|
|
41
41
|
*/
|
|
42
42
|
function instrumentationAliases(config: ResolvedConfig): Record<string, string> {
|
|
43
|
-
return { ...compatAliases(config, 'server'), ...reactServerLayerAliases(config) }
|
|
43
|
+
return { ...compatAliases(config, 'server'), ...reactServerLayerAliases(config) }
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
function instrumentationPlugin(root: string, config?: ResolvedConfig): Plugin {
|
|
47
|
-
const appRequire = createRequire(path.join(root, 'package.json'))
|
|
48
|
-
const aliases = config ? instrumentationAliases(config) : {}
|
|
47
|
+
const appRequire = createRequire(path.join(root, 'package.json'))
|
|
48
|
+
const aliases = config ? instrumentationAliases(config) : {}
|
|
49
49
|
return {
|
|
50
50
|
name: 'pnext-instrumentation',
|
|
51
51
|
setup(builder) {
|
|
52
52
|
builder.onResolve({ filter: /^[^./]/ }, args => {
|
|
53
|
-
const alias = aliases[args.path]
|
|
54
|
-
if (!alias) return undefined
|
|
53
|
+
const alias = aliases[args.path]
|
|
54
|
+
if (!alias) return undefined
|
|
55
55
|
return {
|
|
56
56
|
path: path.isAbsolute(alias) ? pathToFileURL(alias).href : alias,
|
|
57
57
|
external: true,
|
|
58
|
-
}
|
|
59
|
-
})
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
60
|
builder.onResolve({ filter: /^server-only$/ }, () => ({
|
|
61
61
|
path: 'server-only',
|
|
62
62
|
namespace: 'pnext',
|
|
63
|
-
}))
|
|
64
|
-
builder.onLoad({ filter: /^server-only$/, namespace: 'pnext' }, () => ({ contents: '' }))
|
|
63
|
+
}))
|
|
64
|
+
builder.onLoad({ filter: /^server-only$/, namespace: 'pnext' }, () => ({ contents: '' }))
|
|
65
65
|
builder.onResolve({ filter: /^@vercel\/otel$/ }, () => {
|
|
66
66
|
try {
|
|
67
|
-
appRequire.resolve('@vercel/otel')
|
|
68
|
-
return undefined
|
|
67
|
+
appRequire.resolve('@vercel/otel')
|
|
68
|
+
return undefined
|
|
69
69
|
} catch {
|
|
70
|
-
return { path: '@vercel/otel', namespace: 'pnext' }
|
|
70
|
+
return { path: '@vercel/otel', namespace: 'pnext' }
|
|
71
71
|
}
|
|
72
|
-
})
|
|
72
|
+
})
|
|
73
73
|
builder.onLoad({ filter: /^@vercel\/otel$/, namespace: 'pnext' }, () => ({
|
|
74
74
|
contents: 'export function registerOTel() {}',
|
|
75
|
-
}))
|
|
75
|
+
}))
|
|
76
76
|
builder.onResolve({ filter: /^[^./]/ }, args => {
|
|
77
77
|
const target = resolveExternalLoadTarget({
|
|
78
78
|
root,
|
|
79
79
|
fromFile: args.importer || path.join(root, 'instrumentation.ts'),
|
|
80
80
|
specifier: args.path,
|
|
81
81
|
target: 'server',
|
|
82
|
-
})
|
|
83
|
-
return target ? { path: target } : undefined
|
|
84
|
-
})
|
|
82
|
+
})
|
|
83
|
+
return target ? { path: target } : undefined
|
|
84
|
+
})
|
|
85
85
|
},
|
|
86
|
-
}
|
|
86
|
+
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
export type OnRequestErrorHook = (
|
|
90
90
|
error: unknown,
|
|
91
91
|
request: { path: string; method: string; headers: Record<string, string> },
|
|
92
92
|
context: Record<string, unknown>,
|
|
93
|
-
) => void | Promise<void
|
|
93
|
+
) => void | Promise<void>
|
|
94
94
|
|
|
95
95
|
interface InstrumentationModule {
|
|
96
|
-
register?: () => void | Promise<void
|
|
97
|
-
onRequestError?: OnRequestErrorHook
|
|
96
|
+
register?: () => void | Promise<void>
|
|
97
|
+
onRequestError?: OnRequestErrorHook
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
let loaded: InstrumentationModule | undefined
|
|
101
|
-
let readyGate: Promise<void> | undefined
|
|
100
|
+
let loaded: InstrumentationModule | undefined
|
|
101
|
+
let readyGate: Promise<void> | undefined
|
|
102
102
|
|
|
103
103
|
/** The user onRequestError export, once instrumentation has loaded. */
|
|
104
104
|
export function getUserOnRequestError(): OnRequestErrorHook | undefined {
|
|
105
|
-
return loaded?.onRequestError
|
|
105
|
+
return loaded?.onRequestError
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/** Resolve once instrumentation register() has completed (or there is none). */
|
|
109
109
|
export function instrumentationReady(): Promise<void> {
|
|
110
|
-
return readyGate ?? Promise.resolve()
|
|
110
|
+
return readyGate ?? Promise.resolve()
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
function findInstrumentation(config: ResolvedConfig): string | undefined {
|
|
114
114
|
for (const root of instrumentationLookupRoots(config)) {
|
|
115
115
|
for (const name of INSTRUMENTATION_BASENAMES) {
|
|
116
|
-
const candidate = path.join(root, name)
|
|
117
|
-
if (existsSync(candidate)) return candidate
|
|
116
|
+
const candidate = path.join(root, name)
|
|
117
|
+
if (existsSync(candidate)) return candidate
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
-
return undefined
|
|
120
|
+
return undefined
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
/**
|
|
@@ -126,9 +126,9 @@ function findInstrumentation(config: ResolvedConfig): string | undefined {
|
|
|
126
126
|
* ignored). Apps without a `src/` source tree read from the project root.
|
|
127
127
|
*/
|
|
128
128
|
export function instrumentationLookupRoots(config: ResolvedConfig): string[] {
|
|
129
|
-
const src = path.join(config.root, 'src')
|
|
130
|
-
const usesSrc = existsSync(path.join(src, 'app')) || existsSync(path.join(src, 'pages'))
|
|
131
|
-
return usesSrc ? [src] : [config.root]
|
|
129
|
+
const src = path.join(config.root, 'src')
|
|
130
|
+
const usesSrc = existsSync(path.join(src, 'app')) || existsSync(path.join(src, 'pages'))
|
|
131
|
+
return usesSrc ? [src] : [config.root]
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
async function importInstrumentation(
|
|
@@ -136,13 +136,13 @@ async function importInstrumentation(
|
|
|
136
136
|
config: ResolvedConfig,
|
|
137
137
|
suffix = '',
|
|
138
138
|
): Promise<InstrumentationModule> {
|
|
139
|
-
const root = config.root
|
|
139
|
+
const root = config.root
|
|
140
140
|
// Under config.outPath, so a dev server's scratch bundle lives in its own
|
|
141
141
|
// subtree and a concurrent build never removes it mid-import.
|
|
142
|
-
const outDir = path.join(config.outPath, 'instrumentation')
|
|
143
|
-
mkdirSync(outDir, { recursive: true })
|
|
144
|
-
const outfile = path.join(outDir, `instrumentation.${Date.now()}${suffix}.mjs`)
|
|
145
|
-
const tsconfig = path.join(root, 'tsconfig.json')
|
|
142
|
+
const outDir = path.join(config.outPath, 'instrumentation')
|
|
143
|
+
mkdirSync(outDir, { recursive: true })
|
|
144
|
+
const outfile = path.join(outDir, `instrumentation.${Date.now()}${suffix}.mjs`)
|
|
145
|
+
const tsconfig = path.join(root, 'tsconfig.json')
|
|
146
146
|
try {
|
|
147
147
|
await build({
|
|
148
148
|
entryPoints: [file],
|
|
@@ -161,10 +161,10 @@ async function importInstrumentation(
|
|
|
161
161
|
},
|
|
162
162
|
logLevel: 'silent',
|
|
163
163
|
sourcemap: false,
|
|
164
|
-
})
|
|
165
|
-
return (await import(pathToFileURL(outfile).href)) as InstrumentationModule
|
|
164
|
+
})
|
|
165
|
+
return (await import(pathToFileURL(outfile).href)) as InstrumentationModule
|
|
166
166
|
} finally {
|
|
167
|
-
rmSync(outfile, { force: true })
|
|
167
|
+
rmSync(outfile, { force: true })
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
|
|
@@ -174,11 +174,11 @@ async function importInstrumentation(
|
|
|
174
174
|
* the register() completion is tracked by instrumentationReady().
|
|
175
175
|
*/
|
|
176
176
|
export function loadInstrumentation(config: ResolvedConfig): void {
|
|
177
|
-
if (readyGate) return
|
|
178
|
-
const file = findInstrumentation(config)
|
|
177
|
+
if (readyGate) return
|
|
178
|
+
const file = findInstrumentation(config)
|
|
179
179
|
if (!file) {
|
|
180
|
-
readyGate = Promise.resolve()
|
|
181
|
-
return
|
|
180
|
+
readyGate = Promise.resolve()
|
|
181
|
+
return
|
|
182
182
|
}
|
|
183
183
|
readyGate = (async () => {
|
|
184
184
|
try {
|
|
@@ -187,14 +187,14 @@ export function loadInstrumentation(config: ResolvedConfig): void {
|
|
|
187
187
|
// baseline runtime is 'nodejs' (edge-only fixtures still run here).
|
|
188
188
|
|
|
189
189
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
190
|
-
if (!process.env.NEXT_RUNTIME) process.env.NEXT_RUNTIME = 'nodejs'
|
|
191
|
-
loaded = await importInstrumentation(file, config)
|
|
192
|
-
await loaded.register?.()
|
|
193
|
-
if (appHasEdgeEntities(config)) await runEdgeRegisterPass(file, config)
|
|
190
|
+
if (!process.env.NEXT_RUNTIME) process.env.NEXT_RUNTIME = 'nodejs'
|
|
191
|
+
loaded = await importInstrumentation(file, config)
|
|
192
|
+
await loaded.register?.()
|
|
193
|
+
if (appHasEdgeEntities(config)) await runEdgeRegisterPass(file, config)
|
|
194
194
|
} catch (error) {
|
|
195
|
-
console.error('instrumentation register() failed:', error)
|
|
195
|
+
console.error('instrumentation register() failed:', error)
|
|
196
196
|
}
|
|
197
|
-
})()
|
|
197
|
+
})()
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
/**
|
|
@@ -204,29 +204,29 @@ export function loadInstrumentation(config: ResolvedConfig): void {
|
|
|
204
204
|
*/
|
|
205
205
|
async function runEdgeRegisterPass(file: string, config: ResolvedConfig): Promise<void> {
|
|
206
206
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
207
|
-
const previous = process.env.NEXT_RUNTIME
|
|
207
|
+
const previous = process.env.NEXT_RUNTIME
|
|
208
208
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
209
|
-
process.env.NEXT_RUNTIME = 'edge'
|
|
209
|
+
process.env.NEXT_RUNTIME = 'edge'
|
|
210
210
|
try {
|
|
211
|
-
const edgeInstance = await importInstrumentation(file, config, '.edge')
|
|
212
|
-
await edgeInstance.register?.()
|
|
211
|
+
const edgeInstance = await importInstrumentation(file, config, '.edge')
|
|
212
|
+
await edgeInstance.register?.()
|
|
213
213
|
} catch (error) {
|
|
214
|
-
console.error('instrumentation register() (edge pass) failed:', error)
|
|
214
|
+
console.error('instrumentation register() (edge pass) failed:', error)
|
|
215
215
|
} finally {
|
|
216
216
|
if (previous === undefined) {
|
|
217
217
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
218
|
-
delete process.env.NEXT_RUNTIME
|
|
218
|
+
delete process.env.NEXT_RUNTIME
|
|
219
219
|
} else {
|
|
220
220
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
221
|
-
process.env.NEXT_RUNTIME = previous
|
|
221
|
+
process.env.NEXT_RUNTIME = previous
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
const SOURCE_FILE_RE = /\.(?:ts|tsx|js|jsx|mjs|mts|cjs|cts)
|
|
226
|
+
const SOURCE_FILE_RE = /\.(?:ts|tsx|js|jsx|mjs|mts|cjs|cts)$/
|
|
227
227
|
// `export const runtime = 'edge'` (app router) or `config = { runtime:
|
|
228
228
|
// 'edge' | 'experimental-edge' }` (pages router / API routes).
|
|
229
|
-
const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]
|
|
229
|
+
const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]/
|
|
230
230
|
|
|
231
231
|
/**
|
|
232
232
|
* Whether the app contains anything Next would boot the edge runtime for:
|
|
@@ -235,46 +235,46 @@ const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]/;
|
|
|
235
235
|
* at boot; apps without instrumentation never pay).
|
|
236
236
|
*/
|
|
237
237
|
function appHasEdgeEntities(config: ResolvedConfig): boolean {
|
|
238
|
-
const roots = [config.root, path.join(config.root, 'src')]
|
|
238
|
+
const roots = [config.root, path.join(config.root, 'src')]
|
|
239
239
|
for (const root of roots) {
|
|
240
240
|
for (const name of ['middleware', 'proxy']) {
|
|
241
241
|
for (const ext of ['ts', 'js', 'mts', 'mjs']) {
|
|
242
|
-
if (existsSync(path.join(root, `${name}.${ext}`))) return true
|
|
242
|
+
if (existsSync(path.join(root, `${name}.${ext}`))) return true
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
for (const dir of ['app', 'pages']) {
|
|
246
|
-
if (sourceTreeDeclaresEdgeRuntime(path.join(root, dir))) return true
|
|
246
|
+
if (sourceTreeDeclaresEdgeRuntime(path.join(root, dir))) return true
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
-
return false
|
|
249
|
+
return false
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
function sourceTreeDeclaresEdgeRuntime(dir: string): boolean {
|
|
253
|
-
let entries: string[]
|
|
253
|
+
let entries: string[]
|
|
254
254
|
try {
|
|
255
|
-
entries = readdirSync(dir)
|
|
255
|
+
entries = readdirSync(dir)
|
|
256
256
|
} catch {
|
|
257
|
-
return false
|
|
257
|
+
return false
|
|
258
258
|
}
|
|
259
259
|
for (const entry of entries) {
|
|
260
|
-
if (entry === 'node_modules' || entry.startsWith('.')) continue
|
|
261
|
-
const full = path.join(dir, entry)
|
|
262
|
-
let stats
|
|
260
|
+
if (entry === 'node_modules' || entry.startsWith('.')) continue
|
|
261
|
+
const full = path.join(dir, entry)
|
|
262
|
+
let stats
|
|
263
263
|
try {
|
|
264
|
-
stats = statSync(full)
|
|
264
|
+
stats = statSync(full)
|
|
265
265
|
} catch {
|
|
266
|
-
continue
|
|
266
|
+
continue
|
|
267
267
|
}
|
|
268
268
|
if (stats.isDirectory()) {
|
|
269
|
-
if (sourceTreeDeclaresEdgeRuntime(full)) return true
|
|
270
|
-
continue
|
|
269
|
+
if (sourceTreeDeclaresEdgeRuntime(full)) return true
|
|
270
|
+
continue
|
|
271
271
|
}
|
|
272
|
-
if (!SOURCE_FILE_RE.test(entry)) continue
|
|
272
|
+
if (!SOURCE_FILE_RE.test(entry)) continue
|
|
273
273
|
try {
|
|
274
|
-
if (EDGE_RUNTIME_RE.test(readFileSync(full, 'utf8'))) return true
|
|
274
|
+
if (EDGE_RUNTIME_RE.test(readFileSync(full, 'utf8'))) return true
|
|
275
275
|
} catch {
|
|
276
276
|
// unreadable file — skip
|
|
277
277
|
}
|
|
278
278
|
}
|
|
279
|
-
return false
|
|
279
|
+
return false
|
|
280
280
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { format } from 'node:util'
|
|
1
|
+
import { format } from 'node:util'
|
|
2
2
|
|
|
3
|
-
const installed = Symbol.for('pnext.node-console-format-installed')
|
|
3
|
+
const installed = Symbol.for('pnext.node-console-format-installed')
|
|
4
4
|
|
|
5
5
|
export function installNodeConsoleFormat(): void {
|
|
6
|
-
const state = globalThis as typeof globalThis & Record<symbol, true | undefined
|
|
7
|
-
if (state[installed]) return
|
|
8
|
-
state[installed] = true
|
|
9
|
-
const log = console.log.bind(console)
|
|
10
|
-
console.log = (...args: unknown[]) => log(format(...args))
|
|
6
|
+
const state = globalThis as typeof globalThis & Record<symbol, true | undefined>
|
|
7
|
+
if (state[installed]) return
|
|
8
|
+
state[installed] = true
|
|
9
|
+
const log = console.log.bind(console)
|
|
10
|
+
console.log = (...args: unknown[]) => log(format(...args))
|
|
11
11
|
// Errors too: bun prints a thrown/logged Error as `error: message` (and uses
|
|
12
12
|
// `err.name` alone for a renamed one), while Node — and therefore every Next
|
|
13
13
|
// e2e expectation — prints util.inspect's `ClassName: message` /
|
|
14
14
|
// `ClassName [name]: message` header followed by the stack.
|
|
15
|
-
const error = console.error.bind(console)
|
|
16
|
-
console.error = (...args: unknown[]) => error(format(...args))
|
|
17
|
-
const warn = console.warn.bind(console)
|
|
18
|
-
console.warn = (...args: unknown[]) => warn(format(...args))
|
|
15
|
+
const error = console.error.bind(console)
|
|
16
|
+
console.error = (...args: unknown[]) => error(format(...args))
|
|
17
|
+
const warn = console.warn.bind(console)
|
|
18
|
+
console.warn = (...args: unknown[]) => warn(format(...args))
|
|
19
19
|
}
|