/** * Webhook handler factory for auto-generating media on Sanity document events. * * Deploy as a Vercel / Netlify / Cloudflare serverless function. * Listens for Sanity GROQ-powered webhook payloads and triggers Lamina * generation for matching documents. * * Import from 'sanity-plugin-lamina/webhooks'. * * @example * ```ts * import { createLaminaWebhookHandler } from 'sanity-plugin-lamina/webhooks' * * export default createLaminaWebhookHandler({ * laminaApiKey: process.env.LAMINA_API_KEY, * sanityProjectId: 'abc123', * sanityToken: process.env.SANITY_TOKEN, * sanityWebhookSecret: process.env.SANITY_WEBHOOK_SECRET, * triggers: [ * { * filter: '_type == "product"', * fields: { * heroImage: 'Product photo for {{title}}', * thumbnail: 'Product thumbnail, {{title}}', * }, * onlyIfEmpty: true, * }, * ], * }) * ``` * * Closes #78. * * @packageDocumentation */ import type { LaminaSanityClientOptions, FillProgressEvent } from '../headless/types.js'; export interface WebhookTrigger { /** * GROQ filter expression to match documents. * Evaluated against the webhook payload's document. * @example '_type == "product"' */ filter: string; /** * Field-to-brief mapping. * Keys are field names. Values are brief templates with {{fieldName}} placeholders. */ fields: Record; /** Only generate if the field is currently empty. Defaults to true. */ onlyIfEmpty?: boolean; /** Whether to enhance briefs before generation. Defaults to true. */ enhance?: boolean; /** Brand profile ID for this trigger. */ brandProfileId?: string; /** Campaign ID for this trigger. */ campaignId?: string; } export interface WebhookHandlerOptions extends LaminaSanityClientOptions { /** Secret for verifying Sanity webhook signatures. */ sanityWebhookSecret?: string; /** Trigger configurations. */ triggers: WebhookTrigger[]; /** Called after each field is generated. */ onGenerated?: (documentId: string, fieldName: string, assetId: string) => void; /** Called when a field generation fails. */ onError?: (documentId: string, fieldName: string, error: string) => void; /** Called for every progress event. */ onProgress?: (event: FillProgressEvent) => void; } /** * Create a webhook handler that auto-generates Lamina assets when * Sanity documents are created or updated. * * Returns a standard `(request: Request) => Promise` handler * compatible with Vercel, Netlify, Cloudflare Workers, and Express * (via adapter). */ export declare function createLaminaWebhookHandler(opts: WebhookHandlerOptions): (request: Request) => Promise;