import { RequestOptions, Source, SourceClass, SourceSettings } from '@orbit/data';
import { Dict } from '@orbit/utils';
import { StandardValidator, ValidatorForFn } from '@orbit/validators';
import { RecordKeyMap } from './record-key-map';
import { RecordNormalizer } from './record-normalizer';
import { RecordQueryBuilder } from './record-query-builder';
import { RecordSchema } from './record-schema';
import { RecordTransformBuilder } from './record-transform-builder';
import { StandardRecordValidator } from './record-validators/standard-record-validators';
export interface RecordSourceQueryOptions extends RequestOptions {
    raiseNotFoundExceptions?: boolean;
}
export interface RecordSourceSettings<QO extends RequestOptions = RecordSourceQueryOptions, TO extends RequestOptions = RequestOptions, QB = RecordQueryBuilder, TB = RecordTransformBuilder> extends SourceSettings<QO, TO, QB, TB> {
    schema: RecordSchema;
    keyMap?: RecordKeyMap;
    normalizer?: RecordNormalizer;
    /**
     * A completely custom set of validators.
     */
    validatorFor?: ValidatorForFn<StandardValidator | StandardRecordValidator>;
    /**
     * Custom validators to override, and be merged with, the standard ones which
     * will be built as long as `autoValidate !== false`.
     */
    validators?: Dict<StandardValidator | StandardRecordValidator>;
    /**
     * Automatically validate the contents of all requests.
     *
     * If true, builds a `validatorFor` function if one has not been provided.
     * This will include standard validators as well as any custom `validators`
     * that may be provided.
     *
     * @default true
     */
    autoValidate?: boolean;
    /**
     * Automatically upgrade this source whenever its schema is upgraded.
     *
     * Override the `upgrade` method to provide an upgrade implementation.
     *
     * @default true
     */
    autoUpgrade?: boolean;
}
export declare type RecordSourceClass<QO extends RequestOptions = RecordSourceQueryOptions, TO extends RequestOptions = RequestOptions, QB = RecordQueryBuilder, TB = RecordTransformBuilder> = SourceClass<QO, TO, QB, TB>;
/**
 * Abstract base class for record-based sources.
 */
export declare abstract class RecordSource<QO extends RequestOptions = RecordSourceQueryOptions, TO extends RequestOptions = RequestOptions, QB = RecordQueryBuilder, TB = RecordTransformBuilder> extends Source<QO, TO, QB, TB> {
    protected _keyMap?: RecordKeyMap;
    protected _schema: RecordSchema;
    protected _validatorFor?: ValidatorForFn<StandardValidator | StandardRecordValidator>;
    protected _queryBuilder: QB;
    protected _transformBuilder: TB;
    constructor(settings: RecordSourceSettings<QO, TO, QB, TB>);
    get schema(): RecordSchema;
    get keyMap(): RecordKeyMap | undefined;
    get validatorFor(): ValidatorForFn<StandardValidator | StandardRecordValidator> | undefined;
    get queryBuilder(): QB;
    get transformBuilder(): TB;
    /**
     * Upgrade source as part of a schema upgrade.
     */
    upgrade(): Promise<void>;
}
