@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
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
// Ordering: registerCompatExtensions runs cache BEFORE actions, so the use-cache source transform is
|
|
11
11
|
// registered ahead of the inline-action-tag transform, matching the old rewriteServerSource order.
|
|
12
12
|
|
|
13
|
-
import type { ResolvedConfig } from '../../config'
|
|
14
|
-
import { nextCompatEnabled } from '../../compat'
|
|
13
|
+
import type { ResolvedConfig } from '../../config'
|
|
14
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
15
15
|
import {
|
|
16
16
|
registerBundledSourceTransforms,
|
|
17
17
|
registerInitHooks,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
setRenderExtensions,
|
|
20
20
|
setRequestExtensions,
|
|
21
21
|
withSniff,
|
|
22
|
-
} from '../../extensions'
|
|
22
|
+
} from '../../extensions'
|
|
23
23
|
import {
|
|
24
24
|
collectRenderCacheMeta,
|
|
25
25
|
currentRenderCacheMeta,
|
|
@@ -28,13 +28,13 @@ import {
|
|
|
28
28
|
tagsRevalidatedSince,
|
|
29
29
|
tagsRevalidationReasonSince,
|
|
30
30
|
tagsStaleSince,
|
|
31
|
-
} from '../cache/revalidate'
|
|
32
|
-
import { setBuildFlagsOutPath } from '../cache/build-flags'
|
|
33
|
-
import { installCompatFetchCache } from '../cache/fetch-patch'
|
|
34
|
-
import { installCustomCacheHandler } from '../cache/custom-handler'
|
|
35
|
-
import { installModernCacheHandlers } from '../cache/modern-handler'
|
|
36
|
-
import { rewriteUseCacheSource } from '../cache/use-cache-transform'
|
|
37
|
-
import { resumeDataCacheExtension } from '../cache/resume-data-cache'
|
|
31
|
+
} from '../cache/revalidate'
|
|
32
|
+
import { setBuildFlagsOutPath } from '../cache/build-flags'
|
|
33
|
+
import { installCompatFetchCache } from '../cache/fetch-patch'
|
|
34
|
+
import { installCustomCacheHandler } from '../cache/custom-handler'
|
|
35
|
+
import { installModernCacheHandlers } from '../cache/modern-handler'
|
|
36
|
+
import { rewriteUseCacheSource } from '../cache/use-cache-transform'
|
|
37
|
+
import { resumeDataCacheExtension } from '../cache/resume-data-cache'
|
|
38
38
|
|
|
39
39
|
export function registerCacheExtensions(config: ResolvedConfig): void {
|
|
40
40
|
// Render cache-meta collection scope (tags/revalidate/no-store) wrapped
|
|
@@ -45,7 +45,7 @@ export function registerCacheExtensions(config: ResolvedConfig): void {
|
|
|
45
45
|
// the document can inline its own reuse window for hard loads.
|
|
46
46
|
currentCacheStaleSeconds: () => currentRenderCacheMeta()?.staleSeconds,
|
|
47
47
|
prerenderSidecar: resumeDataCacheExtension,
|
|
48
|
-
})
|
|
48
|
+
})
|
|
49
49
|
|
|
50
50
|
// ISR on-demand staleness: fold the path + tag revalidation checks start.ts
|
|
51
51
|
// used to OR together into the single registry predicate.
|
|
@@ -56,7 +56,7 @@ export function registerCacheExtensions(config: ResolvedConfig): void {
|
|
|
56
56
|
pathRevalidationReasonSince(pathname, mtimeMs) ??
|
|
57
57
|
tagsRevalidationReasonSince(tags, mtimeMs) ??
|
|
58
58
|
(tagsStaleSince(tags, mtimeMs) ? 'soft' : undefined),
|
|
59
|
-
})
|
|
59
|
+
})
|
|
60
60
|
|
|
61
61
|
// 'use cache' source rewrite (server bundles): registered first so it runs
|
|
62
62
|
// before the inline-action-tag transform, exactly as before. Also registered
|
|
@@ -64,22 +64,22 @@ export function registerCacheExtensions(config: ResolvedConfig): void {
|
|
|
64
64
|
// the directive is the one trigger in the chain that survives bundling.
|
|
65
65
|
const useCache = withSniff(['use cache'], (source, file, root) =>
|
|
66
66
|
rewriteUseCacheSource(source, file, root),
|
|
67
|
-
)
|
|
68
|
-
registerServerSourceTransforms(useCache)
|
|
69
|
-
registerBundledSourceTransforms(useCache)
|
|
67
|
+
)
|
|
68
|
+
registerServerSourceTransforms(useCache)
|
|
69
|
+
registerBundledSourceTransforms(useCache)
|
|
70
70
|
|
|
71
71
|
// Prerenders + runtime renders must observe Next fetch-cache options
|
|
72
72
|
// (force-cache, next: { revalidate, tags }). Idempotent; next-compat only.
|
|
73
73
|
if (nextCompatEnabled(config)) {
|
|
74
74
|
registerInitHooks(cfg => {
|
|
75
|
-
installCompatFetchCache()
|
|
75
|
+
installCompatFetchCache()
|
|
76
76
|
// Where `pnext start` reads the build's --debug-prerender flag back from
|
|
77
77
|
// (the runtime 'use cache' error funnel shapes its log around it).
|
|
78
|
-
setBuildFlagsOutPath(cfg.outPath)
|
|
78
|
+
setBuildFlagsOutPath(cfg.outPath)
|
|
79
79
|
// Load + instantiate the configured `cacheHandler` (next.config) and
|
|
80
80
|
// install it into the core cache seam so the data cache defers to it.
|
|
81
|
-
installCustomCacheHandler(cfg.root)
|
|
82
|
-
installModernCacheHandlers(cfg.root)
|
|
83
|
-
})
|
|
81
|
+
installCustomCacheHandler(cfg.root)
|
|
82
|
+
installModernCacheHandlers(cfg.root)
|
|
83
|
+
})
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
// contract. The compat entry already imports the route's nearest error.js and installs the action-error
|
|
8
8
|
// overlay; to activate the general client error pipeline it additionally calls installClientErrors.
|
|
9
9
|
|
|
10
|
-
import type { ResolvedConfig } from '../../config'
|
|
11
|
-
import { nextCompatEnabled } from '../../compat'
|
|
10
|
+
import type { ResolvedConfig } from '../../config'
|
|
11
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
12
12
|
|
|
13
13
|
export function registerClientErrorExtensions(config: ResolvedConfig): void {
|
|
14
|
-
if (!nextCompatEnabled(config)) return
|
|
14
|
+
if (!nextCompatEnabled(config)) return
|
|
15
15
|
// No server-side render/routing extension: the client runtime installs in the
|
|
16
16
|
// browser from the generated entry (seam 5, clientEntryModules). Kept as the
|
|
17
17
|
// stable registration seam so the orchestrator can wire it uniformly.
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
// next.config values feed pnext's resolved config for build AND start/dev. The orchestrator must call
|
|
6
6
|
// this from register.ts too, so a single registerCompatExtensions() pass leaves the source installed.
|
|
7
7
|
|
|
8
|
-
import { registerConfigSource as registerCoreConfigSource } from '../../config'
|
|
9
|
-
import type { ConfigSourceOverrides } from '../../config'
|
|
10
|
-
import { loadNextConfig } from '../next/config-loader'
|
|
8
|
+
import { registerConfigSource as registerCoreConfigSource } from '../../config'
|
|
9
|
+
import type { ConfigSourceOverrides } from '../../config'
|
|
10
|
+
import { loadNextConfig } from '../next/config-loader'
|
|
11
11
|
|
|
12
12
|
export function registerConfigSource(): void {
|
|
13
13
|
registerCoreConfigSource(async (root, options): Promise<ConfigSourceOverrides> => {
|
|
14
|
-
const { overrides } = await loadNextConfig(root, options)
|
|
15
|
-
return overrides
|
|
16
|
-
})
|
|
14
|
+
const { overrides } = await loadNextConfig(root, options)
|
|
15
|
+
return overrides
|
|
16
|
+
})
|
|
17
17
|
}
|
|
@@ -18,38 +18,34 @@
|
|
|
18
18
|
// Gated on next-compat: a pure-core or react-only app keeps every no-op default and never loads the sass
|
|
19
19
|
// module.
|
|
20
20
|
|
|
21
|
-
import type { Plugin } from 'esbuild'
|
|
22
|
-
import type { ResolvedConfig } from '../../config'
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
setBundlerExtensions,
|
|
26
|
-
setCssExtensions,
|
|
27
|
-
} from '../../extensions';
|
|
28
|
-
import { nextCompatEnabled } from '../../render/hooks';
|
|
21
|
+
import type { Plugin } from 'esbuild'
|
|
22
|
+
import type { ResolvedConfig } from '../../config'
|
|
23
|
+
import { getBundlerExtensions, setBundlerExtensions, setCssExtensions } from '../../extensions'
|
|
24
|
+
import { nextCompatEnabled } from '../../render/hooks'
|
|
29
25
|
import {
|
|
30
26
|
sassChunkPlugin,
|
|
31
27
|
sassLoadCssModuleForClient,
|
|
32
28
|
sassResolveCssModule,
|
|
33
|
-
} from '../css/sass-plugin'
|
|
34
|
-
import { isSassFile, isSassModuleFile, sassModuleMapping } from '../css/sass'
|
|
29
|
+
} from '../css/sass-plugin'
|
|
30
|
+
import { isSassFile, isSassModuleFile, sassModuleMapping } from '../css/sass'
|
|
35
31
|
import {
|
|
36
32
|
nextCssLoadModuleForClient,
|
|
37
33
|
nextCssModuleChunkPlugin,
|
|
38
34
|
nextCssResolveModule,
|
|
39
|
-
} from '../css/modules'
|
|
40
|
-
import { nextPlanRouteCssChunks } from '../css/chunking'
|
|
41
|
-
import { inlineCssStylesheets } from '../css/inline-css'
|
|
35
|
+
} from '../css/modules'
|
|
36
|
+
import { nextPlanRouteCssChunks } from '../css/chunking'
|
|
37
|
+
import { inlineCssStylesheets } from '../css/inline-css'
|
|
42
38
|
|
|
43
39
|
export function registerCssExtrasExtensions(config: ResolvedConfig): void {
|
|
44
|
-
if (!nextCompatEnabled(config)) return
|
|
40
|
+
if (!nextCompatEnabled(config)) return
|
|
45
41
|
|
|
46
42
|
// (1) CSS-chunk + module-map registry consumed by src/css.ts. The two entries
|
|
47
43
|
// the route scanner needs (extraCssExtensions, resolveCssDependency) plus the
|
|
48
44
|
// source materialization are boot facts — register-boot.ts owns them.
|
|
49
|
-
const resolveNextCssModule = nextCssResolveModule(config)
|
|
50
|
-
const loadNextCssModuleForClient = nextCssLoadModuleForClient(config)
|
|
51
|
-
const resolveSassCssModule = sassResolveCssModule(config)
|
|
52
|
-
const loadSassCssModuleForClient = sassLoadCssModuleForClient(config)
|
|
45
|
+
const resolveNextCssModule = nextCssResolveModule(config)
|
|
46
|
+
const loadNextCssModuleForClient = nextCssLoadModuleForClient(config)
|
|
47
|
+
const resolveSassCssModule = sassResolveCssModule(config)
|
|
48
|
+
const loadSassCssModuleForClient = sassLoadCssModuleForClient(config)
|
|
53
49
|
setCssExtensions({
|
|
54
50
|
deferRootNotFoundCss: () => true,
|
|
55
51
|
inlineStylesheets: inlineCssStylesheets,
|
|
@@ -58,12 +54,12 @@ export function registerCssExtrasExtensions(config: ResolvedConfig): void {
|
|
|
58
54
|
loadCssModuleForClient: file =>
|
|
59
55
|
loadNextCssModuleForClient(file) ?? loadSassCssModuleForClient(file),
|
|
60
56
|
planRouteCssChunks: nextPlanRouteCssChunks,
|
|
61
|
-
})
|
|
57
|
+
})
|
|
62
58
|
|
|
63
59
|
// (2) Compose the sass module-loader onto the JS bundle esbuild seams.
|
|
64
|
-
const current = getBundlerExtensions()
|
|
65
|
-
const priorClient = current.clientEsbuildPlugins
|
|
66
|
-
const priorServer = current.serverEsbuildPlugins
|
|
60
|
+
const current = getBundlerExtensions()
|
|
61
|
+
const priorClient = current.clientEsbuildPlugins
|
|
62
|
+
const priorServer = current.serverEsbuildPlugins
|
|
67
63
|
setBundlerExtensions({
|
|
68
64
|
clientEsbuildPlugins: (cfg: ResolvedConfig): Plugin[] => [
|
|
69
65
|
...priorClient(cfg),
|
|
@@ -74,20 +70,20 @@ export function registerCssExtrasExtensions(config: ResolvedConfig): void {
|
|
|
74
70
|
nextCssServerModuleLoaderPlugin(cfg),
|
|
75
71
|
sassModuleLoaderPlugin(cfg),
|
|
76
72
|
],
|
|
77
|
-
})
|
|
73
|
+
})
|
|
78
74
|
}
|
|
79
75
|
|
|
80
76
|
function nextCssServerModuleLoaderPlugin(config: ResolvedConfig): Plugin {
|
|
81
|
-
const loadModule = nextCssLoadModuleForClient(config)
|
|
77
|
+
const loadModule = nextCssLoadModuleForClient(config)
|
|
82
78
|
return {
|
|
83
79
|
name: 'pnext-compat-server-css-module',
|
|
84
80
|
setup(build) {
|
|
85
81
|
build.onLoad({ filter: /\.module\.css$/ }, ({ path: file }) => {
|
|
86
|
-
const contents = loadModule(file)
|
|
87
|
-
return contents ? { contents, loader: 'js' } : null
|
|
88
|
-
})
|
|
82
|
+
const contents = loadModule(file)
|
|
83
|
+
return contents ? { contents, loader: 'js' } : null
|
|
84
|
+
})
|
|
89
85
|
},
|
|
90
|
-
}
|
|
86
|
+
}
|
|
91
87
|
}
|
|
92
88
|
|
|
93
89
|
/**
|
|
@@ -101,14 +97,14 @@ function sassModuleLoaderPlugin(config: ResolvedConfig): Plugin {
|
|
|
101
97
|
name: 'pnext-compat-sass-module',
|
|
102
98
|
setup(build) {
|
|
103
99
|
build.onLoad({ filter: /\.(?:scss|sass)$/ }, ({ path: file }) => {
|
|
104
|
-
if (!isSassFile(file)) return null
|
|
100
|
+
if (!isSassFile(file)) return null
|
|
105
101
|
const contents = isSassModuleFile(file)
|
|
106
102
|
? `export default ${JSON.stringify(sassModuleMapping(file, config.root, sassIncludePathsFor(config)))};`
|
|
107
|
-
: 'export default undefined;'
|
|
108
|
-
return { contents, loader: 'js' }
|
|
109
|
-
})
|
|
103
|
+
: 'export default undefined;'
|
|
104
|
+
return { contents, loader: 'js' }
|
|
105
|
+
})
|
|
110
106
|
},
|
|
111
|
-
}
|
|
107
|
+
}
|
|
112
108
|
}
|
|
113
109
|
|
|
114
110
|
// Local include-paths read kept here to avoid importing sass-plugin internals;
|
|
@@ -116,5 +112,5 @@ function sassModuleLoaderPlugin(config: ResolvedConfig): Plugin {
|
|
|
116
112
|
// file itself), so an empty list is acceptable — the CSS-chunk plugin
|
|
117
113
|
// (sass-plugin.ts) threads the real sassOptions.includePaths.
|
|
118
114
|
function sassIncludePathsFor(_config: ResolvedConfig): string[] {
|
|
119
|
-
return []
|
|
115
|
+
return []
|
|
120
116
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { setRuntimeExtensions } from '../../extensions'
|
|
2
|
-
import { withEdgeRuntime } from '../edge-runtime'
|
|
1
|
+
import { setRuntimeExtensions } from '../../extensions'
|
|
2
|
+
import { withEdgeRuntime } from '../edge-runtime'
|
|
3
3
|
|
|
4
4
|
export function registerEdgeRuntimeExtensions(): void {
|
|
5
|
-
setRuntimeExtensions({ withEdgeRuntime })
|
|
5
|
+
setRuntimeExtensions({ withEdgeRuntime })
|
|
6
6
|
}
|
|
@@ -5,20 +5,20 @@
|
|
|
5
5
|
// global-error / global-not-found boundary discovery. A pure-core app registers none of these, keeping
|
|
6
6
|
// the compact core error UI and no digest/redaction.
|
|
7
7
|
|
|
8
|
-
import type { ResolvedConfig } from '../../config'
|
|
9
|
-
import { setRenderExtensions } from '../../extensions'
|
|
10
|
-
import { nextCompatEnabled } from '../../compat'
|
|
8
|
+
import type { ResolvedConfig } from '../../config'
|
|
9
|
+
import { setRenderExtensions } from '../../extensions'
|
|
10
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
11
11
|
import {
|
|
12
12
|
serializeBoundaryError,
|
|
13
13
|
wrapThrownValue,
|
|
14
14
|
formatErrorLog,
|
|
15
|
-
} from '../lifecycle/error-serialize'
|
|
15
|
+
} from '../lifecycle/error-serialize'
|
|
16
16
|
import {
|
|
17
17
|
httpAccessFallbackUi,
|
|
18
18
|
defaultGlobalErrorUi,
|
|
19
19
|
globalErrorReportScript,
|
|
20
|
-
} from '../lifecycle/error-ui'
|
|
21
|
-
import { getNextConfig } from '../next/config-loader'
|
|
20
|
+
} from '../lifecycle/error-ui'
|
|
21
|
+
import { getNextConfig } from '../next/config-loader'
|
|
22
22
|
|
|
23
23
|
// global-error / global-not-found are CORE document conventions (discovered by
|
|
24
24
|
// src/routing/routes.ts findGlobalError + src/render renderGlobalNotFoundResponse);
|
|
@@ -26,7 +26,7 @@ import { getNextConfig } from '../next/config-loader';
|
|
|
26
26
|
// digest protocol here. forbidden/unauthorized stay compat conventions
|
|
27
27
|
// (registered in register-routing.ts).
|
|
28
28
|
export function registerErrorExtensions(config: ResolvedConfig): void {
|
|
29
|
-
if (!nextCompatEnabled(config)) return
|
|
29
|
+
if (!nextCompatEnabled(config)) return
|
|
30
30
|
|
|
31
31
|
setRenderExtensions({
|
|
32
32
|
serializeError: serializeBoundaryError,
|
|
@@ -37,10 +37,8 @@ export function registerErrorExtensions(config: ResolvedConfig): void {
|
|
|
37
37
|
formatErrorLog,
|
|
38
38
|
// Read lazily per call: next.config loads after registration.
|
|
39
39
|
globalNotFoundEnabled: () => {
|
|
40
|
-
const experimental = getNextConfig().experimental as
|
|
41
|
-
|
|
42
|
-
| undefined;
|
|
43
|
-
return experimental?.globalNotFound === true;
|
|
40
|
+
const experimental = getNextConfig().experimental as { globalNotFound?: boolean } | undefined
|
|
41
|
+
return experimental?.globalNotFound === true
|
|
44
42
|
},
|
|
45
|
-
})
|
|
43
|
+
})
|
|
46
44
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { nextCompatEnabled } from '../../compat'
|
|
2
|
-
import { onExtensionHostReset, registerBuildCompleteHooks } from '../../extensions'
|
|
3
|
-
import type { ResolvedConfig } from '../../config'
|
|
4
|
-
import { emitMetadataRouteArtifacts } from '../metadata-
|
|
5
|
-
import { emitStaticExport } from '../export'
|
|
6
|
-
import { emitCustomServerShim } from '../next/custom-server'
|
|
1
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
2
|
+
import { onExtensionHostReset, registerBuildCompleteHooks } from '../../extensions'
|
|
3
|
+
import type { ResolvedConfig } from '../../config'
|
|
4
|
+
import { emitMetadataRouteArtifacts } from '../metadata-artifacts'
|
|
5
|
+
import { emitStaticExport } from '../export/emit'
|
|
6
|
+
import { emitCustomServerShim } from '../next/custom-server'
|
|
7
7
|
|
|
8
|
-
let registered = false
|
|
8
|
+
let registered = false
|
|
9
9
|
// Host-scoped guard: a fresh host must be registered into again.
|
|
10
|
-
onExtensionHostReset(() => (registered = false))
|
|
10
|
+
onExtensionHostReset(() => (registered = false))
|
|
11
11
|
|
|
12
12
|
export function registerExportExtensions(config: ResolvedConfig): void {
|
|
13
|
-
if (registered) return
|
|
14
|
-
if (!nextCompatEnabled(config)) return
|
|
15
|
-
registered = true
|
|
13
|
+
if (registered) return
|
|
14
|
+
if (!nextCompatEnabled(config)) return
|
|
15
|
+
registered = true
|
|
16
16
|
|
|
17
17
|
registerBuildCompleteHooks(async ctx => {
|
|
18
|
-
if (!nextCompatEnabled(ctx.config)) return
|
|
19
|
-
await emitStaticExport(ctx)
|
|
20
|
-
await emitMetadataRouteArtifacts(ctx)
|
|
21
|
-
await emitCustomServerShim(ctx.config)
|
|
22
|
-
})
|
|
18
|
+
if (!nextCompatEnabled(ctx.config)) return
|
|
19
|
+
await emitStaticExport(ctx)
|
|
20
|
+
await emitMetadataRouteArtifacts(ctx)
|
|
21
|
+
await emitCustomServerShim(ctx.config)
|
|
22
|
+
})
|
|
23
23
|
}
|
|
@@ -11,26 +11,26 @@
|
|
|
11
11
|
// Registration is idempotent and also happens lazily on the first font-collection scope, so it is safe
|
|
12
12
|
// to call in a pure-core app and works before the orchestrator wires it in.
|
|
13
13
|
|
|
14
|
-
import type { ResolvedConfig } from '../../config'
|
|
14
|
+
import type { ResolvedConfig } from '../../config'
|
|
15
15
|
import {
|
|
16
16
|
registerClientSourceTransforms,
|
|
17
17
|
registerServerSourceTransforms,
|
|
18
18
|
withSniff,
|
|
19
|
-
} from '../../extensions'
|
|
20
|
-
import { rewriteNextFontSource } from '../
|
|
21
|
-
import { registerFontFinalizerOnce } from '../next/font/runtime'
|
|
19
|
+
} from '../../extensions'
|
|
20
|
+
import { rewriteNextFontSource } from '../aliases'
|
|
21
|
+
import { registerFontFinalizerOnce } from '../next/font/runtime'
|
|
22
22
|
|
|
23
|
-
const fontSourceTransformRoots = new Set<string>()
|
|
23
|
+
const fontSourceTransformRoots = new Set<string>()
|
|
24
24
|
|
|
25
25
|
export function registerFontExtensions(config: ResolvedConfig): void {
|
|
26
|
-
registerFontFinalizerOnce()
|
|
27
|
-
if (!config.compat?.next || fontSourceTransformRoots.has(config.root)) return
|
|
28
|
-
fontSourceTransformRoots.add(config.root)
|
|
29
|
-
const sniff = ['next/font', 'next/root-params']
|
|
26
|
+
registerFontFinalizerOnce()
|
|
27
|
+
if (!config.compat?.next || fontSourceTransformRoots.has(config.root)) return
|
|
28
|
+
fontSourceTransformRoots.add(config.root)
|
|
29
|
+
const sniff = ['next/font', 'next/root-params']
|
|
30
30
|
registerServerSourceTransforms(
|
|
31
31
|
withSniff(sniff, (source, file) => rewriteNextFontSource(source, file, 'server', config.root)),
|
|
32
|
-
)
|
|
32
|
+
)
|
|
33
33
|
registerClientSourceTransforms(
|
|
34
34
|
withSniff(sniff, (source, file) => rewriteNextFontSource(source, file, 'client', config.root)),
|
|
35
|
-
)
|
|
35
|
+
)
|
|
36
36
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Registration seam for the next/navigation router hooks (COMPAT).
|
|
3
3
|
//
|
|
4
4
|
// The hooks themselves (useSelectedLayoutSegment(s), usePathname,
|
|
5
|
-
// useSearchParams, useParams) need no runtime registration: compat/
|
|
5
|
+
// useSearchParams, useParams) need no runtime registration: compat/aliases.ts maps
|
|
6
6
|
// `next/navigation` to compat/next/{navigation,client-navigation}.ts, and the
|
|
7
7
|
// per-layout segment scope is installed by the core renderer (render/slots.ts +
|
|
8
8
|
// render/renderer.ts applyLayouts), gated on next-compat.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
// today it only re-exports the canonical setter for the proxy wiring.
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
|
|
25
|
-
export { recordCanonicalUrl, canonicalUrlHref } from '../next/canonical-url'
|
|
25
|
+
export { recordCanonicalUrl, canonicalUrlHref } from '../next/canonical-url'
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Placeholder registration entry point kept for symmetry with the other register-<x> modules. The router
|
|
@@ -4,37 +4,37 @@
|
|
|
4
4
|
// endpoint, and buildExtensions.steps gets images-manifest.json emission. Safe to call in a pure-core
|
|
5
5
|
// app: the interceptor and build step no-op unless compat.next is enabled.
|
|
6
6
|
|
|
7
|
-
import path from 'node:path'
|
|
8
|
-
import { mkdir, writeFile } from 'node:fs/promises'
|
|
9
|
-
import type { ResolvedConfig } from '../../config'
|
|
10
|
-
import { nextCompatEnabled } from '../../compat'
|
|
7
|
+
import path from 'node:path'
|
|
8
|
+
import { mkdir, writeFile } from 'node:fs/promises'
|
|
9
|
+
import type { ResolvedConfig } from '../../config'
|
|
10
|
+
import { nextCompatEnabled } from '../../compat/aliases'
|
|
11
11
|
import {
|
|
12
12
|
registerBuildCompleteHooks,
|
|
13
13
|
registerBuildSteps,
|
|
14
14
|
registerRequestInterceptors,
|
|
15
15
|
type BuildStepContext,
|
|
16
16
|
type RequestInterceptor,
|
|
17
|
-
} from '../../extensions'
|
|
18
|
-
import { getImagesConfig, type ResolvedImagesConfig } from '../next/image/config'
|
|
19
|
-
import { isImageOptimizerRequest, serveImageOptimizer } from '../next/image/optimizer'
|
|
20
|
-
import { manifestLocalPatterns } from '../next/image/patterns'
|
|
21
|
-
import { getDocumentScriptExtensions, setDocumentScriptExtensions } from '../../render/hooks'
|
|
22
|
-
import { setWorkUnitRoute } from '../../request/context'
|
|
17
|
+
} from '../../extensions'
|
|
18
|
+
import { getImagesConfig, type ResolvedImagesConfig } from '../next/image/config'
|
|
19
|
+
import { isImageOptimizerRequest, serveImageOptimizer } from '../next/image/optimizer'
|
|
20
|
+
import { manifestLocalPatterns } from '../next/image/patterns'
|
|
21
|
+
import { getDocumentScriptExtensions, setDocumentScriptExtensions } from '../../render/hooks'
|
|
22
|
+
import { setWorkUnitRoute } from '../../request/context'
|
|
23
23
|
|
|
24
24
|
export function registerImageExtensions(config: ResolvedConfig): void {
|
|
25
|
-
globalThis.__PNEXT_IMAGE_CONFIG__ = getImagesConfig()
|
|
26
|
-
registerRequestInterceptors(imageOptimizerInterceptor)
|
|
27
|
-
registerBuildSteps(writeImagesManifestStep)
|
|
25
|
+
globalThis.__PNEXT_IMAGE_CONFIG__ = getImagesConfig()
|
|
26
|
+
registerRequestInterceptors(imageOptimizerInterceptor)
|
|
27
|
+
registerBuildSteps(writeImagesManifestStep)
|
|
28
28
|
registerBuildCompleteHooks(async ctx => {
|
|
29
|
-
if (nextCompatEnabled(ctx.config)) await mirrorStaticMedia(ctx.config)
|
|
30
|
-
})
|
|
29
|
+
if (nextCompatEnabled(ctx.config)) await mirrorStaticMedia(ctx.config)
|
|
30
|
+
})
|
|
31
31
|
|
|
32
32
|
if (nextCompatEnabled(config)) {
|
|
33
|
-
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
33
|
+
const previousHeadTags = getDocumentScriptExtensions().documentHeadTags
|
|
34
34
|
setDocumentScriptExtensions({
|
|
35
35
|
documentHeadTags: (cfg, ctx) =>
|
|
36
36
|
`${previousHeadTags?.(cfg, ctx) ?? ''}${PLACEHOLDER_SCRIPT_TAG}`,
|
|
37
|
-
})
|
|
37
|
+
})
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -52,36 +52,36 @@ export function registerImageExtensions(config: ResolvedConfig): void {
|
|
|
52
52
|
// INSIDE the post-decode callback, not at bind time. A hydrating route's ClientImage vdom carries no
|
|
53
53
|
// `data-nimg-ph`, so preact's hydration strips the SSR attribute; by the time this callback fires the
|
|
54
54
|
// attribute is gone on any hydrated image, the check bails, and ClientImage stays the sole owner.
|
|
55
|
-
const PLACEHOLDER_SCRIPT_TAG = `<script>(function(){try{function b(){var l=document.querySelectorAll("img[data-nimg-ph]");for(var i=0;i<l.length;i++){(function(img){if(img.closest("[data-pnext-client]"))return;var done=false;function r(){if(done)return;done=true;("decode"in img?img.decode():Promise.resolve()).catch(function(){}).then(function(){var t=img.getAttribute("data-nimg-ph");if(t==null||!img.isConnected)return;img.style.cssText=t;img.removeAttribute("data-nimg-ph")})}if(img.complete&&img.naturalWidth>0)r();else{img.addEventListener("load",r);img.addEventListener("error",r)}})(l[i])}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",b);else b()}catch(e){}})();</script
|
|
55
|
+
const PLACEHOLDER_SCRIPT_TAG = `<script>(function(){try{function b(){var l=document.querySelectorAll("img[data-nimg-ph]");for(var i=0;i<l.length;i++){(function(img){if(img.closest("[data-pnext-client]"))return;var done=false;function r(){if(done)return;done=true;("decode"in img?img.decode():Promise.resolve()).catch(function(){}).then(function(){var t=img.getAttribute("data-nimg-ph");if(t==null||!img.isConnected)return;img.style.cssText=t;img.removeAttribute("data-nimg-ph")})}if(img.complete&&img.naturalWidth>0)r();else{img.addEventListener("load",r);img.addEventListener("error",r)}})(l[i])}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",b);else b()}catch(e){}})();</script>`
|
|
56
56
|
|
|
57
57
|
declare global {
|
|
58
|
-
var __PNEXT_IMAGE_CONFIG__: ResolvedImagesConfig | undefined
|
|
58
|
+
var __PNEXT_IMAGE_CONFIG__: ResolvedImagesConfig | undefined
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
const imageOptimizerInterceptor: RequestInterceptor = async (request, ctx) => {
|
|
62
|
-
const config = ctx.config
|
|
63
|
-
if (!nextCompatEnabled(config)) return undefined
|
|
64
|
-
const url = new URL(request.url)
|
|
65
|
-
const images = getImagesConfig()
|
|
66
|
-
if (!isImageOptimizerRequest(url, images)) return undefined
|
|
67
|
-
if (request.method !== 'GET' && request.method !== 'HEAD') return undefined
|
|
62
|
+
const config = ctx.config
|
|
63
|
+
if (!nextCompatEnabled(config)) return undefined
|
|
64
|
+
const url = new URL(request.url)
|
|
65
|
+
const images = getImagesConfig()
|
|
66
|
+
if (!isImageOptimizerRequest(url, images)) return undefined
|
|
67
|
+
if (request.method !== 'GET' && request.method !== 'HEAD') return undefined
|
|
68
68
|
// Optimizer responses own their headers outright — classify as a static
|
|
69
69
|
// asset so the app-router finalizers (Vary token merge, x-nextjs-* stamps)
|
|
70
70
|
// leave them untouched. Next serves /_next/image outside the router too.
|
|
71
|
-
setWorkUnitRoute('static-asset')
|
|
72
|
-
return serveImageOptimizer(request, config)
|
|
73
|
-
}
|
|
71
|
+
setWorkUnitRoute('static-asset')
|
|
72
|
+
return serveImageOptimizer(request, config)
|
|
73
|
+
}
|
|
74
74
|
|
|
75
75
|
// Next-compatible images-manifest.json (.next/): the qualities/localpatterns
|
|
76
76
|
// e2e suites read it in production to assert the resolved images config.
|
|
77
77
|
async function writeImagesManifestStep(ctx: BuildStepContext): Promise<void> {
|
|
78
|
-
const config = ctx.config
|
|
79
|
-
if (!nextCompatEnabled(config)) return
|
|
80
|
-
const images = getImagesConfig()
|
|
78
|
+
const config = ctx.config
|
|
79
|
+
if (!nextCompatEnabled(config)) return
|
|
80
|
+
const images = getImagesConfig()
|
|
81
81
|
|
|
82
82
|
// normalizeLocalPatterns already appends the internal media patterns when
|
|
83
83
|
// localPatterns is configured, so manifest and runtime share one source.
|
|
84
|
-
const localPatterns = manifestLocalPatterns(images.localPatterns)
|
|
84
|
+
const localPatterns = manifestLocalPatterns(images.localPatterns)
|
|
85
85
|
|
|
86
86
|
const manifest = {
|
|
87
87
|
version: 1,
|
|
@@ -108,11 +108,11 @@ async function writeImagesManifestStep(ctx: BuildStepContext): Promise<void> {
|
|
|
108
108
|
unoptimized: images.unoptimized,
|
|
109
109
|
customCacheHandler: images.customCacheHandler,
|
|
110
110
|
},
|
|
111
|
-
}
|
|
111
|
+
}
|
|
112
112
|
|
|
113
|
-
const outDir = path.join(config.root, '.next')
|
|
114
|
-
await mkdir(outDir, { recursive: true })
|
|
115
|
-
await writeFile(path.join(outDir, 'images-manifest.json'), JSON.stringify(manifest, null, 2))
|
|
113
|
+
const outDir = path.join(config.root, '.next')
|
|
114
|
+
await mkdir(outDir, { recursive: true })
|
|
115
|
+
await writeFile(path.join(outDir, 'images-manifest.json'), JSON.stringify(manifest, null, 2))
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
// Tooling (and Next's e2e suites) discover fingerprinted static-import images
|
|
@@ -120,12 +120,12 @@ async function writeImagesManifestStep(ctx: BuildStepContext): Promise<void> {
|
|
|
120
120
|
// outPath/public/_next/static/media. Mirror them into .next so both layouts
|
|
121
121
|
// hold the same files.
|
|
122
122
|
async function mirrorStaticMedia(config: ResolvedConfig): Promise<void> {
|
|
123
|
-
const { cp } = await import('node:fs/promises')
|
|
123
|
+
const { cp } = await import('node:fs/promises')
|
|
124
124
|
for (const dir of ['media', 'immutable/media']) {
|
|
125
|
-
const source = path.join(config.outPath, 'public', '_next', 'static', dir)
|
|
126
|
-
const target = path.join(config.root, '.next', 'static', dir)
|
|
125
|
+
const source = path.join(config.outPath, 'public', '_next', 'static', dir)
|
|
126
|
+
const target = path.join(config.root, '.next', 'static', dir)
|
|
127
127
|
try {
|
|
128
|
-
await cp(source, target, { recursive: true, force: true })
|
|
128
|
+
await cp(source, target, { recursive: true, force: true })
|
|
129
129
|
} catch {
|
|
130
130
|
// no static media emitted for this build
|
|
131
131
|
}
|