@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
|
@@ -20,34 +20,34 @@
|
|
|
20
20
|
* routes' server modules as soon as the route scan hands them over, and blocks on stdin for the
|
|
21
21
|
* go-ahead to finish the rest once the manifest is written.
|
|
22
22
|
*/
|
|
23
|
-
import { existsSync } from 'node:fs'
|
|
24
|
-
import { readFile } from 'node:fs/promises'
|
|
25
|
-
import path from 'node:path'
|
|
26
|
-
import { fileURLToPath } from 'node:url'
|
|
27
|
-
import { loadConfig, pathToFileHref, type ResolvedConfig } from '../../config'
|
|
28
|
-
import { bootstrapCompat } from '../../compat-bootstrap'
|
|
29
|
-
import { ssrClientReference } from '../../client/reference'
|
|
23
|
+
import { existsSync } from 'node:fs'
|
|
24
|
+
import { readFile } from 'node:fs/promises'
|
|
25
|
+
import path from 'node:path'
|
|
26
|
+
import { fileURLToPath } from 'node:url'
|
|
27
|
+
import { loadConfig, pathToFileHref, type ResolvedConfig } from '../../config'
|
|
28
|
+
import { bootstrapCompat } from '../../compat-bootstrap'
|
|
29
|
+
import { ssrClientReference } from '../../client/reference'
|
|
30
30
|
import {
|
|
31
31
|
devClientModuleHref,
|
|
32
32
|
devServerModuleHref,
|
|
33
33
|
setEmitCompiledSpecifiersManifest,
|
|
34
|
-
} from '../../
|
|
35
|
-
import { getCompatModeExtensions } from '../../extensions'
|
|
36
|
-
import { findConventionFiles, findLayouts } from '../../routing/routes'
|
|
37
|
-
import { registerServerRuntime } from '../../runtime/
|
|
38
|
-
import { namedBunBinary } from '../named-bin'
|
|
39
|
-
import type { VerboseLogger } from '../../utils/verbose'
|
|
40
|
-
import type { BuildManifest } from '../../types'
|
|
34
|
+
} from '../../runtime/modules'
|
|
35
|
+
import { getCompatModeExtensions } from '../../extensions'
|
|
36
|
+
import { findConventionFiles, findLayouts } from '../../routing/routes'
|
|
37
|
+
import { registerServerRuntime } from '../../runtime/loader'
|
|
38
|
+
import { namedBunBinary } from '../boot/named-bin'
|
|
39
|
+
import type { VerboseLogger } from '../../utils/verbose'
|
|
40
|
+
import type { BuildManifest } from '../../types'
|
|
41
41
|
|
|
42
42
|
// The child reports one line per file it finishes — `<source>` for an imported
|
|
43
43
|
// route handler, `<source>\t<compiled>` for a compiled module. Everything else
|
|
44
44
|
// it prints is app output the parent passes through.
|
|
45
|
-
const DONE_MARKER = 'pnext-warm-done:'
|
|
45
|
+
const DONE_MARKER = 'pnext-warm-done:'
|
|
46
46
|
|
|
47
47
|
// Printed once compiles finish and before the handler loop starts: the
|
|
48
48
|
// compiled artifact set is already final at that boundary, so the parent can
|
|
49
49
|
// start tracing the node_modules closure while this process runs handlers.
|
|
50
|
-
const COMPILED_MARKER = 'pnext-warm-compiled'
|
|
50
|
+
const COMPILED_MARKER = 'pnext-warm-compiled'
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
53
|
* What the parent sends over stdin, one JSON object per line. A `prewarm`
|
|
@@ -56,21 +56,21 @@ const COMPILED_MARKER = 'pnext-warm-compiled';
|
|
|
56
56
|
*/
|
|
57
57
|
interface WarmRequest {
|
|
58
58
|
/** Files a previous attempt already finished — or died on. */
|
|
59
|
-
skip: string[]
|
|
59
|
+
skip: string[]
|
|
60
60
|
}
|
|
61
61
|
interface PrewarmRequest {
|
|
62
62
|
/** Page route sources, known from the route scan long before the manifest. */
|
|
63
|
-
prewarm: string[]
|
|
63
|
+
prewarm: string[]
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// An attempt still running after this long is not going to finish: something in
|
|
67
67
|
// the app's own code is holding the process. Bounded so the build completes
|
|
68
68
|
// instead of hanging forever.
|
|
69
|
-
const ATTEMPT_TIMEOUT_MS = 10 * 60_000
|
|
69
|
+
const ATTEMPT_TIMEOUT_MS = 10 * 60_000
|
|
70
70
|
|
|
71
71
|
// One clean pass, plus enough restarts to step over a couple of poisoned files
|
|
72
72
|
// before concluding the app cannot be warmed.
|
|
73
|
-
const MAX_ATTEMPTS = 3
|
|
73
|
+
const MAX_ATTEMPTS = 3
|
|
74
74
|
|
|
75
75
|
export interface WarmChild {
|
|
76
76
|
/**
|
|
@@ -78,17 +78,17 @@ export interface WarmChild {
|
|
|
78
78
|
* under the rest of the build. Optional and fire-and-forget: whatever it does
|
|
79
79
|
* not get to, `finish` compiles.
|
|
80
80
|
*/
|
|
81
|
-
prewarm(files: string[]): void
|
|
81
|
+
prewarm(files: string[]): void
|
|
82
82
|
/**
|
|
83
83
|
* Release the child to warm, and collect the module paths it compiled. `onCompiled`, if given,
|
|
84
84
|
* fires once - as soon as the child reaches its handler phase - with the modules compiled so far,
|
|
85
85
|
* which is already the final set: the caller can start tracing the node_modules closure while the
|
|
86
86
|
* child runs handlers concurrently.
|
|
87
87
|
*/
|
|
88
|
-
finish(log: VerboseLogger, onCompiled?: (modules: string[]) => void): Promise<string[]
|
|
88
|
+
finish(log: VerboseLogger, onCompiled?: (modules: string[]) => void): Promise<string[]>
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'
|
|
91
|
+
type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'>
|
|
92
92
|
|
|
93
93
|
/**
|
|
94
94
|
* Spawn the warm child. Call as early in the build as possible: it boots while the build runs and
|
|
@@ -96,31 +96,31 @@ type WarmProcess = Bun.Subprocess<'pipe', 'pipe', 'inherit'>;
|
|
|
96
96
|
* throws - a warm-up that cannot start degrades to "no warmed modules", which `finish` reports.
|
|
97
97
|
*/
|
|
98
98
|
export function startWarmChild(config: ResolvedConfig): WarmChild {
|
|
99
|
-
const spawn = () => spawnWarmProcess(config)
|
|
100
|
-
const first = spawn()
|
|
99
|
+
const spawn = () => spawnWarmProcess(config)
|
|
100
|
+
const first = spawn()
|
|
101
101
|
return {
|
|
102
102
|
prewarm(files) {
|
|
103
|
-
if (!first || files.length === 0) return
|
|
103
|
+
if (!first || files.length === 0) return
|
|
104
104
|
try {
|
|
105
|
-
void first.stdin.write(`${JSON.stringify({ prewarm: files } satisfies PrewarmRequest)}\n`)
|
|
106
|
-
void first.stdin.flush()
|
|
105
|
+
void first.stdin.write(`${JSON.stringify({ prewarm: files } satisfies PrewarmRequest)}\n`)
|
|
106
|
+
void first.stdin.flush()
|
|
107
107
|
} catch {
|
|
108
108
|
// broken pipe: the child is gone; `finish` reports why
|
|
109
109
|
}
|
|
110
110
|
},
|
|
111
111
|
finish: (log, onCompiled) => warmWithRestarts(first, spawn, log, onCompiled),
|
|
112
|
-
}
|
|
112
|
+
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
function spawnWarmProcess(config: ResolvedConfig): WarmProcess | undefined {
|
|
116
|
-
const entry = fileURLToPath(new URL(import.meta.url))
|
|
116
|
+
const entry = fileURLToPath(new URL(import.meta.url))
|
|
117
117
|
try {
|
|
118
118
|
return Bun.spawn(
|
|
119
119
|
[namedBunBinary('pnext-warm'), '--conditions=react-server', entry, config.root],
|
|
120
120
|
{ cwd: config.root, stdin: 'pipe', stdout: 'pipe', stderr: 'inherit', env: process.env },
|
|
121
|
-
)
|
|
121
|
+
)
|
|
122
122
|
} catch {
|
|
123
|
-
return undefined
|
|
123
|
+
return undefined // no child (fork limit, unsupported platform)
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
|
|
@@ -132,34 +132,39 @@ async function warmWithRestarts(
|
|
|
132
132
|
) {
|
|
133
133
|
// Source file -> compiled artifact. Handlers map to nothing but still count as
|
|
134
134
|
// finished, so a restart does not import them a second time.
|
|
135
|
-
const finished = new Map<string, string | undefined>()
|
|
136
|
-
const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file))
|
|
135
|
+
const finished = new Map<string, string | undefined>()
|
|
136
|
+
const compiled = () => [...finished.values()].filter((file): file is string => Boolean(file))
|
|
137
137
|
// The marker can only mean "compiled set final" the first time it fires —
|
|
138
138
|
// whichever attempt reaches its own handler phase first.
|
|
139
|
-
let fired = false
|
|
139
|
+
let fired = false
|
|
140
140
|
const fireOnCompiled = onCompiled
|
|
141
141
|
? () => {
|
|
142
|
-
if (fired) return
|
|
143
|
-
fired = true
|
|
144
|
-
onCompiled(compiled())
|
|
142
|
+
if (fired) return
|
|
143
|
+
fired = true
|
|
144
|
+
onCompiled(compiled())
|
|
145
145
|
}
|
|
146
|
-
: undefined
|
|
147
|
-
let child = first
|
|
146
|
+
: undefined
|
|
147
|
+
let child = first
|
|
148
148
|
for (let attempt = 1; attempt <= MAX_ATTEMPTS && child; attempt++) {
|
|
149
|
-
const before = finished.size
|
|
150
|
-
const failure = await runAttempt(
|
|
149
|
+
const before = finished.size
|
|
150
|
+
const failure = await runAttempt(
|
|
151
|
+
child,
|
|
152
|
+
{ skip: [...finished.keys()] },
|
|
153
|
+
finished,
|
|
154
|
+
fireOnCompiled,
|
|
155
|
+
)
|
|
151
156
|
if (!failure) {
|
|
152
|
-
log.log(`warmed ${compiled().length} modules`)
|
|
153
|
-
return compiled()
|
|
157
|
+
log.log(`warmed ${compiled().length} modules`)
|
|
158
|
+
return compiled()
|
|
154
159
|
}
|
|
155
160
|
// A restart only helps if the last one got somewhere; otherwise the first
|
|
156
161
|
// thing it would redo is what killed it.
|
|
157
|
-
child = finished.size > before && attempt < MAX_ATTEMPTS ? spawn() : undefined
|
|
158
|
-
if (child) log.log(`warm-up ${failure} after ${finished.size} files; restarting past them`)
|
|
159
|
-
else warmIncomplete(failure, finished.size)
|
|
162
|
+
child = finished.size > before && attempt < MAX_ATTEMPTS ? spawn() : undefined
|
|
163
|
+
if (child) log.log(`warm-up ${failure} after ${finished.size} files; restarting past them`)
|
|
164
|
+
else warmIncomplete(failure, finished.size)
|
|
160
165
|
}
|
|
161
|
-
fireOnCompiled?.()
|
|
162
|
-
return compiled()
|
|
166
|
+
fireOnCompiled?.()
|
|
167
|
+
return compiled()
|
|
163
168
|
}
|
|
164
169
|
|
|
165
170
|
/** Runs one attempt to completion. Returns undefined on success, else why it died. */
|
|
@@ -172,48 +177,48 @@ async function runAttempt(
|
|
|
172
177
|
try {
|
|
173
178
|
// Writing the request and closing stdin is the go-ahead; until then the
|
|
174
179
|
// child sits parked after its boot (or busy on a prewarm batch).
|
|
175
|
-
void child.stdin.write(`${JSON.stringify(request)}\n`)
|
|
176
|
-
void child.stdin.end()
|
|
180
|
+
void child.stdin.write(`${JSON.stringify(request)}\n`)
|
|
181
|
+
void child.stdin.end()
|
|
177
182
|
} catch {
|
|
178
183
|
// broken pipe: the child is already gone, and its exit below says why
|
|
179
184
|
}
|
|
180
|
-
const timeout = setTimeout(() => child.kill('SIGKILL'), ATTEMPT_TIMEOUT_MS)
|
|
181
|
-
timeout.unref?.()
|
|
185
|
+
const timeout = setTimeout(() => child.kill('SIGKILL'), ATTEMPT_TIMEOUT_MS)
|
|
186
|
+
timeout.unref?.()
|
|
182
187
|
|
|
183
188
|
// Streamed rather than buffered to completion: the compiled-phase marker
|
|
184
189
|
// has to reach the caller while this attempt is still running (the child's
|
|
185
190
|
// handler phase), not after the process exits.
|
|
186
191
|
const processLine = (line: string) => {
|
|
187
|
-
if (!line) return
|
|
192
|
+
if (!line) return
|
|
188
193
|
if (line === COMPILED_MARKER) {
|
|
189
|
-
onCompiled?.()
|
|
190
|
-
return
|
|
194
|
+
onCompiled?.()
|
|
195
|
+
return
|
|
191
196
|
}
|
|
192
197
|
if (!line.startsWith(DONE_MARKER)) {
|
|
193
|
-
console.log(line)
|
|
194
|
-
return
|
|
198
|
+
console.log(line) // app output
|
|
199
|
+
return
|
|
195
200
|
}
|
|
196
|
-
const [source, artifact] = line.slice(DONE_MARKER.length).split('\t')
|
|
197
|
-
if (source) finished.set(source, artifact || undefined)
|
|
198
|
-
}
|
|
199
|
-
const reader = child.stdout.getReader()
|
|
200
|
-
const decoder = new TextDecoder()
|
|
201
|
-
let buffer = ''
|
|
201
|
+
const [source, artifact] = line.slice(DONE_MARKER.length).split('\t')
|
|
202
|
+
if (source) finished.set(source, artifact || undefined)
|
|
203
|
+
}
|
|
204
|
+
const reader = child.stdout.getReader()
|
|
205
|
+
const decoder = new TextDecoder()
|
|
206
|
+
let buffer = ''
|
|
202
207
|
for (;;) {
|
|
203
|
-
const { done, value } = await reader.read()
|
|
204
|
-
if (done) break
|
|
205
|
-
buffer += decoder.decode(value, { stream: true })
|
|
206
|
-
let newline: number
|
|
208
|
+
const { done, value } = await reader.read()
|
|
209
|
+
if (done) break
|
|
210
|
+
buffer += decoder.decode(value, { stream: true })
|
|
211
|
+
let newline: number
|
|
207
212
|
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
208
|
-
processLine(buffer.slice(0, newline))
|
|
209
|
-
buffer = buffer.slice(newline + 1)
|
|
213
|
+
processLine(buffer.slice(0, newline))
|
|
214
|
+
buffer = buffer.slice(newline + 1)
|
|
210
215
|
}
|
|
211
216
|
}
|
|
212
|
-
if (buffer) processLine(buffer)
|
|
217
|
+
if (buffer) processLine(buffer)
|
|
213
218
|
|
|
214
|
-
const code = await child.exited.finally(() => clearTimeout(timeout))
|
|
215
|
-
if (code === 0) return undefined
|
|
216
|
-
return child.signalCode ? `was killed by ${child.signalCode}` : `exited with code ${code}
|
|
219
|
+
const code = await child.exited.finally(() => clearTimeout(timeout))
|
|
220
|
+
if (code === 0) return undefined
|
|
221
|
+
return child.signalCode ? `was killed by ${child.signalCode}` : `exited with code ${code}`
|
|
217
222
|
}
|
|
218
223
|
|
|
219
224
|
function warmIncomplete(failure: string, done: number) {
|
|
@@ -221,18 +226,18 @@ function warmIncomplete(failure: string, done: number) {
|
|
|
221
226
|
`vercel adapter: module warm-up ${failure} after warming ${done} file(s). The function ships ` +
|
|
222
227
|
'without the rest of its module cache and may fail to render those routes at request time, ' +
|
|
223
228
|
"where Vercel's filesystem is read-only.",
|
|
224
|
-
)
|
|
229
|
+
)
|
|
225
230
|
}
|
|
226
231
|
|
|
227
232
|
const report = (file: string, artifact?: string) => {
|
|
228
|
-
console.log(`${DONE_MARKER}${file}${artifact ? `\t${artifact}` : ''}`)
|
|
229
|
-
}
|
|
233
|
+
console.log(`${DONE_MARKER}${file}${artifact ? `\t${artifact}` : ''}`)
|
|
234
|
+
}
|
|
230
235
|
|
|
231
236
|
/** Every server module a page route pulls in: the page, its layouts, its conventions. */
|
|
232
237
|
function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
|
|
233
|
-
const files = new Set<string>()
|
|
234
|
-
const globalNotFound = path.join(config.appPath, 'not-found.tsx')
|
|
235
|
-
if (existsSync(globalNotFound)) files.add(globalNotFound)
|
|
238
|
+
const files = new Set<string>()
|
|
239
|
+
const globalNotFound = path.join(config.appPath, 'not-found.tsx')
|
|
240
|
+
if (existsSync(globalNotFound)) files.add(globalNotFound)
|
|
236
241
|
for (const routeFile of routeFiles) {
|
|
237
242
|
for (const file of [
|
|
238
243
|
routeFile,
|
|
@@ -241,14 +246,14 @@ function pageServerFiles(config: ResolvedConfig, routeFiles: Iterable<string>) {
|
|
|
241
246
|
findConventionFiles(config.appPath, routeFile, name),
|
|
242
247
|
),
|
|
243
248
|
]) {
|
|
244
|
-
if (existsSync(file)) files.add(file)
|
|
249
|
+
if (existsSync(file)) files.add(file)
|
|
245
250
|
}
|
|
246
251
|
}
|
|
247
|
-
return files
|
|
252
|
+
return files
|
|
248
253
|
}
|
|
249
254
|
|
|
250
255
|
const compileServer = (config: ResolvedConfig, file: string) =>
|
|
251
|
-
devServerModuleHref(config, file, 'build').then(href => report(file, fileURLToPath(href)))
|
|
256
|
+
devServerModuleHref(config, file, 'build').then(href => report(file, fileURLToPath(href)))
|
|
252
257
|
|
|
253
258
|
/**
|
|
254
259
|
* Compile the page routes' server modules from the build's route scan, long before the manifest
|
|
@@ -257,12 +262,12 @@ const compileServer = (config: ResolvedConfig, file: string) =>
|
|
|
257
262
|
* code, so it is safe to overlap (see the handler note below).
|
|
258
263
|
*/
|
|
259
264
|
export async function prewarmPageModules(config: ResolvedConfig, routeFiles: string[]) {
|
|
260
|
-
if (!getCompatModeExtensions().reactEnabled(config)) return
|
|
265
|
+
if (!getCompatModeExtensions().reactEnabled(config)) return
|
|
261
266
|
await Promise.all(
|
|
262
267
|
[...pageServerFiles(config, routeFiles)].map(file =>
|
|
263
268
|
compileServer(config, file).catch(() => undefined),
|
|
264
269
|
),
|
|
265
|
-
)
|
|
270
|
+
)
|
|
266
271
|
}
|
|
267
272
|
|
|
268
273
|
/**
|
|
@@ -274,19 +279,19 @@ export async function warmRouteModules(
|
|
|
274
279
|
manifest: BuildManifest,
|
|
275
280
|
skip: ReadonlySet<string> = new Set(),
|
|
276
281
|
) {
|
|
277
|
-
const clientFiles = new Set<string>()
|
|
278
|
-
const handlers: BuildManifest['routes'] = []
|
|
279
|
-
const pageRoutes: string[] = []
|
|
282
|
+
const clientFiles = new Set<string>()
|
|
283
|
+
const handlers: BuildManifest['routes'] = []
|
|
284
|
+
const pageRoutes: string[] = []
|
|
280
285
|
|
|
281
286
|
for (const route of manifest.routes) {
|
|
282
287
|
if (route.kind === 'handler') {
|
|
283
|
-
if (!skip.has(route.file)) handlers.push(route)
|
|
284
|
-
continue
|
|
288
|
+
if (!skip.has(route.file)) handlers.push(route)
|
|
289
|
+
continue
|
|
285
290
|
}
|
|
286
|
-
pageRoutes.push(route.file)
|
|
291
|
+
pageRoutes.push(route.file)
|
|
287
292
|
for (const reference of route.clientReferences) {
|
|
288
293
|
if (ssrClientReference(reference) && existsSync(reference.file)) {
|
|
289
|
-
clientFiles.add(reference.file)
|
|
294
|
+
clientFiles.add(reference.file)
|
|
290
295
|
}
|
|
291
296
|
}
|
|
292
297
|
}
|
|
@@ -305,9 +310,9 @@ export async function warmRouteModules(
|
|
|
305
310
|
report(file, fileURLToPath(href)),
|
|
306
311
|
),
|
|
307
312
|
),
|
|
308
|
-
])
|
|
313
|
+
])
|
|
309
314
|
}
|
|
310
|
-
console.log(COMPILED_MARKER)
|
|
315
|
+
console.log(COMPILED_MARKER)
|
|
311
316
|
|
|
312
317
|
// Handlers come last, and only once nothing else is in flight. Importing them runs the app's own
|
|
313
318
|
// server code (auth, db pools, telemetry), and that code running *concurrently* with the compile
|
|
@@ -315,16 +320,16 @@ export async function warmRouteModules(
|
|
|
315
320
|
// handlers alone against a populated cache never crash. Doing them after the compiles also means a
|
|
316
321
|
// crash here costs only the remaining handlers, not the whole module pass.
|
|
317
322
|
for (const route of handlers) {
|
|
318
|
-
registerServerRuntime(config, route.sourceFiles)
|
|
323
|
+
registerServerRuntime(config, route.sourceFiles)
|
|
319
324
|
// Reported before the import, not after: handlers are imported one at a
|
|
320
325
|
// time, so a handler that takes the process down is unambiguous and a
|
|
321
326
|
// restart must not run it again (Bun caches a failed import for the
|
|
322
327
|
// process' lifetime anyway, so a retry could not succeed either).
|
|
323
|
-
report(route.file)
|
|
328
|
+
report(route.file)
|
|
324
329
|
try {
|
|
325
|
-
await import(pathToFileHref(route.file))
|
|
330
|
+
await import(pathToFileHref(route.file))
|
|
326
331
|
} catch (error) {
|
|
327
|
-
console.warn(`vercel adapter: importing ${route.file} failed during warmup:`, error)
|
|
332
|
+
console.warn(`vercel adapter: importing ${route.file} failed during warmup:`, error)
|
|
328
333
|
}
|
|
329
334
|
}
|
|
330
335
|
}
|
|
@@ -334,42 +339,42 @@ export async function warmRouteModules(
|
|
|
334
339
|
* each prewarm batch as it arrives. Returns the final request.
|
|
335
340
|
*/
|
|
336
341
|
async function readWarmRequests(config: ResolvedConfig): Promise<Partial<WarmRequest>> {
|
|
337
|
-
let buffer = ''
|
|
338
|
-
const decoder = new TextDecoder()
|
|
339
|
-
const reader = Bun.stdin.stream().getReader()
|
|
342
|
+
let buffer = ''
|
|
343
|
+
const decoder = new TextDecoder()
|
|
344
|
+
const reader = Bun.stdin.stream().getReader()
|
|
340
345
|
for (;;) {
|
|
341
|
-
const { done, value } = await reader.read()
|
|
342
|
-
if (done) break
|
|
343
|
-
buffer += decoder.decode(value, { stream: true })
|
|
344
|
-
let newline: number
|
|
346
|
+
const { done, value } = await reader.read()
|
|
347
|
+
if (done) break
|
|
348
|
+
buffer += decoder.decode(value, { stream: true })
|
|
349
|
+
let newline: number
|
|
345
350
|
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
346
|
-
const line = buffer.slice(0, newline).trim()
|
|
347
|
-
buffer = buffer.slice(newline + 1)
|
|
348
|
-
if (!line) continue
|
|
349
|
-
const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest
|
|
350
|
-
if (message.skip) return message
|
|
351
|
-
if (message.prewarm) await prewarmPageModules(config, message.prewarm)
|
|
351
|
+
const line = buffer.slice(0, newline).trim()
|
|
352
|
+
buffer = buffer.slice(newline + 1)
|
|
353
|
+
if (!line) continue
|
|
354
|
+
const message = JSON.parse(line) as Partial<WarmRequest & PrewarmRequest>
|
|
355
|
+
if (message.skip) return message
|
|
356
|
+
if (message.prewarm) await prewarmPageModules(config, message.prewarm)
|
|
352
357
|
}
|
|
353
358
|
}
|
|
354
|
-
const rest = buffer.trim()
|
|
355
|
-
return rest ? (JSON.parse(rest) as Partial<WarmRequest>) : {}
|
|
359
|
+
const rest = buffer.trim()
|
|
360
|
+
return rest ? (JSON.parse(rest) as Partial<WarmRequest>) : {}
|
|
356
361
|
}
|
|
357
362
|
|
|
358
363
|
if (import.meta.main) {
|
|
359
|
-
const root = process.argv[2]
|
|
360
|
-
const config = await loadConfig(root)
|
|
361
|
-
await bootstrapCompat(config)
|
|
364
|
+
const root = process.argv[2]
|
|
365
|
+
const config = await loadConfig(root)
|
|
366
|
+
await bootstrapCompat(config)
|
|
362
367
|
// This process only ever runs for a vercel-adapter build; record each
|
|
363
368
|
// artifact's specifiers so the parent's trace step can read them back.
|
|
364
|
-
setEmitCompiledSpecifiersManifest(true)
|
|
369
|
+
setEmitCompiledSpecifiersManifest(true)
|
|
365
370
|
// Blocks until the parent sends the go-ahead, i.e. until the manifest is
|
|
366
371
|
// written; a prewarm batch may arrive and run before that.
|
|
367
|
-
const request = await readWarmRequests(config)
|
|
372
|
+
const request = await readWarmRequests(config)
|
|
368
373
|
const manifest = JSON.parse(
|
|
369
374
|
await readFile(path.join(config.outPath, 'manifest.json'), 'utf8'),
|
|
370
|
-
) as BuildManifest
|
|
371
|
-
await warmRouteModules(config, manifest, new Set(request.skip ?? []))
|
|
375
|
+
) as BuildManifest
|
|
376
|
+
await warmRouteModules(config, manifest, new Set(request.skip ?? []))
|
|
372
377
|
// App code reached through a route handler can leave the loop alive (a db
|
|
373
378
|
// pool, a stray interval); the warm pass is done either way.
|
|
374
|
-
process.exit(0)
|
|
379
|
+
process.exit(0)
|
|
375
380
|
}
|