import type { Logger } from 'winston';
import type { SyncStream, ReadStream, WriteStream } from '../grpc/plugin.js';
import type { Table } from '../schema/table.js';
export type BackendOptions = {
    tableName: string;
    connection: string;
};
export type TableOptions = {
    tables: string[];
    skipTables: string[];
    skipDependentTables: boolean;
};
export type SyncOptions = {
    tables: string[];
    skipTables: string[];
    skipDependentTables: boolean;
    deterministicCQId: boolean;
    backendOptions: BackendOptions;
    stream: SyncStream;
};
export type NewClientOptions = {
    noConnection: boolean;
};
export type NewClientFunction = (logger: Logger, spec: string, options: NewClientOptions) => Promise<Client>;
export type PluginKind = 'source' | 'destination';
export type BuildTarget = {
    os: 'linux' | 'darwin' | 'windows';
    arch: 'amd64' | 'arm64';
};
export type PluginOptions = {
    team: string;
    kind: PluginKind;
    dockerFile?: string;
    buildTargets?: BuildTarget[];
    jsonSchema?: string;
};
export interface SourceClient {
    tables: (options: TableOptions) => Promise<Table[]>;
    sync: (options: SyncOptions) => void;
}
export interface DestinationClient {
    read: (stream: ReadStream) => void;
    write: (stream: WriteStream) => Promise<void>;
}
export interface Client extends SourceClient, DestinationClient {
    close: () => Promise<void>;
}
export interface Plugin extends Client {
    getLogger: () => Logger;
    setLogger: (logger: Logger) => void;
    name: () => string;
    version: () => string;
    team: () => string | undefined;
    kind: () => PluginKind | undefined;
    jsonSchema: () => string | undefined;
    dockerFile: () => string;
    buildTargets: () => BuildTarget[];
    init: (spec: string, options: NewClientOptions) => Promise<void>;
    testConnection?: (spec: string) => Promise<{
        success?: boolean;
        failureCode?: string;
        failureDescription?: string;
    }>;
}
export declare const newUnimplementedSource: () => SourceClient;
export declare const newUnimplementedDestination: () => DestinationClient;
export declare const newPlugin: (name: string, version: string, newClient: NewClientFunction, options?: PluginOptions) => Plugin;
