/// <reference types="node" />
/**
 *
 */
import { Logger } from './util/logger';
import { Record, DescribeLayoutResult, DescribeCompactLayoutsResult, DescribeApprovalLayoutsResult, Optional, DmlOptions, SaveResult, UpsertResult, RetrieveOptions, Schema, SObjectNames, SObjectRecord, SObjectInputRecord, SObjectUpdateRecord, SObjectFieldNames, FieldProjectionConfig, FieldPathSpecifier, FieldPathScopedProjection } from './types';
import Connection from './connection';
import RecordReference from './record-reference';
import Query, { QueryOptions, QueryField, QueryCondition, QueryConfig } from './query';
import QuickAction from './quick-action';
import { CachedFunction } from './cache';
import { Readable } from 'stream';
export type FindOptions<S extends Schema, N extends SObjectNames<S>> = Partial<QueryOptions & Pick<QueryConfig<S, N>, 'sort' | 'includes'> & {
    limit: number;
    offset: number;
}>;
/**
 * A class for organizing all SObject access
 */
export declare class SObject<S extends Schema, N extends SObjectNames<S>, FieldNames extends SObjectFieldNames<S, N> = SObjectFieldNames<S, N>, RetrieveRecord extends SObjectRecord<S, N, '*'> = SObjectRecord<S, N, '*'>, InputRecord extends SObjectInputRecord<S, N> = SObjectInputRecord<S, N>, UpdateRecord extends SObjectUpdateRecord<S, N> = SObjectUpdateRecord<S, N>> {
    static _logger: Logger;
    type: N;
    _conn: Connection<S>;
    _logger: Logger;
    layouts$: CachedFunction<(ln?: string) => Promise<DescribeLayoutResult>>;
    layouts$$: CachedFunction<(ln?: string) => DescribeLayoutResult>;
    compactLayouts$: CachedFunction<() => Promise<DescribeCompactLayoutsResult>>;
    compactLayouts$$: CachedFunction<() => DescribeCompactLayoutsResult>;
    approvalLayouts$: CachedFunction<() => Promise<DescribeApprovalLayoutsResult>>;
    approvalLayouts$$: CachedFunction<() => DescribeApprovalLayoutsResult>;
    /**
     *
     */
    constructor(conn: Connection<S>, type: N);
    /**
     * Create records
     */
    create(records: InputRecord[], options?: DmlOptions): Promise<SaveResult[]>;
    create(records: InputRecord, options?: DmlOptions): Promise<SaveResult>;
    create(records: InputRecord | InputRecord[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    /**
     * Synonym of SObject#create()
     */
    insert: {
        (records: InputRecord[], options?: DmlOptions): Promise<SaveResult[]>;
        (records: InputRecord, options?: DmlOptions): Promise<SaveResult>;
        (records: InputRecord | InputRecord[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    };
    /**
     * Retrieve specified records
     */
    retrieve(ids: string[], options?: RetrieveOptions): Promise<RetrieveRecord[]>;
    retrieve(ids: string, options?: RetrieveOptions): Promise<RetrieveRecord>;
    retrieve(ids: string | string[], options?: RetrieveOptions): Promise<RetrieveRecord | RetrieveRecord[]>;
    /**
     * Update records
     */
    update(records: UpdateRecord[], options?: DmlOptions): Promise<SaveResult[]>;
    update(records: UpdateRecord, options?: DmlOptions): Promise<SaveResult>;
    update(records: UpdateRecord | UpdateRecord[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    /**
     * Upsert records
     */
    upsert(records: InputRecord[], extIdField: FieldNames, options?: DmlOptions): Promise<UpsertResult[]>;
    upsert(records: InputRecord, extIdField: FieldNames, options?: DmlOptions): Promise<UpsertResult>;
    upsert(records: InputRecord | InputRecord[], extIdField: FieldNames, options?: DmlOptions): Promise<UpsertResult | UpsertResult[]>;
    /**
     * Delete records
     */
    destroy(ids: string[], options?: DmlOptions): Promise<SaveResult[]>;
    destroy(ids: string, options?: DmlOptions): Promise<SaveResult>;
    destroy(ids: string | string[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    /**
     * Synonym of SObject#destroy()
     */
    delete: {
        (ids: string[], options?: DmlOptions): Promise<SaveResult[]>;
        (ids: string, options?: DmlOptions): Promise<SaveResult>;
        (ids: string | string[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    };
    /**
     * Synonym of SObject#destroy()
     */
    del: {
        (ids: string[], options?: DmlOptions): Promise<SaveResult[]>;
        (ids: string, options?: DmlOptions): Promise<SaveResult>;
        (ids: string | string[], options?: DmlOptions): Promise<SaveResult | SaveResult[]>;
    };
    /**
     * Call Bulk#load() to execute bulkload, returning batch object
     */
    bulkload(operation: 'insert' | 'update' | 'upsert' | 'delete' | 'hardDelete', optionsOrInput?: Object | Record[] | Readable | string, input?: Record[] | Readable | string): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Bulkly insert input data using bulk API
     */
    createBulk(input?: Record[] | Readable | string): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Synonym of SObject#createBulk()
     */
    insertBulk: (input?: Record[] | Readable | string) => import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Bulkly update records by input data using bulk API
     */
    updateBulk(input?: Record[] | Readable | string): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Bulkly upsert records by input data using bulk API
     */
    upsertBulk(input?: Record[] | Readable | string, extIdField?: string): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Bulkly delete records specified by input data using bulk API
     */
    destroyBulk(input?: Record[] | Readable | string): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Synonym of SObject#destroyBulk()
     */
    deleteBulk: (input?: Record[] | Readable | string) => import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Bulkly hard delete records specified in input data using bulk API
     */
    destroyHardBulk(input: Record[] | Readable): import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Synonym of SObject#destroyHardBulk()
     */
    deleteHardBulk: (input: Record[] | Readable) => import("./api/bulk").Batch<S, "insert" | "update" | "upsert" | "delete" | "hardDelete">;
    /**
     * Describe SObject metadata
     */
    describe(): Promise<import("./types").DescribeSObjectResult>;
    /**
     *
     */
    describe$(): Promise<import("./types").DescribeSObjectResult>;
    /**
     *
     */
    describe$$(): import("./types").DescribeSObjectResult;
    /**
     * Get record representation instance by given id
     */
    record(id: string): RecordReference<S, N>;
    /**
     * Retrieve recently accessed records
     */
    recent(): Promise<Record[]>;
    /**
     * Retrieve the updated records
     */
    updated(start: string | Date, end: string | Date): Promise<import("./types").UpdatedResult>;
    /**
     * Retrieve the deleted records
     */
    deleted(start: string | Date, end: string | Date): Promise<import("./types").DeletedResult>;
    /**
     * Describe layout information for SObject
     */
    layouts(layoutName?: string): Promise<DescribeLayoutResult>;
    /**
     * @typedef {Object} CompactLayoutInfo
     * @prop {Array.<Object>} compactLayouts - Array of compact layouts
     * @prop {String} defaultCompactLayoutId - ID of default compact layout
     * @prop {Array.<Object>} recordTypeCompactLayoutMappings - Array of record type mappings
     */
    /**
     * Describe compact layout information defined for SObject
     *
     * @param {Callback.<CompactLayoutInfo>} [callback] - Callback function
     * @returns {Promise.<CompactLayoutInfo>}
     */
    compactLayouts(): Promise<DescribeCompactLayoutsResult>;
    /**
     * Describe compact layout information defined for SObject
     *
     * @param {Callback.<ApprovalLayoutInfo>} [callback] - Callback function
     * @returns {Promise.<ApprovalLayoutInfo>}
     */
    approvalLayouts(): Promise<DescribeApprovalLayoutsResult>;
    /**
     * Find and fetch records which matches given conditions
     */
    find<R extends Record = Record>(conditions?: Optional<QueryCondition<S, N>>): Query<S, N, SObjectRecord<S, N, '*', R>, 'Records'>;
    find<R extends Record = Record, FP extends FieldPathSpecifier<S, N> = FieldPathSpecifier<S, N>, FPC extends FieldProjectionConfig = FieldPathScopedProjection<S, N, FP>>(conditions: Optional<QueryCondition<S, N>>, fields?: Optional<QueryField<S, N, FP>>, options?: FindOptions<S, N>): Query<S, N, SObjectRecord<S, N, FPC, R>, 'Records'>;
    /**
     * Fetch one record which matches given conditions
     */
    findOne<R extends Record = Record>(conditions?: Optional<QueryCondition<S, N>>): Query<S, N, SObjectRecord<S, N, '*', R>, 'SingleRecord'>;
    findOne<R extends Record = Record, FP extends FieldPathSpecifier<S, N> = FieldPathSpecifier<S, N>, FPC extends FieldProjectionConfig = FieldPathScopedProjection<S, N, FP>>(conditions: Optional<QueryCondition<S, N>>, fields?: Optional<QueryField<S, N, FP>>, options?: FindOptions<S, N>): Query<S, N, SObjectRecord<S, N, FPC, R>, 'SingleRecord'>;
    /**
     * Find and fetch records only by specifying fields to fetch.
     */
    select<R extends Record = Record, FP extends FieldPathSpecifier<S, N> = FieldPathSpecifier<S, N>, FPC extends FieldProjectionConfig = FieldPathScopedProjection<S, N, FP>>(fields: QueryField<S, N, FP>): Query<S, N, SObjectRecord<S, N, FPC, R>, 'Records'>;
    /**
     * Count num of records which matches given conditions
     */
    count(conditions?: Optional<QueryCondition<S, N>>): Query<S, N, SObjectRecord<S, N, "*" | FieldPathScopedProjection<S, N, Extract<keyof S["SObjects"][N]["Fields"], string>> | FieldPathScopedProjection<S, N, { [K in Extract<keyof S["SObjects"][N]["ParentReferences"], string>]?: "*" | ("*" | Extract<keyof Extract<S["SObjects"][N]["ParentReferences"][K], import("./types").SObjectDefinition<string>>["Fields"], string> | { [K_1 in Extract<keyof Extract<S["SObjects"][N]["ParentReferences"][K], import("./types").SObjectDefinition<string>>["ParentReferences"], string>]?: "*" | ("*" | Extract<keyof Extract<Extract<S["SObjects"][N]["ParentReferences"][K], import("./types").SObjectDefinition<string>>["ParentReferences"][K_1], import("./types").SObjectDefinition<string>>["Fields"], string> | { [K_2 in Extract<keyof Extract<Extract<S["SObjects"][N]["ParentReferences"][K], import("./types").SObjectDefinition<string>>["ParentReferences"][K_1], import("./types").SObjectDefinition<string>>["ParentReferences"], string>]?: "*" | ("*" | Extract<keyof Extract<Extract<Extract<S["SObjects"][N]["ParentReferences"][K], import("./types").SObjectDefinition<string>>["ParentReferences"][K_1], import("./types").SObjectDefinition<string>>["ParentReferences"][K_2], import("./types").SObjectDefinition<string>>["Fields"], string>[])[] | undefined; })[] | undefined; })[] | undefined; }>, Record, {}>, "Count">;
    /**
     * Returns the list of list views for the SObject
     *
     * @param {Callback.<ListViewsInfo>} [callback] - Callback function
     * @returns {Promise.<ListViewsInfo>}
     */
    listviews(): import("./types").StreamPromise<unknown>;
    /**
     * Returns the list view info in specifed view id
     *
     * @param {String} id - List view ID
     * @returns {ListView}
     */
    listview(id: string): ListView;
    /**
     * Returns all registered quick actions for the SObject
     *
     * @param {Callback.<Array.<QuickAction~QuickActionInfo>>} [callback] - Callback function
     * @returns {Promise.<Array.<QuickAction~QuickActionInfo>>}
     */
    quickActions(): import("./types").StreamPromise<unknown>;
    /**
     * Get reference for specified quick aciton in the SObject
     *
     * @param {String} actionName - Name of the quick action
     * @returns {QuickAction}
     */
    quickAction(actionName: string): QuickAction<S>;
}
/**
 * A class for organizing list view information
 *
 * @protected
 * @class ListView
 * @param {Connection} conn - Connection instance
 * @param {SObject} type - SObject type
 * @param {String} id - List view ID
 */
declare class ListView {
    _conn: Connection;
    type: string;
    id: string;
    /**
     *
     */
    constructor(conn: Connection, type: string, id: string);
    /**
     * Executes query for the list view and returns the resulting data and presentation information.
     */
    results(): import("./types").StreamPromise<unknown>;
    /**
     * Returns detailed information about a list view
     */
    describe(options?: {
        headers?: {
            [name: string]: string;
        };
    }): import("./types").StreamPromise<unknown>;
    /**
     * Explain plan for executing list view
     */
    explain(): import("./types").StreamPromise<any>;
}
export default SObject;
