import type { Editor } from '@tiptap/core'; import { type WorkDocumentFieldContextResolver, type WorkDocumentFieldRefreshOptions } from './work-document-fields'; import type { WorkDocumentContent } from './work-types'; /** * One mail-merge data row. Keys are MERGEFIELD names; values are plain text * substitutions for preview/refresh. Hosts own the data source. */ export type WorkDocumentMailMergeRecord = Readonly>; /** Bounded comparison operators for recipient-filter rules (AND-combined). */ export type WorkDocumentMailMergeFilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'isBlank' | 'isNotBlank'; /** One recipient-filter predicate against a MERGEFIELD / column name. */ export interface WorkDocumentMailMergeFilterRule { field: string; operator: WorkDocumentMailMergeFilterOperator; /** Compared text for operators other than isBlank / isNotBlank. */ value?: string; } /** AND-combined recipient filter over host records. */ export interface WorkDocumentMailMergeRecipientFilter { rules: readonly WorkDocumentMailMergeFilterRule[]; } /** * Explicit host contract for bounded mail-merge preview and batch generation. * * Unsupported MERGEFIELD switches remain outside this slice. */ export interface WorkDocumentMailMergeSource { /** Ordered recipient/data rows (unfiltered host data). */ records: readonly WorkDocumentMailMergeRecord[]; /** * Zero-based active preview row within {@link filteredMailMergeRecords}. */ activeIndex: number; /** Optional AND recipient filter; preview and batch use the filtered view. */ filter?: WorkDocumentMailMergeRecipientFilter | null; } export declare const DOCUMENT_MAIL_MERGE_MAX_RECORDS = 10000; export declare const DOCUMENT_MAIL_MERGE_MAX_BATCH_DOCUMENTS = 256; export declare const DOCUMENT_MAIL_MERGE_MAX_FIELDS = 256; export declare const DOCUMENT_MAIL_MERGE_MAX_FIELD_NAME = 64; export declare const DOCUMENT_MAIL_MERGE_MAX_FIELD_VALUE = 10000; export declare const DOCUMENT_MAIL_MERGE_MAX_FILTER_RULES = 8; export declare function emptyMailMergeSource(): WorkDocumentMailMergeSource; export declare function normalizeMailMergeRecipientFilter(value: Partial | null | undefined): WorkDocumentMailMergeRecipientFilter | null; export declare function normalizeMailMergeSource(value: Partial | null | undefined): WorkDocumentMailMergeSource; export declare function normalizeMailMergeRecord(value: unknown): WorkDocumentMailMergeRecord | null; /** Recipient rows visible after applying the optional AND filter. */ export declare function filteredMailMergeRecords(source: WorkDocumentMailMergeSource | null | undefined): readonly WorkDocumentMailMergeRecord[]; export declare function mailMergeRecordMatchesFilter(record: WorkDocumentMailMergeRecord, filter: WorkDocumentMailMergeRecipientFilter | null | undefined): boolean; export declare function setMailMergeRecipientFilter(source: WorkDocumentMailMergeSource | null | undefined, filter: WorkDocumentMailMergeRecipientFilter | null | undefined): WorkDocumentMailMergeSource; export declare function mailMergeFieldNamesFromRecords(records: readonly WorkDocumentMailMergeRecord[]): string[]; export declare function activeMailMergeRecord(source: WorkDocumentMailMergeSource | null | undefined): WorkDocumentMailMergeRecord | null; export declare function stepMailMergeSource(source: WorkDocumentMailMergeSource | null | undefined, delta: number): WorkDocumentMailMergeSource; export declare function mailMergeFieldNamesFromHtml(html: string): string[]; export declare function mailMergeFieldNamesFromEditor(editor: Editor): string[]; /** * Layers the active mail-merge record onto a base field-context resolver * (typically pagination). When no base resolver exists, still returns a * minimal context so MERGEFIELD preview works in web/continuous views. */ export declare function createMailMergeFieldContextResolver(base: WorkDocumentFieldContextResolver | null | undefined, source: WorkDocumentMailMergeSource | null | undefined): WorkDocumentFieldContextResolver | null; /** Refreshes live fields using the active row from a host mail-merge source. */ export declare function previewMailMergeSource(editor: Editor, content: WorkDocumentContent, source: WorkDocumentMailMergeSource | null | undefined, options?: Omit & { resolveContext?: WorkDocumentFieldContextResolver | null; }): boolean; /** One generated DOCX for a single mail-merge recipient row. */ export interface WorkDocumentMailMergeGeneratedDocument { index: number; record: WorkDocumentMailMergeRecord; blob: Blob; } /** * Generates one DOCX blob per filtered recipient row for the current editor * template. * * Caps at `DOCUMENT_MAIL_MERGE_MAX_BATCH_DOCUMENTS`. Restores the editor to the * source's active preview row after generation. */ export declare function generateMailMergeDocuments(editor: Editor, content: WorkDocumentContent, source: WorkDocumentMailMergeSource | null | undefined, options?: Omit & { resolveContext?: WorkDocumentFieldContextResolver | null; exportDocument?: (next: WorkDocumentContent) => Promise; maxDocuments?: number; }): Promise;