import type { PreRenderedChunk } from "rollup";
import type { PreRenderedAsset } from "rollup";
import type { UserConfig, BuildOptions, InlineConfig, AliasOptions, Connect, ResolveOptions } from "vite";
import type { PipeableStreamOptions } from "./worker/types.js";
export type NormalizerInput = unknown;
export type InputNormalizer = (input: NormalizerInput) => [string, string];
export type InputNormalizerWorker = (input: NormalizerInput) => Promise<[string, string]>;
export type ResolvedUserConfig = Required<Pick<UserConfig, "root" | "mode" | "build" | "resolve">> & Omit<UserConfig, "root" | "mode" | "build" | "resolve"> & {
    resolve: ResolveOptions;
} & {
    build: NonNullable<Required<Pick<BuildOptions, "target" | "outDir" | "assetsDir" | "ssr" | "ssrEmitAssets" | "ssrManifest" | "manifest" | "rollupOptions">>> & Omit<BuildOptions, "target" | "outDir" | "assetsDir" | "ssr" | "ssrEmitAssets" | "ssrManifest" | "manifest">;
};
export interface StreamPluginOptionsClient {
    outDir?: string;
    build?: BuildConfig;
    assetsDir?: string;
    projectRoot?: string;
    moduleBase?: string;
    moduleBasePath?: string;
    moduleBaseURL?: string;
    clientComponents?: AliasOptions;
    cssFiles?: AliasOptions;
}
export type ResolvedUserOptions<InlineCSS extends boolean = boolean> = Required<Pick<StreamPluginOptions, "moduleBase" | "moduleBasePath" | "moduleBaseURL" | "projectRoot" | "build" | "Page" | "props" | "Html" | "CssCollector" | "pageExportName" | "propsExportName" | "collectCss" | "collectAssets" | "inlineCss" | "htmlWorkerPath" | "rscWorkerPath" | "loaderPath" | "clientEntry" | "serverEntry" | "moduleBaseExceptions" | "pipableStreamOptions">> & {
    build: NonNullable<Required<StreamPluginOptions<InlineCSS>["build"]>>;
    autoDiscover: {
        modulePattern: (path: string) => boolean;
        cssPattern: (path: string) => boolean;
        jsonPattern: (path: string) => boolean;
        clientComponents: (path: string) => boolean;
        propsPattern: (path: string) => boolean;
        pagePattern: (path: string) => boolean;
        serverFunctions: (path: string) => boolean;
        cssModulePattern: (path: string) => boolean;
        vendorPattern: (path: string) => boolean;
    };
};
export type createBuildConfigFn<C extends "react-client" | "react-server"> = (input: {
    condition: C;
    userOptions: ResolvedUserOptions;
    userConfig: ResolvedUserConfig;
    mode: "production" | "development" | "test";
    inputNormalizer: C extends "react-server" ? InputNormalizerWorker : InputNormalizerWorker;
}) => C extends "react-server" ? Promise<InlineConfig> : Promise<InlineConfig>;
export interface StreamPluginOptions<InlineCSS extends boolean = boolean> {
    projectRoot?: string;
    moduleBase: string;
    moduleBasePath?: string;
    moduleBaseURL?: string;
    clientEntry?: string;
    serverEntry?: string;
    autoDiscover?: {
        modulePattern?: string | RegExp | ((path: string) => boolean);
        pagePattern?: string | RegExp | ((path: string) => boolean);
        propsPattern?: string | RegExp | ((path: string) => boolean);
        clientComponents?: string | RegExp | ((path: string) => boolean);
        serverFunctions?: string | RegExp | ((path: string) => boolean);
        cssPattern?: string | RegExp | ((path: string) => boolean);
        jsonPattern?: string | RegExp | ((path: string) => boolean);
        htmlPattern?: string | RegExp | ((path: string) => boolean);
        cssModulePattern?: string | RegExp | ((path: string) => boolean);
        vendorPattern?: string | RegExp | ((path: string) => boolean);
    } | undefined;
    Page: string | ((url: string) => string);
    props?: undefined | string | ((url: string) => string);
    htmlWorkerPath?: string;
    rscWorkerPath?: string;
    loaderPath?: string;
    pageExportName?: string;
    propsExportName?: string;
    Html?: React.FC<{
        manifest: import("vite").Manifest;
        pageProps: any;
        route: string;
        url: string;
        children: React.ReactNode;
    }>;
    CssCollector?: InlineCSS extends true ? React.FC<React.PropsWithChildren<InlineCssCollectorProps>> : React.FC<React.PropsWithChildren<CssCollectorProps>>;
    collectCss?: boolean;
    collectAssets?: boolean;
    inlineCss?: InlineCSS;
    build?: BuildConfig;
    moduleBaseExceptions?: string[];
    pipableStreamOptions?: PipeableStreamOptions;
}
export interface CreateHandlerOptions<T = any, InlineCSS extends boolean = boolean> {
    root: string;
    url: string;
    route: string;
    getCss: (id: string) => Promise<Map<string, string | CssContent>> | Map<string, string | CssContent>;
    loader: (id: string) => Promise<T>;
    Html: NonNullable<StreamPluginOptions['Html']>;
    CssCollector: InlineCSS extends true ? React.FC<React.PropsWithChildren<InlineCssCollectorProps>> : React.FC<React.PropsWithChildren<CssCollectorProps>>;
    inlineCss: InlineCSS;
    propsPath?: string;
    pagePath?: string;
    pageExportName: string;
    propsExportName: string;
    moduleBase: string;
    preserveModulesRoot?: boolean | undefined;
    moduleBasePath: string;
    moduleRootPath: string;
    moduleBaseURL: string;
    cssFiles: (string | CssContent)[];
    cssModules?: Map<string, string | CssContent> | undefined;
    onCssFile?: (path: string, parentUrl: string) => void;
    logger: import("vite").Logger;
    pipableStreamOptions: PipeableStreamOptions;
}
export type ModuleLoader = (url: string, context?: any, defaultLoad?: any) => Promise<Record<string, any>>;
export interface BaseProps {
    manifest: import("vite").Manifest;
    children?: React.ReactNode;
    assets?: {
        css?: string[];
    };
}
export type StreamResult = {
    type: "success";
    stream: any;
    assets?: {
        css?: string[];
    };
} | {
    type: "error";
    error: unknown;
} | {
    type: "skip";
};
export interface RscStreamOptions {
    Page: React.ComponentType;
    props: any;
    Html: any;
    logger?: Console | import("vite").Logger;
    cssFiles?: string[];
    htmlProps: any;
    route: string;
    url: string;
    pipableStreamOptions?: PipeableStreamOptions;
    moduleBasePath: string;
}
export interface RouteConfig {
    path: string;
    pattern?: {
        page?: string;
        props?: string;
    };
    paths?: {
        page: string;
        props: string;
    };
}
export interface BuildOutput {
    dir?: string;
    rsc?: string;
    ext?: string;
}
export interface BuildConfig {
    pages: string[] | (() => Promise<string[]> | string[]) | Promise<string[]>;
    assetsDir?: string;
    client?: string;
    server?: string;
    static?: string;
    api?: string;
    outDir?: string;
    hash?: string;
    preserveModulesRoot?: boolean;
    entryFile?: (n: PreRenderedChunk) => string;
    chunkFile?: (n: PreRenderedChunk) => string;
    assetFile?: (n: PreRenderedAsset) => string;
}
export interface RscResolver {
    /**
     * Get RSC data for static generation
     * @param path - Route path (e.g. "/", "/about")
     */
    getRscData: (path: string) => Promise<{
        Page: React.ComponentType;
        props: any;
    }>;
}
export type RequestHandler = Connect.NextHandleFunction;
export interface SsrStreamOptions {
    url: string;
    controller: AbortController;
    loader: (id: string) => Promise<any>;
    Html: any;
    options: StreamPluginOptions;
    pageExportName: string;
    propsExportName: string;
    moduleGraph: any;
    bootstrapModules?: string[];
    importMap?: Record<string, string[]>;
    clientComponents?: boolean;
    onlyClientComponents?: boolean;
}
export type RscServerConfig = {
    /** How to get RSC data (e.g. HTTP, direct import, etc) */
    getRscComponent: (url: string) => React.Usable<React.ReactNode>;
    /** Base URL for client assets */
    clientBase?: string;
    /** SSR stream rendering options */
    ssrOptions?: SsrStreamOptions;
};
export interface RscServerModule {
    /**
     * Get RSC data for a route
     * @param path - Route path (e.g. "/", "/about")
     * @returns Page component and props
     */
    getRscData: (path: string) => Promise<{
        /** Page component to render */
        Page: React.ComponentType;
        /** Props to pass to the page */
        props: any;
    }>;
}
export interface RegisterComponentMessage {
    type: "REGISTER_COMPONENT";
    id: string;
    code: string;
}
export type RscBuildResult = string[];
export interface ReactStreamPluginMeta {
    timing: BuildTiming;
}
export interface BuildTiming {
    start: number;
    configResolved?: number;
    buildStart?: number;
    buildEnd?: number;
    renderStart?: number;
    renderEnd?: number;
    total?: number;
}
export type CheckFilesExistReturn = {
    propsMap: Map<string, string>;
    propsSet: Set<string>;
    pageMap: Map<string, string>;
    pageSet: Set<string>;
    urlMap: Map<string, {
        props: string;
        page: string;
    }>;
    errors: string[];
};
export type WorkerMessage = {
    type: "READY";
} | {
    type: "ERROR";
    error: string | Error;
} | {
    type: "RSC_CHUNK";
    id: string;
    chunk: Buffer;
} | {
    type: "RSC_END";
    id: string;
} | {
    type: "SHUTDOWN";
};
export type ModuleId = string & {
    readonly __brand: unique symbol;
};
export type PagePath = string & {
    readonly __brand: unique symbol;
};
export type HtmlProps = {
    pageProps: any;
    route: string;
    url: string;
    cssFiles: string[];
};
export interface PageAsset {
    type: 'css' | 'js';
    path: string;
    parentUrl: string;
}
export interface PageData {
    route: string;
    clientComponents?: string[];
    html?: {
        raw: string;
        transformed?: string;
        assets: PageAsset[];
    };
    rsc?: {
        content: string;
        modules: Array<[string, string]>;
    };
}
export interface CssContent {
    type?: string;
    content: string;
    key?: string;
    path: string;
}
export interface InlineCssCollectorProps {
    cssFiles: CssContent[];
    root: string;
    moduleBaseURL: string;
    moduleBasePath: string;
    moduleRootPath: string;
    route: string;
    children?: React.ReactNode;
}
export interface CssCollectorProps {
    cssFiles: CssContent[];
    root: string;
    moduleBaseURL: string;
    moduleBasePath: string;
    moduleRootPath: string;
    route: string;
    children?: React.ReactNode;
}
//# sourceMappingURL=types.d.ts.map