@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,19 +1,19 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
-
import { builtinModules } from 'node:module'
|
|
4
|
-
import { listFilesSync } from '../../utils/fs'
|
|
5
|
-
import type { ResolvedConfig } from '../../config'
|
|
6
|
-
import { nextCompatEnabled } from '
|
|
7
|
-
import { importSpecifiers } from '../../resolve/scan-facts'
|
|
8
|
-
import { readSourceSync } from '../../resolve/source-text'
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
+
import { builtinModules } from 'node:module'
|
|
4
|
+
import { listFilesSync } from '../../utils/fs'
|
|
5
|
+
import type { ResolvedConfig } from '../../config'
|
|
6
|
+
import { nextCompatEnabled } from '../aliases'
|
|
7
|
+
import { importSpecifiers } from '../../resolve/scan-facts'
|
|
8
|
+
import { readSourceSync } from '../../resolve/source-text'
|
|
9
9
|
import {
|
|
10
10
|
packageNameOfSpecifier,
|
|
11
11
|
resolutionRootForFile,
|
|
12
12
|
resolvePackageSpecifier,
|
|
13
|
-
} from '../../resolve/imports'
|
|
14
|
-
import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect'
|
|
15
|
-
import { canonical, canonicalActionId } from './client-plugin'
|
|
16
|
-
import { registerActionModule, type ActionEntry } from './registry'
|
|
13
|
+
} from '../../resolve/imports'
|
|
14
|
+
import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect'
|
|
15
|
+
import { canonical, canonicalActionId } from './client-plugin'
|
|
16
|
+
import { registerActionModule, type ActionEntry } from './registry'
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* One discovered server-action module: its source path, the action export
|
|
@@ -23,26 +23,26 @@ import { registerActionModule, type ActionEntry } from './registry';
|
|
|
23
23
|
*/
|
|
24
24
|
export interface DiscoveredActionModule {
|
|
25
25
|
/** Source file of the 'use server' module. */
|
|
26
|
-
file: string
|
|
26
|
+
file: string
|
|
27
27
|
/** Action export names (named exports + 'default'). */
|
|
28
|
-
exports: string[]
|
|
28
|
+
exports: string[]
|
|
29
29
|
/** actionId(file, exportName, root) keyed by export name. */
|
|
30
|
-
ids: Record<string, string
|
|
30
|
+
ids: Record<string, string>
|
|
31
31
|
/** What runAction hands to importModule() (defaults to `file`). */
|
|
32
|
-
modulePath: string
|
|
32
|
+
modulePath: string
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export interface ActionDiscovery {
|
|
36
|
-
modules: DiscoveredActionModule[]
|
|
36
|
+
modules: DiscoveredActionModule[]
|
|
37
37
|
/** Every source file that is a 'use server' module, for the client alias. */
|
|
38
|
-
actionFiles: Set<string
|
|
38
|
+
actionFiles: Set<string>
|
|
39
39
|
/**
|
|
40
40
|
* First-party files that import a node_modules action module. The route-fact scan's client-entry-reason
|
|
41
41
|
* walk never descends into node_modules (see collectSourceFiles), so a route reaching an action only
|
|
42
42
|
* through one of these files needs its 'actions' reason added explicitly - the action file itself never
|
|
43
43
|
* lands in route.sourceFiles the way a first-party action module does.
|
|
44
44
|
*/
|
|
45
|
-
actionImporters: Set<string
|
|
45
|
+
actionImporters: Set<string>
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -58,62 +58,59 @@ export async function discoverActions(
|
|
|
58
58
|
config: ResolvedConfig,
|
|
59
59
|
options: { modulePathFor?: (file: string) => string } = {},
|
|
60
60
|
): Promise<ActionDiscovery> {
|
|
61
|
-
const empty: ActionDiscovery = { modules: [], actionFiles: new Set(), actionImporters: new Set() }
|
|
62
|
-
if (!nextCompatEnabled(config)) return empty
|
|
61
|
+
const empty: ActionDiscovery = { modules: [], actionFiles: new Set(), actionImporters: new Set() }
|
|
62
|
+
if (!nextCompatEnabled(config)) return empty
|
|
63
63
|
|
|
64
|
-
const roots = actionScanRoots(config)
|
|
65
|
-
const seen = new Set<string>()
|
|
66
|
-
const files: string[] = []
|
|
64
|
+
const roots = actionScanRoots(config)
|
|
65
|
+
const seen = new Set<string>()
|
|
66
|
+
const files: string[] = []
|
|
67
67
|
// Synchronous on purpose: every await hands the loop back to the build's sync route-fact walk and
|
|
68
68
|
// gate steps, which hold it long enough to stretch this work into a span the client stage then
|
|
69
69
|
// waits on. Running it straight through costs the same CPU and unblocks the stage.
|
|
70
|
-
const listings = roots.map(root => (existsSync(root) ? listFilesSync(root) : []))
|
|
70
|
+
const listings = roots.map(root => (existsSync(root) ? listFilesSync(root) : []))
|
|
71
71
|
for (const listing of listings) {
|
|
72
72
|
for (const file of listing) {
|
|
73
|
-
const resolved = path.resolve(file)
|
|
74
|
-
if (seen.has(resolved) || !isScriptFile(resolved)) continue
|
|
75
|
-
seen.add(resolved)
|
|
76
|
-
files.push(resolved)
|
|
73
|
+
const resolved = path.resolve(file)
|
|
74
|
+
if (seen.has(resolved) || !isScriptFile(resolved)) continue
|
|
75
|
+
seen.add(resolved)
|
|
76
|
+
files.push(resolved)
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
const sources = readSources(files)
|
|
80
|
-
const { files: nodeModuleActionFiles, importers: actionImporters } =
|
|
81
|
-
config,
|
|
82
|
-
files,
|
|
83
|
-
sources,
|
|
84
|
-
seen,
|
|
85
|
-
);
|
|
79
|
+
const sources = readSources(files)
|
|
80
|
+
const { files: nodeModuleActionFiles, importers: actionImporters } =
|
|
81
|
+
discoverNodeModuleActionFiles(config, files, sources, seen)
|
|
86
82
|
for (const file of nodeModuleActionFiles) {
|
|
87
|
-
files.push(file)
|
|
88
|
-
seen.add(file)
|
|
83
|
+
files.push(file)
|
|
84
|
+
seen.add(file)
|
|
89
85
|
}
|
|
90
86
|
for (const [file, source] of readSources(files.filter(file => !sources.has(file)))) {
|
|
91
|
-
sources.set(file, source)
|
|
87
|
+
sources.set(file, source)
|
|
92
88
|
}
|
|
93
89
|
|
|
94
|
-
const modules: DiscoveredActionModule[] = []
|
|
95
|
-
const actionFiles = new Set<string>()
|
|
90
|
+
const modules: DiscoveredActionModule[] = []
|
|
91
|
+
const actionFiles = new Set<string>()
|
|
96
92
|
for (const file of files) {
|
|
97
|
-
const source = sources.get(file)
|
|
93
|
+
const source = sources.get(file)!
|
|
98
94
|
// Module-level 'use cache' files are server-reference modules too: their
|
|
99
95
|
// exports cross to client components as RPC stubs (Next semantics — the
|
|
100
96
|
// cached function always runs, and caches, on the server).
|
|
101
|
-
if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) continue
|
|
102
|
-
const exports = moduleActionExports(source)
|
|
103
|
-
if (exports.length === 0) continue
|
|
97
|
+
if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) continue
|
|
98
|
+
const exports = moduleActionExports(source)
|
|
99
|
+
if (exports.length === 0) continue
|
|
104
100
|
|
|
105
|
-
const ids: Record<string, string> = {}
|
|
106
|
-
for (const exportName of exports)
|
|
101
|
+
const ids: Record<string, string> = {}
|
|
102
|
+
for (const exportName of exports)
|
|
103
|
+
ids[exportName] = canonicalActionId(file, exportName, config.root)
|
|
107
104
|
modules.push({
|
|
108
105
|
file,
|
|
109
106
|
exports,
|
|
110
107
|
ids,
|
|
111
108
|
modulePath: options.modulePathFor ? options.modulePathFor(file) : file,
|
|
112
|
-
})
|
|
113
|
-
actionFiles.add(file)
|
|
109
|
+
})
|
|
110
|
+
actionFiles.add(file)
|
|
114
111
|
}
|
|
115
112
|
|
|
116
|
-
return { modules, actionFiles, actionImporters }
|
|
113
|
+
return { modules, actionFiles, actionImporters }
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
/**
|
|
@@ -124,8 +121,8 @@ export function registerDiscoveredActions(
|
|
|
124
121
|
config: ResolvedConfig,
|
|
125
122
|
discovery: ActionDiscovery,
|
|
126
123
|
): ActionEntry[] {
|
|
127
|
-
const entries: ActionEntry[] = []
|
|
128
|
-
const root = canonical(config.root)
|
|
124
|
+
const entries: ActionEntry[] = []
|
|
125
|
+
const root = canonical(config.root)
|
|
129
126
|
for (const module of discovery.modules) {
|
|
130
127
|
// Canonical (file, root) so registry ids match the client stub / manifest.
|
|
131
128
|
entries.push(
|
|
@@ -133,9 +130,9 @@ export function registerDiscoveredActions(
|
|
|
133
130
|
root,
|
|
134
131
|
modulePath: module.modulePath,
|
|
135
132
|
}),
|
|
136
|
-
)
|
|
133
|
+
)
|
|
137
134
|
}
|
|
138
|
-
return entries
|
|
135
|
+
return entries
|
|
139
136
|
}
|
|
140
137
|
|
|
141
138
|
// Server actions live under the app dir and (for monorepos) may be shared from
|
|
@@ -143,24 +140,24 @@ export function registerDiscoveredActions(
|
|
|
143
140
|
// app dir plus the project src dir if present — the common home for a shared
|
|
144
141
|
// actions module. node_modules and the build output are excluded.
|
|
145
142
|
function actionScanRoots(config: ResolvedConfig) {
|
|
146
|
-
const roots = new Set<string>([config.appPath])
|
|
143
|
+
const roots = new Set<string>([config.appPath])
|
|
147
144
|
if (config.appPath.includes('pnext-pages-compat')) {
|
|
148
|
-
const rootApp = path.join(config.root, 'app')
|
|
149
|
-
if (existsSync(rootApp)) roots.add(rootApp)
|
|
150
|
-
const srcApp = path.join(config.root, 'src', 'app')
|
|
151
|
-
if (existsSync(srcApp)) roots.add(srcApp)
|
|
145
|
+
const rootApp = path.join(config.root, 'app')
|
|
146
|
+
if (existsSync(rootApp)) roots.add(rootApp)
|
|
147
|
+
const srcApp = path.join(config.root, 'src', 'app')
|
|
148
|
+
if (existsSync(srcApp)) roots.add(srcApp)
|
|
152
149
|
}
|
|
153
|
-
const srcDir = path.join(config.root, 'src')
|
|
154
|
-
if (existsSync(srcDir)) roots.add(srcDir)
|
|
155
|
-
return [...roots]
|
|
150
|
+
const srcDir = path.join(config.root, 'src')
|
|
151
|
+
if (existsSync(srcDir)) roots.add(srcDir)
|
|
152
|
+
return [...roots]
|
|
156
153
|
}
|
|
157
154
|
|
|
158
155
|
function isScriptFile(file: string) {
|
|
159
|
-
if (file.includes(`${path.sep}node_modules${path.sep}`)) return false
|
|
160
|
-
return /\.(?:tsx?|jsx?|mjs)$/.test(file) && !file.endsWith('.d.ts')
|
|
156
|
+
if (file.includes(`${path.sep}node_modules${path.sep}`)) return false
|
|
157
|
+
return /\.(?:tsx?|jsx?|mjs)$/.test(file) && !file.endsWith('.d.ts')
|
|
161
158
|
}
|
|
162
159
|
|
|
163
|
-
const ACTION_RESOLVE_CONDITIONS = ['react-server', 'node', 'import', 'module', 'default'] as const
|
|
160
|
+
const ACTION_RESOLVE_CONDITIONS = ['react-server', 'node', 'import', 'module', 'default'] as const
|
|
164
161
|
/**
|
|
165
162
|
* node_modules packages that export module-level 'use server' modules the app imports directly.
|
|
166
163
|
* Reading a file's real imports costs an oxc parse - but an import specifier is always a quoted string
|
|
@@ -173,89 +170,92 @@ function discoverNodeModuleActionFiles(
|
|
|
173
170
|
sources: Map<string, string>,
|
|
174
171
|
seen: Set<string>,
|
|
175
172
|
): { files: string[]; importers: Set<string> } {
|
|
176
|
-
const actionFiles = new Set<string>()
|
|
177
|
-
const importers = new Set<string>()
|
|
173
|
+
const actionFiles = new Set<string>()
|
|
174
|
+
const importers = new Set<string>()
|
|
178
175
|
// A bare specifier resolves purely from the importer's resolution root, so
|
|
179
176
|
// both the resolution and the 'use server' verdict are cached app-wide, and
|
|
180
177
|
// each is derived only for the specifiers a file actually reaches.
|
|
181
|
-
const targets = new Map<string, string | undefined>()
|
|
182
|
-
const verdicts = new Map<string, boolean>()
|
|
178
|
+
const targets = new Map<string, string | undefined>()
|
|
179
|
+
const verdicts = new Map<string, boolean>()
|
|
183
180
|
const actionTarget = (resolveRoot: string, file: string, specifier: string) => {
|
|
184
|
-
const packageName = packageNameOfSpecifier(specifier)
|
|
185
|
-
if (!packageName || builtinModules.includes(packageName)) return undefined
|
|
186
|
-
const key = `${resolveRoot}\0${specifier}
|
|
181
|
+
const packageName = packageNameOfSpecifier(specifier)
|
|
182
|
+
if (!packageName || builtinModules.includes(packageName)) return undefined
|
|
183
|
+
const key = `${resolveRoot}\0${specifier}`
|
|
187
184
|
if (!targets.has(key)) {
|
|
188
|
-
targets.set(
|
|
185
|
+
targets.set(
|
|
186
|
+
key,
|
|
187
|
+
resolvePackageSpecifier(config.root, file, specifier, ACTION_RESOLVE_CONDITIONS),
|
|
188
|
+
)
|
|
189
189
|
}
|
|
190
|
-
const resolved = targets.get(key)
|
|
191
|
-
if (!resolved) return undefined
|
|
192
|
-
const absolute = path.resolve(resolved)
|
|
193
|
-
if (seen.has(absolute) || !isNodeModuleScriptFile(absolute)) return undefined
|
|
194
|
-
let verdict = verdicts.get(absolute)
|
|
190
|
+
const resolved = targets.get(key)
|
|
191
|
+
if (!resolved) return undefined
|
|
192
|
+
const absolute = path.resolve(resolved)
|
|
193
|
+
if (seen.has(absolute) || !isNodeModuleScriptFile(absolute)) return undefined
|
|
194
|
+
let verdict = verdicts.get(absolute)
|
|
195
195
|
if (verdict === undefined) {
|
|
196
196
|
// An unreadable candidate is simply not an action module.
|
|
197
197
|
try {
|
|
198
|
-
verdict = moduleLevelUseServer(readFileSync(absolute, 'utf8'))
|
|
198
|
+
verdict = moduleLevelUseServer(readFileSync(absolute, 'utf8'))
|
|
199
199
|
} catch {
|
|
200
|
-
verdict = false
|
|
200
|
+
verdict = false
|
|
201
201
|
}
|
|
202
|
-
verdicts.set(absolute, verdict)
|
|
202
|
+
verdicts.set(absolute, verdict)
|
|
203
203
|
}
|
|
204
|
-
return verdict ? absolute : undefined
|
|
205
|
-
}
|
|
204
|
+
return verdict ? absolute : undefined
|
|
205
|
+
}
|
|
206
206
|
|
|
207
207
|
for (const file of sourceFiles) {
|
|
208
|
-
const source = sources.get(file) ?? ''
|
|
209
|
-
const resolveRoot = resolutionRootForFile(config.root, file)
|
|
210
|
-
let reachable = false
|
|
208
|
+
const source = sources.get(file) ?? ''
|
|
209
|
+
const resolveRoot = resolutionRootForFile(config.root, file)
|
|
210
|
+
let reachable = false
|
|
211
211
|
for (const candidate of candidateSpecifiers(source)) {
|
|
212
212
|
if (actionTarget(resolveRoot, file, candidate)) {
|
|
213
|
-
reachable = true
|
|
214
|
-
break
|
|
213
|
+
reachable = true
|
|
214
|
+
break
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
// No candidate resolves to an action module, so neither can the file's real
|
|
218
218
|
// imports (a subset) — the parse would only reproduce this answer.
|
|
219
|
-
if (!reachable) continue
|
|
219
|
+
if (!reachable) continue
|
|
220
220
|
for (const specifier of importSpecifiers(source, file)) {
|
|
221
|
-
const target = actionTarget(resolveRoot, file, specifier)
|
|
221
|
+
const target = actionTarget(resolveRoot, file, specifier)
|
|
222
222
|
if (target) {
|
|
223
|
-
actionFiles.add(target)
|
|
224
|
-
importers.add(file)
|
|
223
|
+
actionFiles.add(target)
|
|
224
|
+
importers.add(file)
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
|
-
return { files: [...actionFiles], importers }
|
|
228
|
+
return { files: [...actionFiles], importers }
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
// Every string literal in an import position: `from 'x'`, `import 'x'`,
|
|
232
232
|
// `import('x')`, `require('x')`. Deliberately looser than the grammar (it also
|
|
233
233
|
// matches inside comments and strings) — over-reporting only costs a resolve.
|
|
234
234
|
const importedLiteral =
|
|
235
|
-
/\b(?:from|import|require)\s*\(?\s*(?:\/\*[\s\S]*?\*\/\s*)?(['"])([^'"\n]{1,256})\1/g
|
|
235
|
+
/\b(?:from|import|require)\s*\(?\s*(?:\/\*[\s\S]*?\*\/\s*)?(['"])([^'"\n]{1,256})\1/g
|
|
236
236
|
// npm package names are lowercase `[a-z0-9._-]` with an optional @scope, so a
|
|
237
237
|
// literal with whitespace or a leading ./ can never be a bare specifier.
|
|
238
|
-
const bareSpecifier = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:\/[^\s]+)?$/i
|
|
238
|
+
const bareSpecifier = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:\/[^\s]+)?$/i
|
|
239
239
|
|
|
240
240
|
/** Every literal in the source that could be an imported bare package specifier. */
|
|
241
241
|
function candidateSpecifiers(source: string) {
|
|
242
|
-
const found = new Set<string>()
|
|
243
|
-
importedLiteral.lastIndex = 0
|
|
244
|
-
let match: RegExpExecArray | null
|
|
242
|
+
const found = new Set<string>()
|
|
243
|
+
importedLiteral.lastIndex = 0
|
|
244
|
+
let match: RegExpExecArray | null
|
|
245
245
|
while ((match = importedLiteral.exec(source))) {
|
|
246
|
-
const value = match[2]
|
|
247
|
-
if (bareSpecifier.test(value)) found.add(value)
|
|
246
|
+
const value = match[2]!
|
|
247
|
+
if (bareSpecifier.test(value)) found.add(value)
|
|
248
248
|
}
|
|
249
|
-
return found
|
|
249
|
+
return found
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
/** Read each file once (build-scope cached: the walk's reads are free here). */
|
|
253
253
|
function readSources(files: string[]) {
|
|
254
|
-
const sources = new Map<string, string>()
|
|
255
|
-
for (const file of files) sources.set(file, readSourceSync(file))
|
|
256
|
-
return sources
|
|
254
|
+
const sources = new Map<string, string>()
|
|
255
|
+
for (const file of files) sources.set(file, readSourceSync(file))
|
|
256
|
+
return sources
|
|
257
257
|
}
|
|
258
258
|
|
|
259
259
|
function isNodeModuleScriptFile(file: string) {
|
|
260
|
-
return /\.(?:tsx?|jsx?|mjs|cjs|cts)$/.test(file) && !file.endsWith('.d.ts')
|
|
260
|
+
return /\.(?:tsx?|jsx?|mjs|cjs|cts)$/.test(file) && !file.endsWith('.d.ts')
|
|
261
261
|
}
|