@wular/pnext 0.0.4 → 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 -1992
- 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 -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 +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} +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 +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 +827 -815
- 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
|
@@ -2,76 +2,76 @@
|
|
|
2
2
|
// independent scan of app-dir layouts/slots and the pages/ directory, plus the
|
|
3
3
|
// redirects/rewrites from next.config. Feeds the Next-identical codegen in
|
|
4
4
|
// ./typegen.ts. Compat-only.
|
|
5
|
-
import { existsSync } from 'node:fs'
|
|
6
|
-
import { readdir } from 'node:fs/promises'
|
|
7
|
-
import path from 'node:path'
|
|
8
|
-
import type { ResolvedConfig } from '../../config'
|
|
9
|
-
import type { RouteManifestEntry } from '../../types'
|
|
10
|
-
import { toPosixPath } from '../../utils/fs'
|
|
5
|
+
import { existsSync } from 'node:fs'
|
|
6
|
+
import { readdir } from 'node:fs/promises'
|
|
7
|
+
import path from 'node:path'
|
|
8
|
+
import type { ResolvedConfig } from '../../config'
|
|
9
|
+
import type { RouteManifestEntry } from '../../types'
|
|
10
|
+
import { toPosixPath } from '../../utils/fs'
|
|
11
11
|
|
|
12
12
|
/** path-to-regexp group info, mirroring Next's `getRouteRegex().groups`. */
|
|
13
13
|
export interface Group {
|
|
14
|
-
pos: number
|
|
15
|
-
repeat: boolean
|
|
16
|
-
optional: boolean
|
|
14
|
+
pos: number
|
|
15
|
+
repeat: boolean
|
|
16
|
+
optional: boolean
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export interface ManifestRouteInfo {
|
|
20
|
-
path: string
|
|
21
|
-
groups: Record<string, Group
|
|
20
|
+
path: string
|
|
21
|
+
groups: Record<string, Group>
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export interface RouteTypesManifest {
|
|
25
|
-
appRoutes: Record<string, ManifestRouteInfo
|
|
26
|
-
pageRoutes: Record<string, ManifestRouteInfo
|
|
27
|
-
layoutRoutes: Record<string, ManifestRouteInfo & { slots: string[] }
|
|
28
|
-
appRouteHandlerRoutes: Record<string, ManifestRouteInfo
|
|
29
|
-
redirectRoutes: Record<string, ManifestRouteInfo
|
|
30
|
-
rewriteRoutes: Record<string, ManifestRouteInfo
|
|
31
|
-
appPagePaths: Set<string
|
|
32
|
-
pagesRouterPagePaths: Set<string
|
|
33
|
-
layoutPaths: Set<string
|
|
34
|
-
appRouteHandlers: Set<string
|
|
35
|
-
pageApiRoutes: Set<string
|
|
36
|
-
filePathToRoute: Map<string, string
|
|
25
|
+
appRoutes: Record<string, ManifestRouteInfo>
|
|
26
|
+
pageRoutes: Record<string, ManifestRouteInfo>
|
|
27
|
+
layoutRoutes: Record<string, ManifestRouteInfo & { slots: string[] }>
|
|
28
|
+
appRouteHandlerRoutes: Record<string, ManifestRouteInfo>
|
|
29
|
+
redirectRoutes: Record<string, ManifestRouteInfo>
|
|
30
|
+
rewriteRoutes: Record<string, ManifestRouteInfo>
|
|
31
|
+
appPagePaths: Set<string>
|
|
32
|
+
pagesRouterPagePaths: Set<string>
|
|
33
|
+
layoutPaths: Set<string>
|
|
34
|
+
appRouteHandlers: Set<string>
|
|
35
|
+
pageApiRoutes: Set<string>
|
|
36
|
+
filePathToRoute: Map<string, string>
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
const PAGE_EXTENSIONS = ['tsx', 'ts', 'jsx', 'js', 'mdx', 'md']
|
|
40
|
-
const LAYOUT_NAMES = new Set(PAGE_EXTENSIONS.map(ext => `layout.${ext}`))
|
|
39
|
+
const PAGE_EXTENSIONS = ['tsx', 'ts', 'jsx', 'js', 'mdx', 'md']
|
|
40
|
+
const LAYOUT_NAMES = new Set(PAGE_EXTENSIONS.map(ext => `layout.${ext}`))
|
|
41
41
|
|
|
42
42
|
function isGroupSegment(name: string): boolean {
|
|
43
|
-
return name.startsWith('(') && name.endsWith(')')
|
|
43
|
+
return name.startsWith('(') && name.endsWith(')')
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
function isSlotSegment(name: string): boolean {
|
|
47
|
-
return name.startsWith('@')
|
|
47
|
+
return name.startsWith('@')
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
function decodeLiteral(segment: string): string {
|
|
51
|
-
return segment.replace(/%5[Ff]/g, '_')
|
|
51
|
+
return segment.replace(/%5[Ff]/g, '_')
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/** Extract groups (param name -> shape) from a bracket-syntax route. */
|
|
55
55
|
function groupsFromBracketRoute(route: string): Record<string, Group> {
|
|
56
|
-
const groups: Record<string, Group> = {}
|
|
57
|
-
let pos = 1
|
|
56
|
+
const groups: Record<string, Group> = {}
|
|
57
|
+
let pos = 1
|
|
58
58
|
for (const segment of route.split('/').filter(Boolean)) {
|
|
59
|
-
const optionalCatchAll = /^\[\[\.\.\.(.+)\]\]$/.exec(segment)
|
|
59
|
+
const optionalCatchAll = /^\[\[\.\.\.(.+)\]\]$/.exec(segment)
|
|
60
60
|
if (optionalCatchAll?.[1]) {
|
|
61
|
-
groups[optionalCatchAll[1]] = { pos: pos++, repeat: true, optional: true }
|
|
62
|
-
continue
|
|
61
|
+
groups[optionalCatchAll[1]] = { pos: pos++, repeat: true, optional: true }
|
|
62
|
+
continue
|
|
63
63
|
}
|
|
64
|
-
const catchAll = /^\[\.\.\.(.+)\]$/.exec(segment)
|
|
64
|
+
const catchAll = /^\[\.\.\.(.+)\]$/.exec(segment)
|
|
65
65
|
if (catchAll?.[1]) {
|
|
66
|
-
groups[catchAll[1]] = { pos: pos++, repeat: true, optional: false }
|
|
67
|
-
continue
|
|
66
|
+
groups[catchAll[1]] = { pos: pos++, repeat: true, optional: false }
|
|
67
|
+
continue
|
|
68
68
|
}
|
|
69
|
-
const param = /^\[(.+)\]$/.exec(segment)
|
|
69
|
+
const param = /^\[(.+)\]$/.exec(segment)
|
|
70
70
|
if (param?.[1]) {
|
|
71
|
-
groups[param[1]] = { pos: pos++, repeat: false, optional: false }
|
|
71
|
+
groups[param[1]] = { pos: pos++, repeat: false, optional: false }
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
return groups
|
|
74
|
+
return groups
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
@@ -79,52 +79,53 @@ function groupsFromBracketRoute(route: string): Record<string, Group> {
|
|
|
79
79
|
* `%5F` decoded) plus its catch-all flags into Next bracket syntax.
|
|
80
80
|
*/
|
|
81
81
|
function bracketRouteFromEntry(entry: RouteManifestEntry): string {
|
|
82
|
-
const segments = entry.route
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
82
|
+
const segments = entry.route
|
|
83
|
+
.split('/')
|
|
84
|
+
.filter(Boolean)
|
|
85
|
+
.map(segment => {
|
|
86
|
+
const catchAll = /^:(.+)\*$/.exec(segment)
|
|
87
|
+
if (catchAll?.[1]) {
|
|
88
|
+
const name = catchAll[1]
|
|
89
|
+
return name === entry.catchAll && entry.catchAllOptional ? `[[...${name}]]` : `[...${name}]`
|
|
90
|
+
}
|
|
91
|
+
const param = /^:(.+)$/.exec(segment)
|
|
92
|
+
if (param?.[1]) return `[${param[1]}]`
|
|
93
|
+
return segment
|
|
94
|
+
})
|
|
95
|
+
return `/${segments.join('/')}`.replace(/\/$/, '') || '/'
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
/** Bracket route derived from a directory path relative to app/ (for layouts). */
|
|
98
99
|
function bracketRouteFromDir(relativeDir: string): string {
|
|
99
|
-
const segments: string[] = []
|
|
100
|
+
const segments: string[] = []
|
|
100
101
|
for (const segment of relativeDir.split('/').filter(Boolean)) {
|
|
101
|
-
if (isGroupSegment(segment) || isSlotSegment(segment)) continue
|
|
102
|
+
if (isGroupSegment(segment) || isSlotSegment(segment)) continue
|
|
102
103
|
if (/^\[\[?\.\.\..+\]\]?$/.test(segment) || /^\[.+\]$/.test(segment)) {
|
|
103
|
-
segments.push(segment)
|
|
104
|
+
segments.push(segment)
|
|
104
105
|
} else {
|
|
105
|
-
segments.push(decodeLiteral(segment))
|
|
106
|
+
segments.push(decodeLiteral(segment))
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
|
-
return `/${segments.join('/')}`.replace(/\/$/, '') || '/'
|
|
109
|
+
return `/${segments.join('/')}`.replace(/\/$/, '') || '/'
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
function pagesRouteFromRelative(relative: string): string {
|
|
112
|
-
const withoutExt = relative.replace(/\.[^.]+$/, '')
|
|
113
|
-
const trimmed = withoutExt.replace(/\/index$/, '').replace(/^index$/, '')
|
|
114
|
-
const route = `/${trimmed}`.replace(/\/$/, '') || '/'
|
|
115
|
-
return route
|
|
113
|
+
const withoutExt = relative.replace(/\.[^.]+$/, '')
|
|
114
|
+
const trimmed = withoutExt.replace(/\/index$/, '').replace(/^index$/, '')
|
|
115
|
+
const route = `/${trimmed}`.replace(/\/$/, '') || '/'
|
|
116
|
+
return route
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
async function walkFiles(dir: string): Promise<string[]> {
|
|
119
|
-
if (!existsSync(dir)) return []
|
|
120
|
-
const out: string[] = []
|
|
121
|
-
const entries = await readdir(dir, { withFileTypes: true })
|
|
120
|
+
if (!existsSync(dir)) return []
|
|
121
|
+
const out: string[] = []
|
|
122
|
+
const entries = await readdir(dir, { withFileTypes: true })
|
|
122
123
|
for (const entry of entries) {
|
|
123
|
-
const full = path.join(dir, entry.name)
|
|
124
|
-
if (entry.isDirectory()) out.push(...(await walkFiles(full)))
|
|
125
|
-
else out.push(full)
|
|
124
|
+
const full = path.join(dir, entry.name)
|
|
125
|
+
if (entry.isDirectory()) out.push(...(await walkFiles(full)))
|
|
126
|
+
else out.push(full)
|
|
126
127
|
}
|
|
127
|
-
return out
|
|
128
|
+
return out
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
/**
|
|
@@ -134,41 +135,44 @@ async function walkFiles(dir: string): Promise<string[]> {
|
|
|
134
135
|
function isPrivate(relativeDir: string): boolean {
|
|
135
136
|
return relativeDir
|
|
136
137
|
.split('/')
|
|
137
|
-
.some(seg => seg.startsWith('_') && !isGroupSegment(seg) && !isSlotSegment(seg))
|
|
138
|
+
.some(seg => seg.startsWith('_') && !isGroupSegment(seg) && !isSlotSegment(seg))
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
// path-to-regexp custom-route source -> bracket routes. The fixture only uses
|
|
141
142
|
// `:name`, `:name+`, `:name*`; other modifiers/patterns are skipped like Next.
|
|
142
143
|
function convertCustomRouteSource(source: string): string[] {
|
|
143
|
-
const normalized = source.startsWith('/') ? source : `/${source}
|
|
144
|
+
const normalized = source.startsWith('/') ? source : `/${source}`
|
|
144
145
|
const converted = normalized
|
|
145
146
|
.split('/')
|
|
146
147
|
.map(segment => {
|
|
147
|
-
const optional = /^:(.+)\*$/.exec(segment)
|
|
148
|
-
if (optional?.[1]) return `[[...${optional[1]}]]
|
|
149
|
-
const catchAll = /^:(.+)\+$/.exec(segment)
|
|
150
|
-
if (catchAll?.[1]) return `[...${catchAll[1]}]
|
|
151
|
-
const param = /^:([A-Za-z0-9_]+)$/.exec(segment)
|
|
152
|
-
if (param?.[1]) return `[${param[1]}]
|
|
153
|
-
return segment
|
|
148
|
+
const optional = /^:(.+)\*$/.exec(segment)
|
|
149
|
+
if (optional?.[1]) return `[[...${optional[1]}]]`
|
|
150
|
+
const catchAll = /^:(.+)\+$/.exec(segment)
|
|
151
|
+
if (catchAll?.[1]) return `[...${catchAll[1]}]`
|
|
152
|
+
const param = /^:([A-Za-z0-9_]+)$/.exec(segment)
|
|
153
|
+
if (param?.[1]) return `[${param[1]}]`
|
|
154
|
+
return segment
|
|
154
155
|
})
|
|
155
|
-
.join('/')
|
|
156
|
-
return [converted.replace(/\/$/, '') || '/']
|
|
156
|
+
.join('/')
|
|
157
|
+
return [converted.replace(/\/$/, '') || '/']
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
interface CustomRoute {
|
|
160
|
-
source: string
|
|
161
|
+
source: string
|
|
161
162
|
}
|
|
162
|
-
type RedirectsFn = () => Promise<CustomRoute[]> | CustomRoute[]
|
|
163
|
+
type RedirectsFn = () => Promise<CustomRoute[]> | CustomRoute[]
|
|
163
164
|
type RewritesFn = () =>
|
|
164
|
-
| Promise<
|
|
165
|
+
| Promise<
|
|
166
|
+
| CustomRoute[]
|
|
167
|
+
| { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }
|
|
168
|
+
>
|
|
165
169
|
| CustomRoute[]
|
|
166
|
-
| { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }
|
|
170
|
+
| { beforeFiles?: CustomRoute[]; afterFiles?: CustomRoute[]; fallback?: CustomRoute[] }
|
|
167
171
|
|
|
168
172
|
export interface BuildManifestInput {
|
|
169
|
-
config: ResolvedConfig
|
|
170
|
-
routes: RouteManifestEntry[]
|
|
171
|
-
nextConfig: { redirects?: unknown; rewrites?: unknown }
|
|
173
|
+
config: ResolvedConfig
|
|
174
|
+
routes: RouteManifestEntry[]
|
|
175
|
+
nextConfig: { redirects?: unknown; rewrites?: unknown }
|
|
172
176
|
}
|
|
173
177
|
|
|
174
178
|
export async function buildRouteTypesManifest({
|
|
@@ -176,19 +180,19 @@ export async function buildRouteTypesManifest({
|
|
|
176
180
|
routes,
|
|
177
181
|
nextConfig,
|
|
178
182
|
}: BuildManifestInput): Promise<RouteTypesManifest> {
|
|
179
|
-
const relApp = (file: string) => toPosixPath(path.relative(config.root, file))
|
|
180
|
-
const isHybrid = config.appPath.includes('pnext-pages-compat')
|
|
183
|
+
const relApp = (file: string) => toPosixPath(path.relative(config.root, file))
|
|
184
|
+
const isHybrid = config.appPath.includes('pnext-pages-compat')
|
|
181
185
|
const sourceAppPath = (entry: RouteManifestEntry): string | undefined => {
|
|
182
|
-
if (!isHybrid) return entry.file
|
|
183
|
-
const basename = entry.kind === 'page' ? /^page\.(?:tsx?|jsx?|mdx?)$/ : /^route\.(?:tsx?|jsx?)
|
|
186
|
+
if (!isHybrid) return entry.file
|
|
187
|
+
const basename = entry.kind === 'page' ? /^page\.(?:tsx?|jsx?|mdx?)$/ : /^route\.(?:tsx?|jsx?)$/
|
|
184
188
|
const source = entry.sourceFiles.find(file => {
|
|
185
|
-
const normalized = toPosixPath(file)
|
|
186
|
-
return normalized.includes('/source-app/') && basename.test(path.basename(normalized))
|
|
187
|
-
})
|
|
188
|
-
if (!source) return undefined
|
|
189
|
-
const relative = toPosixPath(source).split('/source-app/')[1]
|
|
190
|
-
return relative ? path.join(config.root, 'app', relative) : undefined
|
|
191
|
-
}
|
|
189
|
+
const normalized = toPosixPath(file)
|
|
190
|
+
return normalized.includes('/source-app/') && basename.test(path.basename(normalized))
|
|
191
|
+
})
|
|
192
|
+
if (!source) return undefined
|
|
193
|
+
const relative = toPosixPath(source).split('/source-app/')[1]
|
|
194
|
+
return relative ? path.join(config.root, 'app', relative) : undefined
|
|
195
|
+
}
|
|
192
196
|
|
|
193
197
|
const manifest: RouteTypesManifest = {
|
|
194
198
|
appRoutes: {},
|
|
@@ -203,7 +207,7 @@ export async function buildRouteTypesManifest({
|
|
|
203
207
|
appRouteHandlers: new Set(),
|
|
204
208
|
pageApiRoutes: new Set(),
|
|
205
209
|
filePathToRoute: new Map(),
|
|
206
|
-
}
|
|
210
|
+
}
|
|
207
211
|
|
|
208
212
|
// App pages + route handlers from pnext's scanned entries. Skip synthetic /
|
|
209
213
|
// interception entries (typegen resolves interceptors to their canonical page
|
|
@@ -213,55 +217,55 @@ export async function buildRouteTypesManifest({
|
|
|
213
217
|
// wrappers which belong in PageRoutes.
|
|
214
218
|
const hybridFilteredRoutes = isHybrid
|
|
215
219
|
? routes.filter(entry => {
|
|
216
|
-
const file = entry.file
|
|
217
|
-
if (!file.includes('pnext-pages-compat')) return true
|
|
218
|
-
const sourceFiles = (entry as { sourceFiles?: string[] }).sourceFiles ?? []
|
|
219
|
-
const isPagesWrapper = sourceFiles.some(sf => sf.includes('source-pages'))
|
|
220
|
-
if (isPagesWrapper) return false
|
|
221
|
-
return true
|
|
220
|
+
const file = entry.file
|
|
221
|
+
if (!file.includes('pnext-pages-compat')) return true
|
|
222
|
+
const sourceFiles = (entry as { sourceFiles?: string[] }).sourceFiles ?? []
|
|
223
|
+
const isPagesWrapper = sourceFiles.some(sf => sf.includes('source-pages'))
|
|
224
|
+
if (isPagesWrapper) return false
|
|
225
|
+
return true
|
|
222
226
|
})
|
|
223
|
-
: routes
|
|
227
|
+
: routes
|
|
224
228
|
|
|
225
229
|
for (const entry of hybridFilteredRoutes) {
|
|
226
|
-
if (entry.synthetic || entry.interception || entry.metadataRoute) continue
|
|
227
|
-
const source = sourceAppPath(entry)
|
|
228
|
-
if (!source) continue
|
|
229
|
-
const bracket = bracketRouteFromEntry(entry)
|
|
230
|
-
const rel = relApp(source)
|
|
231
|
-
const info: ManifestRouteInfo = { path: rel, groups: groupsFromBracketRoute(bracket) }
|
|
230
|
+
if (entry.synthetic || entry.interception || entry.metadataRoute) continue
|
|
231
|
+
const source = sourceAppPath(entry)
|
|
232
|
+
if (!source) continue
|
|
233
|
+
const bracket = bracketRouteFromEntry(entry)
|
|
234
|
+
const rel = relApp(source)
|
|
235
|
+
const info: ManifestRouteInfo = { path: rel, groups: groupsFromBracketRoute(bracket) }
|
|
232
236
|
if (entry.kind === 'page') {
|
|
233
|
-
if (!manifest.appRoutes[bracket]) manifest.appRoutes[bracket] = info
|
|
237
|
+
if (!manifest.appRoutes[bracket]) manifest.appRoutes[bracket] = info
|
|
234
238
|
// appPagePaths/filePathToRoute (the validator inputs) are populated by an independent filesystem scan
|
|
235
239
|
// below, NOT from runtime entries: pnext's scanner collapses parallel-route slot pages onto a single
|
|
236
240
|
// representative route entry, which mis-maps a slot page's route and drops its siblings, breaking the
|
|
237
241
|
// generated validator's tsc.
|
|
238
242
|
} else {
|
|
239
|
-
if (!manifest.appRouteHandlerRoutes[bracket]) manifest.appRouteHandlerRoutes[bracket] = info
|
|
240
|
-
manifest.appRouteHandlers.add(rel)
|
|
241
|
-
manifest.filePathToRoute.set(rel, bracket)
|
|
243
|
+
if (!manifest.appRouteHandlerRoutes[bracket]) manifest.appRouteHandlerRoutes[bracket] = info
|
|
244
|
+
manifest.appRouteHandlers.add(rel)
|
|
245
|
+
manifest.filePathToRoute.set(rel, bracket)
|
|
242
246
|
}
|
|
243
247
|
}
|
|
244
248
|
|
|
245
249
|
// Layouts + slots: independent app-dir scan (pnext entries don't carry them).
|
|
246
|
-
const appFiles = await walkFiles(isHybrid ? path.join(config.root, 'app') : config.appPath)
|
|
247
|
-
const appPath = isHybrid ? path.join(config.root, 'app') : config.appPath
|
|
250
|
+
const appFiles = await walkFiles(isHybrid ? path.join(config.root, 'app') : config.appPath)
|
|
251
|
+
const appPath = isHybrid ? path.join(config.root, 'app') : config.appPath
|
|
248
252
|
for (const file of appFiles) {
|
|
249
|
-
const relative = toPosixPath(path.relative(appPath, file))
|
|
250
|
-
const base = path.basename(relative)
|
|
251
|
-
if (!LAYOUT_NAMES.has(base)) continue
|
|
252
|
-
const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
|
|
253
|
-
if (isPrivate(dir)) continue
|
|
254
|
-
const bracket = bracketRouteFromDir(dir)
|
|
255
|
-
const rel = relApp(file)
|
|
253
|
+
const relative = toPosixPath(path.relative(appPath, file))
|
|
254
|
+
const base = path.basename(relative)
|
|
255
|
+
if (!LAYOUT_NAMES.has(base)) continue
|
|
256
|
+
const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
|
|
257
|
+
if (isPrivate(dir)) continue
|
|
258
|
+
const bracket = bracketRouteFromDir(dir)
|
|
259
|
+
const rel = relApp(file)
|
|
256
260
|
if (!manifest.layoutRoutes[bracket]) {
|
|
257
261
|
manifest.layoutRoutes[bracket] = {
|
|
258
262
|
path: rel,
|
|
259
263
|
groups: groupsFromBracketRoute(bracket),
|
|
260
264
|
slots: [],
|
|
261
|
-
}
|
|
265
|
+
}
|
|
262
266
|
}
|
|
263
|
-
manifest.layoutPaths.add(rel)
|
|
264
|
-
manifest.filePathToRoute.set(rel, bracket)
|
|
267
|
+
manifest.layoutPaths.add(rel)
|
|
268
|
+
manifest.filePathToRoute.set(rel, bracket)
|
|
265
269
|
}
|
|
266
270
|
|
|
267
271
|
// Slots: `@name` dirs whose nearest ancestor layout owns them. A path can
|
|
@@ -269,22 +273,22 @@ export async function buildRouteTypesManifest({
|
|
|
269
273
|
// the slot that owns a given file is the deepest (last) one on the path,
|
|
270
274
|
// not the first, since the layout receiving the prop lives directly under it.
|
|
271
275
|
for (const file of appFiles) {
|
|
272
|
-
const relative = toPosixPath(path.relative(appPath, file))
|
|
273
|
-
const segments = relative.split('/')
|
|
274
|
-
let slotIndex = -1
|
|
276
|
+
const relative = toPosixPath(path.relative(appPath, file))
|
|
277
|
+
const segments = relative.split('/')
|
|
278
|
+
let slotIndex = -1
|
|
275
279
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
276
280
|
if (isSlotSegment(segments[i]!)) {
|
|
277
|
-
slotIndex = i
|
|
278
|
-
break
|
|
281
|
+
slotIndex = i
|
|
282
|
+
break
|
|
279
283
|
}
|
|
280
284
|
}
|
|
281
|
-
if (slotIndex === -1) continue
|
|
282
|
-
const slotName = segments[slotIndex]!.slice(1)
|
|
283
|
-
const ownerDir = segments.slice(0, slotIndex).join('/')
|
|
284
|
-
if (isPrivate(ownerDir)) continue
|
|
285
|
-
const ownerRoute = bracketRouteFromDir(ownerDir)
|
|
286
|
-
const layout = manifest.layoutRoutes[ownerRoute]
|
|
287
|
-
if (layout && !layout.slots.includes(slotName)) layout.slots.push(slotName)
|
|
285
|
+
if (slotIndex === -1) continue
|
|
286
|
+
const slotName = segments[slotIndex]!.slice(1)
|
|
287
|
+
const ownerDir = segments.slice(0, slotIndex).join('/')
|
|
288
|
+
if (isPrivate(ownerDir)) continue
|
|
289
|
+
const ownerRoute = bracketRouteFromDir(ownerDir)
|
|
290
|
+
const layout = manifest.layoutRoutes[ownerRoute]
|
|
291
|
+
if (layout && !layout.slots.includes(slotName)) layout.slots.push(slotName)
|
|
288
292
|
}
|
|
289
293
|
|
|
290
294
|
// App pages for the validator: an independent filesystem scan of every `page.{ext}` (including
|
|
@@ -293,64 +297,64 @@ export async function buildRouteTypesManifest({
|
|
|
293
297
|
// `dashboard/@analytics/page.tsx` renders at `/dashboard`, so it must validate against `/dashboard`.
|
|
294
298
|
// Guarded to routes that are actually routable, so private and interception pages are excluded - the
|
|
295
299
|
// AppPageConfig<Route> constraint requires `Route extends AppRoutes`.
|
|
296
|
-
const PAGE_BASENAMES = new Set(PAGE_EXTENSIONS.map(ext => `page.${ext}`))
|
|
300
|
+
const PAGE_BASENAMES = new Set(PAGE_EXTENSIONS.map(ext => `page.${ext}`))
|
|
297
301
|
for (const file of appFiles) {
|
|
298
|
-
const relative = toPosixPath(path.relative(appPath, file))
|
|
299
|
-
if (!PAGE_BASENAMES.has(path.basename(relative))) continue
|
|
300
|
-
const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
|
|
301
|
-
if (isPrivate(dir)) continue
|
|
302
|
-
const route = bracketRouteFromDir(dir)
|
|
303
|
-
if (!manifest.appRoutes[route]) continue
|
|
304
|
-
const rel = relApp(file)
|
|
305
|
-
manifest.appPagePaths.add(rel)
|
|
306
|
-
manifest.filePathToRoute.set(rel, route)
|
|
302
|
+
const relative = toPosixPath(path.relative(appPath, file))
|
|
303
|
+
if (!PAGE_BASENAMES.has(path.basename(relative))) continue
|
|
304
|
+
const dir = path.dirname(relative) === '.' ? '' : path.dirname(relative)
|
|
305
|
+
if (isPrivate(dir)) continue
|
|
306
|
+
const route = bracketRouteFromDir(dir)
|
|
307
|
+
if (!manifest.appRoutes[route]) continue
|
|
308
|
+
const rel = relApp(file)
|
|
309
|
+
manifest.appPagePaths.add(rel)
|
|
310
|
+
manifest.filePathToRoute.set(rel, route)
|
|
307
311
|
}
|
|
308
312
|
|
|
309
313
|
// Pages Router: pages/*.{ext} (non-api) -> pageRoutes; pages/api/** -> pageApiRoutes.
|
|
310
|
-
const pagesDir = path.join(config.root, 'pages')
|
|
314
|
+
const pagesDir = path.join(config.root, 'pages')
|
|
311
315
|
for (const file of await walkFiles(pagesDir)) {
|
|
312
|
-
const relative = toPosixPath(path.relative(pagesDir, file))
|
|
313
|
-
if (!PAGE_EXTENSIONS.some(ext => relative.endsWith(`.${ext}`))) continue
|
|
314
|
-
const base = path.basename(relative)
|
|
316
|
+
const relative = toPosixPath(path.relative(pagesDir, file))
|
|
317
|
+
if (!PAGE_EXTENSIONS.some(ext => relative.endsWith(`.${ext}`))) continue
|
|
318
|
+
const base = path.basename(relative)
|
|
315
319
|
if (base.startsWith('_app.') || base.startsWith('_document.') || base.startsWith('_error.')) {
|
|
316
|
-
continue
|
|
320
|
+
continue
|
|
317
321
|
}
|
|
318
|
-
const rel = relApp(file)
|
|
319
|
-
const isApi = relative === 'api' || relative.startsWith('api/')
|
|
320
|
-
const route = pagesRouteFromRelative(relative)
|
|
322
|
+
const rel = relApp(file)
|
|
323
|
+
const isApi = relative === 'api' || relative.startsWith('api/')
|
|
324
|
+
const route = pagesRouteFromRelative(relative)
|
|
321
325
|
if (isApi) {
|
|
322
|
-
manifest.pageApiRoutes.add(rel)
|
|
323
|
-
manifest.filePathToRoute.set(rel, route)
|
|
326
|
+
manifest.pageApiRoutes.add(rel)
|
|
327
|
+
manifest.filePathToRoute.set(rel, route)
|
|
324
328
|
} else {
|
|
325
|
-
manifest.pageRoutes[route] = { path: rel, groups: groupsFromBracketRoute(route) }
|
|
326
|
-
manifest.pagesRouterPagePaths.add(rel)
|
|
327
|
-
manifest.filePathToRoute.set(rel, route)
|
|
329
|
+
manifest.pageRoutes[route] = { path: rel, groups: groupsFromBracketRoute(route) }
|
|
330
|
+
manifest.pagesRouterPagePaths.add(rel)
|
|
331
|
+
manifest.filePathToRoute.set(rel, route)
|
|
328
332
|
}
|
|
329
333
|
}
|
|
330
334
|
|
|
331
335
|
// redirects / rewrites from next.config.
|
|
332
|
-
const redirects = nextConfig.redirects
|
|
336
|
+
const redirects = nextConfig.redirects
|
|
333
337
|
if (typeof redirects === 'function') {
|
|
334
|
-
const list = await (redirects as RedirectsFn)()
|
|
338
|
+
const list = await (redirects as RedirectsFn)()
|
|
335
339
|
for (const item of list ?? []) {
|
|
336
340
|
for (const route of convertCustomRouteSource(item.source)) {
|
|
337
|
-
manifest.redirectRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
|
|
341
|
+
manifest.redirectRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
|
|
338
342
|
}
|
|
339
343
|
}
|
|
340
344
|
}
|
|
341
345
|
|
|
342
|
-
const rewrites = nextConfig.rewrites
|
|
346
|
+
const rewrites = nextConfig.rewrites
|
|
343
347
|
if (typeof rewrites === 'function') {
|
|
344
|
-
const result = await (rewrites as RewritesFn)()
|
|
348
|
+
const result = await (rewrites as RewritesFn)()
|
|
345
349
|
const sources = Array.isArray(result)
|
|
346
350
|
? result
|
|
347
|
-
: [...(result?.beforeFiles ?? []), ...(result?.afterFiles ?? []), ...(result?.fallback ?? [])]
|
|
351
|
+
: [...(result?.beforeFiles ?? []), ...(result?.afterFiles ?? []), ...(result?.fallback ?? [])]
|
|
348
352
|
for (const item of sources) {
|
|
349
353
|
for (const route of convertCustomRouteSource(item.source)) {
|
|
350
|
-
manifest.rewriteRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
|
|
354
|
+
manifest.rewriteRoutes[route] = { path: route, groups: groupsFromBracketRoute(route) }
|
|
351
355
|
}
|
|
352
356
|
}
|
|
353
357
|
}
|
|
354
358
|
|
|
355
|
-
return manifest
|
|
359
|
+
return manifest
|
|
356
360
|
}
|