/**
 * Moving rows in and out: CSV import and export, and JSON APIs read into rows.
 * (Mail stays the app's: its transport, templates and sending are not Talos's.)
 */
/** CSV text to rows keyed by header; `,`, `;` or tab (whichever the header uses most), quotes and "" escapes. */
export declare function parseCsv(text: string): Record<string, string>[];
/** Rows to CSV, with the columns given (header labels optional). */
export declare function toCsv(rows: Record<string, unknown>[], columns: string[] | Record<string, string>, sep?: string): string;
/**
 * Import CSV rows into a table through a write function (a sentence route's
 * runner, or anything taking values): headers mapped to columns (several
 * spellings each), a key column deciding what is already there, and a report.
 *
 *   await importCsv(text, { map: { email: ['email', 'e-mail', 'courriel'], name: ['nom', 'name'] },
 *     key: 'email', exists: email => …, write: values => … })
 */
export declare function importCsv(text: string, o: {
    map: Record<string, string[] | string>;
    key?: string;
    /** whether a row with that key is already there (then it is skipped, or updated with `update`) */
    exists?: (key: string) => Promise<boolean> | boolean;
    write: (values: Record<string, string>) => Promise<unknown> | unknown;
    update?: (values: Record<string, string>) => Promise<unknown> | unknown;
    /** a row to leave out, with the reason */
    check?: (values: Record<string, string>) => string | null | undefined;
}): Promise<{
    total: number;
    inserted: number;
    updated: number;
    skipped: number;
    errors: {
        line: number;
        reason: string;
    }[];
}>;
/**
 * A JSON API read into a row: `{placeholders}` in the URL, dotted paths or
 * functions for each field, a timeout, and a small cache. Returns null when
 * the API has nothing (404, or `found` says so).
 *
 *   const product = connector({ url: 'https://world.openfoodfacts.org/api/v2/product/{code}.json',
 *     found: j => j.status === 1, map: { name: 'product.product_name', brand: 'product.brands' } })
 *   await product({ code: '3017620422003' })
 */
export declare function connector<T extends Record<string, unknown>>(o: {
    url: string;
    map: Record<keyof T & string, string | ((json: any) => unknown)>;
    found?: (json: any) => boolean;
    headers?: Record<string, string>;
    timeoutMs?: number;
    cacheMs?: number;
}): (params: Record<string, unknown>) => Promise<T | null>;
