import type Client from './Client';
export type Numerish = string | number;
export type FieldValue = string | Numerish;
export type FieldData = Record<string, FieldValue>;
export type GenericPortalData = Record<string, FieldData>;
export type RecordResponse<T extends FieldData = FieldData, U extends GenericPortalData = GenericPortalData> = {
    fieldData: T;
    recordId: string;
    modId: string;
    portalData: {
        [key in keyof U]: Array<U[key] & {
            recordId: string;
            modId: string;
        }>;
    };
};
export type ScriptParams = {
    'script'?: string;
    'script.param'?: string;
    'script.prerequest'?: string;
    'script.prerequest.param'?: string;
    'script.presort'?: string;
    'script.presort.param'?: string;
};
export type ScriptResponse = {
    'scriptResult'?: string;
    'scriptError'?: string;
    'scriptResult.prerequest'?: string;
    'scriptError.prerequest'?: string;
    'scriptResult.presort'?: string;
    'scriptError.presort'?: string;
};
export type CreateParams = ScriptParams;
export type CreateResponse = ScriptResponse & {
    recordId: string;
    modId: string;
};
export type UpdateParams = CreateParams & {
    modId?: number;
};
export type UpdateResponse = ScriptResponse & {
    modId: string;
};
export type DeleteParams = ScriptParams;
export type DeleteResponse = ScriptResponse;
export type RangeParams = {
    offset?: number;
    limit?: number;
};
export type PortalRanges<U extends GenericPortalData = GenericPortalData> = Partial<{
    [key in keyof U]: RangeParams;
}>;
export type PortalRangesParams<U extends GenericPortalData = GenericPortalData> = {
    'portalRanges'?: PortalRanges<U>;
};
export type GetParams<U extends GenericPortalData = GenericPortalData> = ScriptParams & PortalRangesParams<U> & {
    'layout.response'?: string;
};
export type Sort<T extends FieldData = FieldData> = {
    fieldName: keyof T;
    sortOrder: 'ascend' | 'descend';
};
export type ListParams<T extends FieldData = FieldData, U extends GenericPortalData = GenericPortalData> = GetParams<U> & RangeParams & {
    sort?: Sort<T> | Array<Sort<T>>;
};
export type GetResponse<T extends FieldData = FieldData, U extends GenericPortalData = GenericPortalData> = ScriptResponse & {
    data: Array<RecordResponse<T, U>>;
};
export type FindResponse<T extends FieldData = FieldData, U extends GenericPortalData = GenericPortalData> = GetResponse<T, U> & {
    dataInfo: {
        foundCount: number;
        returnedCount: number;
        totalRecordCount: number;
    };
};
export type Query<T extends FieldData = FieldData> = Partial<{
    [key in keyof T]: T[key] | string;
}> & {
    omit?: boolean;
};
export type File = {
    name: string;
    buffer: Buffer;
};
export type ExecuteScriptResponse = Pick<ScriptResponse, 'scriptResult' | 'scriptError'>;
export default class Layout<T extends FieldData = FieldData, U extends GenericPortalData = GenericPortalData> {
    private readonly layout;
    private readonly client;
    constructor(layout: string, client: Client);
    create(fieldData: Partial<T>, params?: CreateParams): Promise<CreateResponse>;
    update(recordId: number, fieldData: Partial<T>, params?: UpdateParams): Promise<UpdateResponse>;
    delete(recordId: number, params?: DeleteParams): Promise<DeleteResponse>;
    upload(file: File | string, recordId: number, fieldName: string, fieldRepetition?: number): Promise<void>;
    get(recordId: number, params?: GetParams<U>): Promise<GetResponse<T, U>>;
    range(params?: ListParams<T, U>): Promise<GetResponse<T, U>>;
    find(query: Query<T> | Array<Query<T>>, params?: ListParams<T, U>, ignoreEmptyResult?: boolean): Promise<FindResponse<T, U>>;
    /**
     * The script parameter will be in the query parameter so do not send sensitive information in it.
     */
    executeScript(scriptName: string, scriptParam?: string): Promise<ExecuteScriptResponse>;
    private addPortalRangesToRequest;
}
