@wular/pnext 0.0.1
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 +153 -0
- package/bin/pnext +67 -0
- package/config/lint/base.js +48 -0
- package/config/ts/base.json +26 -0
- package/config/ts/react.json +13 -0
- package/package.json +70 -0
- package/reference/compat.md +63 -0
- package/reference/config.md +120 -0
- package/reference/css.md +58 -0
- package/reference/dev.md +69 -0
- package/reference/env.md +40 -0
- package/reference/metadata.md +86 -0
- package/reference/navigation.md +149 -0
- package/reference/overview.md +35 -0
- package/reference/performance.md +97 -0
- package/reference/rendering.md +127 -0
- package/reference/routing.md +167 -0
- package/reference/typegen.md +64 -0
- package/src/api/cache.ts +80 -0
- package/src/api/client-cache.ts +9 -0
- package/src/api/client-navigation.ts +279 -0
- package/src/api/dynamic.tsx +102 -0
- package/src/api/link.tsx +119 -0
- package/src/api/navigation.ts +198 -0
- package/src/api/router/events.ts +53 -0
- package/src/api/router/history.ts +70 -0
- package/src/api/router/hub.ts +194 -0
- package/src/api/router/policies.ts +107 -0
- package/src/api/router/runtime.ts +5238 -0
- package/src/api/router/types.ts +299 -0
- package/src/api/router.ts +167 -0
- package/src/api/server.ts +323 -0
- package/src/api/suspense.ts +16 -0
- package/src/cache/context.ts +61 -0
- package/src/cli/adapters/vercel-warm.ts +375 -0
- package/src/cli/adapters/vercel.ts +1310 -0
- package/src/cli/analyze-print.ts +181 -0
- package/src/cli/analyze.ts +328 -0
- package/src/cli/boot-trace.ts +29 -0
- package/src/cli/build.ts +3114 -0
- package/src/cli/dev.ts +276 -0
- package/src/cli/index.ts +196 -0
- package/src/cli/named-bin.ts +119 -0
- package/src/cli/serve-ui.ts +160 -0
- package/src/cli/start.ts +1425 -0
- package/src/client/build.ts +2136 -0
- package/src/client/chunk-fold.ts +526 -0
- package/src/client/entry.ts +1525 -0
- package/src/client/paths.ts +22 -0
- package/src/client/prebuilt.ts +621 -0
- package/src/client/profile.ts +75 -0
- package/src/client/react-compiler.ts +94 -0
- package/src/client/reference-stub.ts +145 -0
- package/src/client/reference.ts +47 -0
- package/src/compat/actions/action-client.ts +531 -0
- package/src/compat/actions/action-dispatch.ts +676 -0
- package/src/compat/actions/action-router.ts +40 -0
- package/src/compat/actions/action-shared.ts +95 -0
- package/src/compat/actions/client-plugin.ts +135 -0
- package/src/compat/actions/client-stub.ts +65 -0
- package/src/compat/actions/config.ts +164 -0
- package/src/compat/actions/detect.ts +208 -0
- package/src/compat/actions/discovery.ts +244 -0
- package/src/compat/actions/early-submit.ts +40 -0
- package/src/compat/actions/endpoint.ts +602 -0
- package/src/compat/actions/flight.ts +52 -0
- package/src/compat/actions/form-state.ts +73 -0
- package/src/compat/actions/hoist.ts +485 -0
- package/src/compat/actions/ids.ts +39 -0
- package/src/compat/actions/index.ts +41 -0
- package/src/compat/actions/instances.ts +144 -0
- package/src/compat/actions/origin.ts +109 -0
- package/src/compat/actions/protocol.ts +125 -0
- package/src/compat/actions/registry.ts +74 -0
- package/src/compat/actions/rewrite.ts +282 -0
- package/src/compat/actions/serve.ts +414 -0
- package/src/compat/actions/server-tag.ts +21 -0
- package/src/compat/actions/unrecognized-error.ts +30 -0
- package/src/compat/adapter/build-complete.ts +257 -0
- package/src/compat/bundler/bun-externals.ts +53 -0
- package/src/compat/bundler/cjs-exports.ts +542 -0
- package/src/compat/bundler/config.ts +363 -0
- package/src/compat/bundler/externals.ts +34 -0
- package/src/compat/bundler/import-meta-url.ts +60 -0
- package/src/compat/bundler/modularize-imports.ts +119 -0
- package/src/compat/bundler/new-url-asset.ts +87 -0
- package/src/compat/bundler/optimize-package-imports.ts +273 -0
- package/src/compat/bundler/polyfill.ts +88 -0
- package/src/compat/bundler/react-compiler.ts +61 -0
- package/src/compat/bundler/react-profiler.tsx +25 -0
- package/src/compat/bundler/relay-transform.ts +116 -0
- package/src/compat/bundler/require-context.ts +281 -0
- package/src/compat/bundler/resolve-extensions.ts +75 -0
- package/src/compat/bundler/source-cache.ts +61 -0
- package/src/compat/bundler/static-imports.ts +25 -0
- package/src/compat/bundler/symlink-imports.ts +119 -0
- package/src/compat/bundler/tsconfig-paths.ts +50 -0
- package/src/compat/bundler/wasm.ts +153 -0
- package/src/compat/bundler/webpack-loaders.ts +685 -0
- package/src/compat/bundler/worker.ts +278 -0
- package/src/compat/cache/build-flags.ts +81 -0
- package/src/compat/cache/build-prerender-errors.ts +163 -0
- package/src/compat/cache/custom-handler.ts +159 -0
- package/src/compat/cache/fetch-patch.ts +745 -0
- package/src/compat/cache/handler.ts +100 -0
- package/src/compat/cache/modern-handler.ts +275 -0
- package/src/compat/cache/resume-data-cache.ts +143 -0
- package/src/compat/cache/revalidate.ts +759 -0
- package/src/compat/cache/runtime-error.ts +124 -0
- package/src/compat/cache/use-cache-transform.ts +961 -0
- package/src/compat/cache/use-cache.ts +1695 -0
- package/src/compat/cache-control.ts +269 -0
- package/src/compat/client/base-path.ts +64 -0
- package/src/compat/client/css-order.ts +36 -0
- package/src/compat/client/errors/control-flow.ts +92 -0
- package/src/compat/client/errors/error-boundary.ts +222 -0
- package/src/compat/client/errors/global-error.ts +238 -0
- package/src/compat/client/errors/install.ts +217 -0
- package/src/compat/client/errors/lazy.ts +53 -0
- package/src/compat/client/errors/primitive-throw.ts +126 -0
- package/src/compat/client/errors/soft-refresh.ts +14 -0
- package/src/compat/client/link-status.ts +86 -0
- package/src/compat/client/nav-compat-runtime.ts +57 -0
- package/src/compat/client/nav-compat.ts +42 -0
- package/src/compat/client/navigation-scroll.ts +154 -0
- package/src/compat/client/optimistic-routing.ts +206 -0
- package/src/compat/client/prefetch-cache.ts +111 -0
- package/src/compat/client/route-announcer.ts +72 -0
- package/src/compat/client/segment-cache-policy.ts +159 -0
- package/src/compat/client/segment-cache.ts +1077 -0
- package/src/compat/client/segment-prefetch.ts +375 -0
- package/src/compat/client/trailing-slash.ts +24 -0
- package/src/compat/css/chunking.ts +254 -0
- package/src/compat/css/inline-css.ts +73 -0
- package/src/compat/css/lightningcss.ts +90 -0
- package/src/compat/css/modules.ts +373 -0
- package/src/compat/css/nonce.ts +30 -0
- package/src/compat/css/sass-plugin.ts +65 -0
- package/src/compat/css/sass.ts +392 -0
- package/src/compat/css/styled-jsx-runtime.ts +80 -0
- package/src/compat/css/styled-jsx.ts +49 -0
- package/src/compat/edge-runtime.ts +71 -0
- package/src/compat/export/client.ts +112 -0
- package/src/compat/export/index.ts +272 -0
- package/src/compat/export/standalone.ts +207 -0
- package/src/compat/image-optimizer/cache.ts +119 -0
- package/src/compat/image-optimizer/detect.ts +143 -0
- package/src/compat/image-optimizer/index.ts +601 -0
- package/src/compat/image-optimizer/source.ts +243 -0
- package/src/compat/index.ts +458 -0
- package/src/compat/lifecycle/after-scope.ts +86 -0
- package/src/compat/lifecycle/after.ts +173 -0
- package/src/compat/lifecycle/error-funnel.ts +306 -0
- package/src/compat/lifecycle/error-serialize.ts +87 -0
- package/src/compat/lifecycle/error-ui.ts +167 -0
- package/src/compat/lifecycle/instrumentation-client.ts +138 -0
- package/src/compat/lifecycle/instrumentation.ts +277 -0
- package/src/compat/lifecycle/node-console.ts +19 -0
- package/src/compat/lifecycle/testmode.ts +263 -0
- package/src/compat/mdx/compile.ts +219 -0
- package/src/compat/mdx/next-mdx-stub.ts +46 -0
- package/src/compat/mdx/plugin.ts +37 -0
- package/src/compat/metadata-route-artifacts.ts +458 -0
- package/src/compat/metadata.ts +295 -0
- package/src/compat/middleware/manifest.ts +210 -0
- package/src/compat/misc/action-return.ts +173 -0
- package/src/compat/next/cache.ts +211 -0
- package/src/compat/next/canonical-url.ts +35 -0
- package/src/compat/next/client-cache.ts +57 -0
- package/src/compat/next/client-navigation.ts +313 -0
- package/src/compat/next/client-only.ts +3 -0
- package/src/compat/next/client-script.tsx +215 -0
- package/src/compat/next/client-server.ts +39 -0
- package/src/compat/next/config-loader.ts +569 -0
- package/src/compat/next/config.ts +29 -0
- package/src/compat/next/constants.cjs +6 -0
- package/src/compat/next/constants.ts +6 -0
- package/src/compat/next/custom-server.ts +236 -0
- package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
- package/src/compat/next/dynamic.tsx +46 -0
- package/src/compat/next/error.tsx +148 -0
- package/src/compat/next/font/cache.ts +171 -0
- package/src/compat/next/font/google.ts +2 -0
- package/src/compat/next/font/index.ts +8 -0
- package/src/compat/next/font/local.ts +5 -0
- package/src/compat/next/font/runtime-client.ts +71 -0
- package/src/compat/next/font/runtime.ts +974 -0
- package/src/compat/next/font/shared.ts +281 -0
- package/src/compat/next/form.tsx +156 -0
- package/src/compat/next/head.tsx +10 -0
- package/src/compat/next/headers.ts +247 -0
- package/src/compat/next/image/config.ts +196 -0
- package/src/compat/next/image/optimizer.ts +96 -0
- package/src/compat/next/image/patterns.ts +103 -0
- package/src/compat/next/image/shared.ts +141 -0
- package/src/compat/next/image/static-metadata.ts +283 -0
- package/src/compat/next/image/validate.ts +269 -0
- package/src/compat/next/image-client.tsx +215 -0
- package/src/compat/next/image-props.ts +575 -0
- package/src/compat/next/image-usage.ts +102 -0
- package/src/compat/next/image.tsx +56 -0
- package/src/compat/next/index.ts +1 -0
- package/src/compat/next/legacy-image.tsx +97 -0
- package/src/compat/next/link-usage.ts +29 -0
- package/src/compat/next/link-validation-transform.ts +200 -0
- package/src/compat/next/link.tsx +466 -0
- package/src/compat/next/navigation.cjs +21 -0
- package/src/compat/next/navigation.ts +188 -0
- package/src/compat/next/offline.ts +51 -0
- package/src/compat/next/og.ts +324 -0
- package/src/compat/next/optimistic-route-state.ts +188 -0
- package/src/compat/next/preferred-region.ts +39 -0
- package/src/compat/next/redirects.ts +131 -0
- package/src/compat/next/resource-hints.ts +136 -0
- package/src/compat/next/rewrites.ts +350 -0
- package/src/compat/next/root-params.ts +142 -0
- package/src/compat/next/router.cjs +49 -0
- package/src/compat/next/router.ts +143 -0
- package/src/compat/next/script.tsx +355 -0
- package/src/compat/next/server-only.ts +3 -0
- package/src/compat/next/server.ts +28 -0
- package/src/compat/next/svgr.ts +58 -0
- package/src/compat/next/telemetry.ts +77 -0
- package/src/compat/next/user-agent.ts +100 -0
- package/src/compat/next/web-vitals.ts +56 -0
- package/src/compat/otel/api.ts +95 -0
- package/src/compat/otel/client-trace-metadata.ts +71 -0
- package/src/compat/otel/fetch-span.ts +77 -0
- package/src/compat/otel/tracer.ts +944 -0
- package/src/compat/pages/client-plugin.ts +108 -0
- package/src/compat/pages/index.ts +527 -0
- package/src/compat/pages/router-state.ts +94 -0
- package/src/compat/ppr/io.ts +38 -0
- package/src/compat/ppr/missing-root-params.ts +105 -0
- package/src/compat/ppr/root-params-scan.ts +164 -0
- package/src/compat/ppr/root-params-transform.ts +75 -0
- package/src/compat/ppr/root-params.ts +129 -0
- package/src/compat/ppr/segment-config-incompat.ts +34 -0
- package/src/compat/protocol.ts +202 -0
- package/src/compat/react/client.ts +59 -0
- package/src/compat/react/compiler-runtime.ts +60 -0
- package/src/compat/react/dom-client.ts +115 -0
- package/src/compat/react/dom-react-server.ts +20 -0
- package/src/compat/react/dom-server.ts +40 -0
- package/src/compat/react/dom.ts +154 -0
- package/src/compat/react/preact.ts +522 -0
- package/src/compat/react/react-server.ts +84 -0
- package/src/compat/react/router-shim.ts +26 -0
- package/src/compat/react/server-component-use.ts +48 -0
- package/src/compat/react/server-inserted-html.ts +87 -0
- package/src/compat/react/server.ts +156 -0
- package/src/compat/react/view-transition.ts +60 -0
- package/src/compat/register/actions.ts +875 -0
- package/src/compat/register/boot.ts +141 -0
- package/src/compat/register/build-tier.ts +11 -0
- package/src/compat/register/build.ts +182 -0
- package/src/compat/register/bundler.ts +587 -0
- package/src/compat/register/cache.ts +85 -0
- package/src/compat/register/client-errors.ts +18 -0
- package/src/compat/register/config.ts +17 -0
- package/src/compat/register/css-extras.ts +120 -0
- package/src/compat/register/edge-runtime.ts +6 -0
- package/src/compat/register/errors.ts +46 -0
- package/src/compat/register/export.ts +23 -0
- package/src/compat/register/font.ts +36 -0
- package/src/compat/register/hooks.ts +34 -0
- package/src/compat/register/image.ts +133 -0
- package/src/compat/register/index.ts +111 -0
- package/src/compat/register/instrumentation-client.ts +35 -0
- package/src/compat/register/lifecycle.ts +86 -0
- package/src/compat/register/mdx.ts +48 -0
- package/src/compat/register/middleware.ts +36 -0
- package/src/compat/register/misc.ts +44 -0
- package/src/compat/register/otel.ts +288 -0
- package/src/compat/register/pages-api.ts +473 -0
- package/src/compat/register/ppr.ts +56 -0
- package/src/compat/register/protocol.ts +57 -0
- package/src/compat/register/proxy.ts +127 -0
- package/src/compat/register/render.ts +268 -0
- package/src/compat/register/routing.ts +410 -0
- package/src/compat/register/segment.ts +1903 -0
- package/src/compat/register/static-image.ts +21 -0
- package/src/compat/register/typed-routes.ts +35 -0
- package/src/compat/register/usecache.ts +131 -0
- package/src/compat/register/validation.ts +56 -0
- package/src/compat/segment/loading-boundary.ts +113 -0
- package/src/compat/segment/page-slot.ts +200 -0
- package/src/compat/segment/tree.ts +481 -0
- package/src/compat/segment/vary-key.ts +102 -0
- package/src/compat/segment/vary-params.ts +551 -0
- package/src/compat/static-params.ts +33 -0
- package/src/compat/tsconfig-defaults.ts +301 -0
- package/src/compat/typecheck/index.ts +1481 -0
- package/src/compat/typecheck/worker.ts +26 -0
- package/src/compat/typed-routes/index.ts +92 -0
- package/src/compat/typed-routes/manifest.ts +356 -0
- package/src/compat/typed-routes/typegen.ts +566 -0
- package/src/compat/validation/errors.ts +159 -0
- package/src/compat/validation/index.ts +1770 -0
- package/src/compat/validation/prerender-diagnostics.ts +1508 -0
- package/src/compat-bootstrap.ts +67 -0
- package/src/config.ts +218 -0
- package/src/css/build.ts +697 -0
- package/src/css/index.ts +2 -0
- package/src/css/postcss.ts +236 -0
- package/src/css/worker.ts +34 -0
- package/src/dev/client-actions.ts +35 -0
- package/src/dev/client-chunk-store.ts +92 -0
- package/src/dev/client-key-cache.ts +178 -0
- package/src/dev/global-css-cache.ts +212 -0
- package/src/dev/imports.ts +2430 -0
- package/src/dev/module-cache.ts +721 -0
- package/src/dev/module-generations.ts +38 -0
- package/src/dev/module-transform.ts +188 -0
- package/src/dev/node-module-bundle-cache.ts +63 -0
- package/src/dev/restart-cache.ts +10 -0
- package/src/dev/route-bundle-key-cache.ts +154 -0
- package/src/dev/route-facts-cache.ts +223 -0
- package/src/dev/server.ts +1710 -0
- package/src/dynamic/source.ts +307 -0
- package/src/dynamic/tree-shake.ts +262 -0
- package/src/env.ts +92 -0
- package/src/extensions.ts +1898 -0
- package/src/index.ts +34 -0
- package/src/internal.ts +43 -0
- package/src/islands/boundary-error.ts +8 -0
- package/src/islands/static-children.ts +37 -0
- package/src/islands/static-slots.ts +106 -0
- package/src/ppr-postpone.ts +24 -0
- package/src/ppr.ts +784 -0
- package/src/proxy.ts +752 -0
- package/src/render/hooks.ts +384 -0
- package/src/render/index.ts +1 -0
- package/src/render/island-context.ts +47 -0
- package/src/render/metadata.ts +857 -0
- package/src/render/renderer.ts +7391 -0
- package/src/render/resource-hints.ts +44 -0
- package/src/render/slots.tsx +679 -0
- package/src/request/context.ts +396 -0
- package/src/resolve/engine.ts +219 -0
- package/src/resolve/imports.ts +1104 -0
- package/src/resolve/scan-facts.ts +474 -0
- package/src/resolve/source-text.ts +86 -0
- package/src/routing/forwarded.ts +41 -0
- package/src/routing/handler.ts +271 -0
- package/src/routing/href.ts +203 -0
- package/src/routing/metadata.ts +1018 -0
- package/src/routing/request-runtime.ts +43 -0
- package/src/routing/routes.ts +2560 -0
- package/src/routing/slots.ts +432 -0
- package/src/runtime/server.ts +3453 -0
- package/src/runtime/vendor.ts +1160 -0
- package/src/style-modules.d.ts +9 -0
- package/src/typegen.ts +151 -0
- package/src/types.ts +725 -0
- package/src/utils/ansi.ts +9 -0
- package/src/utils/content-type.ts +31 -0
- package/src/utils/decode.ts +7 -0
- package/src/utils/dev-profile.ts +31 -0
- package/src/utils/error-log.ts +29 -0
- package/src/utils/fs-cache.ts +31 -0
- package/src/utils/fs.ts +119 -0
- package/src/utils/html.ts +46 -0
- package/src/utils/serialize.ts +378 -0
- package/src/utils/source.ts +35 -0
- package/src/utils/verbose.ts +39 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
// Next-identical codegen for `.next/types/{routes.d.ts,link.d.ts,validator.ts}`.
|
|
2
|
+
// Ported near-verbatim from Next 16.3's router-utils/typegen.ts (non-strict
|
|
3
|
+
// variants) so the generated output matches the exact substrings the
|
|
4
|
+
// typed-routes / typed-routes-validator e2e suites assert on. Compat-only.
|
|
5
|
+
import type { ManifestRouteInfo, RouteTypesManifest } from './manifest';
|
|
6
|
+
|
|
7
|
+
function isDynamicRoute(route: string): boolean {
|
|
8
|
+
return /\[.+\]/.test(route);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function generateRouteTypes(manifest: RouteTypesManifest): string {
|
|
12
|
+
const appRoutes = Object.keys(manifest.appRoutes).sort();
|
|
13
|
+
const pageRoutes = Object.keys(manifest.pageRoutes).sort();
|
|
14
|
+
const layoutRoutes = Object.keys(manifest.layoutRoutes).sort();
|
|
15
|
+
const redirectRoutes = Object.keys(manifest.redirectRoutes).sort();
|
|
16
|
+
const rewriteRoutes = Object.keys(manifest.rewriteRoutes).sort();
|
|
17
|
+
const appRouteHandlerRoutes = Object.keys(manifest.appRouteHandlerRoutes).sort();
|
|
18
|
+
const hasAppRouteHandlers = appRouteHandlerRoutes.length > 0;
|
|
19
|
+
|
|
20
|
+
const union = (list: string[]) => list.map(route => JSON.stringify(route)).join(' | ');
|
|
21
|
+
|
|
22
|
+
let result = '';
|
|
23
|
+
result += appRoutes.length > 0 ? `type AppRoutes = ${union(appRoutes)}\n` : 'type AppRoutes = never\n';
|
|
24
|
+
if (hasAppRouteHandlers) {
|
|
25
|
+
result += `type AppRouteHandlerRoutes = ${union(appRouteHandlerRoutes)}\n`;
|
|
26
|
+
}
|
|
27
|
+
result += pageRoutes.length > 0 ? `type PageRoutes = ${union(pageRoutes)}\n` : 'type PageRoutes = never\n';
|
|
28
|
+
result +=
|
|
29
|
+
layoutRoutes.length > 0 ? `type LayoutRoutes = ${union(layoutRoutes)}\n` : 'type LayoutRoutes = never\n';
|
|
30
|
+
result +=
|
|
31
|
+
redirectRoutes.length > 0
|
|
32
|
+
? `type RedirectRoutes = ${union(redirectRoutes)}\n`
|
|
33
|
+
: 'type RedirectRoutes = never\n';
|
|
34
|
+
result +=
|
|
35
|
+
rewriteRoutes.length > 0
|
|
36
|
+
? `type RewriteRoutes = ${union(rewriteRoutes)}\n`
|
|
37
|
+
: 'type RewriteRoutes = never\n';
|
|
38
|
+
|
|
39
|
+
const routeUnionParts = ['AppRoutes', 'PageRoutes', 'LayoutRoutes', 'RedirectRoutes', 'RewriteRoutes'];
|
|
40
|
+
if (hasAppRouteHandlers) routeUnionParts.push('AppRouteHandlerRoutes');
|
|
41
|
+
result += `type Routes = ${routeUnionParts.join(' | ')}\n`;
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function generateParamTypes(manifest: RouteTypesManifest): string {
|
|
46
|
+
const allRoutes: Record<string, ManifestRouteInfo> = {
|
|
47
|
+
...manifest.appRoutes,
|
|
48
|
+
...manifest.appRouteHandlerRoutes,
|
|
49
|
+
...manifest.pageRoutes,
|
|
50
|
+
...manifest.layoutRoutes,
|
|
51
|
+
...manifest.redirectRoutes,
|
|
52
|
+
...manifest.rewriteRoutes,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
let paramTypes = 'interface ParamMap {\n';
|
|
56
|
+
const sortedRoutes = Object.entries(allRoutes).sort(([a], [b]) => a.localeCompare(b));
|
|
57
|
+
for (const [route, routeInfo] of sortedRoutes) {
|
|
58
|
+
const groups = routeInfo.groups;
|
|
59
|
+
if (!isDynamicRoute(route) || Object.keys(groups ?? {}).length === 0) {
|
|
60
|
+
paramTypes += ` ${JSON.stringify(route)}: {}\n`;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
let paramType = '{';
|
|
64
|
+
for (const [key, group] of Object.entries(groups)) {
|
|
65
|
+
const escapedKey = JSON.stringify(key);
|
|
66
|
+
if (group.repeat) {
|
|
67
|
+
paramType += group.optional ? ` ${escapedKey}?: string[];` : ` ${escapedKey}: string[];`;
|
|
68
|
+
} else {
|
|
69
|
+
paramType += group.optional ? ` ${escapedKey}?: string;` : ` ${escapedKey}: string;`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
paramType += ' }';
|
|
73
|
+
paramTypes += ` ${JSON.stringify(route)}: ${paramType}\n`;
|
|
74
|
+
}
|
|
75
|
+
paramTypes += '}\n';
|
|
76
|
+
return paramTypes;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function generateLayoutSlotMap(manifest: RouteTypesManifest): string {
|
|
80
|
+
let slotMap = 'interface LayoutSlotMap {\n';
|
|
81
|
+
const sorted = Object.entries(manifest.layoutRoutes).sort(([a], [b]) => a.localeCompare(b));
|
|
82
|
+
for (const [route, routeInfo] of sorted) {
|
|
83
|
+
const slots = [...routeInfo.slots].sort();
|
|
84
|
+
slotMap +=
|
|
85
|
+
slots.length > 0
|
|
86
|
+
? ` ${JSON.stringify(route)}: ${slots.map(slot => JSON.stringify(slot)).join(' | ')}\n`
|
|
87
|
+
: ` ${JSON.stringify(route)}: never\n`;
|
|
88
|
+
}
|
|
89
|
+
slotMap += '}\n';
|
|
90
|
+
return slotMap;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function formatRouteToRouteType(route: string): { isDynamic: boolean; routeType: string } {
|
|
94
|
+
const isDynamic = isDynamicRoute(route);
|
|
95
|
+
let routeType = route;
|
|
96
|
+
if (isDynamic) {
|
|
97
|
+
routeType = route
|
|
98
|
+
.split('/')
|
|
99
|
+
.map(part => {
|
|
100
|
+
if (part.startsWith('[') && part.endsWith(']')) {
|
|
101
|
+
if (part.startsWith('[[...') && part.endsWith(']]')) return '${OptionalCatchAllSlug<T>}';
|
|
102
|
+
if (part.startsWith('[...')) return '${CatchAllSlug<T>}';
|
|
103
|
+
return '${SafeSlug<T>}';
|
|
104
|
+
}
|
|
105
|
+
return part;
|
|
106
|
+
})
|
|
107
|
+
.join('/');
|
|
108
|
+
}
|
|
109
|
+
return { isDynamic, routeType };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function serializeRouteTypes(routeTypes: [routeType: string, cause: string][]): string {
|
|
113
|
+
routeTypes.sort(([a], [b]) => a.localeCompare(b));
|
|
114
|
+
let union = '';
|
|
115
|
+
for (const [route, cause] of routeTypes) {
|
|
116
|
+
union += `\n | \`${route}\` // ${cause}`;
|
|
117
|
+
}
|
|
118
|
+
return union;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function generateRouteTypesFile(manifest: RouteTypesManifest): string {
|
|
122
|
+
const routeTypes = generateRouteTypes(manifest);
|
|
123
|
+
const paramTypes = generateParamTypes(manifest);
|
|
124
|
+
const layoutSlotMap = generateLayoutSlotMap(manifest);
|
|
125
|
+
const hasAppRouteHandlers = Object.keys(manifest.appRouteHandlerRoutes).length > 0;
|
|
126
|
+
|
|
127
|
+
const routeExports = [
|
|
128
|
+
'AppRoutes',
|
|
129
|
+
'PageRoutes',
|
|
130
|
+
'LayoutRoutes',
|
|
131
|
+
'RedirectRoutes',
|
|
132
|
+
'RewriteRoutes',
|
|
133
|
+
'ParamMap',
|
|
134
|
+
];
|
|
135
|
+
if (hasAppRouteHandlers) routeExports.push('AppRouteHandlerRoutes');
|
|
136
|
+
const exportStatement = `export type { ${routeExports.join(', ')} }`;
|
|
137
|
+
|
|
138
|
+
const routeContextInterface = hasAppRouteHandlers
|
|
139
|
+
? `
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Context for Next.js App Router route handlers
|
|
143
|
+
* @example
|
|
144
|
+
* \`\`\`tsx
|
|
145
|
+
* export async function GET(request: NextRequest, context: RouteContext<'/api/users/[id]'>) {
|
|
146
|
+
* const { id } = await context.params
|
|
147
|
+
* return Response.json({ id })
|
|
148
|
+
* }
|
|
149
|
+
* \`\`\`
|
|
150
|
+
*/
|
|
151
|
+
interface RouteContext<AppRouteHandlerRoute extends AppRouteHandlerRoutes> {
|
|
152
|
+
params: Promise<ParamMap[AppRouteHandlerRoute]>
|
|
153
|
+
}`
|
|
154
|
+
: '';
|
|
155
|
+
|
|
156
|
+
return `// This file is generated automatically by Next.js
|
|
157
|
+
// Do not edit this file manually
|
|
158
|
+
|
|
159
|
+
${routeTypes}
|
|
160
|
+
|
|
161
|
+
${paramTypes}
|
|
162
|
+
|
|
163
|
+
export type ParamsOf<Route extends Routes> = ParamMap[Route]
|
|
164
|
+
|
|
165
|
+
${layoutSlotMap}
|
|
166
|
+
|
|
167
|
+
${exportStatement}
|
|
168
|
+
|
|
169
|
+
declare global {
|
|
170
|
+
/**
|
|
171
|
+
* Props for Next.js App Router page components
|
|
172
|
+
* @example
|
|
173
|
+
* \`\`\`tsx
|
|
174
|
+
* export default function Page(props: PageProps<'/blog/[slug]'>) {
|
|
175
|
+
* const { slug } = await props.params
|
|
176
|
+
* return <div>Blog post: {slug}</div>
|
|
177
|
+
* }
|
|
178
|
+
* \`\`\`
|
|
179
|
+
*/
|
|
180
|
+
interface PageProps<AppRoute extends AppRoutes> {
|
|
181
|
+
params: Promise<ParamMap[AppRoute]>
|
|
182
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Props for Next.js App Router layout components
|
|
187
|
+
* @example
|
|
188
|
+
* \`\`\`tsx
|
|
189
|
+
* export default function Layout(props: LayoutProps<'/dashboard'>) {
|
|
190
|
+
* return <div>{props.children}</div>
|
|
191
|
+
* }
|
|
192
|
+
* \`\`\`
|
|
193
|
+
*/
|
|
194
|
+
type LayoutProps<LayoutRoute extends LayoutRoutes> = {
|
|
195
|
+
params: Promise<ParamMap[LayoutRoute]>
|
|
196
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>
|
|
197
|
+
children: React.ReactNode
|
|
198
|
+
} & {
|
|
199
|
+
[K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
|
|
200
|
+
}${routeContextInterface}
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function generateLinkTypesFile(manifest: RouteTypesManifest): string {
|
|
206
|
+
const visited = new Set<string>();
|
|
207
|
+
const staticRouteTypes: [routeType: string, cause: string][] = [];
|
|
208
|
+
const dynamicRouteTypes: [routeType: string, cause: string][] = [];
|
|
209
|
+
|
|
210
|
+
for (const routeMap of [
|
|
211
|
+
manifest.appRoutes,
|
|
212
|
+
manifest.pageRoutes,
|
|
213
|
+
manifest.redirectRoutes,
|
|
214
|
+
manifest.rewriteRoutes,
|
|
215
|
+
manifest.appRouteHandlerRoutes,
|
|
216
|
+
]) {
|
|
217
|
+
for (const route in routeMap) {
|
|
218
|
+
if (visited.has(route)) continue;
|
|
219
|
+
visited.add(route);
|
|
220
|
+
const { isDynamic, routeType } = formatRouteToRouteType(route);
|
|
221
|
+
const cause = routeMap[route]!.path;
|
|
222
|
+
(isDynamic ? dynamicRouteTypes : staticRouteTypes).push([routeType, cause]);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
for (const filePath of manifest.pageApiRoutes) {
|
|
227
|
+
if (visited.has(filePath)) continue;
|
|
228
|
+
visited.add(filePath);
|
|
229
|
+
const { isDynamic, routeType } = formatRouteToRouteType(filePath);
|
|
230
|
+
(isDynamic ? dynamicRouteTypes : staticRouteTypes).push([routeType, filePath]);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const serializedStaticRouteTypes = serializeRouteTypes(staticRouteTypes);
|
|
234
|
+
const serializedDynamicRouteTypes = serializeRouteTypes(dynamicRouteTypes);
|
|
235
|
+
const routeTypesFallback =
|
|
236
|
+
!serializedStaticRouteTypes && !serializedDynamicRouteTypes ? 'string & {}' : '';
|
|
237
|
+
|
|
238
|
+
return `// This file is generated automatically by Next.js
|
|
239
|
+
// Do not edit this file manually
|
|
240
|
+
|
|
241
|
+
// Type definitions for Next.js routes
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Internal types used by the Next.js router and Link component.
|
|
245
|
+
* These types are not meant to be used directly.
|
|
246
|
+
* @internal
|
|
247
|
+
*/
|
|
248
|
+
declare namespace __next_route_internal_types__ {
|
|
249
|
+
type SearchOrHash = \`?\${string}\` | \`#\${string}\`
|
|
250
|
+
type WithProtocol = \`\${string}:\${string}\`
|
|
251
|
+
|
|
252
|
+
type Suffix = '' | SearchOrHash
|
|
253
|
+
|
|
254
|
+
type SafeSlug<S extends string> = S extends \`\${string}/\${string}\`
|
|
255
|
+
? never
|
|
256
|
+
: S extends \`\${string}\${SearchOrHash}\`
|
|
257
|
+
? never
|
|
258
|
+
: S extends ''
|
|
259
|
+
? never
|
|
260
|
+
: S
|
|
261
|
+
|
|
262
|
+
type CatchAllSlug<S extends string> = S extends \`\${string}\${SearchOrHash}\`
|
|
263
|
+
? never
|
|
264
|
+
: S extends ''
|
|
265
|
+
? never
|
|
266
|
+
: S
|
|
267
|
+
|
|
268
|
+
type OptionalCatchAllSlug<S extends string> =
|
|
269
|
+
S extends \`\${string}\${SearchOrHash}\` ? never : S
|
|
270
|
+
|
|
271
|
+
type StaticRoutes = ${serializedStaticRouteTypes || 'never'}
|
|
272
|
+
type DynamicRoutes<T extends string = string> = ${serializedDynamicRouteTypes || 'never'}
|
|
273
|
+
|
|
274
|
+
type RouteImpl<T> = ${
|
|
275
|
+
routeTypesFallback ||
|
|
276
|
+
`
|
|
277
|
+
${'| StaticRoutes'}
|
|
278
|
+
| SearchOrHash
|
|
279
|
+
| WithProtocol
|
|
280
|
+
| \`\${StaticRoutes}\${SearchOrHash}\`
|
|
281
|
+
| (T extends \`\${DynamicRoutes<infer _>}\${Suffix}\` ? T : never)
|
|
282
|
+
`
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
declare module 'next' {
|
|
287
|
+
export { default } from 'next/types.js'
|
|
288
|
+
export * from 'next/types.js'
|
|
289
|
+
|
|
290
|
+
export type Route<T extends string = string> =
|
|
291
|
+
__next_route_internal_types__.RouteImpl<T>
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
declare module 'next/link' {
|
|
295
|
+
export { useLinkStatus } from 'next/dist/client/link.js'
|
|
296
|
+
|
|
297
|
+
import type { LinkProps as OriginalLinkProps } from 'next/dist/client/link.js'
|
|
298
|
+
import type { AnchorHTMLAttributes, DetailedHTMLProps } from 'react'
|
|
299
|
+
import type { UrlObject } from 'url'
|
|
300
|
+
|
|
301
|
+
type LinkRestProps = Omit<
|
|
302
|
+
Omit<
|
|
303
|
+
DetailedHTMLProps<
|
|
304
|
+
AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
305
|
+
HTMLAnchorElement
|
|
306
|
+
>,
|
|
307
|
+
keyof OriginalLinkProps
|
|
308
|
+
> &
|
|
309
|
+
OriginalLinkProps,
|
|
310
|
+
'href'
|
|
311
|
+
>
|
|
312
|
+
|
|
313
|
+
export type LinkProps<RouteInferType> = LinkRestProps & {
|
|
314
|
+
/**
|
|
315
|
+
* The path or URL to navigate to. This is the only required prop. It can also be an object.
|
|
316
|
+
* @see https://nextjs.org/docs/api-reference/next/link
|
|
317
|
+
*/
|
|
318
|
+
href: __next_route_internal_types__.RouteImpl<RouteInferType> | UrlObject
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export default function Link<RouteType>(props: LinkProps<RouteType>): JSX.Element
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
declare module 'next/navigation' {
|
|
325
|
+
export * from 'next/dist/client/components/navigation.js'
|
|
326
|
+
|
|
327
|
+
import type { NavigateOptions, PrefetchOptions, AppRouterInstance as OriginalAppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime.js'
|
|
328
|
+
import type { RedirectType } from 'next/dist/client/components/redirect-error.js'
|
|
329
|
+
|
|
330
|
+
interface AppRouterInstance extends OriginalAppRouterInstance {
|
|
331
|
+
/**
|
|
332
|
+
* Navigate to the provided href.
|
|
333
|
+
* Pushes a new history entry.
|
|
334
|
+
*/
|
|
335
|
+
push<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: NavigateOptions): void
|
|
336
|
+
/**
|
|
337
|
+
* Navigate to the provided href.
|
|
338
|
+
* Replaces the current history entry.
|
|
339
|
+
*/
|
|
340
|
+
replace<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: NavigateOptions): void
|
|
341
|
+
/**
|
|
342
|
+
* Prefetch the provided href.
|
|
343
|
+
*/
|
|
344
|
+
prefetch<RouteType>(href: __next_route_internal_types__.RouteImpl<RouteType>, options?: PrefetchOptions): void
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export function useRouter(): AppRouterInstance;
|
|
348
|
+
|
|
349
|
+
export function redirect<RouteType>(
|
|
350
|
+
url: __next_route_internal_types__.RouteImpl<RouteType>,
|
|
351
|
+
type?: RedirectType
|
|
352
|
+
): never;
|
|
353
|
+
|
|
354
|
+
export function permanentRedirect<RouteType>(
|
|
355
|
+
url: __next_route_internal_types__.RouteImpl<RouteType>,
|
|
356
|
+
type?: RedirectType
|
|
357
|
+
): never;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
declare module 'next/form' {
|
|
361
|
+
import type { FormProps as OriginalFormProps } from 'next/dist/client/form.js'
|
|
362
|
+
|
|
363
|
+
type FormRestProps = Omit<OriginalFormProps, 'action'>
|
|
364
|
+
|
|
365
|
+
export type FormProps<RouteInferType> = {
|
|
366
|
+
action: __next_route_internal_types__.RouteImpl<RouteInferType> | ((formData: FormData) => void)
|
|
367
|
+
} & FormRestProps
|
|
368
|
+
|
|
369
|
+
export default function Form<RouteType>(props: FormProps<RouteType>): JSX.Element
|
|
370
|
+
}
|
|
371
|
+
`;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Non-strict validator file. `importDir` is the directory the validator.ts is
|
|
376
|
+
* written to (e.g. `<root>/.next/types`); import specifiers are recomputed
|
|
377
|
+
* relative to it from the manifest's root-relative paths.
|
|
378
|
+
*/
|
|
379
|
+
export function generateValidatorFile(
|
|
380
|
+
manifest: RouteTypesManifest,
|
|
381
|
+
toImportSpecifier: (rootRelativePath: string) => string,
|
|
382
|
+
): string {
|
|
383
|
+
const generateValidations = (
|
|
384
|
+
paths: string[],
|
|
385
|
+
type: 'AppPageConfig' | 'PagesPageConfig' | 'LayoutConfig' | 'RouteHandlerConfig' | 'ApiRouteConfig',
|
|
386
|
+
pathToRouteMap?: Map<string, string>,
|
|
387
|
+
) =>
|
|
388
|
+
paths
|
|
389
|
+
.sort()
|
|
390
|
+
.filter(filePath => filePath.endsWith('.ts') || filePath.endsWith('.tsx'))
|
|
391
|
+
.filter(
|
|
392
|
+
filePath =>
|
|
393
|
+
type !== 'AppPageConfig' || filePath.endsWith('page.ts') || filePath.endsWith('page.tsx'),
|
|
394
|
+
)
|
|
395
|
+
.map(filePath => {
|
|
396
|
+
const importPath = toImportSpecifier(filePath);
|
|
397
|
+
const route = pathToRouteMap?.get(filePath);
|
|
398
|
+
const typeWithRoute =
|
|
399
|
+
route &&
|
|
400
|
+
(type === 'AppPageConfig' || type === 'LayoutConfig' || type === 'RouteHandlerConfig')
|
|
401
|
+
? `${type}<${JSON.stringify(route)}>`
|
|
402
|
+
: type;
|
|
403
|
+
return `// Validate ${filePath}
|
|
404
|
+
{
|
|
405
|
+
type __IsExpected<Specific extends ${typeWithRoute}> = Specific
|
|
406
|
+
const handler = {} as typeof import(${JSON.stringify(importPath.replace(/\.tsx?$/, '.js'))})
|
|
407
|
+
type __Check = __IsExpected<typeof handler>
|
|
408
|
+
// @ts-ignore
|
|
409
|
+
type __Unused = __Check
|
|
410
|
+
}`;
|
|
411
|
+
})
|
|
412
|
+
.join('\n\n');
|
|
413
|
+
|
|
414
|
+
const appPageValidations = generateValidations(
|
|
415
|
+
[...manifest.appPagePaths].sort(),
|
|
416
|
+
'AppPageConfig',
|
|
417
|
+
manifest.filePathToRoute,
|
|
418
|
+
);
|
|
419
|
+
const appRouteHandlerValidations = generateValidations(
|
|
420
|
+
[...manifest.appRouteHandlers].sort(),
|
|
421
|
+
'RouteHandlerConfig',
|
|
422
|
+
manifest.filePathToRoute,
|
|
423
|
+
);
|
|
424
|
+
const pagesRouterPageValidations = generateValidations(
|
|
425
|
+
[...manifest.pagesRouterPagePaths].sort(),
|
|
426
|
+
'PagesPageConfig',
|
|
427
|
+
);
|
|
428
|
+
const pagesApiRouteValidations = generateValidations(
|
|
429
|
+
[...manifest.pageApiRoutes].sort(),
|
|
430
|
+
'ApiRouteConfig',
|
|
431
|
+
);
|
|
432
|
+
const layoutValidations = generateValidations(
|
|
433
|
+
[...manifest.layoutPaths].sort(),
|
|
434
|
+
'LayoutConfig',
|
|
435
|
+
manifest.filePathToRoute,
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
const hasAppRouteHandlers = Object.keys(manifest.appRouteHandlerRoutes).length > 0;
|
|
439
|
+
|
|
440
|
+
let typeDefinitions = '';
|
|
441
|
+
if (appPageValidations) {
|
|
442
|
+
typeDefinitions += `type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
|
|
443
|
+
default: React.JSXElementConstructor<PageProps<Route>> | ((props: { params: Promise<ParamMap[Route]>, searchParams: Promise<any> }) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
|
444
|
+
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
|
445
|
+
generateMetadata?: (
|
|
446
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
447
|
+
parent: ResolvingMetadata
|
|
448
|
+
) => Promise<any> | any
|
|
449
|
+
generateViewport?: (
|
|
450
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
451
|
+
parent: ResolvingViewport
|
|
452
|
+
) => Promise<any> | any
|
|
453
|
+
metadata?: any
|
|
454
|
+
viewport?: any
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
`;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
if (pagesRouterPageValidations) {
|
|
461
|
+
typeDefinitions += `type PagesPageConfig = {
|
|
462
|
+
default: React.ComponentType<any> | ((props: any) => React.ReactNode | Promise<React.ReactNode> | never | void)
|
|
463
|
+
getStaticProps?: (context: any) => Promise<any> | any
|
|
464
|
+
getStaticPaths?: (context: any) => Promise<any> | any
|
|
465
|
+
getServerSideProps?: (context: any) => Promise<any> | any
|
|
466
|
+
getInitialProps?: (context: any) => Promise<any> | any
|
|
467
|
+
/**
|
|
468
|
+
* Segment configuration for legacy Pages Router pages.
|
|
469
|
+
* Validated at build-time by parsePagesSegmentConfig.
|
|
470
|
+
*/
|
|
471
|
+
config?: {
|
|
472
|
+
maxDuration?: number
|
|
473
|
+
runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
|
|
474
|
+
regions?: string[]
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
`;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (layoutValidations) {
|
|
482
|
+
typeDefinitions += `type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
|
|
483
|
+
default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
|
484
|
+
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
|
485
|
+
generateMetadata?: (
|
|
486
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
487
|
+
parent: ResolvingMetadata
|
|
488
|
+
) => Promise<any> | any
|
|
489
|
+
generateViewport?: (
|
|
490
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
491
|
+
parent: ResolvingViewport
|
|
492
|
+
) => Promise<any> | any
|
|
493
|
+
metadata?: any
|
|
494
|
+
viewport?: any
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
`;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
if (appRouteHandlerValidations) {
|
|
501
|
+
typeDefinitions += `type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRoutes> = {
|
|
502
|
+
GET?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
503
|
+
POST?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
504
|
+
PUT?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
505
|
+
PATCH?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
506
|
+
DELETE?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
507
|
+
HEAD?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
508
|
+
OPTIONS?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
`;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (pagesApiRouteValidations) {
|
|
515
|
+
typeDefinitions += `type ApiRouteConfig = {
|
|
516
|
+
default: (req: any, res: any) => ReturnType<NextApiHandler>
|
|
517
|
+
config?: {
|
|
518
|
+
api?: {
|
|
519
|
+
bodyParser?: boolean | { sizeLimit?: number | string }
|
|
520
|
+
responseLimit?: string | number | boolean
|
|
521
|
+
externalResolver?: boolean
|
|
522
|
+
}
|
|
523
|
+
runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
|
|
524
|
+
maxDuration?: number
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
`;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
const routeImports: string[] = [];
|
|
532
|
+
if (appPageValidations) routeImports.push('AppRoutes');
|
|
533
|
+
if (layoutValidations) routeImports.push('LayoutRoutes');
|
|
534
|
+
if (appPageValidations || layoutValidations || appRouteHandlerValidations) routeImports.push('ParamMap');
|
|
535
|
+
if (hasAppRouteHandlers) routeImports.push('AppRouteHandlerRoutes');
|
|
536
|
+
const routeImportStatement =
|
|
537
|
+
routeImports.length > 0 ? `import type { ${routeImports.join(', ')} } from "./routes.js"` : '';
|
|
538
|
+
|
|
539
|
+
const nextRequestImport = hasAppRouteHandlers
|
|
540
|
+
? "import type { NextRequest } from 'next/server.js'\n"
|
|
541
|
+
: '';
|
|
542
|
+
|
|
543
|
+
const nextTypes: string[] = [];
|
|
544
|
+
if (pagesApiRouteValidations) nextTypes.push('NextApiHandler');
|
|
545
|
+
if (appPageValidations || layoutValidations) nextTypes.push('ResolvingMetadata', 'ResolvingViewport');
|
|
546
|
+
const nextTypesImport =
|
|
547
|
+
nextTypes.length > 0 ? `import type { ${nextTypes.join(', ')} } from "next/types.js"\n` : '';
|
|
548
|
+
|
|
549
|
+
return `// This file is generated automatically by Next.js
|
|
550
|
+
// Do not edit this file manually
|
|
551
|
+
// This file validates that all pages and layouts export the correct types
|
|
552
|
+
|
|
553
|
+
${routeImportStatement}
|
|
554
|
+
${nextTypesImport}${nextRequestImport}
|
|
555
|
+
${typeDefinitions}
|
|
556
|
+
${appPageValidations}
|
|
557
|
+
|
|
558
|
+
${appRouteHandlerValidations}
|
|
559
|
+
|
|
560
|
+
${pagesRouterPageValidations}
|
|
561
|
+
|
|
562
|
+
${pagesApiRouteValidations}
|
|
563
|
+
|
|
564
|
+
${layoutValidations}
|
|
565
|
+
`;
|
|
566
|
+
}
|