/**
 * Execute code-based data loaders for SDK custom blocks.
 *
 * Code loaders are user-defined async functions that can fetch data
 * from any API (not just whitelisted CMS endpoints). They run
 * server-side during loadPage().
 */
import type { PageOutline } from '../contracts';
import type { PrefetchContext, ResolvedBlockData } from './prefetchBlockData';
import type { DataLoaderOverrides } from './types';
/**
 * Execute code-based data loaders for blocks on a page.
 *
 * Iterates through page blocks and executes any registered loader
 * functions for matching block kinds. Runs all loaders in parallel.
 *
 * @param page - Page outline with blocks to process
 * @param context - Prefetch context (siteId, pageId, previewStage)
 * @param overrides - Map of block kinds to loader functions
 * @returns Resolved data keyed by blockId, then loader key
 *
 * @example
 * ```typescript
 * const codeData = await executeCodeLoaders(page, context, {
 *   'custom.featured-products': {
 *     products: async (ctx) => fetchProducts(ctx.content.categoryId),
 *   },
 * });
 * // codeData: { 'block-123': { products: [...] } }
 * ```
 */
export declare function executeCodeLoaders(page: PageOutline, context: PrefetchContext & {
    searchParams?: Record<string, string | string[] | undefined>;
}, overrides: DataLoaderOverrides): Promise<ResolvedBlockData>;
/**
 * Merge resolved data from config loaders and code loaders.
 *
 * Code loader results take precedence on key conflicts.
 *
 * @param configResults - Data from config-based loaders (CMS endpoints)
 * @param codeResults - Data from code-based loaders (external APIs)
 * @returns Merged data with code results overwriting config on conflicts
 */
export declare function mergeLoaderResults(configResults: ResolvedBlockData, codeResults: ResolvedBlockData): ResolvedBlockData;
