@wular/pnext 0.0.3 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1961
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1887
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +833 -848
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,71 +1,69 @@
|
|
|
1
|
-
import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
|
|
2
|
-
import path from 'node:path'
|
|
3
|
-
import type { ResolvedConfig } from '../../config'
|
|
4
|
-
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
5
|
-
import { listFiles, toPosixPath } from '../../utils/fs'
|
|
6
|
-
import type { BuildStepLogger } from '../../extensions'
|
|
7
|
-
import { getNextConfig } from '../next/config-loader'
|
|
8
|
-
import { emitStandalone } from './standalone'
|
|
1
|
+
import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import type { ResolvedConfig } from '../../config'
|
|
4
|
+
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
5
|
+
import { listFiles, toPosixPath } from '../../utils/fs'
|
|
6
|
+
import type { BuildStepLogger } from '../../extensions'
|
|
7
|
+
import { getNextConfig } from '../next/config-loader'
|
|
8
|
+
import { emitStandalone } from './standalone'
|
|
9
9
|
|
|
10
10
|
interface EmitStaticExportContext {
|
|
11
|
-
config: ResolvedConfig
|
|
12
|
-
manifest: BuildManifest
|
|
13
|
-
log: BuildStepLogger
|
|
11
|
+
config: ResolvedConfig
|
|
12
|
+
manifest: BuildManifest
|
|
13
|
+
log: BuildStepLogger
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
interface ExportPage {
|
|
17
|
-
route: RouteManifestEntry
|
|
18
|
-
htmlFile: string
|
|
19
|
-
outHtml: string
|
|
20
|
-
outPageTxt: string
|
|
21
|
-
segmentDir: string
|
|
17
|
+
route: RouteManifestEntry
|
|
18
|
+
htmlFile: string
|
|
19
|
+
outHtml: string
|
|
20
|
+
outPageTxt: string
|
|
21
|
+
segmentDir: string
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
const BUILD_ID = 'pnext'
|
|
25
|
-
const COMMON_SEGMENTS = ['_full', '_head', '_index', '_tree']
|
|
24
|
+
const BUILD_ID = 'pnext'
|
|
25
|
+
const COMMON_SEGMENTS = ['_full', '_head', '_index', '_tree']
|
|
26
26
|
|
|
27
27
|
// Where the client runtime lands inside the export tree. A compat build serves `public/assets/<rel>` at
|
|
28
28
|
// `/_next/static/<rel>`, but a static export may only add files Next itself would add - the file-set
|
|
29
29
|
// contract treats everything under `_next/static/chunks/` as ignorable build output and nothing else.
|
|
30
30
|
// Shifting the whole `assets/` tree down one level, rather than flattening it, keeps its internal
|
|
31
31
|
// layout intact, so an entry's relative `./chunks/<chunk>.js` import still resolves after the move.
|
|
32
|
-
const RUNTIME_ASSET_DIR = '_next/static/chunks'
|
|
32
|
+
const RUNTIME_ASSET_DIR = '_next/static/chunks'
|
|
33
33
|
|
|
34
34
|
// Marks an exported document as "served without a pnext server" for the client
|
|
35
35
|
// router: it switches to fetching the flat artifacts written beside each page
|
|
36
36
|
// instead of negotiating with a server. See ./client.ts. Injected only into the
|
|
37
37
|
// export tree — `pnext start` serves the same build unchanged.
|
|
38
|
-
const EXPORT_MODE_SCRIPT = '<script>window.__PNEXT_OUTPUT_EXPORT__=true;</script>'
|
|
38
|
+
const EXPORT_MODE_SCRIPT = '<script>window.__PNEXT_OUTPUT_EXPORT__=true;</script>'
|
|
39
39
|
|
|
40
40
|
export async function emitStaticExport({ config, manifest, log }: EmitStaticExportContext) {
|
|
41
41
|
// Every compat build serves `/_next/static/<buildId>/_buildManifest.js` (and `_ssgManifest.js`) from
|
|
42
42
|
// the running server - client runtime code fetches it unconditionally, and Next's own asset-404 tests
|
|
43
43
|
// probe it as "a known valid asset path". Export mode additionally snapshots a standalone `out/` tree
|
|
44
44
|
// below; the manifest files it needs are the same bytes, so write the server-served copy first.
|
|
45
|
-
await log.step('build manifest', () =>
|
|
46
|
-
|
|
47
|
-
);
|
|
48
|
-
const output = getNextConfig().output;
|
|
45
|
+
await log.step('build manifest', () => writeBuildManifests(path.join(config.outPath, 'public')))
|
|
46
|
+
const output = getNextConfig().output
|
|
49
47
|
if (output === 'standalone') {
|
|
50
|
-
await emitStandalone({ config, manifest, log })
|
|
51
|
-
return
|
|
48
|
+
await emitStandalone({ config, manifest, log })
|
|
49
|
+
return
|
|
52
50
|
}
|
|
53
|
-
if (output !== 'export') return
|
|
54
|
-
await log.step('static export', () => writeExportTree(config, manifest))
|
|
51
|
+
if (output !== 'export') return
|
|
52
|
+
await log.step('static export', () => writeExportTree(config, manifest))
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
async function writeExportTree(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
|
|
58
|
-
const outDir = exportOutDir(config)
|
|
59
|
-
await rm(outDir, { recursive: true, force: true })
|
|
60
|
-
await mkdir(outDir, { recursive: true })
|
|
56
|
+
const outDir = exportOutDir(config)
|
|
57
|
+
await rm(outDir, { recursive: true, force: true })
|
|
58
|
+
await mkdir(outDir, { recursive: true })
|
|
61
59
|
|
|
62
|
-
const assets = await copyRuntimeAssets(config, outDir)
|
|
63
|
-
await copyPublicTree(config, outDir, assets)
|
|
64
|
-
await writeBuildManifests(outDir)
|
|
60
|
+
const assets = await copyRuntimeAssets(config, outDir)
|
|
61
|
+
await copyPublicTree(config, outDir, assets)
|
|
62
|
+
await writeBuildManifests(outDir)
|
|
65
63
|
|
|
66
|
-
const pages = exportPages(config, manifest)
|
|
67
|
-
for (const page of pages) await writePageArtifacts(page, assets)
|
|
68
|
-
await writeNotFoundArtifacts(config, outDir)
|
|
64
|
+
const pages = exportPages(config, manifest)
|
|
65
|
+
for (const page of pages) await writePageArtifacts(page, assets)
|
|
66
|
+
await writeNotFoundArtifacts(config, outDir)
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
/**
|
|
@@ -76,16 +74,16 @@ async function writeExportTree(config: ResolvedConfig, manifest: BuildManifest):
|
|
|
76
74
|
* can be pointed at their new location.
|
|
77
75
|
*/
|
|
78
76
|
async function copyRuntimeAssets(config: ResolvedConfig, outDir: string): Promise<Set<string>> {
|
|
79
|
-
const assetsDir = path.join(config.outPath, 'public', 'assets')
|
|
80
|
-
const assets = new Set<string>()
|
|
77
|
+
const assetsDir = path.join(config.outPath, 'public', 'assets')
|
|
78
|
+
const assets = new Set<string>()
|
|
81
79
|
for (const file of await listFiles(assetsDir)) {
|
|
82
|
-
const relative = toPosixPath(path.relative(assetsDir, file))
|
|
83
|
-
assets.add(relative)
|
|
84
|
-
const target = path.join(outDir, ...RUNTIME_ASSET_DIR.split('/'), ...relative.split('/'))
|
|
85
|
-
await mkdir(path.dirname(target), { recursive: true })
|
|
86
|
-
await copyFile(file, target)
|
|
80
|
+
const relative = toPosixPath(path.relative(assetsDir, file))
|
|
81
|
+
assets.add(relative)
|
|
82
|
+
const target = path.join(outDir, ...RUNTIME_ASSET_DIR.split('/'), ...relative.split('/'))
|
|
83
|
+
await mkdir(path.dirname(target), { recursive: true })
|
|
84
|
+
await copyFile(file, target)
|
|
87
85
|
}
|
|
88
|
-
return assets
|
|
86
|
+
return assets
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
async function copyPublicTree(
|
|
@@ -93,16 +91,16 @@ async function copyPublicTree(
|
|
|
93
91
|
outDir: string,
|
|
94
92
|
assets: ReadonlySet<string>,
|
|
95
93
|
): Promise<void> {
|
|
96
|
-
const publicDir = path.join(config.outPath, 'public')
|
|
94
|
+
const publicDir = path.join(config.outPath, 'public')
|
|
97
95
|
for (const file of await listFiles(publicDir)) {
|
|
98
|
-
const relative = toPosixPath(path.relative(publicDir, file))
|
|
99
|
-
if (relative.startsWith('assets/')) continue
|
|
100
|
-
const target = path.join(outDir, ...relative.split('/'))
|
|
101
|
-
await mkdir(path.dirname(target), { recursive: true })
|
|
96
|
+
const relative = toPosixPath(path.relative(publicDir, file))
|
|
97
|
+
if (relative.startsWith('assets/')) continue
|
|
98
|
+
const target = path.join(outDir, ...relative.split('/'))
|
|
99
|
+
await mkdir(path.dirname(target), { recursive: true })
|
|
102
100
|
if (relative.endsWith('.html')) {
|
|
103
|
-
await writeFile(target, exportDocument(await readFile(file, 'utf8'), assets))
|
|
101
|
+
await writeFile(target, exportDocument(await readFile(file, 'utf8'), assets))
|
|
104
102
|
} else {
|
|
105
|
-
await copyFile(file, target)
|
|
103
|
+
await copyFile(file, target)
|
|
106
104
|
}
|
|
107
105
|
}
|
|
108
106
|
}
|
|
@@ -119,23 +117,23 @@ function exportDocument(html: string, assets: ReadonlySet<string>): string {
|
|
|
119
117
|
/\/_next\/static\/([^"'`\s<>)?#]+)([?#][^"'`\s<>]*)?/g,
|
|
120
118
|
(match: string, rest: string, suffix?: string) =>
|
|
121
119
|
assets.has(rest) ? `/${RUNTIME_ASSET_DIR}/${rest}${suffix ?? ''}` : match,
|
|
122
|
-
)
|
|
120
|
+
)
|
|
123
121
|
// Before any module script runs, so the first navigation already sees it. A
|
|
124
122
|
// fragment with neither <head> nor <body> takes the marker up front.
|
|
125
|
-
const anchor = /<head[^>]*>|<body[^>]*>/.exec(repointed)
|
|
126
|
-
if (!anchor) return EXPORT_MODE_SCRIPT + repointed
|
|
127
|
-
const at = anchor.index + anchor[0].length
|
|
128
|
-
return `${repointed.slice(0, at)}${EXPORT_MODE_SCRIPT}${repointed.slice(at)}
|
|
123
|
+
const anchor = /<head[^>]*>|<body[^>]*>/.exec(repointed)
|
|
124
|
+
if (!anchor) return EXPORT_MODE_SCRIPT + repointed
|
|
125
|
+
const at = anchor.index + anchor[0].length
|
|
126
|
+
return `${repointed.slice(0, at)}${EXPORT_MODE_SCRIPT}${repointed.slice(at)}`
|
|
129
127
|
}
|
|
130
128
|
|
|
131
129
|
async function writeBuildManifests(outDir: string): Promise<void> {
|
|
132
|
-
const dir = path.join(outDir, '_next', 'static', BUILD_ID)
|
|
133
|
-
await mkdir(dir, { recursive: true })
|
|
130
|
+
const dir = path.join(outDir, '_next', 'static', BUILD_ID)
|
|
131
|
+
await mkdir(dir, { recursive: true })
|
|
134
132
|
await writeFile(
|
|
135
133
|
path.join(dir, '_buildManifest.js'),
|
|
136
134
|
'self.__BUILD_MANIFEST={};self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();\n',
|
|
137
|
-
)
|
|
138
|
-
await writeFile(path.join(dir, '_ssgManifest.js'), 'self.__SSG_MANIFEST=new Set();\n')
|
|
135
|
+
)
|
|
136
|
+
await writeFile(path.join(dir, '_ssgManifest.js'), 'self.__SSG_MANIFEST=new Set();\n')
|
|
139
137
|
}
|
|
140
138
|
|
|
141
139
|
/**
|
|
@@ -144,65 +142,65 @@ async function writeBuildManifests(outDir: string): Promise<void> {
|
|
|
144
142
|
* default dir.
|
|
145
143
|
*/
|
|
146
144
|
function exportOutDir(config: ResolvedConfig): string {
|
|
147
|
-
const distDir = getNextConfig().distDir
|
|
145
|
+
const distDir = getNextConfig().distDir
|
|
148
146
|
// Next's hasCustomExportOutput treats '.next' as the default distDir — the
|
|
149
147
|
// export then lands in 'out' rather than clobbering the build directory.
|
|
150
148
|
const dir =
|
|
151
|
-
typeof distDir === 'string' && distDir.length > 0 && distDir !== '.next' ? distDir : 'out'
|
|
152
|
-
return path.resolve(config.root, dir)
|
|
149
|
+
typeof distDir === 'string' && distDir.length > 0 && distDir !== '.next' ? distDir : 'out'
|
|
150
|
+
return path.resolve(config.root, dir)
|
|
153
151
|
}
|
|
154
152
|
|
|
155
153
|
function exportPages(config: ResolvedConfig, manifest: BuildManifest): ExportPage[] {
|
|
156
|
-
const staticFiles = manifest.staticFiles ?? {}
|
|
157
|
-
const routeById = new Map(manifest.routes.map(route => [route.id, route]))
|
|
158
|
-
const pages: ExportPage[] = []
|
|
154
|
+
const staticFiles = manifest.staticFiles ?? {}
|
|
155
|
+
const routeById = new Map(manifest.routes.map(route => [route.id, route]))
|
|
156
|
+
const pages: ExportPage[] = []
|
|
159
157
|
|
|
160
158
|
for (const [relative, metadata] of Object.entries(staticFiles)) {
|
|
161
|
-
if (metadata.kind !== 'page' || !relative.endsWith('.html')) continue
|
|
162
|
-
const route = metadata.routeId ? routeById.get(metadata.routeId) : undefined
|
|
163
|
-
if (route?.kind !== 'page') continue
|
|
164
|
-
const htmlFile = path.join(config.outPath, 'public', ...relative.split('/'))
|
|
159
|
+
if (metadata.kind !== 'page' || !relative.endsWith('.html')) continue
|
|
160
|
+
const route = metadata.routeId ? routeById.get(metadata.routeId) : undefined
|
|
161
|
+
if (route?.kind !== 'page') continue
|
|
162
|
+
const htmlFile = path.join(config.outPath, 'public', ...relative.split('/'))
|
|
165
163
|
pages.push({
|
|
166
164
|
route,
|
|
167
165
|
htmlFile,
|
|
168
166
|
...exportPathsForHtml(config, relative),
|
|
169
|
-
})
|
|
167
|
+
})
|
|
170
168
|
}
|
|
171
169
|
|
|
172
|
-
return pages.sort((a, b) => a.outHtml.localeCompare(b.outHtml))
|
|
170
|
+
return pages.sort((a, b) => a.outHtml.localeCompare(b.outHtml))
|
|
173
171
|
}
|
|
174
172
|
|
|
175
173
|
function exportPathsForHtml(config: ResolvedConfig, relative: string) {
|
|
176
|
-
const outDir = exportOutDir(config)
|
|
177
|
-
const normalized = toPosixPath(relative)
|
|
174
|
+
const outDir = exportOutDir(config)
|
|
175
|
+
const normalized = toPosixPath(relative)
|
|
178
176
|
if (normalized === 'index.html') {
|
|
179
177
|
return {
|
|
180
178
|
outHtml: path.join(outDir, 'index.html'),
|
|
181
179
|
outPageTxt: path.join(outDir, 'index.txt'),
|
|
182
180
|
segmentDir: outDir,
|
|
183
|
-
}
|
|
181
|
+
}
|
|
184
182
|
}
|
|
185
183
|
if (normalized.endsWith('/index.html')) {
|
|
186
|
-
const routePath = normalized.slice(0, -'/index.html'.length)
|
|
184
|
+
const routePath = normalized.slice(0, -'/index.html'.length)
|
|
187
185
|
return {
|
|
188
186
|
outHtml: path.join(outDir, ...normalized.split('/')),
|
|
189
187
|
outPageTxt: path.join(outDir, ...routePath.split('/'), 'index.txt'),
|
|
190
188
|
segmentDir: path.join(outDir, ...routePath.split('/')),
|
|
191
|
-
}
|
|
189
|
+
}
|
|
192
190
|
}
|
|
193
|
-
const routePath = normalized.slice(0, -'.html'.length)
|
|
191
|
+
const routePath = normalized.slice(0, -'.html'.length)
|
|
194
192
|
return {
|
|
195
193
|
outHtml: path.join(outDir, ...normalized.split('/')),
|
|
196
194
|
outPageTxt: path.join(outDir, `${routePath}.txt`),
|
|
197
195
|
segmentDir: path.join(outDir, ...routePath.split('/')),
|
|
198
|
-
}
|
|
196
|
+
}
|
|
199
197
|
}
|
|
200
198
|
|
|
201
199
|
async function writePageArtifacts(page: ExportPage, assets: ReadonlySet<string>): Promise<void> {
|
|
202
|
-
const html = exportDocument(await readFile(page.htmlFile, 'utf8'), assets)
|
|
203
|
-
await mkdir(path.dirname(page.outPageTxt), { recursive: true })
|
|
204
|
-
await writeFile(page.outPageTxt, html)
|
|
205
|
-
await writeSegmentFiles(page.segmentDir, page.route, html)
|
|
200
|
+
const html = exportDocument(await readFile(page.htmlFile, 'utf8'), assets)
|
|
201
|
+
await mkdir(path.dirname(page.outPageTxt), { recursive: true })
|
|
202
|
+
await writeFile(page.outPageTxt, html)
|
|
203
|
+
await writeSegmentFiles(page.segmentDir, page.route, html)
|
|
206
204
|
}
|
|
207
205
|
|
|
208
206
|
async function writeSegmentFiles(
|
|
@@ -210,63 +208,66 @@ async function writeSegmentFiles(
|
|
|
210
208
|
route: Pick<RouteManifestEntry, 'route' | 'params'>,
|
|
211
209
|
body: string,
|
|
212
210
|
): Promise<void> {
|
|
213
|
-
await mkdir(segmentDir, { recursive: true })
|
|
211
|
+
await mkdir(segmentDir, { recursive: true })
|
|
214
212
|
for (const segment of COMMON_SEGMENTS) {
|
|
215
|
-
await writeFile(path.join(segmentDir, `__next.${segment}.txt`), body)
|
|
213
|
+
await writeFile(path.join(segmentDir, `__next.${segment}.txt`), body)
|
|
216
214
|
}
|
|
217
215
|
|
|
218
|
-
const keys = segmentKeys(route)
|
|
219
|
-
const leaf = keys.at(-1) ?? ''
|
|
220
|
-
await writeFile(
|
|
221
|
-
|
|
216
|
+
const keys = segmentKeys(route)
|
|
217
|
+
const leaf = keys.at(-1) ?? ''
|
|
218
|
+
await writeFile(
|
|
219
|
+
path.join(segmentDir, leaf ? `__next.${leaf}.__PAGE__.txt` : '__next.__PAGE__.txt'),
|
|
220
|
+
body,
|
|
221
|
+
)
|
|
222
|
+
if (leaf) await writeFile(path.join(segmentDir, `__next.${leaf}.txt`), body)
|
|
222
223
|
for (const key of keys.slice(0, -1)) {
|
|
223
|
-
if (key) await writeFile(path.join(segmentDir, `__next.${key}.txt`), body)
|
|
224
|
+
if (key) await writeFile(path.join(segmentDir, `__next.${key}.txt`), body)
|
|
224
225
|
}
|
|
225
226
|
}
|
|
226
227
|
|
|
227
228
|
function segmentKeys(route: Pick<RouteManifestEntry, 'route' | 'params'>): string[] {
|
|
228
|
-
const params = new Set(route.params)
|
|
229
|
+
const params = new Set(route.params)
|
|
229
230
|
const parts = route.route
|
|
230
231
|
.replace(/^\/|\/$/g, '')
|
|
231
232
|
.split('/')
|
|
232
233
|
.filter(Boolean)
|
|
233
|
-
.map(part => (part.startsWith(':') ? `$d$${part.replace(/^:|[*?]$/g, '')}` : part))
|
|
234
|
-
if (parts.length === 0) return ['']
|
|
235
|
-
const keys: string[] = []
|
|
234
|
+
.map(part => (part.startsWith(':') ? `$d$${part.replace(/^:|[*?]$/g, '')}` : part))
|
|
235
|
+
if (parts.length === 0) return ['']
|
|
236
|
+
const keys: string[] = []
|
|
236
237
|
for (const [index, part] of parts.entries()) {
|
|
237
|
-
const key = part.startsWith('$d$') && !params.has(part.slice(3)) ? part.slice(3) : part
|
|
238
|
-
keys.push([...parts.slice(0, index), key].join('.'))
|
|
238
|
+
const key = part.startsWith('$d$') && !params.has(part.slice(3)) ? part.slice(3) : part
|
|
239
|
+
keys.push([...parts.slice(0, index), key].join('.'))
|
|
239
240
|
}
|
|
240
|
-
return keys
|
|
241
|
+
return keys
|
|
241
242
|
}
|
|
242
243
|
|
|
243
244
|
async function writeNotFoundArtifacts(config: ResolvedConfig, outDir: string): Promise<void> {
|
|
244
245
|
// Read back the COPY in the export tree — copyPublicTree already repointed
|
|
245
246
|
// its runtime references and stamped the export marker.
|
|
246
|
-
const htmlFile = path.join(outDir, '404.html')
|
|
247
|
-
const html = await readFile(htmlFile, 'utf8').catch(() => undefined)
|
|
248
|
-
if (html === undefined) return
|
|
247
|
+
const htmlFile = path.join(outDir, '404.html')
|
|
248
|
+
const html = await readFile(htmlFile, 'utf8').catch(() => undefined)
|
|
249
|
+
if (html === undefined) return
|
|
249
250
|
|
|
250
251
|
if (config.trailingSlash === true) {
|
|
251
|
-
const nested = path.join(outDir, '404', 'index.html')
|
|
252
|
-
await mkdir(path.dirname(nested), { recursive: true })
|
|
253
|
-
await writeFile(nested, html)
|
|
252
|
+
const nested = path.join(outDir, '404', 'index.html')
|
|
253
|
+
await mkdir(path.dirname(nested), { recursive: true })
|
|
254
|
+
await writeFile(nested, html)
|
|
254
255
|
}
|
|
255
256
|
|
|
256
257
|
const outHtml =
|
|
257
258
|
config.trailingSlash === true
|
|
258
259
|
? path.join(outDir, '_not-found', 'index.html')
|
|
259
|
-
: path.join(outDir, '_not-found.html')
|
|
260
|
+
: path.join(outDir, '_not-found.html')
|
|
260
261
|
const outTxt =
|
|
261
262
|
config.trailingSlash === true
|
|
262
263
|
? path.join(outDir, '_not-found', 'index.txt')
|
|
263
|
-
: path.join(outDir, '_not-found.txt')
|
|
264
|
-
await mkdir(path.dirname(outHtml), { recursive: true })
|
|
265
|
-
await writeFile(outHtml, html)
|
|
266
|
-
await writeFile(outTxt, html)
|
|
264
|
+
: path.join(outDir, '_not-found.txt')
|
|
265
|
+
await mkdir(path.dirname(outHtml), { recursive: true })
|
|
266
|
+
await writeFile(outHtml, html)
|
|
267
|
+
await writeFile(outTxt, html)
|
|
267
268
|
await writeSegmentFiles(
|
|
268
269
|
path.join(outDir, '_not-found'),
|
|
269
270
|
{ route: '/_not-found', params: [] },
|
|
270
271
|
html,
|
|
271
|
-
)
|
|
272
|
+
)
|
|
272
273
|
}
|
|
@@ -11,34 +11,38 @@
|
|
|
11
11
|
// straight onto its own stdout, so the harness's readiness regex fires without a proxy hop. The original
|
|
12
12
|
// build tree outlives the moved standalone folder for the duration of the test, so absolute references
|
|
13
13
|
// back into it are safe.
|
|
14
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
15
|
-
import { mkdir, rm, writeFile } from 'node:fs/promises'
|
|
16
|
-
import path from 'node:path'
|
|
17
|
-
import type { ResolvedConfig } from '../../config'
|
|
18
|
-
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
19
|
-
import { listFiles, toPosixPath } from '../../utils/fs'
|
|
20
|
-
import type { BuildStepLogger } from '../../extensions'
|
|
14
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
15
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises'
|
|
16
|
+
import path from 'node:path'
|
|
17
|
+
import type { ResolvedConfig } from '../../config'
|
|
18
|
+
import type { BuildManifest, RouteManifestEntry } from '../../types'
|
|
19
|
+
import { listFiles, toPosixPath } from '../../utils/fs'
|
|
20
|
+
import type { BuildStepLogger } from '../../extensions'
|
|
21
21
|
|
|
22
22
|
interface EmitStandaloneContext {
|
|
23
|
-
config: ResolvedConfig
|
|
24
|
-
manifest: BuildManifest
|
|
25
|
-
log: BuildStepLogger
|
|
23
|
+
config: ResolvedConfig
|
|
24
|
+
manifest: BuildManifest
|
|
25
|
+
log: BuildStepLogger
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/** `page.*` / `route.*` entry files whose compiled `<name>.js` gets a trace. */
|
|
29
|
-
const ENTRY_FILE = /(?:^|[\\/])(page|route)\.(?:js|jsx|ts|tsx|mjs|cjs)
|
|
29
|
+
const ENTRY_FILE = /(?:^|[\\/])(page|route)\.(?:js|jsx|ts|tsx|mjs|cjs)$/
|
|
30
30
|
|
|
31
|
-
export async function emitStandalone({
|
|
32
|
-
|
|
31
|
+
export async function emitStandalone({
|
|
32
|
+
config,
|
|
33
|
+
manifest,
|
|
34
|
+
log,
|
|
35
|
+
}: EmitStandaloneContext): Promise<void> {
|
|
36
|
+
await log.step('standalone output', () => writeStandalone(config, manifest))
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
async function writeStandalone(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
|
|
36
|
-
const standaloneDir = path.join(config.root, '.next', 'standalone')
|
|
37
|
-
await rm(standaloneDir, { recursive: true, force: true })
|
|
38
|
-
await mkdir(standaloneDir, { recursive: true })
|
|
39
|
-
await writeServerEntry(config, standaloneDir)
|
|
40
|
-
await writeTraceFiles(config, standaloneDir)
|
|
41
|
-
await writeMiddlewareManifest(manifest, standaloneDir)
|
|
40
|
+
const standaloneDir = path.join(config.root, '.next', 'standalone')
|
|
41
|
+
await rm(standaloneDir, { recursive: true, force: true })
|
|
42
|
+
await mkdir(standaloneDir, { recursive: true })
|
|
43
|
+
await writeServerEntry(config, standaloneDir)
|
|
44
|
+
await writeTraceFiles(config, standaloneDir)
|
|
45
|
+
await writeMiddlewareManifest(manifest, standaloneDir)
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
/**
|
|
@@ -51,8 +55,8 @@ async function writeServerEntry(config: ResolvedConfig, standaloneDir: string):
|
|
|
51
55
|
await writeFile(
|
|
52
56
|
path.join(standaloneDir, 'package.json'),
|
|
53
57
|
`${JSON.stringify({ name: 'pnext-standalone', version: '0.0.0', type: 'commonjs', private: true }, null, 2)}\n`,
|
|
54
|
-
)
|
|
55
|
-
await writeFile(path.join(standaloneDir, 'server.js'), standaloneServerSource(config))
|
|
58
|
+
)
|
|
59
|
+
await writeFile(path.join(standaloneDir, 'server.js'), standaloneServerSource(config))
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
/**
|
|
@@ -64,7 +68,7 @@ async function writeServerEntry(config: ResolvedConfig, standaloneDir: string):
|
|
|
64
68
|
* after() callbacks drain.
|
|
65
69
|
*/
|
|
66
70
|
function standaloneServerSource(config: ResolvedConfig): string {
|
|
67
|
-
const cliPath = path.resolve(import.meta.dirname, '..', '..', 'cli', 'index.ts')
|
|
71
|
+
const cliPath = path.resolve(import.meta.dirname, '..', '..', 'cli', 'index.ts')
|
|
68
72
|
return `'use strict';
|
|
69
73
|
// pnext standalone launcher. Generated by pnext build; see
|
|
70
74
|
// src/compat/export/standalone.ts. Spawned as \`node server.js\` from the moved
|
|
@@ -109,7 +113,7 @@ for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
|
109
113
|
if (child.exitCode === null) child.kill(signal);
|
|
110
114
|
});
|
|
111
115
|
}
|
|
112
|
-
|
|
116
|
+
`
|
|
113
117
|
}
|
|
114
118
|
|
|
115
119
|
/**
|
|
@@ -122,11 +126,11 @@ for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
|
122
126
|
* never distort the emitted paths.
|
|
123
127
|
*/
|
|
124
128
|
async function writeTraceFiles(config: ResolvedConfig, standaloneDir: string): Promise<void> {
|
|
125
|
-
const serverDir = path.join(standaloneDir, '.next', 'server')
|
|
126
|
-
await emitTracesFor(path.join(config.root, 'app'), path.join(serverDir, 'app'))
|
|
127
|
-
await emitTracesFor(path.join(config.root, 'src', 'app'), path.join(serverDir, 'app'))
|
|
128
|
-
await emitTracesFor(path.join(config.root, 'pages'), path.join(serverDir, 'pages'))
|
|
129
|
-
await emitTracesFor(path.join(config.root, 'src', 'pages'), path.join(serverDir, 'pages'))
|
|
129
|
+
const serverDir = path.join(standaloneDir, '.next', 'server')
|
|
130
|
+
await emitTracesFor(path.join(config.root, 'app'), path.join(serverDir, 'app'))
|
|
131
|
+
await emitTracesFor(path.join(config.root, 'src', 'app'), path.join(serverDir, 'app'))
|
|
132
|
+
await emitTracesFor(path.join(config.root, 'pages'), path.join(serverDir, 'pages'))
|
|
133
|
+
await emitTracesFor(path.join(config.root, 'src', 'pages'), path.join(serverDir, 'pages'))
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
/**
|
|
@@ -144,10 +148,10 @@ async function writeMiddlewareManifest(
|
|
|
144
148
|
manifest: BuildManifest,
|
|
145
149
|
standaloneDir: string,
|
|
146
150
|
): Promise<void> {
|
|
147
|
-
const functions: Record<string, unknown> = {}
|
|
151
|
+
const functions: Record<string, unknown> = {}
|
|
148
152
|
for (const route of manifest.routes) {
|
|
149
|
-
if (!isEdgeRoute(route)) continue
|
|
150
|
-
const page = route.route || '/'
|
|
153
|
+
if (!isEdgeRoute(route)) continue
|
|
154
|
+
const page = route.route || '/'
|
|
151
155
|
functions[page] = {
|
|
152
156
|
files: [],
|
|
153
157
|
name: `edge${page === '/' ? '/index' : page}`,
|
|
@@ -156,15 +160,15 @@ async function writeMiddlewareManifest(
|
|
|
156
160
|
wasm: [],
|
|
157
161
|
assets: [],
|
|
158
162
|
env: {},
|
|
159
|
-
}
|
|
163
|
+
}
|
|
160
164
|
}
|
|
161
|
-
if (Object.keys(functions).length === 0) return
|
|
162
|
-
const serverDir = path.join(standaloneDir, '.next', 'server')
|
|
163
|
-
await mkdir(serverDir, { recursive: true })
|
|
165
|
+
if (Object.keys(functions).length === 0) return
|
|
166
|
+
const serverDir = path.join(standaloneDir, '.next', 'server')
|
|
167
|
+
await mkdir(serverDir, { recursive: true })
|
|
164
168
|
await writeFile(
|
|
165
169
|
path.join(serverDir, 'middleware-manifest.json'),
|
|
166
170
|
`${JSON.stringify({ version: 3, sortedMiddleware: [], middleware: {}, functions }, null, 2)}\n`,
|
|
167
|
-
)
|
|
171
|
+
)
|
|
168
172
|
}
|
|
169
173
|
|
|
170
174
|
/**
|
|
@@ -173,35 +177,39 @@ async function writeMiddlewareManifest(
|
|
|
173
177
|
* is detected from the route source directly.
|
|
174
178
|
*/
|
|
175
179
|
function isEdgeRoute(route: RouteManifestEntry): boolean {
|
|
176
|
-
const runtime = route.segmentConfig?.runtime
|
|
177
|
-
if (runtime === 'edge' || runtime === 'experimental-edge') return true
|
|
180
|
+
const runtime = route.segmentConfig?.runtime
|
|
181
|
+
if (runtime === 'edge' || runtime === 'experimental-edge') return true
|
|
178
182
|
for (const file of [route.file, ...(route.sourceFiles ?? [])]) {
|
|
179
|
-
if (!file || !existsSync(file)) continue
|
|
180
|
-
let source: string
|
|
183
|
+
if (!file || !existsSync(file)) continue
|
|
184
|
+
let source: string
|
|
181
185
|
try {
|
|
182
|
-
source = readFileSync(file, 'utf8')
|
|
186
|
+
source = readFileSync(file, 'utf8')
|
|
183
187
|
} catch {
|
|
184
|
-
continue
|
|
188
|
+
continue
|
|
185
189
|
}
|
|
186
|
-
if (/\bruntime\s*:\s*['"](?:edge|experimental-edge)['"]/.test(source)) return true
|
|
187
|
-
if (/export\s+const\s+runtime\s*=\s*['"](?:edge|experimental-edge)['"]/.test(source))
|
|
190
|
+
if (/\bruntime\s*:\s*['"](?:edge|experimental-edge)['"]/.test(source)) return true
|
|
191
|
+
if (/export\s+const\s+runtime\s*=\s*['"](?:edge|experimental-edge)['"]/.test(source))
|
|
192
|
+
return true
|
|
188
193
|
}
|
|
189
|
-
return false
|
|
194
|
+
return false
|
|
190
195
|
}
|
|
191
196
|
|
|
192
197
|
function escapeRouteRegexp(route: string): string {
|
|
193
|
-
return route.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/:([^/\\]+)/g, '[^/]+')
|
|
198
|
+
return route.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/:([^/\\]+)/g, '[^/]+')
|
|
194
199
|
}
|
|
195
200
|
|
|
196
201
|
async function emitTracesFor(sourceDir: string, targetDir: string): Promise<void> {
|
|
197
|
-
if (!existsSync(sourceDir)) return
|
|
202
|
+
if (!existsSync(sourceDir)) return
|
|
198
203
|
for (const file of await listFiles(sourceDir)) {
|
|
199
|
-
const match = ENTRY_FILE.exec(file)
|
|
200
|
-
if (!match) continue
|
|
201
|
-
const relative = toPosixPath(path.relative(sourceDir, file))
|
|
202
|
-
const relativeDir = path.posix.dirname(relative)
|
|
203
|
-
const dir = path.join(targetDir, ...(relativeDir === '.' ? [] : relativeDir.split('/')))
|
|
204
|
-
await mkdir(dir, { recursive: true })
|
|
205
|
-
await writeFile(
|
|
204
|
+
const match = ENTRY_FILE.exec(file)
|
|
205
|
+
if (!match) continue
|
|
206
|
+
const relative = toPosixPath(path.relative(sourceDir, file))
|
|
207
|
+
const relativeDir = path.posix.dirname(relative)
|
|
208
|
+
const dir = path.join(targetDir, ...(relativeDir === '.' ? [] : relativeDir.split('/')))
|
|
209
|
+
await mkdir(dir, { recursive: true })
|
|
210
|
+
await writeFile(
|
|
211
|
+
path.join(dir, `${match[1]}.js.nft.json`),
|
|
212
|
+
`${JSON.stringify({ version: 1, files: [] })}\n`,
|
|
213
|
+
)
|
|
206
214
|
}
|
|
207
215
|
}
|