import { Injector, Type } from '../di'; import { Renderable } from '../dom'; import { Serializer, Serialized } from './Serializer'; import { ReversibleMap } from '../utils'; import { ConfiguredSerializer } from './ConfiguredSerializer'; import { RenderableConstructorArg } from '../common'; export interface Constructable { constructor: Function; } export declare type BaseSerializer = Serializer; export declare type SerializerConstructor = new (...args: any[]) => T; export declare type BaseSerializerArg = T | SerializerConstructor | ConfiguredSerializer, any>; export interface SerializerContainerConfig { /** * An injector to use as the parent injector. * @type {Injector} */ injector?: Injector; } /** * A container for running and determining serializers. * @export * @class SerializerContainer * @example * * const container = new SerializerContainer(); * * class MyClass {} * * const mySerializer = new GenericSerializer('MyClass', MyClass); * * container.registerSerializer(MyClass, mySerializer); * container.serialize(new MyClass()); // => { name: 'MyClass' } * container.deserialize({ name: 'MyClass' }); // => MyClass */ export declare class SerializerContainer { protected _injector: any; protected _serializers: Map, BaseSerializerArg>; protected _classMap: ReversibleMap, string>; protected _instanceCache: WeakMap>; /** * Creates an instance of SerializerContainer. * @param {SerializerContainerConfig} [config={}] */ constructor(config?: SerializerContainerConfig); /** * Registers a serializer with the container. * @param {Type} _Class * @param {(BaseSerializer|Type)} serializer * @param {{ skipRegister?: boolean }} [options={}] */ registerSerializer>(_Class: new (...args: any[]) => R, serializer: BaseSerializerArg, options?: { skipRegister?: boolean; }): void; constructSerializer(serializer: BaseSerializerArg): T; /** * Registers a class that can be identified by a string representation. * @param {string} name * @param {Type} _Class */ registerClass(name: string, _Class: Type): void; /** * Registers multiple classes that can be identified by a string representation. * @param {{ [key:string]: Type }} [classes={}] */ registerClasses(classes?: { [key: string]: Type; }): void; /** * Resolves a class to it's registered string representation. * @param {Type} _Class * @returns {(string|null)} */ resolveClassString(_Class: Type): string | null; /** * Resolves a serializer from a serialized node. * @param {Serialized} node * @returns {(BaseSerializer|null)} */ resolveFromSerialized(node: Serialized): Serializer | null; /** * Resolves a serializer from a class. * @param {Type} _Class * @returns {(BaseSerializer|null)} */ resolveFromClass(_Class: Type): Serializer | null; /** * Resolves a serializer from an instance of a registered class. * @param {(Renderable & Constructable)} instance * @returns {(BaseSerializer|null)} */ resolveFromInstance(instance: Renderable & Constructable): BaseSerializer | null; /** * Resolves a string to a registered class. * @param {string} name * @returns {(Type|null)} */ resolveClass(name: string): Type | null; /** * Serializes a class instance using the registered serializer for that class. * @template R The class type. * @template S The serialized type. * @param {R} instance * @returns {S} The serialized node. */ serialize, S extends Serialized>(instance: R): S; /** * Deserializes a serialized node using the registered serializer for that node type. * @template R The class type. * @template S The serialized type. * @param {S} serialized * @returns {R} The renderable argument. */ deserialize(serialized: S): RenderableConstructorArg; serializeList, S extends Serialized>(instances: R[]): S[]; deserializeList(serialized: S[]): RenderableConstructorArg[]; isExcluded>(instance: R): boolean; /** * Resolves a token with this containers injector. * @template T The return type. * @param {*} token * @returns {(T|null)} */ resolve(token: any, _throw?: boolean): T; private _deserialize; private _serialize; }