import { UpdateMode } from "@azure/data-tables";
import { IDictionary } from "@kwiz/common";
import { IOdataFilterStatement } from "./odata";
export declare function ConfigureTableStorage(config: {
    connectionString: string;
}): void;
export type TableOperationResult<T = never> = {
    success: true;
    result?: T;
    errorCode?: string;
} | {
    success: false;
    result?: T;
    errorCode: string;
};
type TableEntityBase = {
    /**
     * The PartitionKey property of the entity.
     * Does not allow / \ # ? any control characted (like \n)
     */
    partitionKey: string;
    /**
     * The RowKey property of the entity.
     */
    rowKey: string;
};
export type TableEntityType<DataType extends TableEntityBase> = {
    [P in keyof DataType]: string | boolean | Date | number;
};
export declare function findTable(tableName: string): Promise<TableOperationResult>;
export declare function listTables(): Promise<string[]>;
export declare function ensureTable(tableName: string): Promise<TableOperationResult>;
export declare function deleteTable(tableName: string): Promise<TableOperationResult>;
export declare function getItems<DataType extends TableEntityBase & TableEntityType<DataType>>(tableName: string, options?: {
    filterStatment?: IOdataFilterStatement<DataType>;
    postFilter?: (item: DataType) => boolean;
}): Promise<TableOperationResult<DataType[]>>;
export declare function addItem<DataType extends TableEntityBase & TableEntityType<DataType>>(tableName: string, item: DataType): Promise<TableOperationResult>;
export declare function deleteItem(tableName: string, partitionKey: string, rowKey: string): Promise<TableOperationResult>;
export declare function upsertItem<DataType extends TableEntityBase & TableEntityType<DataType>>(tableName: string, item: DataType, options?: {
    mode?: UpdateMode;
}): Promise<TableOperationResult>;
export declare class Table<KeysType extends TableEntityBase, GetKeysParam, SavedRow extends KeysType & TableEntityType<SavedRow>, ParsedRow = SavedRow> {
    private tableName;
    private transform;
    getKeys: (p: GetKeysParam) => KeysType;
    /** If your type contains complex values, provide a transforer to serialize/deserialize those complex columns */
    constructor(tableName: string, options: {
        getKeys: (p: GetKeysParam) => KeysType;
        transform?: {
            save: (parsed: ParsedRow, table: Table<KeysType, GetKeysParam, SavedRow, ParsedRow>) => SavedRow;
            load: (saved: SavedRow, table: Table<KeysType, GetKeysParam, SavedRow, ParsedRow>) => ParsedRow;
        };
    });
    delete(): Promise<TableOperationResult<never>>;
    ensure(): Promise<TableOperationResult<never>>;
    getItems(options?: {
        filterStatment?: IOdataFilterStatement<SavedRow>;
        postFilter?: (item: SavedRow) => boolean;
    }): Promise<{
        result: ParsedRow[];
        success: true;
        errorCode?: string;
    } | {
        result: ParsedRow[];
        success: false;
        errorCode: string;
    }>;
    addItem(item: ParsedRow): Promise<TableOperationResult<never>>;
    upsertItem(item: ParsedRow, options?: {
        mode?: UpdateMode;
    }): Promise<TableOperationResult<never>>;
    deleteItemByKey(param: GetKeysParam): Promise<TableOperationResult<never>>;
    deleteItem(item: KeysType): Promise<TableOperationResult<never>>;
}
export declare const tableColumnLengthLimit = 31999;
export declare function overflowColumnValue<T = IDictionary<any>>(item: T, longProps: string | string[], overrideLimit?: number): T;
export declare function restoreOverflowColumnValue<T = IDictionary<any>>(item: T, longProps: string | string[]): T;
export {};
