rwsdk
Version:
Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime
59 lines (58 loc) • 3.53 kB
TypeScript
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 {};