import type { Logger } from "vite";
import type { ModuleRunner } from "vite/module-runner";
import type { InputNormalizer } from "../types.js";
/**
 * Shared loader utility that both RSC worker loader and build loader can use.
 *
 * This handles the common pattern:
 * 1. Parse id to get moduleId and exportName
 * 2. Handle virtual modules and node_modules (via resolveVirtualAndNodeModules)
 * 3. Try manifest-based resolution (build mode)
 * 4. Import the module
 * 5. Validate exports
 *
 * If the result is already a module object (not a Promise), it's returned directly.
 * This allows loaders to reuse already-loaded modules.
 *
 * @param options - Loader configuration options
 * @returns The resolved module (already a module object, not a Promise)
 */
export declare function createSharedLoader({ moduleId, exportName, verbose, logger, resolveVirtual, manifest, normalizer, moduleBase, preserveModulesRoot, projectRoot, buildOutDir, buildServerDir, isBuildMode, isServeMode: _isServeMode, effectiveProjectRoot, build, moduleRunner, }: {
    moduleId: string;
    exportName?: string;
    verbose?: boolean;
    logger?: Logger;
    resolveVirtual?: boolean;
    manifest?: Record<string, {
        file: string;
    } | undefined>;
    normalizer?: InputNormalizer;
    moduleBase?: string;
    preserveModulesRoot?: boolean;
    projectRoot?: string;
    buildOutDir?: string;
    buildServerDir?: string;
    isBuildMode?: boolean;
    isServeMode?: boolean;
    effectiveProjectRoot?: string;
    build?: {
        server?: string;
        client?: string;
        static?: string;
        outDir?: string;
    };
    /**
     * Optional Vite ModuleRunner. When provided in dev:ssr mode the worker
     * pulls project source through Vite's runner instead of Node's native
     * import(), so file edits invalidate per-module without a worker restart.
     */
    moduleRunner?: ModuleRunner | null;
}): Promise<Record<string, any>>;
//# sourceMappingURL=createSharedLoader.d.ts.map