@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
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto'
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
2
|
|
|
3
|
-
import { isIdentifier, uniqueIdentifier } from '../../utils/
|
|
3
|
+
import { isIdentifier, uniqueIdentifier } from '../../utils/code'
|
|
4
4
|
|
|
5
5
|
export function rewriteStyledJsxSource(source: string, file: string): string {
|
|
6
|
-
if (!source.includes('<style') || !/\bjsx\b/.test(source)) return source
|
|
6
|
+
if (!source.includes('<style') || !/\bjsx\b/.test(source)) return source
|
|
7
7
|
|
|
8
|
-
let next = source
|
|
8
|
+
let next = source
|
|
9
9
|
for (const match of source.matchAll(
|
|
10
10
|
/import\s+([A-Za-z_$][\w$]*)\s+from\s+['"]styled-jsx\/css['"]\s*;?/g,
|
|
11
11
|
)) {
|
|
12
|
-
const [statement, binding] = match
|
|
13
|
-
if (!statement || !binding || !isIdentifier(binding)) continue
|
|
14
|
-
next = next.replace(statement, '')
|
|
12
|
+
const [statement, binding] = match
|
|
13
|
+
if (!statement || !binding || !isIdentifier(binding)) continue
|
|
14
|
+
next = next.replace(statement, '')
|
|
15
15
|
next = next.replace(
|
|
16
16
|
new RegExp(`\\b${binding}\`((?:\\\\.|[^\`])*)\``, 'g'),
|
|
17
17
|
(_statement, css: string) => `\`${minifyStaticCss(css)}\``,
|
|
18
|
-
)
|
|
18
|
+
)
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const component = uniqueIdentifier(next, '__PNextStyledJsx')
|
|
22
|
-
let index = 0
|
|
21
|
+
const component = uniqueIdentifier(next, '__PNextStyledJsx')
|
|
22
|
+
let index = 0
|
|
23
23
|
next = next.replace(
|
|
24
24
|
/<style\s+(?:global\s+)?jsx\s*>\s*\{([\s\S]*?)\}\s*<\/style>/g,
|
|
25
25
|
(_statement, css: string) => {
|
|
26
|
-
const id = createHash('sha256').update(`${file}:${index++}`).digest('hex').slice(0, 12)
|
|
27
|
-
return `<${component} id=${JSON.stringify(id)}>{${minifyTemplate(css)}}</${component}
|
|
26
|
+
const id = createHash('sha256').update(`${file}:${index++}`).digest('hex').slice(0, 12)
|
|
27
|
+
return `<${component} id=${JSON.stringify(id)}>{${minifyTemplate(css)}}</${component}>`
|
|
28
28
|
},
|
|
29
|
-
)
|
|
30
|
-
if (index === 0) return source
|
|
29
|
+
)
|
|
30
|
+
if (index === 0) return source
|
|
31
31
|
|
|
32
|
-
const directives = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? ''
|
|
33
|
-
return `${directives}import { style as ${component} } from 'styled-jsx';\n${next.slice(directives.length)}
|
|
32
|
+
const directives = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? ''
|
|
33
|
+
return `${directives}import { style as ${component} } from 'styled-jsx';\n${next.slice(directives.length)}`
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
function minifyTemplate(expression: string): string {
|
|
37
|
-
const match = /^\s*`([\s\S]*)`\s*$/.exec(expression)
|
|
38
|
-
if (!match?.[1] || match[1].includes('${')) return expression
|
|
39
|
-
return `\`${minifyStaticCss(match[1])}
|
|
37
|
+
const match = /^\s*`([\s\S]*)`\s*$/.exec(expression)
|
|
38
|
+
if (!match?.[1] || match[1].includes('${')) return expression
|
|
39
|
+
return `\`${minifyStaticCss(match[1])}\``
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
function minifyStaticCss(css: string): string {
|
|
43
|
-
if (css.includes('${')) return css
|
|
43
|
+
if (css.includes('${')) return css
|
|
44
44
|
return css
|
|
45
45
|
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
46
46
|
.replace(/\s+/g, ' ')
|
|
47
47
|
.replace(/\s*([{}:;,])\s*/g, '$1')
|
|
48
|
-
.trim()
|
|
48
|
+
.trim()
|
|
49
49
|
}
|
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import { reinstallCustomCacheHandlerForEdge } from './cache/custom-handler'
|
|
1
|
+
import { reinstallCustomCacheHandlerForEdge } from './cache/custom-handler'
|
|
2
2
|
|
|
3
|
-
type GlobalDescriptor = PropertyDescriptor | undefined
|
|
3
|
+
type GlobalDescriptor = PropertyDescriptor | undefined
|
|
4
4
|
|
|
5
5
|
export function withEdgeRuntime<T>(callback: () => T): T {
|
|
6
6
|
const globalObject = globalThis as typeof globalThis & {
|
|
7
|
-
EdgeRuntime?: string
|
|
8
|
-
process?: NodeJS.Process
|
|
9
|
-
}
|
|
10
|
-
const previousEdgeRuntime = Object.getOwnPropertyDescriptor(globalObject, 'EdgeRuntime')
|
|
11
|
-
const previousProcess = Object.getOwnPropertyDescriptor(globalObject, 'process')
|
|
12
|
-
const currentProcess = globalObject.process as NodeJS.Process | undefined
|
|
7
|
+
EdgeRuntime?: string
|
|
8
|
+
process?: NodeJS.Process
|
|
9
|
+
}
|
|
10
|
+
const previousEdgeRuntime = Object.getOwnPropertyDescriptor(globalObject, 'EdgeRuntime')
|
|
11
|
+
const previousProcess = Object.getOwnPropertyDescriptor(globalObject, 'process')
|
|
12
|
+
const currentProcess = globalObject.process as NodeJS.Process | undefined
|
|
13
13
|
const edgeProcess = currentProcess
|
|
14
14
|
? new Proxy(currentProcess, {
|
|
15
15
|
get(target, property, receiver) {
|
|
16
|
-
if (property === 'emit') return undefined
|
|
16
|
+
if (property === 'emit') return undefined
|
|
17
17
|
// Next's Edge runtime exposes only a minimal `process` polyfill —
|
|
18
18
|
// notably no Node `version`/`versions`. Code that branches on
|
|
19
19
|
// `process.version` (to detect Node vs Edge) must see it absent.
|
|
20
|
-
if (property === 'version' || property === 'versions') return undefined
|
|
21
|
-
const value: unknown = Reflect.get(target, property, receiver)
|
|
22
|
-
return typeof value === 'function' ? (value as () => unknown).bind(target) : value
|
|
20
|
+
if (property === 'version' || property === 'versions') return undefined
|
|
21
|
+
const value: unknown = Reflect.get(target, property, receiver)
|
|
22
|
+
return typeof value === 'function' ? (value as () => unknown).bind(target) : value
|
|
23
23
|
},
|
|
24
24
|
})
|
|
25
|
-
: undefined
|
|
25
|
+
: undefined
|
|
26
26
|
|
|
27
27
|
Object.defineProperty(globalObject, 'EdgeRuntime', {
|
|
28
28
|
configurable: true,
|
|
29
29
|
enumerable: false,
|
|
30
30
|
writable: true,
|
|
31
31
|
value: 'edge-runtime',
|
|
32
|
-
})
|
|
32
|
+
})
|
|
33
33
|
Object.defineProperty(globalObject, 'process', {
|
|
34
34
|
configurable: true,
|
|
35
35
|
enumerable: false,
|
|
36
36
|
writable: true,
|
|
37
37
|
value: edgeProcess ?? { env: {} },
|
|
38
|
-
})
|
|
38
|
+
})
|
|
39
39
|
|
|
40
40
|
try {
|
|
41
|
-
reinstallCustomCacheHandlerForEdge()
|
|
42
|
-
const result = callback()
|
|
41
|
+
reinstallCustomCacheHandlerForEdge()
|
|
42
|
+
const result = callback()
|
|
43
43
|
if (isThenable(result)) {
|
|
44
44
|
return Promise.resolve(result).finally(() =>
|
|
45
45
|
restore(previousEdgeRuntime, previousProcess),
|
|
46
|
-
) as T
|
|
46
|
+
) as T
|
|
47
47
|
}
|
|
48
|
-
restore(previousEdgeRuntime, previousProcess)
|
|
49
|
-
return result
|
|
48
|
+
restore(previousEdgeRuntime, previousProcess)
|
|
49
|
+
return result
|
|
50
50
|
} catch (error) {
|
|
51
|
-
restore(previousEdgeRuntime, previousProcess)
|
|
52
|
-
throw error
|
|
51
|
+
restore(previousEdgeRuntime, previousProcess)
|
|
52
|
+
throw error
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function restore(edgeRuntime: GlobalDescriptor, process: GlobalDescriptor): void {
|
|
57
|
-
restoreProperty('EdgeRuntime', edgeRuntime)
|
|
58
|
-
restoreProperty('process', process)
|
|
57
|
+
restoreProperty('EdgeRuntime', edgeRuntime)
|
|
58
|
+
restoreProperty('process', process)
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
function restoreProperty(name: 'EdgeRuntime' | 'process', descriptor: GlobalDescriptor): void {
|
|
62
62
|
if (descriptor) {
|
|
63
|
-
Object.defineProperty(globalThis, name, descriptor)
|
|
63
|
+
Object.defineProperty(globalThis, name, descriptor)
|
|
64
64
|
} else {
|
|
65
|
-
delete (globalThis as Record<string, unknown>)[name]
|
|
65
|
+
delete (globalThis as Record<string, unknown>)[name]
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
function isThenable<T>(value: T): value is T & PromiseLike<unknown> {
|
|
70
|
-
return typeof (value as { then?: unknown } | null | undefined)?.then === 'function'
|
|
70
|
+
return typeof (value as { then?: unknown } | null | undefined)?.then === 'function'
|
|
71
71
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs'
|
|
2
|
-
import { mkdir, writeFile } from 'node:fs/promises'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { pathToFileHref } from '../../config'
|
|
5
|
-
import type { ResolvedConfig } from '../../config'
|
|
6
|
-
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
7
|
-
import { getNextConfig } from '../next/config-loader'
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { pathToFileHref } from '../../config'
|
|
5
|
+
import type { ResolvedConfig } from '../../config'
|
|
6
|
+
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
7
|
+
import { getNextConfig } from '../next/config-loader'
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* `adapterPath` support (Next's `onBuildComplete` hook).
|
|
@@ -15,49 +15,49 @@ import { getNextConfig } from '../next/config-loader';
|
|
|
15
15
|
* artifacts. pnext reports the same classification off its build manifest.
|
|
16
16
|
*/
|
|
17
17
|
interface SharedRouteFields {
|
|
18
|
-
id: string
|
|
19
|
-
filePath: string
|
|
20
|
-
pathname: string
|
|
21
|
-
sourcePage: string
|
|
22
|
-
runtime: 'nodejs' | 'edge'
|
|
23
|
-
assets: Record<string, string
|
|
24
|
-
assetsHashes: Record<string, string
|
|
25
|
-
config: { maxDuration?: number }
|
|
26
|
-
type: string
|
|
18
|
+
id: string
|
|
19
|
+
filePath: string
|
|
20
|
+
pathname: string
|
|
21
|
+
sourcePage: string
|
|
22
|
+
runtime: 'nodejs' | 'edge'
|
|
23
|
+
assets: Record<string, string>
|
|
24
|
+
assetsHashes: Record<string, string>
|
|
25
|
+
config: { maxDuration?: number }
|
|
26
|
+
type: string
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
interface AdapterOutputs {
|
|
30
|
-
pages: SharedRouteFields[]
|
|
31
|
-
appPages: SharedRouteFields[]
|
|
32
|
-
pagesApi: SharedRouteFields[]
|
|
33
|
-
appRoutes: SharedRouteFields[]
|
|
34
|
-
prerenders: { id: string; pathname: string; type: string; parentOutputId: string }[]
|
|
35
|
-
staticFiles: { id: string; filePath: string; pathname: string; type: string }[]
|
|
30
|
+
pages: SharedRouteFields[]
|
|
31
|
+
appPages: SharedRouteFields[]
|
|
32
|
+
pagesApi: SharedRouteFields[]
|
|
33
|
+
appRoutes: SharedRouteFields[]
|
|
34
|
+
prerenders: { id: string; pathname: string; type: string; parentOutputId: string }[]
|
|
35
|
+
staticFiles: { id: string; filePath: string; pathname: string; type: string }[]
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/** One entry of `routing.*` — Next's routes-manifest rewrite shape. */
|
|
39
39
|
interface AdapterRoute {
|
|
40
|
-
source?: string
|
|
41
|
-
sourceRegex: string
|
|
42
|
-
destination?: string
|
|
40
|
+
source?: string
|
|
41
|
+
sourceRegex: string
|
|
42
|
+
destination?: string
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/** Adapter module shape — only the hook pnext can honour is typed. */
|
|
46
46
|
interface NextAdapter {
|
|
47
|
-
name?: string
|
|
48
|
-
onBuildComplete?: (ctx: unknown) => unknown
|
|
47
|
+
name?: string
|
|
48
|
+
onBuildComplete?: (ctx: unknown) => unknown
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/** The URL pathname a built `public/` file is served at. */
|
|
52
52
|
function staticPathname(relative: string): string {
|
|
53
|
-
const url = `/${relative.replace(/\\/g, '/')}
|
|
54
|
-
if (url.endsWith('/index.html')) return url.slice(0, -'index.html'.length) || '/'
|
|
55
|
-
return url.endsWith('.html') ? url.slice(0, -'.html'.length) : url
|
|
53
|
+
const url = `/${relative.replace(/\\/g, '/')}`
|
|
54
|
+
if (url.endsWith('/index.html')) return url.slice(0, -'index.html'.length) || '/'
|
|
55
|
+
return url.endsWith('.html') ? url.slice(0, -'.html'.length) : url
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/** Where the per-route server entry for `route` is written. */
|
|
59
59
|
function serverEntryPath(config: ResolvedConfig, route: RouteManifestEntry): string {
|
|
60
|
-
return path.join(config.outPath, 'server', `${route.id}.js`)
|
|
60
|
+
return path.join(config.outPath, 'server', `${route.id}.js`)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/**
|
|
@@ -66,13 +66,10 @@ function serverEntryPath(config: ResolvedConfig, route: RouteManifestEntry): str
|
|
|
66
66
|
* there is no per-route bundle to point at - so the entry is a descriptor module naming the route and
|
|
67
67
|
* the source module the server renders for it. Only written when an adapter is configured.
|
|
68
68
|
*/
|
|
69
|
-
async function writeServerEntries(
|
|
70
|
-
config:
|
|
71
|
-
manifest: BuildManifest,
|
|
72
|
-
): Promise<void> {
|
|
73
|
-
await mkdir(path.join(config.outPath, 'server'), { recursive: true });
|
|
69
|
+
async function writeServerEntries(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
|
|
70
|
+
await mkdir(path.join(config.outPath, 'server'), { recursive: true })
|
|
74
71
|
await Promise.all(
|
|
75
|
-
manifest.routes.map(
|
|
72
|
+
manifest.routes.map(route =>
|
|
76
73
|
writeFile(
|
|
77
74
|
serverEntryPath(config, route),
|
|
78
75
|
[
|
|
@@ -89,11 +86,11 @@ async function writeServerEntries(
|
|
|
89
86
|
].join('\n'),
|
|
90
87
|
),
|
|
91
88
|
),
|
|
92
|
-
)
|
|
89
|
+
)
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
function sourcePage(config: ResolvedConfig, route: RouteManifestEntry): string {
|
|
96
|
-
return `/${path.relative(config.root, route.file).replace(/\\/g, '/')}
|
|
93
|
+
return `/${path.relative(config.root, route.file).replace(/\\/g, '/')}`
|
|
97
94
|
}
|
|
98
95
|
|
|
99
96
|
function sharedFields(
|
|
@@ -112,7 +109,7 @@ function sharedFields(
|
|
|
112
109
|
config: {
|
|
113
110
|
...(route.maxDuration !== undefined ? { maxDuration: route.maxDuration } : {}),
|
|
114
111
|
},
|
|
115
|
-
}
|
|
112
|
+
}
|
|
116
113
|
}
|
|
117
114
|
|
|
118
115
|
/**
|
|
@@ -129,36 +126,36 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
|
|
|
129
126
|
appRoutes: [],
|
|
130
127
|
prerenders: [],
|
|
131
128
|
staticFiles: [],
|
|
132
|
-
}
|
|
133
|
-
const prerenderedRoutes = new Set<string>()
|
|
129
|
+
}
|
|
130
|
+
const prerenderedRoutes = new Set<string>()
|
|
134
131
|
|
|
135
132
|
for (const [relative, metadata] of Object.entries(manifest.staticFiles ?? {})) {
|
|
136
|
-
const filePath = path.join(config.outPath, 'public', relative)
|
|
133
|
+
const filePath = path.join(config.outPath, 'public', relative)
|
|
137
134
|
// The manifest also records prerenders that produced no body on disk
|
|
138
135
|
// (an empty response, `_not-found` / `_global-error`). Those are not
|
|
139
136
|
// deployable artifacts: leave them out, and leave the owning route as a
|
|
140
137
|
// server entrypoint rather than treating it as prerendered.
|
|
141
|
-
if (!existsSync(filePath)) continue
|
|
142
|
-
if (metadata.routeId) prerenderedRoutes.add(metadata.routeId)
|
|
143
|
-
const entry = { id: relative, filePath, pathname: staticPathname(relative) }
|
|
138
|
+
if (!existsSync(filePath)) continue
|
|
139
|
+
if (metadata.routeId) prerenderedRoutes.add(metadata.routeId)
|
|
140
|
+
const entry = { id: relative, filePath, pathname: staticPathname(relative) }
|
|
144
141
|
if (metadata.revalidateSeconds !== undefined) {
|
|
145
142
|
outputs.prerenders.push({
|
|
146
143
|
...entry,
|
|
147
144
|
type: 'PRERENDER',
|
|
148
145
|
parentOutputId: metadata.routeId ?? relative,
|
|
149
|
-
})
|
|
146
|
+
})
|
|
150
147
|
} else {
|
|
151
|
-
outputs.staticFiles.push({ ...entry, type: 'STATIC_FILE' })
|
|
148
|
+
outputs.staticFiles.push({ ...entry, type: 'STATIC_FILE' })
|
|
152
149
|
}
|
|
153
150
|
}
|
|
154
151
|
|
|
155
152
|
for (const route of manifest.routes) {
|
|
156
|
-
if (prerenderedRoutes.has(route.id) && route.mode === 'static' && !route.ppr) continue
|
|
157
|
-
const fields = sharedFields(config, route)
|
|
153
|
+
if (prerenderedRoutes.has(route.id) && route.mode === 'static' && !route.ppr) continue
|
|
154
|
+
const fields = sharedFields(config, route)
|
|
158
155
|
if (route.kind === 'handler') {
|
|
159
|
-
outputs.appRoutes.push({ ...fields, type: 'APP_ROUTE' })
|
|
156
|
+
outputs.appRoutes.push({ ...fields, type: 'APP_ROUTE' })
|
|
160
157
|
} else {
|
|
161
|
-
outputs.appPages.push({ ...fields, type: 'APP_PAGE' })
|
|
158
|
+
outputs.appPages.push({ ...fields, type: 'APP_PAGE' })
|
|
162
159
|
// Every app page is reachable both as HTML and as its RSC payload; Next
|
|
163
160
|
// reports the pair as two outputs sharing one entrypoint.
|
|
164
161
|
outputs.appPages.push({
|
|
@@ -166,11 +163,11 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
|
|
|
166
163
|
type: 'APP_PAGE',
|
|
167
164
|
id: `${route.id}.rsc`,
|
|
168
165
|
pathname: `${fields.pathname}.rsc`,
|
|
169
|
-
})
|
|
166
|
+
})
|
|
170
167
|
}
|
|
171
168
|
}
|
|
172
169
|
|
|
173
|
-
return outputs
|
|
170
|
+
return outputs
|
|
174
171
|
}
|
|
175
172
|
|
|
176
173
|
/**
|
|
@@ -178,12 +175,12 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
|
|
|
178
175
|
* the `namedRegex` form Next's routes-manifest uses (`$name` in destinations).
|
|
179
176
|
*/
|
|
180
177
|
function namedSourceRegex(route: RouteManifestEntry): string {
|
|
181
|
-
let index = 0
|
|
178
|
+
let index = 0
|
|
182
179
|
const named = route.pattern.replace(/\((\[\^\/\]\+|\.\*)\)/g, (whole, body: string) => {
|
|
183
|
-
const param = route.params[index++]
|
|
184
|
-
return param ? `(?<${param.replace(/\W/g, '')}>${body})` : whole
|
|
185
|
-
})
|
|
186
|
-
return `^${named}(?:/)
|
|
180
|
+
const param = route.params[index++]
|
|
181
|
+
return param ? `(?<${param.replace(/\W/g, '')}>${body})` : whole
|
|
182
|
+
})
|
|
183
|
+
return `^${named}(?:/)?$`
|
|
187
184
|
}
|
|
188
185
|
|
|
189
186
|
/**
|
|
@@ -192,10 +189,10 @@ function namedSourceRegex(route: RouteManifestEntry): string {
|
|
|
192
189
|
* emits them.
|
|
193
190
|
*/
|
|
194
191
|
function collectDynamicRoutes(manifest: BuildManifest): AdapterRoute[] {
|
|
195
|
-
const routes: AdapterRoute[] = []
|
|
192
|
+
const routes: AdapterRoute[] = []
|
|
196
193
|
for (const route of manifest.routes) {
|
|
197
|
-
if (route.params.length === 0) continue
|
|
198
|
-
const sourceRegex = namedSourceRegex(route)
|
|
194
|
+
if (route.params.length === 0) continue
|
|
195
|
+
const sourceRegex = namedSourceRegex(route)
|
|
199
196
|
if (route.kind === 'page') {
|
|
200
197
|
routes.push({
|
|
201
198
|
source: `${route.route}.rsc`,
|
|
@@ -204,11 +201,11 @@ function collectDynamicRoutes(manifest: BuildManifest): AdapterRoute[] {
|
|
|
204
201
|
String.raw`(?<rscSuffix>\.rsc|\.segments/.+\.segment\.rsc)(?:/)?$`,
|
|
205
202
|
),
|
|
206
203
|
destination: `${route.route}$rscSuffix`,
|
|
207
|
-
})
|
|
204
|
+
})
|
|
208
205
|
}
|
|
209
|
-
routes.push({ source: route.route, sourceRegex, destination: route.route })
|
|
206
|
+
routes.push({ source: route.route, sourceRegex, destination: route.route })
|
|
210
207
|
}
|
|
211
|
-
return routes
|
|
208
|
+
return routes
|
|
212
209
|
}
|
|
213
210
|
|
|
214
211
|
/**
|
|
@@ -221,21 +218,21 @@ export async function runBuildCompleteAdapter(
|
|
|
221
218
|
config: ResolvedConfig,
|
|
222
219
|
manifest: BuildManifest,
|
|
223
220
|
): Promise<void> {
|
|
224
|
-
const configured = getNextConfig().adapterPath
|
|
221
|
+
const configured = getNextConfig().adapterPath
|
|
225
222
|
const adapterPath =
|
|
226
223
|
// eslint-disable-next-line turbo/no-undeclared-env-vars -- Next's own env override
|
|
227
|
-
process.env.NEXT_ADAPTER_PATH || (typeof configured === 'string' ? configured : undefined)
|
|
228
|
-
if (!adapterPath) return
|
|
224
|
+
process.env.NEXT_ADAPTER_PATH || (typeof configured === 'string' ? configured : undefined)
|
|
225
|
+
if (!adapterPath) return
|
|
229
226
|
const resolved = path.isAbsolute(adapterPath)
|
|
230
227
|
? adapterPath
|
|
231
|
-
: path.resolve(config.root, adapterPath)
|
|
228
|
+
: path.resolve(config.root, adapterPath)
|
|
232
229
|
const module = (await import(pathToFileHref(resolved))) as {
|
|
233
|
-
default?: NextAdapter
|
|
234
|
-
} & NextAdapter
|
|
235
|
-
const adapter = module.default ?? module
|
|
236
|
-
if (typeof adapter?.onBuildComplete !== 'function') return
|
|
230
|
+
default?: NextAdapter
|
|
231
|
+
} & NextAdapter
|
|
232
|
+
const adapter = module.default ?? module
|
|
233
|
+
if (typeof adapter?.onBuildComplete !== 'function') return
|
|
237
234
|
|
|
238
|
-
await writeServerEntries(config, manifest)
|
|
235
|
+
await writeServerEntries(config, manifest)
|
|
239
236
|
|
|
240
237
|
await adapter.onBuildComplete({
|
|
241
238
|
routing: {
|
|
@@ -253,5 +250,5 @@ export async function runBuildCompleteAdapter(
|
|
|
253
250
|
projectDir: config.root,
|
|
254
251
|
repoRoot: config.root,
|
|
255
252
|
distDir: config.outPath,
|
|
256
|
-
})
|
|
253
|
+
})
|
|
257
254
|
}
|
|
@@ -15,15 +15,15 @@
|
|
|
15
15
|
// rewrite of the page also cover the data request. A host-level REDIRECT typically does not, so - like
|
|
16
16
|
// Next - a HEAD probe resolves the page's final URL first.
|
|
17
17
|
|
|
18
|
-
import { setExportDocumentFetcher } from '../../
|
|
18
|
+
import { setExportDocumentFetcher } from '../../client/router/policies'
|
|
19
19
|
|
|
20
20
|
/** The exported segment file carrying a route's complete document. */
|
|
21
|
-
const SEGMENT_FILE = '__next._full.txt'
|
|
21
|
+
const SEGMENT_FILE = '__next._full.txt'
|
|
22
22
|
|
|
23
23
|
/** A document read out of the export tree, with the route URL it belongs to. */
|
|
24
24
|
interface ExportedDocument {
|
|
25
|
-
html: string
|
|
26
|
-
finalUrl: string
|
|
25
|
+
html: string
|
|
26
|
+
finalUrl: string
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// Registered at MODULE scope rather than from installNavCompat(): the router
|
|
@@ -31,31 +31,29 @@ interface ExportedDocument {
|
|
|
31
31
|
// install sequence, and those would otherwise fall through to a server that
|
|
32
32
|
// isn't there. Module initialization runs before any of it, and the marker is
|
|
33
33
|
// an inline script in <head>, so it is already set by the time this evaluates.
|
|
34
|
-
if (outputExportMode()) setExportDocumentFetcher(fetchExportedDocument)
|
|
34
|
+
if (outputExportMode()) setExportDocumentFetcher(fetchExportedDocument)
|
|
35
35
|
|
|
36
36
|
/** Whether the running document was served out of an export tree. */
|
|
37
37
|
function outputExportMode(): boolean {
|
|
38
38
|
return (
|
|
39
39
|
(process.browser || typeof window !== 'undefined') &&
|
|
40
40
|
(window as { __PNEXT_OUTPUT_EXPORT__?: boolean }).__PNEXT_OUTPUT_EXPORT__ === true
|
|
41
|
-
)
|
|
41
|
+
)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/** `/another` -> `/another.txt`; `/another/` -> `/another/index.txt`. */
|
|
45
45
|
function documentUrl(url: URL): URL {
|
|
46
|
-
const target = new URL(url.href)
|
|
47
|
-
target.pathname += target.pathname.endsWith('/') ? 'index.txt' : '.txt'
|
|
48
|
-
return target
|
|
46
|
+
const target = new URL(url.href)
|
|
47
|
+
target.pathname += target.pathname.endsWith('/') ? 'index.txt' : '.txt'
|
|
48
|
+
return target
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/** `/another` (or `/another/`) -> `/another/__next._full.txt`. */
|
|
52
52
|
function segmentUrl(url: URL): URL {
|
|
53
|
-
const target = new URL(url.href)
|
|
54
|
-
const directory = target.pathname.endsWith('/')
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
target.pathname = `${directory}/${SEGMENT_FILE}`;
|
|
58
|
-
return target;
|
|
53
|
+
const target = new URL(url.href)
|
|
54
|
+
const directory = target.pathname.endsWith('/') ? target.pathname.slice(0, -1) : target.pathname
|
|
55
|
+
target.pathname = `${directory}/${SEGMENT_FILE}`
|
|
56
|
+
return target
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
/**
|
|
@@ -68,30 +66,30 @@ async function fetchExportedDocument(
|
|
|
68
66
|
init: RequestInit,
|
|
69
67
|
prefetch: boolean,
|
|
70
68
|
): Promise<ExportedDocument | null> {
|
|
71
|
-
const url = new URL(href, location.href)
|
|
72
|
-
let pageUrl = url
|
|
69
|
+
const url = new URL(href, location.href)
|
|
70
|
+
let pageUrl = url
|
|
73
71
|
if (prefetch) {
|
|
74
72
|
// Resolve host-level redirects on the PAGE path before asking for a file
|
|
75
73
|
// beside it: a host that redirects `/old` to `/new` has no reason to also
|
|
76
74
|
// redirect `/old/__next._full.txt`, which the exporter never wrote.
|
|
77
75
|
const probe = await fetch(url.href, { method: 'HEAD', credentials: 'same-origin' }).catch(
|
|
78
76
|
() => null,
|
|
79
|
-
)
|
|
77
|
+
)
|
|
80
78
|
// `Response#ok` is false for a followed 3xx chain, so test the range.
|
|
81
|
-
if (!probe || probe.status < 200 || probe.status >= 400) return null
|
|
82
|
-
if (probe.redirected) pageUrl = new URL(probe.url)
|
|
79
|
+
if (!probe || probe.status < 200 || probe.status >= 400) return null
|
|
80
|
+
if (probe.redirected) pageUrl = new URL(probe.url)
|
|
83
81
|
}
|
|
84
|
-
const target = prefetch ? segmentUrl(pageUrl) : documentUrl(pageUrl)
|
|
85
|
-
const response = await fetch(target.href, init)
|
|
86
|
-
if (!response.ok) return null
|
|
87
|
-
const html = await response.text()
|
|
82
|
+
const target = prefetch ? segmentUrl(pageUrl) : documentUrl(pageUrl)
|
|
83
|
+
const response = await fetch(target.href, init)
|
|
84
|
+
if (!response.ok) return null
|
|
85
|
+
const html = await response.text()
|
|
88
86
|
// Static hosts answer an unknown path with a catch-all document or a
|
|
89
87
|
// directory listing rather than a 404; neither is a pnext document.
|
|
90
|
-
if (!html.includes('<html')) return null
|
|
88
|
+
if (!html.includes('<html')) return null
|
|
91
89
|
return {
|
|
92
90
|
html,
|
|
93
91
|
finalUrl: prefetch ? pageUrl.href : navigatedUrl(response, url),
|
|
94
|
-
}
|
|
92
|
+
}
|
|
95
93
|
}
|
|
96
94
|
|
|
97
95
|
/**
|
|
@@ -99,14 +97,14 @@ async function fetchExportedDocument(
|
|
|
99
97
|
* suffix peeled back off when the host redirected, otherwise the requested URL.
|
|
100
98
|
*/
|
|
101
99
|
function navigatedUrl(response: Response, requested: URL): string {
|
|
102
|
-
if (!response.redirected) return requested.href
|
|
100
|
+
if (!response.redirected) return requested.href
|
|
103
101
|
try {
|
|
104
|
-
const url = new URL(response.url)
|
|
102
|
+
const url = new URL(response.url)
|
|
105
103
|
url.pathname = url.pathname.endsWith('/index.txt')
|
|
106
104
|
? url.pathname.slice(0, -'index.txt'.length)
|
|
107
|
-
: url.pathname.replace(/\.txt$/, '')
|
|
108
|
-
return url.href
|
|
105
|
+
: url.pathname.replace(/\.txt$/, '')
|
|
106
|
+
return url.href
|
|
109
107
|
} catch {
|
|
110
|
-
return requested.href
|
|
108
|
+
return requested.href
|
|
111
109
|
}
|
|
112
110
|
}
|