import { Dict } from '@orbit/utils';
import { RecordSchema, RecordKeyMap, InitializedRecord, RecordIdentity, RecordOperation, ModelDefinition } from '@orbit/records';
import { Serializer, SerializerForFn, StringSerializer } from '@orbit/serializers';
import { Resource, ResourceDocument, ResourceIdentity, ResourceRelationship } from './resource-document';
import { ResourceAtomicOperation, RecordOperationsDocument } from './resource-operations';
import { ResourceAtomicOperationsDocument } from './resource-operations';
import { RecordDocument } from './record-document';
import { JSONAPIResourceSerializer } from './serializers/jsonapi-resource-serializer';
import { JSONAPIResourceIdentitySerializer } from './serializers/jsonapi-resource-identity-serializer';
import { JSONAPIAtomicOperationSerializer } from './serializers/jsonapi-atomic-operation-serializer';
import { JSONAPIResourceFieldSerializer } from './serializers/jsonapi-resource-field-serializer';
export interface JSONAPISerializationOptions {
    primaryRecord?: InitializedRecord;
    primaryRecords?: InitializedRecord[];
}
export interface JSONAPISerializerSettings {
    schema: RecordSchema;
    keyMap?: RecordKeyMap;
    serializers?: Dict<Serializer>;
}
/**
 * @deprecated since v0.17, remove in v0.18
 */
export declare class JSONAPISerializer implements Serializer<RecordDocument, ResourceDocument, JSONAPISerializationOptions, JSONAPISerializationOptions> {
    protected _schema: RecordSchema;
    protected _keyMap?: RecordKeyMap;
    protected _serializerFor: SerializerForFn;
    constructor(settings: JSONAPISerializerSettings);
    get schema(): RecordSchema;
    get keyMap(): RecordKeyMap | undefined;
    get serializerFor(): SerializerForFn;
    resourceKey(type: string): string;
    resourceType(type: string): string;
    resourceRelationship(type: string | undefined, relationship: string): string;
    resourceAttribute(type: string | undefined, attr: string): string;
    resourceIdentity(identity: RecordIdentity): Resource;
    resourceIds(type: string, ids: string[]): (string | undefined)[];
    resourceId(type: string, id: string): string | undefined;
    recordId(type: string, resourceId: string): string;
    recordType(resourceType: string): string;
    recordIdentity(resourceIdentity: ResourceIdentity): RecordIdentity;
    recordAttribute(type: string, resourceAttribute: string): string;
    recordRelationship(type: string, resourceRelationship: string): string;
    serialize(document: RecordDocument): ResourceDocument;
    serializeAtomicOperationsDocument(document: RecordOperationsDocument): ResourceAtomicOperationsDocument;
    serializeAtomicOperations(operations: RecordOperation[]): ResourceAtomicOperation[];
    serializeAtomicOperation(operation: RecordOperation): ResourceAtomicOperation;
    serializeRecords(records: InitializedRecord[]): Resource[];
    serializeRecord(record: InitializedRecord): Resource;
    serializeIdentity(record: InitializedRecord): Resource;
    serializeId(resource: Resource, record: RecordIdentity, model: ModelDefinition): void;
    serializeAttributes(resource: Resource, record: InitializedRecord, model: ModelDefinition): void;
    serializeAttribute(resource: Resource, record: InitializedRecord, attr: string, model: ModelDefinition): void;
    serializeRelationships(resource: Resource, record: InitializedRecord, model: ModelDefinition): void;
    serializeRelationship(resource: Resource, record: InitializedRecord, relationship: string, model: ModelDefinition): void;
    deserialize(document: ResourceDocument, options?: JSONAPISerializationOptions): RecordDocument;
    deserializeAtomicOperationsDocument(document: ResourceAtomicOperationsDocument): RecordOperationsDocument;
    deserializeAtomicOperations(operations: ResourceAtomicOperation[]): RecordOperation[];
    deserializeAtomicOperation(operation: ResourceAtomicOperation): RecordOperation;
    deserializeResourceIdentity(resource: Resource, primaryRecord?: InitializedRecord): InitializedRecord;
    deserializeResource(resource: Resource, primaryRecord?: InitializedRecord): InitializedRecord;
    deserializeAttributes(record: InitializedRecord, resource: Resource, model: ModelDefinition): void;
    deserializeAttribute(record: InitializedRecord, attr: string, value: unknown, model: ModelDefinition): void;
    deserializeRelationships(record: InitializedRecord, resource: Resource, model: ModelDefinition): void;
    deserializeRelationship(record: InitializedRecord, relationship: string, value: ResourceRelationship, model: ModelDefinition): void;
    deserializeLinks(record: InitializedRecord, resource: Resource, model: ModelDefinition): void;
    deserializeMeta(record: InitializedRecord, resource: Resource, model: ModelDefinition): void;
    protected get resourceSerializer(): JSONAPIResourceSerializer;
    protected get identitySerializer(): JSONAPIResourceIdentitySerializer;
    protected get typeSerializer(): StringSerializer;
    protected get fieldSerializer(): JSONAPIResourceFieldSerializer;
    protected get atomicOperationSerializer(): JSONAPIAtomicOperationSerializer;
    protected _generateNewId(type: string, keyName: string, keyValue: string): string;
}
