UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

59 lines (58 loc) 3.53 kB
import React from "react"; import { RequestInfo } from "../requestInfo/types"; import type { Kysely } from "kysely"; export type DocumentProps<T extends RequestInfo = RequestInfo> = T & { children: React.ReactNode; }; export type LayoutProps<T extends RequestInfo = RequestInfo> = { children?: React.ReactNode; requestInfo?: T; }; export type RwContext = { nonce: string; Document: React.FC<DocumentProps<any>>; rscPayload: boolean; ssr: boolean; layouts?: React.FC<LayoutProps<any>>[]; databases: Map<string, Kysely<any>>; pageRouteResolved: PromiseWithResolvers<void> | undefined; }; export type RouteMiddleware<T extends RequestInfo = RequestInfo> = (requestInfo: T) => Response | Promise<Response> | void | Promise<void> | Promise<Response | void>; type RouteFunction<T extends RequestInfo = RequestInfo> = (requestInfo: T) => Response | Promise<Response>; type MaybePromise<T> = T | Promise<T>; type RouteComponent<T extends RequestInfo = RequestInfo> = (requestInfo: T) => MaybePromise<React.JSX.Element | Response>; type RouteHandler<T extends RequestInfo = RequestInfo> = RouteFunction<T> | RouteComponent<T> | [...RouteMiddleware<T>[], RouteFunction<T> | RouteComponent<T>]; export type Route<T extends RequestInfo = RequestInfo> = RouteMiddleware<T> | RouteDefinition<T> | Array<Route<T>>; export type RouteDefinition<T extends RequestInfo = RequestInfo> = { path: string; handler: RouteHandler<T>; layouts?: React.FC<LayoutProps<T>>[]; }; export declare function matchPath<T extends RequestInfo = RequestInfo>(routePath: string, requestPath: string): T["params"] | null; export declare function defineRoutes<T extends RequestInfo = RequestInfo>(routes: Route<T>[]): { routes: Route<T>[]; handle: ({ request, renderPage, getRequestInfo, onError, runWithRequestInfoOverrides, }: { request: Request; renderPage: (requestInfo: T, Page: React.FC, onError: (error: unknown) => void) => Promise<Response>; getRequestInfo: () => T; onError: (error: unknown) => void; runWithRequestInfoOverrides: <Result>(overrides: Partial<T>, fn: () => Promise<Result>) => Promise<Result>; }) => Response | Promise<Response>; }; export declare function route<T extends RequestInfo = RequestInfo>(path: string, handler: RouteHandler<T>): RouteDefinition<T>; export declare function index<T extends RequestInfo = RequestInfo>(handler: RouteHandler<T>): RouteDefinition<T>; export declare function prefix<T extends RequestInfo = RequestInfo>(prefixPath: string, routes: Route<T>[]): Route<T>[]; export declare const wrapHandlerToThrowResponses: <T extends RequestInfo = RequestInfo>(handler: RouteFunction<T> | RouteComponent<T>) => RouteHandler<T>; export declare function layout<T extends RequestInfo = RequestInfo>(LayoutComponent: React.FC<LayoutProps<T>>, routes: Route<T>[]): Route<T>[]; export declare function render<T extends RequestInfo = RequestInfo>(Document: React.FC<DocumentProps<T>>, routes: Route<T>[], /** * @param options - Configuration options for rendering. * @param options.rscPayload - Toggle the RSC payload that's appended to the Document. Disabling this will mean that interactivity no longer works. * @param options.ssr - Disable sever side rendering for all these routes. This only allow client side rendering`, which requires `rscPayload` to be enabled. */ options?: { rscPayload?: boolean; ssr?: boolean; }): Route<T>[]; export declare const isClientReference: (value: any) => boolean; export {};