UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

702 lines 24.7 kB
import { Alias } from './alias'; import { CustomKey } from './custom-key'; import { CustomOption } from './custom-option'; import { CustomValue } from './custom-value'; import { DefaultValue } from './default-value'; import { Discriminant } from './discriminant'; import { Discriminator } from './discriminator'; import { Factory } from './factory'; import { InjectIndex } from './inject-index'; import { InjectMetadata } from './inject-metadata'; import { InjectOptions } from './inject-options'; import { InjectSorter } from './inject-sorter'; import { Injector } from './injector'; import { Logger } from './logger'; import { Metadata } from './metadata'; import { NamingConvention } from './naming-convention'; import { Nullable } from './nullable'; import { Optional } from './optional'; import { PropertyMetadata } from './property-metadata'; import { PropertyName } from './property-name'; import { PropertyOptions } from './property-options'; import { PropertySorter } from './property-sorter'; import { ReferenceHandler } from './reference-handler'; import { Serializer } from './serializer'; import { SerializerCallback } from './serializer-callback'; import { TypeArgument } from './type-argument'; import { TypeExtensionMetadata } from './type-extension-metadata'; import { TypeExtensionMetadataCtor } from './type-extension-metadata-ctor'; import { TypeExtensionOptions } from './type-extension-options'; import { TypeFn } from './type-fn'; import { TypeManager } from './type-manager'; import { TypeName } from './type-name'; import { TypeOptions } from './type-options'; import { TypeState } from './type-state'; import { ResolvedTypeState } from './type-states/resolved-type-state'; import { UnresolvedTypeState } from './type-states/unresolved-type-state'; /** * Main class used to describe a certain type. * * @type {TypeMetadata<TObject>} */ export declare class TypeMetadata<TObject> extends Metadata { /** * Type name. * * Defined at runtime based on the constructor function. * * @type {TypeName} */ readonly typeName: TypeName; /** * Type function. * * @type {TypeFn<TObject>} */ readonly typeFn: TypeFn<TObject>; /** * Parent type metadata. * * @type {Optional<TypeMetadata<any>>} */ readonly parentTypeMetadata: Optional<TypeMetadata<any>>; /** * Type options used as a fallback. * * @type {TypeOptionsBase<TObject>} */ private readonly typeOptionsBase; /** * Type options. * * @type {TypeOptions<TObject>} */ private readonly typeOptions; /** * Type metadata set. * * @type {ReadonlySet<TypeMetadata<any>>} */ private readonly typeMetadataSet; /** * Current type function map. * * @type {Map<Alias, TypeFn<any>>} */ private readonly currentTypeFnMap; /** * Current child type metadata map. * * @type {Map<TypeFn<TObject>, TypeMetadata<any>>} */ private readonly currentChildTypeMetadataMap; /** * Current property metadata map. * * @type {Map<PropertyName, PropertyMetadata<TObject, any>>} */ private readonly currentPropertyMetadataMap; /** * Current inject metadata map. * * @type {Map<InjectIndex, InjectMetadata<TObject, any>>} */ private readonly currentInjectMetadataMap; /** * Current type state. * * @type {TypeState<TObject>} */ private currentTypeState; /** * Constructor. * * @param {TypeManager} typeManager Type manager. * @param {Map<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases. * @param {ReadonlySet<TypeMetadata<any>>} typeMetadataSet Type metadata set. * @param {TypeFn<any>} typeFn Type function. * @param {TypeOptions<TObject>} typeOptions Type options. * @param {Optional<TypeMetadata<any>>} parentTypeMetadata Parent type metadata. */ constructor(typeManager: TypeManager, typeFnMap: Map<Alias, TypeFn<any>>, typeMetadataSet: ReadonlySet<TypeMetadata<any>>, typeFn: TypeFn<TObject>, typeOptions: TypeOptions<TObject>, parentTypeMetadata: Optional<TypeMetadata<any>>); /** * Gets type state. * * @returns {TypeState<TObject>} Type state. */ get typeState(): TypeState<TObject>; /** * Gets inject metadata map. * * @returns {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>} */ get injectMetadataMap(): ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>; /** * Gets property metadata map. * * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} */ get propertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>; /** * Gets alias. * * @returns {Optional<Alias>} Alias or undefined. */ get alias(): Optional<Alias>; /** * Gets custom value map. * * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map. */ get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>; /** * Gets serialized null value. * * @returns {Nullable<any>} Resolved serialized null value. */ get serializedNullValue(): Nullable<any>; /** * Gets serialized default value. * * @returns {Optional<any>} Resolved serialized default value. */ get serializedDefaultValue(): Optional<any>; /** * Gets deserialized null value. * * @returns {Nullable<any>} Resolved deserialized null value. */ get deserializedNullValue(): Nullable<any>; /** * Gets deserialized default value. * * @returns {Optional<any>} Resolved deserialized default value. */ get deserializedDefaultValue(): Optional<any>; /** * Gets before serialize callback. * * @returns {Optional<SerializerCallback<TObject>>} Before serialize callback. */ get beforeSerializeCallback(): Optional<SerializerCallback<TObject>>; /** * Gets after deserialize callback. * * @returns {Optional<SerializerCallback<TObject>>} After deserialize callback. */ get afterDeserializeCallback(): Optional<SerializerCallback<TObject>>; /** * Gets discriminant. * * @returns {Discriminant} Discriminant. */ get discriminant(): Discriminant; /** * Gets discriminator. * * @returns {Discriminator} Discriminator. */ get discriminator(): Discriminator; /** * Gets factory. * * @returns {Factory} Factory. */ get factory(): Factory; /** * Gets injectable value. * * @returns {boolean} Injectable indicator. */ get injectable(): boolean; /** * Gets injector. * * @returns {Injector} Injector. */ get injector(): Injector; /** * Gets logger. * * @returns {Logger} Logger instance. */ get logger(): Logger; /** * Gets naming convention. * * @returns {Optional<NamingConvention>} Naming convention or undefined. */ get namingConvention(): Optional<NamingConvention>; /** * Gets indicator if current type metadata is polymorphic. * * @returns {boolean} True when type metadata is polymorphic. False otherwise. */ get polymorphic(): boolean; /** * Gets indicator if discriminator should be preserved. * * @returns {boolean} True when discriminator should be preserved. False otherwise. */ get preserveDiscriminator(): boolean; /** * Gets reference handler. * * @returns {ReferenceHandler} Reference handler. */ get referenceHandler(): ReferenceHandler; /** * Gets serializer. * * @returns {Serializer<TObject>} Serializer. */ get serializer(): Serializer<TObject>; /** * Gets indicator if null value should be preserved. * * @returns {boolean} True when null value should be preserved. False otherwise. */ get preserveNull(): boolean; /** * Gets indicator if default value should be used. * * @returns {boolean} True when type should use default value. False otherwise. */ get useDefaultValue(): boolean; /** * Gets indicator if implicit conversion should be used. * * @returns {boolean} True when type should use implicit conversion. False otherwise. */ get useImplicitConversion(): boolean; /** * Gets property sorter. * * @returns {Optional<PropertySorter>} Property sorter or undefined. */ get propertySorter(): Optional<PropertySorter>; /** * Gets sorted property metadatas. * * @returns {ReadonlyArray<PropertyMetadata<TObject, any>>} Readonly array of property metadatas. */ get sortedPropertyMetadatas(): ReadonlyArray<PropertyMetadata<TObject, any>>; /** * Gets inject sorter. * * @returns {Optional<InjectSorter>} Property sorter or undefined. */ get injectSorter(): Optional<InjectSorter>; /** * Gets sorted inject metadatas. * * @returns {ReadonlyArray<InjectMetadata<TObject, any>>} Iterable of inject metadatas. */ get sortedInjectMetadatas(): ReadonlyArray<InjectMetadata<TObject, any>>; /** * Gets parent type arguments. * * @returns {ReadonlyArray<TypeArgument<any>>} Parent arguments. */ get parentTypeArguments(): ReadonlyArray<TypeArgument<any>>; /** * Gets property options map. * * @returns {ReadonlyMap<PropertyName, PropertyOptions<any>>} Property options map. */ get propertyOptionsMap(): ReadonlyMap<PropertyName, PropertyOptions<any>>; /** * Gets inject options map. * * @returns {ReadonlyMap<InjectIndex, InjectOptions<any>>} Inject options map. */ get injectOptionsMap(): ReadonlyMap<InjectIndex, InjectOptions<any>>; /** * Constructs initial type options by extending passed options * with default values if they are not overriden. All references are kept. * * @param {TypeOptions<TObject>} typeOptions Type options. * * @returns {TypeOptions<TObject>} Constructed type options. */ private constructTypeOptions; /** * Configures type extension metadata. * * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor. * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options. * * @returns {TTypeExtensionMetadata} Type extension metadata */ configureTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>, typeExtensionOptions?: TTypeExtensionOptions): TTypeExtensionMetadata; /** * Extracts type extension metadata. * * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor. * * @returns {Optional<TTypeExtensionMetadata>} Type extension metadata or undefined. */ extractTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>): Optional<TTypeExtensionMetadata>; /** * Extracts type extension metadata ctor set from custom value map. * * @returns {Set<TypeExtensionMetadataCtor<any, any, any>>} Type extension metadata ctor set. */ private extractTypeExtensionMetadataCtorSet; /** * Resolves type state. * * Calling this method has side effects by recomputing type state. If you need current * type state then use provided getter for that. * * @returns {ResolvedTypeState<TObject>} Resolved type state. */ resolveTypeState(): ResolvedTypeState<TObject>; /** * Unresolves type state. * * Calling this method has side effects by resetting type state. * * @returns {UnresolvedTypeState<TObject>} Unresolved type state. */ unresolveTypeState(): UnresolvedTypeState<TObject>; /** * Resolves custom value map the same way as it is done for the main options. * * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map. */ private resolveCustomValueMap; /** * Resolves own parent type metadatas. * * @param {ReadonlyArray<TypeArgument<any>>} parentTypeArguments Resolved parent type arguments. * * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own parent type metadatas. */ private resolveOwnParentTypeMetadatas; /** * Resolves own child type metadatas. * * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own child type metadatas. */ private resolveOwnChildTypeMetadatas; /** * Resolves parent type metadata set for provided type metadata reflecting inheritance order where the * first element is the current type metadata and the last element is the most abstract parent. This * collection is used to define all properties which are declared for the provided type metadata * respecting nested declarations. * * @param {TypeMetadata<any>} typeMetadata Type metadata. * @param {Set<TypeMetadata<any>>} parentTypeMetadataSet Parent type metadata set. * * @returns {ReadonlySet<TypeMetadata<any>>} Parent type metadata set. */ private resolveParentTypeMetadataSet; /** * Resolved child type metadata set for provided type metadata reflecting inheritance order where the * first element is the current type metadata and the last element is the most specific child. This * collection is used to define polymorphic relationships between types. * * @param {TypeMetadata<any>} typeMetadata Type metadata. * @param {Set<TypeMetadata<any>>} childTypeMetadataSet Child type metadata set. * * @returns {ReadonlySet<TypeMetadata<any>>} Child type metadata set. */ private resolveChildTypeMetadataSet; /** * Resolves property metadata map. * * @param {ReadonlyArray<TypeMetadata<any>>} parentTypeMetadatas Resolved parent type metadatas. * * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Resolved property metadata map. */ private resolvePropertyMetadataMap; /** * Extends parent type metadata. * * @returns {this} Current instance of type metadata. */ private extendParentTypeMetadata; /** * Reflects inject metadata. * * Used to configure inject metadata based on reflect metadata as inject decorators may be omitted. * * @returns {this} Current instance of type metadata. */ reflectInjectMetadata(): this; /** * Configures alias. * * @param {Optional<Alias>} alias Alias. * * @returns {this} Current instance of type metadata. */ hasAlias(alias: Optional<Alias>): this; /** * Releases alias. * * @returns {this} Current instance of type metadata. */ private releaseAlias; /** * Configures custom value map. * * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined. * * @returns {this} Current instance of type metadata. */ hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this; /** * Configures custom value. * * @param {CustomKey<TCustomValue>} customKey Custom key. * @param {TCustomValue} customValue Custom value. * * @returns {this} Current instance of type metadata. */ hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this; /** * Extracts value by custom key. * * @param {CustomKey<TCustomValue>} customKey Custom key. * * @returns {TCustomValue} Custom value. */ extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue; /** * Configures custom options. * * @param {ReadonlyArray<CustomOption>} customOptions Custom options. * * @returns {this} Current instance of type metadata. */ hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this; /** * Configures default value. * * @param {DefaultValue} defaultValue Default value. * * @returns {this} Current instance of type metadata. */ hasDefaultValue(defaultValue: DefaultValue): this; /** * Configures serialized default value. * * @param {DefaultValue} serializedDefaultValue Serialized default value. * * @returns {this} Current instance of type metadata. */ hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this; /** * Configures deserialized default value. * * @param {DefaultValue} deserializedDefaultValue Deserialized default value. * * @returns {this} Current instance of type metadata. */ hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this; /** * Configures before serialize callback. * * @param {Optional<SerializerCallback<TObject>>} beforeSerializeCallback Before serialize callback. * * @returns {this} Current instance of type metadata. */ hasBeforeSerializeCallback(beforeSerializeCallback: Optional<SerializerCallback<TObject>>): this; /** * Configures after deserialize callback. * * @param {Optional<SerializerCallback<TObject>>} afterDeserializeCallback After deserialize callback. * * @returns {this} Current instance of type metadata. */ hasAfterDeserializeCallback(afterDeserializeCallback: Optional<SerializerCallback<TObject>>): this; /** * Configures discriminator. * * @param {Optional<Discriminator>} discriminator Discriminator. * * @returns {this} Current instance of type metadata. */ hasDiscriminator(discriminator: Optional<Discriminator>): this; /** * Configures discriminant. * * @param {Optional<Discriminant>} discriminant Discriminant. * * @returns {this} Current instance of type metadata. */ hasDiscriminant(discriminant: Optional<Discriminant>): this; /** * Configures factory. * * @param {Optional<Factory>} factory Factory. * * @returns {this} Current instance of type metadata. */ hasFactory(factory: Optional<Factory>): this; /** * Configures injectable. * * @param {boolean} injectable Injectable. * * @returns {this} Current instance of type metadata. */ isInjectable(injectable?: boolean): this; /** * Configures injector. * * @param {Optional<Injector>} injector Injector. * * @returns {this} Current instance of type metadata. */ hasInjector(injector: Optional<Injector>): this; /** * Configures logger. * * @param {Optional<Logger>} logger Logger. * * @returns {this} Current instance of type metadata. */ hasLogger(logger: Optional<Logger>): this; /** * Configures naming convention. * * @param {Optional<NamingConvention>} namingConvention Naming convention. * * @returns {this} Current instance of type metadata. */ hasNamingConvention(namingConvention: Optional<NamingConvention>): this; /** * Configures preserve discriminator. * * @param {boolean} preserveDiscriminator Preserve discriminator. * * @returns {this} Current instance of type metadata. */ shouldPreserveDiscriminator(preserveDiscriminator?: boolean): this; /** * Configures reference handler. * * @param {Optional<ReferenceHandler>} referenceHandler Reference handler. * * @returns {this} Current instance of type metadata. */ hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this; /** * Configures serializer. * * @param {Optional<Serializer<TObject>>} serializer Serializer. * * @returns {this} Current instance of type metadata. */ hasSerializer(serializer: Optional<Serializer<TObject>>): this; /** * Configures preserve null. * * @param {boolean} preserveNull Preserve null. * * @returns {this} Current instance of type metadata. */ shouldPreserveNull(preserveNull?: boolean): this; /** * Configures use default value. * * @param {boolean} useDefaultValue Use default value. * * @returns {this} Current instance of type metadata. */ shouldUseDefaultValue(useDefaultValue?: boolean): this; /** * Configures use implicit convertion. * * @param {boolean} useImplicitConversion Use implicit convertion. * * @returns {this} Current instance of type metadata. */ shouldUseImplicitConversion(useImplicitConversion?: boolean): this; /** * Configures property sorter. * * @param {Optional<PropertySorter>} propertySorter Property sorter. * * @returns {this} Current instance of type metadata. */ hasPropertySorter(propertySorter: Optional<PropertySorter>): this; /** * Configures inject sorter. * * @param {Optional<InjectSorter>} injectSorter Inject sorter. * * @returns {this} Current instance of type metadata. */ hasInjectSorter(injectSorter: Optional<InjectSorter>): this; /** * Configures parent type arguments. * * @param {Array<TypeArgument<any>>} parentTypeArguments Parent type arguments. * * @returns {this} Current instance of type metadata. */ hasParentTypeArguments(parentTypeArguments: Array<TypeArgument<any>>): this; /** * Configures certain property metadata. * * @param {PropertyName} propertyName Property name. * @param {PropertyOptions<TPropertyType>} propertyOptions Property options. * * @returns {PropertyMetadata<TObject, TPropertyType>} Configured property metadata. */ configurePropertyMetadata<TPropertyType>(propertyName: PropertyName, propertyOptions?: PropertyOptions<TPropertyType>): PropertyMetadata<TObject, TPropertyType>; /** * Configures certain inject metadata. * * @param {InjectIndex} injectIndex Inject index. * @param {InjectOptions<TInjectType>} injectOptions Inject options. * * @returns {InjectMetadata<TObject, TInjectType>} Configured inject metadata. */ configureInjectMetadata<TInjectType>(injectIndex: InjectIndex, injectOptions?: InjectOptions<TInjectType>): InjectMetadata<TObject, TInjectType>; /** * Configures property metadata map. * * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map. * * @returns {this} Current instance of type metadata. */ hasPropertyMetadataMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): this; /** * Clears property options map. * * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map. * * @returns {Map<PropertyName, PropertyOptions<any>>} Cleared property options map. */ private clearPropertyOptionsMap; /** * Configures inject metadata map. * * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map. * * @returns {this} Current instance of type metadata. */ hasInjectMetadataMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): this; /** * Clears inject options map. * * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map. * * @returns {Map<InjectIndex, InjectOptions<any>>} Cleared inject options map. */ private clearInjectOptionsMap; /** * Configures type metadata based on provided options. * * @param {TypeOptions<TObject>} typeOptions Type options. * * @returns {this} Current instance of type metadata. */ configure(typeOptions: TypeOptions<TObject>): this; } //# sourceMappingURL=type-metadata.d.ts.map