/// import * as https from 'https' import * as stream from 'stream' declare class ClickHouse { constructor(options: ConstructorOptions) query(chQuery: string, options: ClickHouse.QueryOptions, cb?: ClickHouse.QueryCallback): ClickHouse.RecordStream query(chQuery: string, cb?: ClickHouse.QueryCallback): ClickHouse.RecordStream querying< QueryOptions extends ClickHouse.QueryOptions, RecordType extends ClickHouse.DefaultRecordType< ConstructorOptions, QueryOptions, unknown > = ClickHouse.DefaultRecordType >(chQuery: string, options?: QueryOptions): Promise> ping(cb?: ClickHouse.QueryCallback): ClickHouse.RecordStream pinging(): Promise } declare namespace ClickHouse { type SpecificConstructorOptions = { // Host is required, overriding it host: string user?: string password?: string useQueryString?: boolean } & QueryOptions type ConstructorOptions = https.RequestOptions & SpecificConstructorOptions export type Options = ConstructorOptions | string export type QueryOptions = { dataObjects?: boolean format?: Format syncParser?: boolean omitFormat?: boolean readonly?: boolean queryOptions?: { [key: string]: string | number | boolean } } export type QueryCallback = (error?: Error) => void export class RecordStream extends stream.Duplex {} export type Format = | 'TabSeparated' | 'TSV' | 'TabSeparatedRaw' | 'TSVRaw' | 'TabSeparatedWithNames' | 'TSVWithNames' | 'TabSeparatedWithNamesAndTypes' | 'TSVWithNamesAndTypes' | 'Template' | 'TemplateIgnoreSpaces' | 'CSV' | 'CSVWithNames' | 'CustomSeparated' | 'Values' | 'Vertical' | 'JSON' | 'JSONCompact' | 'JSONEachRow' | 'TSKV' | 'Pretty' | 'PrettyCompact' | 'PrettyCompactMonoBlock' | 'PrettyNoEscapes' | 'PrettySpace' | 'Protobuf' | 'Parquet' | 'RowBinary' | 'RowBinaryWithNamesAndTypes' | 'Native' | 'Null' | 'XML' | 'CapnProto' type StringResultFormat = Exclude // This is returned when format=JSON, format=JSONCompact or dataObject=true specified export type ObjectQueryResult = { meta: Array<{ name: string type: string }> totals?: any extremes?: any data: Array rows: number rows_before_limit_at_least?: number statistics: { elapsed: number rows_read: number bytes_read: number } transferred: number } // DefaultRecordType is used to check any user-defined type // DefaultRecordType is used as a default if user does not supply specific type // DefaultRecordType cannot be used to check user-defined type as it allows pretty much anything, including Array type DefaultRecordType = QueryOptions extends { format: 'JSON' } ? Record : QueryOptions extends { format: 'JSONCompact' } ? Array : QueryOptions extends { format: StringResultFormat } ? null : ConstructorOptions extends { format: 'JSON' } ? Record : ConstructorOptions extends { format: 'JSONCompact' } ? Array : ConstructorOptions extends { format: StringResultFormat } ? null : QueryOptions extends { dataObjects: true } ? Record : ConstructorOptions extends { dataObjects: true } ? Record : Array // string is returned for any non-JSON format export type QueryResult = RecordType extends null ? string : ObjectQueryResult } export = ClickHouse