@dipscope/type-manager 8.1.1 → 8.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/es2015/type-manager.js +0 -2
- package/dist/es2015/type-manager.js.map +1 -1
- package/dist/es5/type-manager.js +0 -2
- package/dist/es5/type-manager.js.map +1 -1
- package/dist/types/type-manager.d.ts.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +1 -1
package/dist/umd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://$DSTypeManager/webpack/universalModuleDefinition","webpack://$DSTypeManager/./src/any.ts","webpack://$DSTypeManager/./src/constants/default-value-resolver.ts","webpack://$DSTypeManager/./src/constants/empty-array.ts","webpack://$DSTypeManager/./src/constants/empty-map.ts","webpack://$DSTypeManager/./src/constants/index.ts","webpack://$DSTypeManager/./src/constants/null-value-resolver.ts","webpack://$DSTypeManager/./src/custom-key.ts","webpack://$DSTypeManager/./src/factories/index.ts","webpack://$DSTypeManager/./src/factories/type-factory.ts","webpack://$DSTypeManager/./src/functions/get-own-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-words.ts","webpack://$DSTypeManager/./src/functions/index.ts","webpack://$DSTypeManager/./src/functions/json-parse.ts","webpack://$DSTypeManager/./src/functions/json-stringify.ts","webpack://$DSTypeManager/./src/functions/name-of.ts","webpack://$DSTypeManager/./src/index.ts","webpack://$DSTypeManager/./src/inject-metadata.ts","webpack://$DSTypeManager/./src/inject-sorters/asc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/desc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/index.ts","webpack://$DSTypeManager/./src/inject-states/index.ts","webpack://$DSTypeManager/./src/inject-states/resolved-inject-state.ts","webpack://$DSTypeManager/./src/inject-states/unresolved-inject-state.ts","webpack://$DSTypeManager/./src/inject.ts","webpack://$DSTypeManager/./src/injectors/index.ts","webpack://$DSTypeManager/./src/injectors/singleton-injector.ts","webpack://$DSTypeManager/./src/logger-level.ts","webpack://$DSTypeManager/./src/logger.ts","webpack://$DSTypeManager/./src/metadata.ts","webpack://$DSTypeManager/./src/naming-conventions/camel-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/index.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/pascal-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/property-extension-metadata-ctor-set-key.ts","webpack://$DSTypeManager/./src/property-extension-metadata.ts","webpack://$DSTypeManager/./src/property-metadata.ts","webpack://$DSTypeManager/./src/property-sorters/asc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/desc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/index.ts","webpack://$DSTypeManager/./src/property-states/index.ts","webpack://$DSTypeManager/./src/property-states/resolved-property-state.ts","webpack://$DSTypeManager/./src/property-states/unresolved-property-state.ts","webpack://$DSTypeManager/./src/property.ts","webpack://$DSTypeManager/./src/reference-handlers/circular-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/index.ts","webpack://$DSTypeManager/./src/reference-handlers/json-path-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/plain-reference-handler.ts","webpack://$DSTypeManager/./src/serializer-context.ts","webpack://$DSTypeManager/./src/serializers/any-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-buffer-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-serializer.ts","webpack://$DSTypeManager/./src/serializers/boolean-serializer.ts","webpack://$DSTypeManager/./src/serializers/data-view-serializer.ts","webpack://$DSTypeManager/./src/serializers/date-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-64-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/index.ts","webpack://$DSTypeManager/./src/serializers/int-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/map-serializer.ts","webpack://$DSTypeManager/./src/serializers/number-serializer.ts","webpack://$DSTypeManager/./src/serializers/set-serializer.ts","webpack://$DSTypeManager/./src/serializers/string-serializer.ts","webpack://$DSTypeManager/./src/serializers/type-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-clamped-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/unknown-serializer.ts","webpack://$DSTypeManager/./src/type-extension-metadata-ctor-set-key.ts","webpack://$DSTypeManager/./src/type-extension-metadata.ts","webpack://$DSTypeManager/./src/type-manager.ts","webpack://$DSTypeManager/./src/type-metadata-symbol.ts","webpack://$DSTypeManager/./src/type-metadata.ts","webpack://$DSTypeManager/./src/type-scope.ts","webpack://$DSTypeManager/./src/type-states/index.ts","webpack://$DSTypeManager/./src/type-states/resolved-type-state.ts","webpack://$DSTypeManager/./src/type-states/unresolved-type-state.ts","webpack://$DSTypeManager/./src/type.ts","webpack://$DSTypeManager/./src/unknown.ts","webpack://$DSTypeManager/webpack/bootstrap","webpack://$DSTypeManager/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"$DSTypeManager\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"$DSTypeManager\"] = factory();\n\telse\n\t\troot[\"$DSTypeManager\"] = factory();\n})(this, () => {\nreturn ","/**\n * In type script there is no explicit class for any type but sometimes such serialization is required.\n * This simple class will allow direct serialization and deserialization. No transformations will be applied \n * for properties which specify it as a type argument.\n * \n * @type {Any}\n */\nexport class Any\n{\n \n}\n","import { DefaultValueResolver } from '../default-value-resolver';\n\n/**\n * Represents a default value resolver.\n * \n * @type {DefaultValueResolver}\n */\nexport const DEFAULT_VALUE_RESOLVER: DefaultValueResolver = () => undefined;\n","/**\n * Represents an empty array.\n * \n * @type {ReadonlyArray<any>}\n */\nexport const EMPTY_ARRAY: ReadonlyArray<any> = new Array<any>();\n","/**\n * Represents an empty map.\n * \n * @type {ReadonlyMap<any, any>}\n */\nexport const EMPTY_MAP: ReadonlyMap<any, any> = new Map<any, any>();\n","export * from './default-value-resolver';\nexport * from './empty-array';\nexport * from './empty-map';\nexport * from './null-value-resolver';\n","import { NullValueResolver } from '../null-value-resolver';\n\n/**\n * Represents a null value resolver.\n * \n * @type {NullValueResolver}\n */\nexport const NULL_VALUE_RESOLVER: NullValueResolver = () => null;\n","import { CustomValueResolver } from './custom-value-resolver';\nimport { Optional } from './optional';\n\n/**\n * Key used to describe custom value. Such key is explicitly defined and used\n * by type manager plugins to store strongly typed custom values within metadata.\n * \n * @type {CustomKey<TCustomValue>}\n */\nexport class CustomKey<TCustomValue>\n{\n /**\n * Description.\n * \n * @type {string}\n */\n public readonly description: string;\n \n /**\n * Custom value resolver.\n * \n * @type {Optional<CustomValueResolver<TCustomValue>>}\n */\n public readonly customValueResolver: Optional<CustomValueResolver<TCustomValue>>;\n \n /**\n * Constructor.\n * \n * @param {string} description Description.\n * @param {CustomValueResolver<TCustomValue>} customValueResolver Custom value resolver.\n */\n public constructor(description: string, customValueResolver?: CustomValueResolver<TCustomValue>)\n {\n this.description = description;\n this.customValueResolver = customValueResolver;\n\n return;\n }\n}\n","export * from './type-factory';\n","import { Factory } from '../factory';\nimport { Injector } from '../injector';\nimport { PropertyName } from '../property-name';\nimport { TypeCtor } from '../type-ctor';\nimport { TypeEntry } from '../type-entry';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Type factory.\n * \n * @type {TypeFactory}\n */\nexport class TypeFactory implements Factory\n{\n /**\n * Builds type described by provided type context.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * @param {ReadonlyMap<PropertyName, TypeEntry<TObject, any>>} typeEntryMap Type entry map.\n * @param {Injector} injector Injector.\n * \n * @returns {TObject} Object instance described by provided type context.\n */\n public build<TObject>(typeMetadata: TypeMetadata<TObject>, typeEntryMap: ReadonlyMap<PropertyName, TypeEntry<TObject, any>>, injector: Injector): TObject\n {\n const typeCtor = typeMetadata.typeFn as TypeCtor<TObject>;\n const typeState = typeMetadata.typeState;\n const injectedKeys = new Set<string>();\n const args = new Array<any>(typeCtor.length);\n\n for (let i = 0; i < typeState.sortedInjectMetadatas.length; i++)\n {\n const injectMetadata = typeState.sortedInjectMetadatas[i];\n const injectState = injectMetadata.injectState;\n const argKey = injectState.key;\n\n if (argKey === undefined)\n {\n args[injectMetadata.injectIndex] = injector.get(injectState.typeMetadata);\n\n continue;\n }\n\n const typeEntry = typeEntryMap.get(argKey);\n\n if (typeEntry !== undefined)\n {\n args[injectMetadata.injectIndex] = typeEntry.value;\n }\n\n injectedKeys.add(argKey);\n }\n \n const type = new typeCtor(...args) as any;\n\n for (const typeEntry of typeEntryMap.values())\n {\n const propertyMetadata = typeEntry.propertyMetadata;\n\n if (\n propertyMetadata !== undefined \n && typeEntry.value !== undefined \n && !injectedKeys.has(propertyMetadata.propertyName)\n )\n {\n type[propertyMetadata.propertyName] = typeEntry.value;\n }\n }\n\n return type;\n }\n}\n","/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect\n{\n /**\n * Gets metadata value of an own metadata key of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getOwnMetadata(metadataKey: string, target: any): any;\n}\n\n/**\n * Gets own reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getOwnReflectMetadata(metadataKey: string, target: any): any\n{\n if (typeof Reflect === 'object' && Reflect !== null && typeof Reflect.getOwnMetadata === 'function')\n {\n return Reflect.getOwnMetadata(metadataKey, target);\n }\n\n return undefined;\n}\n","/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect \n{\n /**\n * Gets metadata value of a metadata key on the prototype chain of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any;\n}\n\n/**\n * Gets reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getReflectMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any\n{\n if (typeof Reflect === 'object' && Reflect !== null && typeof Reflect.getMetadata === 'function')\n {\n return Reflect.getMetadata(metadataKey, target, propertyKey);\n }\n \n return undefined;\n}\n","import { EMPTY_ARRAY } from '../constants/empty-array';\n\n/** ------ Symbols and regular expressions used by words function ------ **/\nconst rsAstralRange = '\\\\ud800-\\\\udfff';\nconst rsComboMarksRange = '\\\\u0300-\\\\u036f';\nconst reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f';\nconst rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff';\nconst rsComboMarksExtendedRange = '\\\\u1ab0-\\\\u1aff';\nconst rsComboMarksSupplementRange = '\\\\u1dc0-\\\\u1dff';\nconst rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;\nconst rsDingbatRange = '\\\\u2700-\\\\u27bf';\nconst rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff';\nconst rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7';\nconst rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf';\nconst rsPunctuationRange = '\\\\u2000-\\\\u206f';\nconst rsSpaceRange = '\\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000';\nconst rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde';\nconst rsVarRange = '\\\\ufe0e\\\\ufe0f';\nconst rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\nconst rsApos = '[\\'\\\\u2019]';\nconst rsBreak = `[${rsBreakRange}]`;\nconst rsCombo = `[${rsComboRange}]`;\nconst rsDigit = '\\\\d';\nconst rsDingbat = `[${rsDingbatRange}]`;\nconst rsLower = `[${rsLowerRange}]`;\nconst rsMisc = `[^${rsAstralRange}${rsBreakRange + rsDigit + rsDingbatRange + rsLowerRange + rsUpperRange}]`;\nconst rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]';\nconst rsModifier = `(?:${rsCombo}|${rsFitz})`;\nconst rsNonAstral = `[^${rsAstralRange}]`;\nconst rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}';\nconst rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]';\nconst rsUpper = `[${rsUpperRange}]`;\nconst rsZWJ = '\\\\u200d';\nconst rsMiscLower = `(?:${rsLower}|${rsMisc})`;\nconst rsMiscUpper = `(?:${rsUpper}|${rsMisc})`;\nconst rsOptContrLower = `(?:${rsApos}(?:d|ll|m|re|s|t|ve))?`;\nconst rsOptContrUpper = `(?:${rsApos}(?:D|LL|M|RE|S|T|VE))?`;\nconst reOptMod = `${rsModifier}?`;\nconst rsOptVar = `[${rsVarRange}]?`;\nconst rsOptJoin = `(?:${rsZWJ}(?:${[rsNonAstral, rsRegional, rsSurrPair].join('|')})${rsOptVar + reOptMod})*`;\nconst rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])';\nconst rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])';\nconst rsSeq = rsOptVar + reOptMod + rsOptJoin;\nconst rsEmoji = `(?:${[rsDingbat, rsRegional, rsSurrPair].join('|')})${rsSeq}`;\nconst reA = `${rsUpper}?${rsLower}+${rsOptContrLower}(?=${[rsBreak, rsUpper, '$'].join('|')})`;\nconst reB = `${rsMiscUpper}+${rsOptContrUpper}(?=${[rsBreak, rsUpper + rsMiscLower, '$'].join('|')})`;\nconst reC = `${rsUpper}?${rsMiscLower}+${rsOptContrLower}`;\nconst reD = rsOrdUpper;\nconst reE = rsOrdLower;\nconst reF = `${rsDigit}+`;\nconst reG = rsEmoji;\nconst reUnicodeWord = new RegExp('[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9\\\\s]');\nconst reUnicodeWords = new RegExp([reA, reB, reC, reD, reE, reF, reG].join('|'), 'g');\nconst reAsciiWords = new RegExp('[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+', 'g');\n\n/**\n * Splits a Unicode string into an array of its words.\n * \n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nfunction getUnicodeWords(x: string): ReadonlyArray<string>\n{\n return x.match(reUnicodeWords) ?? EMPTY_ARRAY;\n}\n\n/**\n * Splits a ASCII string into an array of its words.\n *\n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nfunction getAsciiWords(x: string): ReadonlyArray<string>\n{\n return x.match(reAsciiWords) ?? EMPTY_ARRAY;\n}\n\n/**\n * Splits string into an array of its words.\n *\n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nexport function getWords(x: string): ReadonlyArray<string>\n{\n return reUnicodeWord.test(x) ? getUnicodeWords(x) : getAsciiWords(x);\n}\n","export * from './get-own-reflect-metadata';\nexport * from './get-reflect-metadata';\nexport * from './get-words';\nexport * from './json-parse';\nexport * from './json-stringify';\nexport * from './name-of';\n","/**\n * Function which returns consistent results when parse JSON object.\n * \n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {any} Consistent JSON parse result.\n */\nexport function jsonParse(\n x: string,\n reviver?: (this: any, key: string, value: any) => any\n): any\n{\n return JSON.parse(x, reviver);\n}\n","/**\n * Function which returns consistent results when stringify JSON object.\n * \n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} Consistent JSON string which can be used for hashing.\n */\nexport function jsonStringify(\n x: any, \n replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null,\n space?: string | number\n): string\n{\n\tconst spacing = typeof space === 'number' ? new Array(isFinite(space) ? space + 1 : 0).join(' ') : (space ?? '');\n\tconst separator = spacing ? ': ' : ':';\n\tconst seen = new Set<any>();\n\t\n\tconst stringify = (parent: any, key: any, node: any, level: number): any =>\n {\n\t\tif (node && node.toJSON && typeof node.toJSON === 'function')\n {\n\t\t\tnode = node.toJSON();\n\t\t}\n\n\t\tif (replacer)\n\t\t{\n\t\t\tnode = replacer.call(parent, key, node);\n\t\t}\n\n\t\tif (node === undefined)\n {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof node === 'number')\n\t\t{\n\t\t\treturn isFinite(node) ? '' + node : 'null';\n\t\t}\n\n\t\tif (typeof node !== 'object')\n {\n\t\t\treturn JSON.stringify(node);\n\t\t}\n\n\t\tlet i = 0;\n\t\tlet indent = '';\n\t\tlet out = '';\n\n\t\tif (spacing)\n\t\t{\n\t\t\tindent += '\\n';\n\n\t\t\tfor (i = 0; i < level + 1; i++)\n\t\t\t{\n\t\t\t\tindent += spacing;\n\t\t\t}\n\t\t}\n\n\t\tif (Array.isArray(node))\n {\n\t\t\tout += '['; \n\n\t\t\tfor (i = 0; i < node.length; i++)\n {\n\t\t\t\tif (i) \n\t\t\t\t{\n\t\t\t\t\tout += ',';\n\t\t\t\t}\n\n\t\t\t\tconst value = stringify(node, i, node[i], level + 1) || 'null';\n\n\t\t\t\tout += indent + spacing + value;\n\t\t\t}\n\n\t\t\tout += indent;\n\t\t\tout += ']';\n\n\t\t\treturn out;\n\t\t}\n\n\t\tif (node === null)\n\t\t{\n\t\t\treturn 'null';\n\t\t}\n\n\t\tif (seen.has(node))\n {\n\t\t\tseen.delete(node);\n\n\t\t\treturn 'null';\n\t\t}\n\n\t\tseen.add(node);\n\n\t\tconst keys = Object.keys(node).sort();\n\n\t\tfor (i = 0; i < keys.length; i++)\n {\n\t\t\tconst key = keys[i];\n\t\t\tconst value = stringify(node, key, node[key], level + 1);\n\n\t\t\tif (!value) \n {\n continue; \n }\n\n\t\t\tif (out)\n\t\t\t{\n\t\t\t\tout += ',';\n\t\t\t}\n\n\t\t\tout += indent + spacing + JSON.stringify(key) + separator + value;\n\t\t}\n\n\t\tseen.delete(node);\n\n\t\treturn '{' + out + indent + '}';\n\t};\n\t\n\treturn stringify({ '': x }, '', x, 0);\n}\n","/**\n * Defines name for any value.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} Name when present. Unknown otherwise.\n */\nexport function nameOf(x: any): string\n{\n return typeof x === 'function' ? x.name : 'Unknown';\n}\n","export * from './constants';\nexport * from './factories';\nexport * from './functions';\nexport * from './inject-sorters';\nexport * from './inject-states';\nexport * from './injectors';\nexport * from './naming-conventions';\nexport * from './property-sorters';\nexport * from './property-states';\nexport * from './reference-handlers';\nexport * from './serializers';\nexport * from './type-states';\nexport * from './alias';\nexport * from './any';\nexport * from './custom-key';\nexport * from './custom-option';\nexport * from './custom-value-resolver';\nexport * from './custom-value';\nexport * from './default-value-resolver';\nexport * from './default-value';\nexport * from './discriminant';\nexport * from './discriminator';\nexport * from './factory';\nexport * from './generic-argument';\nexport * from './generic-metadata';\nexport * from './inject-decorator';\nexport * from './inject-index';\nexport * from './inject-metadata';\nexport * from './inject-options';\nexport * from './inject-sorter';\nexport * from './inject-state';\nexport * from './inject';\nexport * from './injector';\nexport * from './logger-level';\nexport * from './logger';\nexport * from './metadata';\nexport * from './naming-convention';\nexport * from './null-value-resolver';\nexport * from './nullable';\nexport * from './optional';\nexport * from './property-decorator';\nexport * from './property-extension-metadata-ctor-set-key';\nexport * from './property-extension-metadata-ctor';\nexport * from './property-extension-metadata';\nexport * from './property-extension-options';\nexport * from './property-metadata';\nexport * from './property-name';\nexport * from './property-options';\nexport * from './property-sorter';\nexport * from './property-state';\nexport * from './property';\nexport * from './reference-callback';\nexport * from './reference-handler';\nexport * from './reference-key';\nexport * from './reference-value-getter';\nexport * from './reference-value-setter';\nexport * from './reference-value';\nexport * from './serializer-context';\nexport * from './serializer';\nexport * from './type-abstraction';\nexport * from './type-argument';\nexport * from './type-configuration';\nexport * from './type-ctor';\nexport * from './type-decorator';\nexport * from './type-entry';\nexport * from './type-extension-metadata-ctor-set-key';\nexport * from './type-extension-metadata-ctor';\nexport * from './type-extension-metadata';\nexport * from './type-extension-options';\nexport * from './type-fn';\nexport * from './type-like';\nexport * from './type-manager-options';\nexport * from './type-manager';\nexport * from './type-metadata-symbol';\nexport * from './type-metadata';\nexport * from './type-name';\nexport * from './type-options-base';\nexport * from './type-options';\nexport * from './type-resolver';\nexport * from './type-scope';\nexport * from './type-state';\nexport * from './type';\nexport * from './unknown';\n","import { Alias } from './alias';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { InjectState } from './inject-state';\nimport { ResolvedInjectState } from './inject-states/resolved-inject-state';\nimport { UnresolvedInjectState } from './inject-states/unresolved-inject-state';\nimport { Metadata } from './metadata';\nimport { Optional } from './optional';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Main class used to describe an injection.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\nexport class InjectMetadata<TDeclaringObject, TObject> extends Metadata\n{\n /**\n * Type metadata to which inject metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringObject>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringObject>;\n\n /**\n * Index of injection within a type constructor function.\n * \n * @type {InjectIndex}\n */\n public readonly injectIndex: InjectIndex;\n\n /**\n * Inject options.\n * \n * @type {InjectOptions<TObject>}\n */\n private readonly injectOptions: InjectOptions<TObject>;\n\n /**\n * Type function defined using reflect metadata.\n * \n * @type {Optional<TypeFn<TObject>>}\n */\n private readonly reflectTypeFn: Optional<TypeFn<TObject>>;\n\n /**\n * Current inject state.\n * \n * @type {InjectState<TDeclaringObject, TObject>}\n */\n private currentInjectState: InjectState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {TypeMetadata<TDeclaringObject>} declaringTypeMetadata Type metadata to which inject metadata belongs to.\n * @param {InjectIndex} injectIndex Index of injection within a type constructor function.\n * @param {InjectOptions<TObject>} injectOptions Inject options.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: ReadonlyMap<Alias, TypeFn<any>>,\n declaringTypeMetadata: TypeMetadata<TDeclaringObject>, \n injectIndex: InjectIndex,\n injectOptions: InjectOptions<TObject>\n )\n {\n super(typeManager, typeFnMap);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.injectIndex = injectIndex;\n this.injectOptions = injectOptions;\n this.reflectTypeFn = (getOwnReflectMetadata('design:paramtypes', declaringTypeMetadata.typeFn) ?? EMPTY_ARRAY)[injectIndex];\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n this.configure(injectOptions);\n\n return;\n }\n\n /**\n * Gets inject state.\n * \n * @returns {InjectState<TDeclaringObject, TObject>} Inject state.\n */\n public get injectState(): InjectState<TDeclaringObject, TObject>\n {\n return this.currentInjectState;\n }\n\n /**\n * Gets key.\n * \n * @returns {Optional<string>} Key or undefined.\n */\n public get key(): Optional<string>\n {\n return this.currentInjectState.key;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n return this.currentInjectState.typeArgument;\n }\n\n /**\n * Gets inject type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.currentInjectState.typeMetadata;\n }\n\n /**\n * Resolves inject state.\n * \n * Calling this method has side effects by recomputing injection state. If you need current\n * inject state then use provided getter for that.\n * \n * @returns {ResolvedInjectState<TDeclaringObject, TObject>} Resolved inject state.\n */\n public resolveInjectState(): ResolvedInjectState<TDeclaringObject, TObject>\n {\n const injectOptions = this.injectOptions;\n const key = injectOptions.key;\n const typeArgument = injectOptions.typeArgument === undefined ? this.reflectTypeFn : injectOptions.typeArgument;\n const typeMetadata = this.resolveTypeMetadata(typeArgument);\n const resolvedInjectState = new ResolvedInjectState<TDeclaringObject, TObject>(this, key, typeArgument, typeMetadata);\n\n this.currentInjectState = resolvedInjectState;\n\n return resolvedInjectState;\n }\n\n /**\n * Unresolves inject state.\n * \n * Calling this method has side effects by resetting inject state. \n * \n * @returns {UnresolvedInjectState<TDeclaringObject, TObject>} Unresolved inject state.\n */\n public unresolveInjectState(): UnresolvedInjectState<TDeclaringObject, TObject>\n {\n const unresolvedInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n this.currentInjectState = unresolvedInjectState;\n\n return unresolvedInjectState;\n }\n\n /**\n * Configures key.\n * \n * @param {Optional<string>} key Key or undefined.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public hasKey(key: Optional<string>): this\n {\n this.injectOptions.key = key;\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures type argument.\n * \n * @param {Optional<TypeArgument<TObject>>} typeArgument Type argument or undefined.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public hasTypeArgument(typeArgument: Optional<TypeArgument<TObject>>): this\n {\n this.injectOptions.typeArgument = typeArgument;\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures inject metadata based on provided options.\n * \n * @param {InjectOptions<TObject>} injectOptions Inject options.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public configure(injectOptions: InjectOptions<TObject>): this\n {\n if (injectOptions.key !== undefined)\n {\n this.hasKey(injectOptions.key);\n }\n\n if (injectOptions.typeArgument !== undefined)\n {\n this.hasTypeArgument(injectOptions.typeArgument);\n }\n\n return this;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents asc inject sorter which sorts type injects in\n * ascending order by index.\n * \n * @type {AscInjectSorter}\n */\nexport class AscInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TObject, any>} x First inject.\n * @param {InjectMetadata<TObject, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: InjectMetadata<TObject, any>, y: InjectMetadata<TObject, any>): number\n {\n return x.injectIndex - y.injectIndex;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents desc inject sorter which sorts type injects in\n * descending order by index.\n * \n * @type {DescInjectSorter}\n */\nexport class DescInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TObject, any>} x First inject.\n * @param {InjectMetadata<TObject, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: InjectMetadata<TObject, any>, y: InjectMetadata<TObject, any>): number\n {\n return y.injectIndex - x.injectIndex;\n }\n}\n","export * from './asc-inject-sorter';\nexport * from './desc-inject-sorter';\n","export * from './resolved-inject-state';\nexport * from './unresolved-inject-state';\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectState } from '../inject-state';\nimport { Optional } from '../optional';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Represents resolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\nexport class ResolvedInjectState<TDeclaringObject, TObject> implements InjectState<TDeclaringObject, TObject>\n{\n /**\n * Inject metadata for which state is defined.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\n public readonly injectMetadata: InjectMetadata<TDeclaringObject, TObject>;\n\n /**\n * Parameter key to inject within a type context.\n * \n * @type {Optional<string>}\n */\n public readonly key: Optional<string>;\n\n /**\n * Type argument of the injection.\n * \n * @type {TypeArgument<TObject>}\n */\n public readonly typeArgument: TypeArgument<TObject>;\n\n /**\n * Type metadata of the injection.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Constructor.\n * \n * @param {InjectMetadata<TDeclaringObject, TObject>} injectMetadata Inject metadata for which state is defined.\n * @param {Optional<string>} key Parameter key to inject within a type context.\n * @param {TypeArgument<TObject>} typeArgument Type argument of the injection.\n * @param {TypeMetadata<TObject>} typeMetadata Type metadata of the injection.\n */\n public constructor(\n injectMetadata: InjectMetadata<TDeclaringObject, TObject>,\n key: Optional<string>,\n typeArgument: TypeArgument<TObject>,\n typeMetadata: TypeMetadata<TObject>\n )\n {\n this.injectMetadata = injectMetadata;\n this.key = key;\n this.typeArgument = typeArgument;\n this.typeMetadata = typeMetadata;\n\n return;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectState } from '../inject-state';\nimport { Optional } from '../optional';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\nimport { ResolvedInjectState } from './resolved-inject-state';\n\n/**\n * Represents unresolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\nexport class UnresolvedInjectState<TDeclaringObject, TObject> implements InjectState<TDeclaringObject, TObject>\n{\n /**\n * Inject metadata for which state is defined.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\n public readonly injectMetadata: InjectMetadata<TDeclaringObject, TObject>;\n \n /**\n * Resolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\n private resolvedInjectState?: ResolvedInjectState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {InjectMetadata<TDeclaringObject, TObject>} injectMetadata Inject metadata for which state is defined.\n */\n public constructor(injectMetadata: InjectMetadata<TDeclaringObject, TObject>)\n {\n this.injectMetadata = injectMetadata;\n\n return;\n }\n\n /**\n * Gets parameter key to inject within a type context.\n * \n * @returns {Optional<string>} Key.\n */\n public get key(): Optional<string>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.key;\n }\n\n /**\n * Gets type argument of the injection.\n * \n * @type {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.typeArgument;\n }\n\n /**\n * Gets type metadata of the injection.\n * \n * @type {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.typeMetadata;\n }\n}\n","import { nameOf } from './functions/name-of';\nimport { InjectDecorator } from './inject-decorator';\nimport { InjectOptions } from './inject-options';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\n\n/**\n * Inject decorator.\n * \n * @param {InjectOptions<TObject>|TypeArgument<TObject>|string} x Inject options, type argument or key from the type context.\n * \n * @returns {InjectDecorator} Inject decorator.\n */\nexport function Inject<TObject>(x?: InjectOptions<TObject> | TypeArgument<TObject> | string): InjectDecorator\n{\n const injectOptions = (typeof x === 'object' ? x : {}) as InjectOptions<TObject>;\n\n if (injectOptions.key === undefined && typeof x === 'string')\n {\n injectOptions.key = x as string;\n }\n\n if (injectOptions.typeArgument === undefined && typeof x === 'function')\n {\n injectOptions.typeArgument = x as TypeArgument<TObject>;\n }\n \n return function (target: any, propertyName: string | symbol | undefined, injectIndex: number): void\n {\n if (typeof target === 'function' && target.name === '')\n {\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: inject decorator cannot be applied to a method.`);\n }\n \n if (typeof injectIndex !== 'number')\n {\n throw new Error(`${nameOf(target)}.${String(propertyName)}: inject decorator cannot be applied to a property.`);\n }\n \n const typeFn = target as TypeFn<any>;\n \n TypeManager.configureTypeMetadata(typeFn).configureInjectMetadata(injectIndex, injectOptions);\n\n return;\n };\n}\n","export * from './singleton-injector';\n","import { Injector } from '../injector';\nimport { TypeCtor } from '../type-ctor';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Singleton injector.\n * \n * @type {SingletonInjector}\n */\nexport class SingletonInjector implements Injector\n{\n /**\n * Map with resolved types.\n * \n * @type {WeakMap<TypeMetadata<any>, any>}\n */\n private readonly instanceMap: WeakMap<TypeMetadata<any>, any> = new WeakMap<TypeMetadata<any>, any>();\n\n /**\n * Method to get instance described by type metadata.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * \n * @returns {TObject} Instance of type described by type metadata or undefined.\n */\n public get<TObject>(typeMetadata: TypeMetadata<TObject>): TObject | undefined\n {\n if (!typeMetadata.injectable)\n {\n throw new Error(`${typeMetadata.typeName}: cannot resolve type! Have you registered it as injectable?`);\n }\n\n const instance = this.instanceMap.get(typeMetadata);\n\n if (instance === undefined)\n {\n return this.init(typeMetadata);\n }\n\n return instance;\n }\n\n /**\n * Creates instance described by type metadata.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * \n * @returns {TObject} Type instance described by type metadata.\n */\n private init<TObject>(typeMetadata: TypeMetadata<TObject>): TObject\n {\n const typeCtor = typeMetadata.typeFn as TypeCtor<TObject>;\n const args = new Array<any>(typeCtor.length);\n const sortedInjectMetadatas = typeMetadata.sortedInjectMetadatas;\n\n for (let i = 0; i < sortedInjectMetadatas.length; i++)\n {\n args[sortedInjectMetadatas[i].injectIndex] = this.get(sortedInjectMetadatas[i].typeMetadata);\n }\n \n const instance = new typeCtor(...args);\n\n this.instanceMap.set(typeMetadata, instance);\n\n return instance;\n }\n}\n","/**\n * Logger level.\n * \n * @type {LoggerLevel}\n */\nexport enum LoggerLevel\n{\n /**\n * All details are displayed. On this level everything\n * is logged including info, warn and errors.\n */\n Debug = 0,\n\n /**\n * Important details are displayed. Debug messages are not shown.\n * On this level warn and errors are included.\n */\n Info = 1,\n\n /**\n * Warning and errors are displayed without debug and info\n * messages.\n */\n Warn = 2,\n\n /**\n * Only errors are displayed.\n */\n Error = 3,\n\n /**\n * Nothing is displayed. All messages are hidden.\n */\n None = 4\n}\n","import { LoggerLevel } from './logger-level';\n\n/**\n * Main logger class used for displaying messages.\n * \n * @type {Logger}\n */\nexport class Logger\n{\n /**\n * Logger level defines what kind of messages should be displayed in the console.\n * \n * @type {LoggerLevel}\n */\n private readonly loggerLevel: LoggerLevel;\n \n /**\n * Debug disabled?\n * \n * @type {boolean}\n */\n private readonly debugDisabled: boolean;\n\n /**\n * Info disabled?\n * \n * @type {boolean}\n */\n private readonly infoDisabled: boolean;\n\n /**\n * Warn disabled?\n * \n * @type {boolean}\n */\n private readonly warnDisabled: boolean;\n\n /**\n * Error disabled?\n * \n * @type {boolean}\n */\n private readonly errorDisabled: boolean;\n\n /**\n * Supports console?\n * \n * @type {boolean}\n */\n private readonly supportsConsole: boolean;\n\n /**\n * Supports console log?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleLog: boolean;\n\n /**\n * Supports console info?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleInfo: boolean;\n\n /**\n * Supports console warn?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleWarn: boolean;\n\n /**\n * Supports console error?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleError: boolean;\n\n /**\n * Constructor.\n * \n * @param {LoggerLevel} loggerLevel Logger level.\n */\n public constructor(loggerLevel: LoggerLevel)\n {\n this.loggerLevel = loggerLevel;\n this.debugDisabled = this.loggerLevel > LoggerLevel.Debug;\n this.infoDisabled = this.loggerLevel > LoggerLevel.Info;\n this.warnDisabled = this.loggerLevel > LoggerLevel.Warn;\n this.errorDisabled = this.loggerLevel > LoggerLevel.Error;\n this.supportsConsole = console !== undefined && console !== null;\n this.supportsConsoleLog = this.supportsConsole && console.log !== undefined && console.log !== null;\n this.supportsConsoleInfo = this.supportsConsole && console.info !== undefined && console.info !== null;\n this.supportsConsoleWarn = this.supportsConsole && console.warn !== undefined && console.warn !== null;\n this.supportsConsoleError = this.supportsConsole && console.error !== undefined && console.error !== null;\n\n return;\n }\n\n /**\n * Formats message based on component and level.\n * \n * @param {string} component Component which logs the message.\n * @param {string} loggerLevel Logger level.\n * @param {string} message Message to display.\n * \n * @returns {string} Formatted message.\n */\n private format(component: string, loggerLevel: string, message: string): string\n {\n return `[${component}][${loggerLevel}]: ${message}`;\n }\n\n /**\n * Displays debug message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public debug(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.debugDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const debugMessage = this.format(component, 'Debug', message);\n\n console.log(debugMessage, ...optionalParams);\n\n return;\n }\n\n return;\n }\n\n /**\n * Displays info message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public info(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.infoDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleInfo)\n {\n const infoMessage = this.format(component, 'Info', message);\n\n console.info(infoMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const infoMessage = this.format(component, 'Info', message);\n\n console.log(infoMessage, ...optionalParams);\n\n return;\n }\n\n return;\n }\n\n /**\n * Displays warn message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public warn(component: string, message: any, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.warnDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleWarn)\n {\n const warnMessage = this.format(component, 'Warn', message);\n\n console.warn(warnMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const warnMessage = this.format(component, 'Warn', message);\n\n console.log(warnMessage, ...optionalParams);\n \n return;\n }\n\n return;\n }\n\n /**\n * Displays error message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public error(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void \n {\n if (this.errorDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleError)\n {\n const errorMessage = this.format(component, 'Error', message);\n\n console.error(errorMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const errorMessage = this.format(component, 'Error', message);\n\n console.log(errorMessage, ...optionalParams);\n \n return;\n }\n\n return;\n }\n}\n","import { Alias } from './alias';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeResolver } from './type-resolver';\nimport { Unknown } from './unknown';\n\n/**\n * Metadata class.\n * \n * Encapsulates common methods and properties which can be used by all types of metadata.\n * \n * @type {Metadata}\n */\nexport class Metadata\n{\n /**\n * Type manager.\n * \n * @type {TypeManager}\n */\n public readonly typeManager: TypeManager;\n\n /**\n * Type function map for types with aliases.\n * \n * @type {ReadonlyMap<Alias, TypeFn<any>>}\n */\n private readonly typeFnMap: ReadonlyMap<Alias, TypeFn<any>>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n */\n public constructor(typeManager: TypeManager, typeFnMap: ReadonlyMap<Alias, TypeFn<any>>)\n {\n this.typeManager = typeManager;\n this.typeFnMap = typeFnMap;\n\n return;\n }\n\n /**\n * Resolves type metadatas for provided type arguments.\n * \n * @param {ReadonlyArray<TypeArgument<any>>} typeArguments Type arguments.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved type metadatas.\n */\n public resolveTypeMetadatas(typeArguments: ReadonlyArray<TypeArgument<any>>): ReadonlyArray<TypeMetadata<any>>\n {\n const typeMetadatas = new Array<TypeMetadata<any>>(typeArguments.length);\n\n for (let i = 0; i < typeArguments.length; i++)\n {\n typeMetadatas[i] = this.resolveTypeMetadata(typeArguments[i]);\n }\n\n return typeMetadatas;\n }\n\n /**\n * Resolves type metadata for provided type argument.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Resolved type metadata.\n */\n public resolveTypeMetadata(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n if (typeof typeArgument === 'function')\n {\n if (typeArgument.name === '')\n {\n return this.resolveTypeMetadataUsingTypeResolver(typeArgument);\n }\n\n return this.resolveTypeMetadataUsingTypeFn(typeArgument);\n }\n\n if (typeof typeArgument === 'string')\n {\n return this.resolveTypeMetadataUsingAlias(typeArgument);\n }\n\n return this.resolveTypeMetadataUsingUnknownTypeFn();\n }\n\n /**\n * Resolves type metadata using type resolver.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type resolver.\n */\n private resolveTypeMetadataUsingTypeResolver(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeResolver = typeArgument as TypeResolver<any>;\n\n return this.typeManager.extractTypeMetadata(typeResolver());\n }\n\n /**\n * Resolves type metadata using type function.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type function.\n */\n private resolveTypeMetadataUsingTypeFn(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeFn = typeArgument as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using alias.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using alias.\n */\n private resolveTypeMetadataUsingAlias(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const alias = typeArgument as Alias;\n const typeFn = this.typeFnMap.get(alias);\n\n if (typeFn === undefined)\n {\n this.typeManager.logger.error('Metadata', 'Cannot resolve type metadata for provided type alias.', alias);\n this.typeManager.logger.info('Metadata', 'Check if a type exists that defines such an alias. In the meantime, metadata for an unknown type will be used.');\n\n return this.resolveTypeMetadataUsingUnknownTypeFn();\n }\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using unknown type function.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using unknown type function.\n */\n private resolveTypeMetadataUsingUnknownTypeFn(): TypeMetadata<any>\n {\n const typeFn = Unknown as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves generic metadatas based on provided generic arguments.\n * \n * @param {ReadonlyArray<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Resolved generic metadatas.\n */\n public resolveGenericMetadatas(genericArguments: ReadonlyArray<GenericArgument<any>>): ReadonlyArray<GenericMetadata<any>>\n {\n const genericMetadatas = new Array<GenericMetadata<any>>(genericArguments.length);\n\n for (let i = 0; i < genericArguments.length; i++)\n {\n const genericArgument = genericArguments[i];\n\n if (Array.isArray(genericArgument))\n {\n genericMetadatas[i] = [\n this.resolveTypeMetadata(genericArgument[0]),\n this.resolveGenericMetadatas(genericArgument[1])\n ];\n\n continue;\n }\n \n genericMetadatas[i] = [\n this.resolveTypeMetadata(genericArgument),\n EMPTY_ARRAY\n ];\n }\n\n return genericMetadatas;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Camel case naming convention.\n * \n * @type {CamelCaseNamingConvention}\n */\nexport class CamelCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat case naming convention.\n * \n * @type {FlatCaseNamingConvention}\n */\nexport class FlatCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toLowerCase()}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat upper case naming convention.\n * \n * @type {FlatUpperCaseNamingConvention}\n */\nexport class FlatUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toUpperCase()}`;\n }\n}\n","export * from './camel-case-naming-convention';\nexport * from './flat-case-naming-convention';\nexport * from './flat-upper-case-naming-convention';\nexport * from './kebab-case-naming-convention';\nexport * from './kebab-upper-case-naming-convention';\nexport * from './pascal-case-naming-convention';\nexport * from './snake-case-naming-convention';\nexport * from './snake-upper-case-naming-convention';\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab case naming convention.\n * \n * @type {KebabCaseNamingConvention}\n */\nexport class KebabCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}-${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab upper naming case.\n * \n * @type {KebabUpperCaseNamingConvention}\n */\nexport class KebabUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}-${wordUpperCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Pascal case naming convention.\n * \n * @type {PascalCaseNamingConvention}\n */\nexport class PascalCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n const wordPascalCased = `${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n\n if (index === 0)\n {\n return wordPascalCased;\n }\n\n return `${result}${wordPascalCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake case naming convention.\n *\n * @type {SnakeCaseNamingConvention}\n */\nexport class SnakeCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}_${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake upper case naming convention.\n * \n * @type {SnakeUpperCaseNamingConvention}\n */\nexport class SnakeUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}_${wordUpperCased}`;\n }\n}\n","import { CustomKey } from './custom-key';\nimport { PropertyExtensionMetadataCtor } from './property-extension-metadata-ctor';\n\n/**\n * Property extension metadata constructor set key.\n * \n * @type {CustomKey<Set<PropertyExtensionMetadataCtor<any, any, any>>>}\n */\nexport const PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY: CustomKey<Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>> = new CustomKey<Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>>('$DSPropertyExtensionMetadataCtorSet', () => new Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>());\n","import { PropertyExtensionOptions } from './property-extension-options';\nimport { PropertyMetadata } from './property-metadata';\n\n/**\n * Property extension metadata used by plugins to provide additional features for property metadata \n * using custom keys. Descendant classes are just wrappers to get convenient access to custom value map.\n * \n * @type {PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>}\n */\nexport abstract class PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions extends PropertyExtensionOptions>\n{\n /**\n * Property metadata which we extend.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata which we extend.\n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n */\n public constructor(propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>, propertyExtensionOptions: TPropertyExtensionOptions)\n {\n this.propertyMetadata = propertyMetadata;\n\n this.configure(propertyExtensionOptions);\n\n return;\n }\n \n /**\n * Configures property extension.\n * \n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n * \n * @returns {this} Property extension metadata.\n */\n public abstract configure(propertyExtensionOptions: TPropertyExtensionOptions): this;\n}\n","import { Alias } from './alias';\nimport { DEFAULT_VALUE_RESOLVER } from './constants/default-value-resolver';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { EMPTY_MAP } from './constants/empty-map';\nimport { NULL_VALUE_RESOLVER } from './constants/null-value-resolver';\nimport { CustomKey } from './custom-key';\nimport { CustomOption } from './custom-option';\nimport { CustomValue } from './custom-value';\nimport { DefaultValue } from './default-value';\nimport { getReflectMetadata } from './functions/get-reflect-metadata';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyExtensionMetadata } from './property-extension-metadata';\nimport { PropertyExtensionMetadataCtor } from './property-extension-metadata-ctor';\nimport { PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY } from './property-extension-metadata-ctor-set-key';\nimport { PropertyExtensionOptions } from './property-extension-options';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { PropertyState } from './property-state';\nimport { ResolvedPropertyState } from './property-states/resolved-property-state';\nimport { UnresolvedPropertyState } from './property-states/unresolved-property-state';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeState } from './type-state';\n\n/**\n * Main class used to describe a certain property.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\nexport class PropertyMetadata<TDeclaringObject, TObject> extends Metadata\n{\n /**\n * Type metadata to which property metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringObject>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringObject>;\n\n /**\n * Property name as declared in type.\n * \n * @type {PropertyName}\n */\n public readonly propertyName: PropertyName;\n\n /**\n * Normalized property name used for sorting.\n * \n * @type {PropertyName}\n */\n public readonly normalizedPropertyName: PropertyName;\n\n /**\n * Property options.\n * \n * @type {PropertyOptions<TObject>}\n */\n private readonly propertyOptions: PropertyOptions<TObject>;\n\n /**\n * Type function defined using reflect metadata.\n * \n * @type {Optional<TypeFn<TObject>>}\n */\n private readonly reflectTypeFn: Optional<TypeFn<TObject>>;\n\n /**\n * Current property state.\n * \n * @type {PropertyState<TDeclaringObject, TObject>}\n */\n private currentPropertyState: PropertyState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {TypeMetadata<TDeclaringObject>} declaringTypeMetadata Type metadata to which property metadata belongs to.\n * @param {PropertyName} propertyName Property name.\n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: ReadonlyMap<Alias, TypeFn<any>>,\n declaringTypeMetadata: TypeMetadata<TDeclaringObject>, \n propertyName: PropertyName,\n propertyOptions: PropertyOptions<TObject>\n )\n {\n super(typeManager, typeFnMap);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.propertyName = propertyName;\n this.normalizedPropertyName = propertyName.toLocaleLowerCase();\n this.reflectTypeFn = getReflectMetadata('design:type', declaringTypeMetadata.typeFn.prototype, propertyName);\n this.propertyOptions = this.constructPropertyOptions(propertyOptions);\n this.currentPropertyState = new UnresolvedPropertyState(this);\n\n this.configure(propertyOptions);\n\n return;\n }\n\n /**\n * Gets property state.\n * \n * @returns {PropertyState<TDeclaringObject, TObject>} Property state.\n */\n public get propertyState(): PropertyState<TDeclaringObject, TObject>\n {\n return this.currentPropertyState;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias or undefined.\n */\n public get alias(): Optional<Alias>\n {\n return this.currentPropertyState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n return this.currentPropertyState.customValueMap;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): Nullable<any>\n {\n return this.currentPropertyState.serializedNullValueResolver();\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n return this.currentPropertyState.serializedDefaultValueResolver();\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n return this.currentPropertyState.deserializedNullValueResolver();\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n return this.currentPropertyState.deserializedDefaultValueResolver();\n }\n\n /**\n * Gets serialized property name.\n * \n * @returns {string} Serialized property name.\n */\n public get serializedPropertyName(): string\n {\n return this.currentPropertyState.serializedPropertyName;\n }\n\n /**\n * Gets deserialized property name.\n * \n * @returns {string} Deserialized property name.\n */\n public get deserializedPropertyName(): string\n {\n return this.currentPropertyState.deserializedPropertyName;\n }\n\n /**\n * Gets deserializable value.\n * \n * @returns {boolean} Deserializable indicator.\n */\n public get deserializable(): boolean\n {\n return this.currentPropertyState.deserializable;\n }\n\n /**\n * Gets generic arguments.\n * \n * @returns {ReadonlyArray<GenericArgument<any>>} Generic arguments.\n */\n public get genericArguments(): ReadonlyArray<GenericArgument<any>>\n {\n return this.currentPropertyState.genericArguments;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Generic metadatas.\n */\n public get genericMetadatas(): ReadonlyArray<GenericMetadata<any>>\n {\n return this.currentPropertyState.genericMetadatas;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention or undefined.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n return this.currentPropertyState.namingConvention;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler \n {\n return this.currentPropertyState.referenceHandler;\n }\n\n /**\n * Gets serializable value.\n * \n * @returns {boolean} Serializable indicator.\n */\n public get serializable(): boolean\n {\n return this.currentPropertyState.serializable;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject> \n {\n return this.currentPropertyState.serializer;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n return this.currentPropertyState.typeArgument;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.currentPropertyState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.currentPropertyState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value indicator.\n */\n public get useDefaultValue(): boolean\n {\n return this.currentPropertyState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion indicator.\n */\n public get useImplicitConversion(): boolean\n {\n return this.currentPropertyState.useImplicitConversion;\n }\n\n /**\n * Constructs initial property options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n * \n * @returns {PropertyOptions<TObject>} Constructed type options.\n */\n private constructPropertyOptions(propertyOptions: PropertyOptions<TObject>): PropertyOptions<TObject>\n {\n if (propertyOptions.customValueMap === undefined)\n {\n propertyOptions.customValueMap = new Map<CustomKey<any>, CustomValue>();\n }\n\n return propertyOptions;\n }\n\n /**\n * Configures property extension metadata.\n * \n * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.\n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n * \n * @returns {TPropertyExtensionMetadata} Property extension metadata\n */\n public configurePropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(\n propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>, \n propertyExtensionOptions?: TPropertyExtensionOptions\n ): TPropertyExtensionMetadata\n {\n const propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();\n\n if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor))\n {\n propertyExtensionMetadataCtorSet.add(propertyExtensionMetadataCtor);\n }\n\n const initialPropertyExtensionOptions = propertyExtensionOptions ?? {} as TPropertyExtensionOptions;\n const propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);\n\n return propertyExtensionMetadata;\n }\n\n /**\n * Extracts property extension metadata.\n * \n * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.\n * \n * @returns {Optional<TPropertyExtensionMetadata>} Property extension metadata or undefined.\n */\n public extractPropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(\n propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>\n ): Optional<TPropertyExtensionMetadata>\n {\n const propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();\n \n if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor))\n {\n return undefined;\n }\n\n const initialPropertyExtensionOptions = {} as TPropertyExtensionOptions;\n const propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);\n\n return propertyExtensionMetadata;\n }\n\n /**\n * Extracts property extension metadata ctor set from custom value map.\n * \n * @returns {Set<PropertyExtensionMetadataCtor<any, any, any, any>>} Property extension metadata ctor set.\n */\n private extractPropertyExtensionMetadataCtorSet(): Set<PropertyExtensionMetadataCtor<any, any, any, any>>\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n let propertyExtensionMetadataCtorSet = customValueMap.get(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY) as Optional<Set<PropertyExtensionMetadataCtor<any, any, any, any>>>;\n\n if (propertyExtensionMetadataCtorSet === undefined)\n {\n propertyExtensionMetadataCtorSet = new Set<PropertyExtensionMetadataCtor<any, any, any, any>>();\n\n customValueMap.set(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY, propertyExtensionMetadataCtorSet);\n }\n\n return propertyExtensionMetadataCtorSet;\n }\n\n /**\n * Resolves property state.\n * \n * Calling this method has side effects by recomputing property state. If you need current\n * type state then use provided getter for that.\n * \n * @returns {ResolvedPropertyState<TDeclaringObject, TObject>} Resolved property state.\n */\n public resolvePropertyState(): ResolvedPropertyState<TDeclaringObject, TObject>\n {\n const propertyOptions = this.propertyOptions;\n const propertyName = this.propertyName;\n const alias = propertyOptions.alias;\n const deserializedPropertyName = propertyName;\n\n const typeArgument = propertyOptions.typeArgument === undefined \n ? this.reflectTypeFn \n : propertyOptions.typeArgument;\n\n const typeMetadata = this.resolveTypeMetadata(typeArgument);\n const typeState = typeMetadata.typeState;\n const customValueMap = this.resolveCustomValueMap(typeState);\n\n const preserveNull = propertyOptions.preserveNull === undefined \n ? typeState.preserveNull \n : propertyOptions.preserveNull;\n\n const useDefaultValue = propertyOptions.useDefaultValue === undefined \n ? typeState.useDefaultValue \n : propertyOptions.useDefaultValue;\n\n const useImplicitConversion = propertyOptions.useImplicitConversion === undefined \n ? typeState.useImplicitConversion \n : propertyOptions.useImplicitConversion;\n\n const serializedDefaultValue = propertyOptions.defaultValue === undefined \n ? (propertyOptions.serializedDefaultValue === undefined ? typeState.serializedDefaultValue : propertyOptions.serializedDefaultValue)\n : propertyOptions.defaultValue;\n \n const serializedDefaultValueResolver = useDefaultValue \n ? (typeof serializedDefaultValue === 'function' ? serializedDefaultValue : () => serializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const serializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER \n : serializedDefaultValueResolver;\n \n const deserializedDefaultValue = propertyOptions.defaultValue === undefined \n ? (propertyOptions.deserializedDefaultValue === undefined ? typeState.deserializedDefaultValue : propertyOptions.deserializedDefaultValue)\n : propertyOptions.defaultValue;\n \n const deserializedDefaultValueResolver = useDefaultValue\n ? (typeof deserializedDefaultValue === 'function' ? deserializedDefaultValue : () => deserializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const deserializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER\n : deserializedDefaultValueResolver;\n \n const namingConvention = propertyOptions.namingConvention === undefined\n ? this.declaringTypeMetadata.typeState.namingConvention\n : propertyOptions.namingConvention;\n\n const serializedPropertyName = alias === undefined\n ? (namingConvention === undefined ? propertyName : namingConvention.convert(propertyName))\n : alias;\n \n const useDefaultSerialization = propertyOptions.serializable === undefined \n && propertyOptions.deserializable === undefined;\n\n const serializable = useDefaultSerialization\n || propertyOptions.serializable === true;\n\n const deserializable = useDefaultSerialization\n || propertyOptions.deserializable === true;\n\n const genericArguments = propertyOptions.genericArguments === undefined\n ? EMPTY_ARRAY\n : propertyOptions.genericArguments;\n\n const genericMetadatas = this.resolveGenericMetadatas(genericArguments);\n\n const referenceHandler = propertyOptions.referenceHandler === undefined\n ? typeState.referenceHandler\n : propertyOptions.referenceHandler;\n\n const serializer = propertyOptions.serializer === undefined\n ? typeState.serializer\n : propertyOptions.serializer;\n \n const resolvedPropertyState = new ResolvedPropertyState<TDeclaringObject, TObject>(\n this,\n alias,\n customValueMap,\n serializedNullValueResolver,\n serializedDefaultValueResolver,\n deserializedNullValueResolver,\n deserializedDefaultValueResolver,\n serializedPropertyName,\n deserializedPropertyName,\n serializable,\n deserializable,\n genericArguments,\n genericMetadatas,\n namingConvention,\n referenceHandler,\n serializer,\n typeArgument,\n typeMetadata,\n preserveNull,\n useDefaultValue,\n useImplicitConversion\n );\n \n this.currentPropertyState = resolvedPropertyState;\n\n return resolvedPropertyState;\n }\n\n /**\n * Unresolves property state.\n * \n * Calling this method has side effects by resetting property state. \n * \n * @returns {UnresolvedPropertyState<TDeclaringObject, TObject>} Unresolved property state.\n */\n public unresolvePropertyState(): UnresolvedPropertyState<TDeclaringObject, TObject>\n {\n const unresolvedPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n this.currentPropertyState = unresolvedPropertyState;\n\n return unresolvedPropertyState;\n }\n\n /**\n * Resolves custom value map the same way as it is done for the main options.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map.\n */\n private resolveCustomValueMap(typeState: TypeState<TObject>): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n const propertyOptions = this.propertyOptions;\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n if (propertyOptions.customValueMap === undefined)\n {\n return customValueMap;\n }\n\n const typeCustomValueMap = typeState.customValueMap === undefined\n ? EMPTY_MAP\n : typeState.customValueMap;\n \n for (const [customKey, customValue] of propertyOptions.customValueMap)\n {\n if (customValue === undefined)\n {\n customValueMap.set(customKey, typeCustomValueMap.get(customKey));\n\n continue;\n }\n\n customValueMap.set(customKey, customValue);\n }\n\n return customValueMap;\n }\n\n /**\n * Configures alias.\n * \n * @param {Optional<Alias>} alias Alias or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasAlias(alias: Optional<Alias>): this\n {\n this.propertyOptions.alias = alias;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value map.\n * \n * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this\n {\n let currentCustomValueMap = this.propertyOptions.customValueMap;\n\n if (currentCustomValueMap === undefined)\n {\n currentCustomValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = currentCustomValueMap;\n }\n \n if (customValueMap !== undefined)\n {\n if (currentCustomValueMap !== customValueMap)\n {\n currentCustomValueMap.clear();\n }\n\n for (const [customKey, customValue] of customValueMap)\n {\n currentCustomValueMap.set(customKey, customValue);\n }\n }\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * @param {TCustomValue} customValue Custom value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n customValueMap.set(customKey, customValue);\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Extracts value by custom key.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * \n * @returns {TCustomValue} Custom value.\n */\n public extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\n {\n let customValue = this.propertyState.customValueMap.get(customKey) as TCustomValue;\n\n if (customValue === undefined && customKey.customValueResolver !== undefined)\n {\n customValue = customKey.customValueResolver();\n }\n\n return customValue;\n }\n\n /**\n * Configures custom options.\n * \n * @param {ReadonlyArray<CustomOption>} customOptions Custom options.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n for (let i = 0; i < customOptions.length; i++)\n {\n customValueMap.set(customOptions[i][0], customOptions[i][1]);\n }\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): this\n {\n this.propertyOptions.defaultValue = defaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this\n {\n this.propertyOptions.serializedDefaultValue = serializedDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this\n {\n this.propertyOptions.deserializedDefaultValue = deserializedDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserializable.\n * \n * @param {boolean} deserializable Deserializable.\n * \n * @returns {this} Current instance of property metadata.\n */\n public isDeserializable(deserializable: boolean = true): this\n {\n this.propertyOptions.deserializable = deserializable;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializable.\n * \n * @param {boolean} serializable Serializable.\n * \n * @returns {this} Current instance of property metadata.\n */\n public isSerializable(serializable: boolean = true): this\n {\n this.propertyOptions.serializable = serializable;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures generic arguments.\n * \n * @param {Optional<Array<GenericArgument<any>>>} genericArguments Generic arguments or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasGenericArguments(genericArguments: Optional<Array<GenericArgument<any>>>): this\n {\n this.propertyOptions.genericArguments = genericArguments;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {Optional<NamingConvention>} namingConvention Naming convention or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasNamingConvention(namingConvention: Optional<NamingConvention>): this\n {\n this.propertyOptions.namingConvention = namingConvention;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {Optional<ReferenceHandler>} referenceHandler Reference handler or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this\n {\n this.propertyOptions.referenceHandler = referenceHandler;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Optional<Serializer<TObject>>} serializer Serializer or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasSerializer(serializer: Optional<Serializer<TObject>>): this\n {\n this.propertyOptions.serializer = serializer;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures type argument.\n * \n * @param {Optional<TypeArgument<TObject>>} typeArgument Type argument or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasTypeArgument(typeArgument: Optional<TypeArgument<TObject>>): this\n {\n this.propertyOptions.typeArgument = typeArgument ?? this.reflectTypeFn;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): this\n {\n this.propertyOptions.preserveNull = preserveNull;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): this\n {\n this.propertyOptions.useDefaultValue = useDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): this\n {\n this.propertyOptions.useImplicitConversion = useImplicitConversion;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures property metadata based on provided options.\n * \n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n * \n * @returns {this} Current instance of property metadata.\n */\n public configure(propertyOptions: PropertyOptions<TObject>): this\n {\n if (propertyOptions.alias !== undefined)\n {\n this.hasAlias(propertyOptions.alias);\n }\n\n if (propertyOptions.customValueMap !== undefined)\n {\n this.hasCustomValueMap(propertyOptions.customValueMap);\n }\n\n if (propertyOptions.defaultValue !== undefined)\n {\n this.hasDefaultValue(propertyOptions.defaultValue);\n }\n\n if (propertyOptions.serializedDefaultValue !== undefined)\n {\n this.hasSerializedDefaultValue(propertyOptions.serializedDefaultValue);\n }\n\n if (propertyOptions.deserializedDefaultValue !== undefined)\n {\n this.hasDeserializedDefaultValue(propertyOptions.deserializedDefaultValue);\n }\n\n if (propertyOptions.deserializable !== undefined)\n {\n this.isDeserializable(propertyOptions.deserializable);\n }\n\n if (propertyOptions.genericArguments !== undefined) \n {\n this.hasGenericArguments(propertyOptions.genericArguments);\n }\n\n if (propertyOptions.namingConvention !== undefined)\n {\n this.hasNamingConvention(propertyOptions.namingConvention);\n }\n\n if (propertyOptions.referenceHandler !== undefined) \n {\n this.hasReferenceHandler(propertyOptions.referenceHandler);\n }\n\n if (propertyOptions.serializable !== undefined) \n {\n this.isSerializable(propertyOptions.serializable);\n }\n\n if (propertyOptions.serializer !== undefined) \n {\n this.hasSerializer(propertyOptions.serializer);\n }\n\n if (propertyOptions.typeArgument !== undefined) \n {\n this.hasTypeArgument(propertyOptions.typeArgument);\n }\n\n if (propertyOptions.preserveNull !== undefined)\n {\n this.shouldPreserveNull(propertyOptions.preserveNull);\n }\n\n if (propertyOptions.useDefaultValue !== undefined)\n {\n this.shouldUseDefaultValue(propertyOptions.useDefaultValue);\n }\n\n if (propertyOptions.useImplicitConversion !== undefined) \n {\n this.shouldUseImplicitConversion(propertyOptions.useImplicitConversion);\n }\n\n return this;\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents asc property sorter which sorts type properties in\n * ascending order by name.\n * \n * @type {AscPropertySorter}\n */\nexport class AscPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TObject, any>} x First property.\n * @param {PropertyMetadata<TObject, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: PropertyMetadata<TObject, any>, y: PropertyMetadata<TObject, any>): number\n {\n return x.normalizedPropertyName.localeCompare(y.normalizedPropertyName);\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents desc property sorter which sorts type properties in\n * descending order by name.\n * \n * @type {DescPropertySorter}\n */\nexport class DescPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TObject, any>} x First property.\n * @param {PropertyMetadata<TObject, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: PropertyMetadata<TObject, any>, y: PropertyMetadata<TObject, any>): number\n {\n return y.normalizedPropertyName.localeCompare(x.normalizedPropertyName);\n }\n}\n","export * from './asc-property-sorter';\nexport * from './desc-property-sorter';\n","export * from './resolved-property-state';\nexport * from './unresolved-property-state';\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { GenericArgument } from '../generic-argument';\nimport { GenericMetadata } from '../generic-metadata';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyState } from '../property-state';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Represents resolved property state.\n * \n * @type {ResolvedPropertyState<TDeclaringObject, TObject>}\n */\nexport class ResolvedPropertyState<TDeclaringObject, TObject> implements PropertyState<TDeclaringObject, TObject>\n{\n /**\n * Property metadata for which state is defined.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Alias.\n * \n * @type {Optional<Alias>}\n */\n public readonly alias: Optional<Alias>;\n\n /**\n * Custom value map.\n * \n * @type {ReadonlyMap<CustomKey<any>, CustomValue>}\n */\n public readonly customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>;\n\n /**\n * Serialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly serializedNullValueResolver: NullValueResolver;\n\n /**\n * Serialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly serializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Deserialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly deserializedNullValueResolver: NullValueResolver;\n\n /**\n * Deserialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly deserializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Serialized property name.\n * \n * @type {PropertyName}\n */\n public readonly serializedPropertyName: PropertyName;\n\n /**\n * Deserialized property name.\n * \n * @type {PropertyName}\n */\n public readonly deserializedPropertyName: PropertyName;\n\n /**\n * Serializable value.\n * \n * @type {boolean}\n */\n public readonly serializable: boolean;\n\n /**\n * Deserializable value.\n * \n * @type {boolean}\n */\n public readonly deserializable: boolean;\n\n /**\n * Generic arguments.\n * \n * @type {ReadonlyArray<GenericArgument<any>>}\n */\n public readonly genericArguments: ReadonlyArray<GenericArgument<any>>;\n\n /**\n * Generic metadatas.\n * \n * @type {ReadonlyArray<GenericMetadata<any>>}\n */\n public readonly genericMetadatas: ReadonlyArray<GenericMetadata<any>>;\n\n /**\n * Naming convention.\n * \n * @type {Optional<NamingConvention>}\n */\n public readonly namingConvention: Optional<NamingConvention>;\n\n /**\n * Reference handler.\n * \n * @type {ReferenceHandler}\n */\n public readonly referenceHandler: ReferenceHandler;\n \n /**\n * Serializer.\n * \n * @type {Serializer<TObject>}\n */\n public readonly serializer: Serializer<TObject>;\n\n /**\n * Type argument.\n * \n * @type {TypeArgument<TObject>}\n */\n public readonly typeArgument: TypeArgument<TObject>;\n\n /**\n * Type metadata.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Indicator if null value should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveNull: boolean;\n\n /**\n * Indicator if default value should be used.\n * \n * @type {boolean}\n */\n public readonly useDefaultValue: boolean;\n\n /**\n * Indicator if implicit conversion should be used.\n * \n * @type {boolean}\n */\n public readonly useImplicitConversion: boolean;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata for which state is defined.\n * @param {Optional<Alias>} alias Alias.\n * @param {ReadonlyMap<CustomKey<any>, CustomValue>} customValueMap Custom value map.\n * @param {NullValueResolver} serializedNullValueResolver Serialized null value resolver.\n * @param {DefaultValueResolver} serializedDefaultValueResolver Serialized default value resolver.\n * @param {NullValueResolver} deserializedNullValueResolver Deserialized null value resolver.\n * @param {DefaultValueResolver} deserializedDefaultValueResolver Deserialized default value resolver.\n * @param {PropertyName} serializedPropertyName Serialized property name.\n * @param {PropertyName} deserializedPropertyName Deserialized property name.\n * @param {boolean} serializable Serializable value.\n * @param {boolean} deserializable Deserializable value.\n * @param {ReadonlyArray<GenericArgument<any>>} genericArguments Generic arguments.\n * @param {ReadonlyArray<GenericMetadata<any>>} genericMetadatas Generic metadatas.\n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * @param {ReferenceHandler} referenceHandler Reference handler.\n * @param {Serializer<TObject>} serializer Serializer.\n * @param {TypeArgument<TObject>} typeArgument Type argument.\n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * @param {boolean} preserveNull Indicator if null value should be preserved.\n * @param {boolean} useDefaultValue Indicator if default value should be used.\n * @param {boolean} useImplicitConversion Indicator if implicit conversion should be used.\n */\n public constructor(\n propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>,\n alias: Optional<Alias>,\n customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>,\n serializedNullValueResolver: NullValueResolver,\n serializedDefaultValueResolver: DefaultValueResolver,\n deserializedNullValueResolver: NullValueResolver,\n deserializedDefaultValueResolver: DefaultValueResolver,\n serializedPropertyName: PropertyName,\n deserializedPropertyName: PropertyName,\n serializable: boolean,\n deserializable: boolean,\n genericArguments: ReadonlyArray<GenericArgument<any>>,\n genericMetadatas: ReadonlyArray<GenericMetadata<any>>,\n namingConvention: Optional<NamingConvention>,\n referenceHandler: ReferenceHandler,\n serializer: Serializer<TObject>,\n typeArgument: TypeArgument<TObject>,\n typeMetadata: TypeMetadata<TObject>,\n preserveNull: boolean,\n useDefaultValue: boolean,\n useImplicitConversion: boolean\n )\n {\n this.propertyMetadata = propertyMetadata;\n this.alias = alias;\n this.customValueMap = customValueMap;\n this.serializedNullValueResolver = serializedNullValueResolver;\n this.serializedDefaultValueResolver = serializedDefaultValueResolver;\n this.deserializedNullValueResolver = deserializedNullValueResolver;\n this.deserializedDefaultValueResolver = deserializedDefaultValueResolver;\n this.serializedPropertyName = serializedPropertyName;\n this.deserializedPropertyName = deserializedPropertyName;\n this.serializable = serializable;\n this.deserializable = deserializable;\n this.genericArguments = genericArguments;\n this.genericMetadatas = genericMetadatas;\n this.namingConvention = namingConvention;\n this.referenceHandler = referenceHandler;\n this.serializer = serializer;\n this.typeArgument = typeArgument;\n this.typeMetadata = typeMetadata;\n this.preserveNull = preserveNull;\n this.useDefaultValue = useDefaultValue;\n this.useImplicitConversion = useImplicitConversion;\n\n return;\n }\n}\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { GenericArgument } from '../generic-argument';\nimport { GenericMetadata } from '../generic-metadata';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyState } from '../property-state';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\nimport { ResolvedPropertyState } from './resolved-property-state';\n\n/**\n * Represents unresolved property state.\n * \n * @type {UnresolvedPropertyState<TDeclaringObject, TObject>}\n */\nexport class UnresolvedPropertyState<TDeclaringObject, TObject> implements PropertyState<TDeclaringObject, TObject>\n{\n /**\n * Property metadata for which state is defined.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Resolved property state.\n * \n * @type {ResolvedPropertyState<TDeclaringObject, TObject>}\n */\n private resolvedPropertyState?: ResolvedPropertyState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata for which state is defined.\n */\n public constructor(propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>)\n {\n this.propertyMetadata = propertyMetadata;\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Optional alias.\n */\n public get alias(): Optional<Alias>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.customValueMap;\n }\n\n /**\n * Gets serialized null value resolver.\n * \n * @returns {NullValueResolver} Serialized null value resolver.\n */\n public get serializedNullValueResolver(): NullValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedNullValueResolver;\n }\n\n /**\n * Gets serialized default value resolver.\n * \n * @returns {DefaultValueResolver} Default value resolver.\n */\n public get serializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedDefaultValueResolver;\n }\n\n /**\n * Gets deserialized null value resolver.\n * \n * @returns {NullValueResolver} Deserialized null value resolver.\n */\n public get deserializedNullValueResolver(): NullValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedNullValueResolver;\n }\n\n /**\n * Gets deserialized default value resolver.\n * \n * @returns {DefaultValueResolver} Deserialized default value resolver.\n */\n public get deserializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedDefaultValueResolver;\n }\n\n /**\n * Gets serialized property name.\n * \n * @returns {PropertyName} Serialized property name.\n */\n public get serializedPropertyName(): PropertyName\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedPropertyName;\n }\n\n /**\n * Gets deserialized property name.\n * \n * @returns {PropertyName} Deserialized property name.\n */\n public get deserializedPropertyName(): PropertyName\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedPropertyName;\n }\n\n /**\n * Gets serializable value.\n * \n * @returns {boolean} Serializable value.\n */\n public get serializable(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializable;\n }\n\n /**\n * Gets deserializable value.\n * \n * @returns {boolean} Deserializable value.\n */\n public get deserializable(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializable;\n }\n\n /**\n * Gets generic arguments.\n * \n * @returns {ReadonlyArray<GenericArgument<any>>} Generic arguments.\n */\n public get genericArguments(): ReadonlyArray<GenericArgument<any>>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.genericArguments;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Generic metadatas.\n */\n public get genericMetadatas(): ReadonlyArray<GenericMetadata<any>>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.genericMetadatas;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.namingConvention;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.referenceHandler;\n }\n \n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializer;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.typeArgument;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} Preserve null indicator.\n */\n public get preserveNull(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value indicator.\n */\n public get useDefaultValue(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion indicator.\n */\n public get useImplicitConversion(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.useImplicitConversion;\n }\n}\n","import { nameOf } from './functions/name-of';\nimport { GenericArgument } from './generic-argument';\nimport { PropertyDecorator } from './property-decorator';\nimport { PropertyOptions } from './property-options';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\n\n/**\n * Property decorator.\n * \n * @param {TypeArgument<TObject>|Array<GenericArgument<any>>|PropertyOptions<TObject>} x Type argument, generic arguments or property options.\n * @param {Array<GenericArgument<any>>|PropertyOptions<TObject>} y Generic arguments or property options if first parameter is type argument.\n * @param {PropertyOptions<TObject>} z Property options if second parameter are generic arguments.\n * \n * @returns {PropertyDecorator} Property decorator.\n */\nexport function Property<TObject>(\n x?: TypeArgument<TObject> | Array<GenericArgument<any>> | PropertyOptions<TObject>, \n y?: Array<GenericArgument<any>> | PropertyOptions<TObject>,\n z?: PropertyOptions<TObject>\n): PropertyDecorator\n{\n const propertyOptions = {} as PropertyOptions<TObject>;\n\n if (typeof z === 'object')\n {\n Object.assign(propertyOptions, z);\n }\n\n if (typeof y === 'object' && !Array.isArray(y))\n {\n Object.assign(propertyOptions, y);\n }\n\n if (typeof x === 'object' && !Array.isArray(x))\n {\n Object.assign(propertyOptions, x);\n }\n\n if (Array.isArray(y))\n {\n propertyOptions.genericArguments = y as Array<GenericArgument<any>>;\n }\n\n if (Array.isArray(x))\n {\n propertyOptions.genericArguments = x as Array<GenericArgument<any>>;\n }\n\n if (typeof x === 'string' || typeof x === 'function')\n {\n propertyOptions.typeArgument = x as TypeArgument<TObject>;\n }\n\n return function (target: any, context: any): any\n {\n // Modern decorator has a dynamic target which is dependent from where decorator \n // is applied (target), context as a second parameter (context) and optional \n // resolver like return type.\n if (context !== null && typeof context === 'object' && context.hasOwnProperty('kind'))\n {\n const decoratorContext = context as any;\n const kind = decoratorContext.kind;\n const propertyName = decoratorContext.name;\n\n if (kind === 'method' || kind === 'class')\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to a method or a class.`);\n }\n\n if (propertyName === undefined)\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to undefined values.`);\n }\n\n if (typeof propertyName === 'symbol')\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to a symbol.`);\n }\n\n TypeManager.typeScope.addPropertyOptions(propertyName, propertyOptions);\n\n return;\n }\n\n // Legacy decorator has class reference as a first parameter (target), property name \n // or symbol as a second parameter (context) and no return type.\n if (target !== null && typeof target === 'object' && (typeof context === 'string' || typeof context === 'symbol'))\n {\n const legacyTarget = target as any;\n const propertyName = context as string | symbol | undefined;\n \n if (typeof legacyTarget === 'function' && legacyTarget.name !== '')\n {\n throw new Error(`${nameOf(legacyTarget)}.${String(propertyName)}: property decorator cannot be applied to a static member.`);\n }\n\n if (propertyName === undefined)\n {\n throw new Error(`${nameOf(legacyTarget)}.${String(propertyName)}: property decorator cannot be applied to undefined values.`);\n }\n\n if (typeof propertyName === 'symbol')\n {\n throw new Error(`${nameOf(legacyTarget.constructor)}.${String(propertyName)}: property decorator cannot be applied to a symbol.`);\n }\n \n if (typeof legacyTarget[propertyName] === 'function')\n {\n throw new Error(`${nameOf(legacyTarget.constructor)}.${String(propertyName)}: property decorator cannot be applied to a method.`);\n }\n \n const typeFn = legacyTarget.constructor as TypeFn<any>;\n \n TypeManager.configureTypeMetadata(typeFn).configurePropertyMetadata(propertyName as string, propertyOptions);\n \n return;\n }\n\n throw new Error(`Property decorator was not able to detect correct resolver for the following target [${target}] and context [${context}].`);\n };\n}\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Circular reference handler which preserves references as is even if the circular is detected.\n * \n * @type {CircularReferenceHandler}\n */\nexport class CircularReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","export * from './circular-reference-handler';\nexport * from './json-path-reference-handler';\nexport * from './plain-reference-handler';\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Json path reference handler preserves references using JSONPath.\n * \n * @type {JsonPathReferenceHandler}\n */\nexport class JsonPathReferenceHandler implements ReferenceHandler\n{\n /**\n * Regular expression used to get array key from a certain place of the JSONPath.\n * \n * @type {RegExp}\n */\n private readonly arrayKeyRegExp: RegExp = new RegExp('\\\\[\\\\\\'?([^\\\\\\'\\\\[\\\\]]+)\\\\\\'?\\\\]', 'g');\n\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referencePath = referenceMap.get(referenceKey);\n\n if (referencePath === undefined)\n {\n referenceMap.set(referenceKey, serializerContext.jsonPath);\n\n const value = referenceValueGetter();\n\n return value;\n }\n\n return { $ref: referencePath };\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceTarget = this.defineReferenceTarget(serializerContext, referenceKey);\n const referenceValue = referenceMap.get(referenceTarget);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceTarget, referenceTarget);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceTarget, value);\n\n serializerContext.resolveReferenceCallbacks(referenceTarget);\n\n return value;\n }\n \n if (referenceTarget !== referenceKey) \n {\n serializerContext.pushReferenceCallback(referenceTarget, () =>\n {\n serializerContext.resolveReferenceCallbacks(referenceKey);\n });\n }\n\n if (referenceTarget === referenceValue)\n {\n serializerContext.registerReferenceCallback(referenceTarget);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Defines reference target based on reference key.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * \n * @returns {ReferenceKey} Reference which acts as a target key in context of JSONPath.\n */\n private defineReferenceTarget(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey): ReferenceKey\n {\n const $ = serializerContext.$;\n const referencePath = referenceKey.$ref;\n\n if (typeof referencePath !== 'string' || typeof $ !== 'object')\n {\n return referenceKey;\n }\n\n if (referencePath === '$')\n {\n return $;\n }\n\n const referencePathArray = this.convertReferencePathToArray(referencePath);\n\n referencePathArray.shift();\n\n let referenceTarget = $ as Record<string, any>;\n\n for (let i = 0; i < referencePathArray.length; i++)\n {\n referenceTarget = referenceTarget[referencePathArray[i]];\n }\n\n return referenceTarget;\n }\n\n /**\n * Converts reference path to array.\n * \n * @param {string} referencePath Reference path.\n * \n * @returns {Array<string>} Array reference path.\n */\n private convertReferencePathToArray(referencePath: string): Array<string> \n {\n const array = new Array<string>();\n const parts = referencePath.split('.');\n\n for (let i = 0; i < parts.length; i++) \n {\n const part = parts[i];\n const keys = part.split(this.arrayKeyRegExp);\n\n for (let j = 0; j < keys.length; j++)\n {\n const key = keys[j];\n\n if (key.length > 0) \n {\n array.push(key);\n }\n }\n }\n\n return array;\n }\n}\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Plain reference handler preserves references except circular. If circular reference is detected the it will \n * be setted to undefined so only first occurance is handled.\n * \n * @type {PlainReferenceHandler}\n */\nexport class PlainReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","import { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { GenericMetadata } from './generic-metadata';\nimport { Injector } from './injector';\nimport { Logger } from './logger';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyState } from './property-state';\nimport { ReferenceCallback } from './reference-callback';\nimport { ReferenceHandler } from './reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { ReferenceValueGetter } from './reference-value-getter';\nimport { ReferenceValueSetter } from './reference-value-setter';\nimport { Serializer } from './serializer';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeState } from './type-state';\n\n/**\n * Serializer context of a certain type.\n * \n * @type {SerializerContext<TObject>}\n */\nexport class SerializerContext<TObject>\n{\n /**\n * Serializer context root.\n * \n * This is a value passed to the root serializer.\n * \n * @type {any}\n */\n public readonly $: any;\n\n /**\n * Reference map.\n * \n * Used to preserve object references.\n * \n * @type {Map<ReferenceKey, ReferenceValue>}\n */\n public readonly referenceMap: Map<ReferenceKey, ReferenceValue>;\n\n /**\n * Reference callback map.\n * \n * Used to assign object references in a later time due to circular dependency.\n * \n * @type {Map<ReferenceKey, Array<ReferenceCallback>>}\n */\n public readonly referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>;\n\n /**\n * Parent serializer context.\n * \n * Present when any serializer defines child context.\n * \n * @type {Optional<SerializerContext<any>>}\n */\n public readonly parentSerializerContext: Optional<SerializerContext<any>>;\n\n /**\n * Json path key.\n * \n * @type {any}\n */\n public jsonPathKey: any;\n\n /**\n * Type state.\n * \n * @type {TypeState<TObject>}\n */\n public typeState: TypeState<TObject>;\n\n /**\n * Property state.\n * \n * @type {TypeState<TObject>}\n */\n public genericMetadatas: ReadonlyArray<GenericMetadata<any>>;\n\n /**\n * Property state.\n * \n * @type {Optional<PropertyState<any, TObject>>}\n */\n public propertyState: Optional<PropertyState<any, TObject>>;\n\n /**\n * Reference value setter.\n * \n * @type {Optional<ReferenceValueSetter>}\n */\n public referenceValueSetter: Optional<ReferenceValueSetter>;\n\n /**\n * Constructor.\n * \n * @param {any} $ Serializer context root.\n * @param {Map<ReferenceKey, ReferenceValue>} referenceMap Reference map.\n * @param {Map<ReferenceKey, Array<ReferenceCallback>>} referenceCallbackMap Reference callback map.\n * @param {Optional<SerializerContext<any>>} parentSerializerContext Parent serializer context.\n * @param {any} jsonPathKey Json path key.\n * @param {TypeState<TObject>} typeState Type state.\n * @param {ReadonlyArray<GenericMetadata<any>>} genericMetadatas Generic metadatas.\n * @param {Optional<PropertyState<any, TObject>>} propertyState Property state.\n * @param {Optional<ReferenceValueSetter>} referenceValueSetter Reference value setter.\n */\n public constructor(\n $: any,\n referenceMap: Map<ReferenceKey, ReferenceValue>,\n referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>,\n parentSerializerContext: Optional<SerializerContext<any>>,\n jsonPathKey: any,\n typeState: TypeState<TObject>,\n genericMetadatas: ReadonlyArray<GenericMetadata<any>>,\n propertyState: Optional<PropertyState<any, TObject>>,\n referenceValueSetter: Optional<ReferenceValueSetter>\n )\n {\n this.$ = $;\n this.referenceMap = referenceMap,\n this.referenceCallbackMap = referenceCallbackMap;\n this.parentSerializerContext = parentSerializerContext;\n this.jsonPathKey = jsonPathKey;\n this.typeState = typeState;\n this.genericMetadatas = genericMetadatas;\n this.propertyState = propertyState;\n this.referenceValueSetter = referenceValueSetter;\n\n return;\n }\n\n /**\n * Gets json path from serializer context root.\n * \n * @returns {string} Json path.\n */\n public get jsonPath(): string\n {\n const jsonPathKey = this.jsonPathKey;\n const parentSerializerContext = this.parentSerializerContext;\n\n if (parentSerializerContext === undefined)\n {\n return `${jsonPathKey}`;\n }\n\n if (typeof jsonPathKey === 'number')\n {\n return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`;\n }\n\n return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): Nullable<any>\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n if (this.useDefaultValue)\n {\n return this.propertyState?.serializedDefaultValueResolver() ?? this.typeState.serializedDefaultValueResolver();\n }\n\n return undefined;\n }\n \n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.deserializedDefaultValue;\n }\n\n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n if (this.useDefaultValue)\n {\n return this.propertyState?.deserializedDefaultValueResolver() ?? this.typeState.deserializedDefaultValueResolver();\n }\n \n return undefined;\n }\n\n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.typeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.typeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.typeState.factory;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector\n */\n public get injector(): Injector\n {\n return this.typeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger instance.\n */\n public get logger(): Logger\n {\n return this.typeState.logger;\n }\n\n /**\n * Gets indicator if context is polymorphic.\n * \n * @returns {boolean} True when context is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.typeState.polymorphic;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.typeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.propertyState?.referenceHandler ?? this.typeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n return this.propertyState?.serializer ?? this.typeState.serializer;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.typeState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.propertyState?.preserveNull ?? this.typeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.propertyState?.useDefaultValue ?? this.typeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.propertyState?.useImplicitConversion ?? this.typeState.useImplicitConversion;\n }\n\n /**\n * Serializes provided value using context.\n * \n * @param {TypeLike<TObject>} x Some value.\n * \n * @returns {TypeLike<any>} Value serialized by context.\n */\n public serialize(x: TypeLike<TObject>): TypeLike<any>\n {\n return this.serializer.serialize(x, this);\n }\n\n /**\n * Deserializes provided value using context.\n * \n * @param {TypeLike<any>} x Some value.\n * \n * @returns {TypeLike<TObject>} Value deserialized by context.\n */\n public deserialize(x: TypeLike<any>): TypeLike<TObject>\n {\n return this.serializer.deserialize(x, this);\n }\n\n /**\n * Defines reference. \n * \n * May be called during serialization to define reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public defineReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.define(this, referenceKey, referenceValueGetter);\n }\n\n /**\n * Restores reference.\n * \n * May be called during deserialization to restore reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public restoreReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.restore(this, referenceKey, referenceValueGetter);\n }\n \n /**\n * Registers callback for provided reference key.\n * \n * May be called by reference handlers to register a callback resolver for a circular reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public registerReferenceCallback(referenceKey: ReferenceKey): void\n {\n const referenceValueSetter = this.referenceValueSetter;\n\n if (referenceValueSetter === undefined)\n {\n return;\n }\n\n const jsonPathKey = this.jsonPathKey;\n\n this.pushReferenceCallback(referenceKey, () =>\n {\n const referenceValue = this.referenceMap.get(referenceKey);\n\n referenceValueSetter(referenceValue, jsonPathKey);\n });\n\n return;\n }\n\n /**\n * Pushes callback for provided reference key.\n * \n * Called by reference handlers during handling of circular references.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceCallback} referenceCallback Reference callback.\n * \n * @returns {void}\n */\n public pushReferenceCallback(referenceKey: ReferenceKey, referenceCallback: ReferenceCallback): void\n {\n let referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (referenceCallbacks === undefined)\n {\n referenceCallbacks = new Array<ReferenceCallback>();\n\n this.referenceCallbackMap.set(referenceKey, referenceCallbacks);\n }\n\n referenceCallbacks.push(referenceCallback);\n\n return;\n }\n\n /**\n * Resolves callbacks for provided reference key.\n * \n * May be called by reference handlers when circular references can be resolved.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public resolveReferenceCallbacks(referenceKey: ReferenceKey): void\n {\n const referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (referenceCallbacks === undefined)\n {\n return;\n }\n \n for (let i = 0; i < referenceCallbacks.length; i++)\n {\n referenceCallbacks[i]();\n }\n\n return;\n }\n\n /**\n * Defines child serializer context.\n * \n * Called by serializers on drill down.\n * \n * @returns {SerializerContext<any>} Child serializer context.\n */\n public defineChildSerializerContext(): SerializerContext<any>\n {\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this,\n this.jsonPathKey,\n this.typeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines generic serializer context.\n * \n * Called by serializers which work with generics.\n * \n * @param {number} genericIndex Generic index.\n * \n * @returns {SerializerContext<any>} Generic serializer context.\n */\n public defineGenericSerializerContext(genericIndex: number): SerializerContext<any>\n {\n const genericMetadata = this.genericMetadatas[genericIndex];\n\n if (genericMetadata === undefined)\n {\n throw new Error(`${this.jsonPath}: cannot define generic metadata for index ${genericIndex}. This is usually caused by invalid configuration.`);\n }\n\n const typeMetadata = genericMetadata[0];\n const genericMetadatas = genericMetadata[1];\n\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap, \n this.parentSerializerContext,\n this.jsonPath,\n typeMetadata.typeState,\n genericMetadatas,\n undefined,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines polymorphic serializer context.\n * \n * Called by serializers which work with polymorphic types.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n public definePolymorphicSerializerContext(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n if (typeof x === 'function')\n {\n return this.definePolymorphicSerializerContextByTypeFn(x);\n }\n\n return this.definePolymorphicSerializerContextByDiscriminant(x);\n }\n\n /**\n * Defines polymorphic serializer context by type function.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByTypeFn(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n const typeFn = x as TypeFn<any>;\n const typeMetadata = this.typeState.typeMetadataMap.get(typeFn);\n\n if (typeMetadata === undefined)\n {\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this.parentSerializerContext,\n this.jsonPathKey,\n typeMetadata.typeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines polymorphic serializer context by discriminant.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByDiscriminant(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n const record = x as Record<string, any>;\n const childTypeMetadatas = this.typeState.childTypeMetadatas;\n\n for (let i = 0; i < childTypeMetadatas.length; i++)\n {\n const childTypeState = childTypeMetadatas[i].typeState;\n\n if (record[childTypeState.discriminator] === childTypeState.discriminant)\n {\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this.parentSerializerContext,\n this.jsonPathKey,\n childTypeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n }\n\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Any serializer.\n * \n * @type {AnySerializer}\n */\nexport class AnySerializer implements Serializer<any>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n \n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array buffer serializer.\n * \n * @type {ArrayBufferSerializer}\n */\nexport class ArrayBufferSerializer implements Serializer<ArrayBuffer>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<ArrayBuffer>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<ArrayBuffer>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof ArrayBuffer)\n {\n const arrayBufferView = new Uint16Array(x);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n serializerContext.logger.error('ArrayBufferSerializer', `${serializerContext.jsonPath}: cannot serialize value as array buffer.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<ArrayBuffer>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<ArrayBuffer>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return arrayBuffer;\n }\n\n serializerContext.logger.error('ArrayBufferSerializer', `${serializerContext.jsonPath}: cannot deserialize value as array buffer.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array serializer.\n * \n * @type {ArraySerializer}\n */\nexport class ArraySerializer implements Serializer<Array<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Array<any>>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Array<any>>, serializerContext: SerializerContext<Array<any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => arrayOutput[k] = v;\n\n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n arrayOutput[i] = serializer.serialize(arrayInput[i], valueSerializerContext);\n }\n \n return arrayOutput;\n });\n }\n\n serializerContext.logger.error('ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Array<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Array<any>>): TypeLike<Array<any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => arrayOutput[k] = v;\n\n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n arrayOutput[i] = serializer.deserialize(arrayInput[i], valueSerializerContext);\n }\n \n return arrayOutput;\n });\n }\n\n serializerContext.logger.error('ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Boolean serializer.\n * \n * @type {BooleanSerializer}\n */\nexport class BooleanSerializer implements Serializer<boolean>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<boolean>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<boolean>, serializerContext: SerializerContext<boolean>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'boolean')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot serialize value as boolean.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<boolean>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'boolean')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot deserialize value as boolean.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Type serializer context.\n * \n * @returns {TypeLike<boolean>} Converted value.\n */\n private convert(x: any, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\n {\n if (typeof x === 'string' && (x === 'true' || x === 'false'))\n {\n return x === 'true';\n }\n\n if (typeof x === 'string' && (x === '1' || x === '0'))\n {\n return x === '1';\n }\n\n if (typeof x === 'number' && (x === 1 || x === 0))\n {\n return x === 1;\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot convert value to boolean.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Data view serializer.\n * \n * @type {DataViewSerializer}\n */\nexport class DataViewSerializer implements Serializer<DataView>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<DataView>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<DataView>, serializerContext: SerializerContext<DataView>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof DataView)\n {\n const arrayBufferView = new Uint16Array(x.buffer);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n serializerContext.logger.error('DataViewSerializer', `${serializerContext.jsonPath}: cannot serialize value as data view.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<DataView>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<DataView>): TypeLike<DataView>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return new DataView(arrayBuffer);\n }\n\n serializerContext.logger.error('DataViewSerializer', `${serializerContext.jsonPath}: cannot deserialize value as data view.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Date serializer.\n * \n * @type {DateSerializer}\n */\nexport class DateSerializer implements Serializer<Date>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Date>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Date>, serializerContext: SerializerContext<Date>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Date)\n {\n return x.toISOString();\n }\n\n serializerContext.logger.error('DateSerializer', `${serializerContext.jsonPath}: cannot serialize value as date.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Date>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Date>): TypeLike<Date>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return new Date(x);\n }\n \n serializerContext.logger.error('DateSerializer', `${serializerContext.jsonPath}: cannot deserialize value as date.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 32 array serializer.\n * \n * @type {Float32ArraySerializer}\n */\nexport class Float32ArraySerializer implements Serializer<Float32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float32Array>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float32Array>, serializerContext: SerializerContext<Float32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Float32Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Float32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as float 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float32Array>): TypeLike<Float32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Float32Array.from(x);\n }\n\n serializerContext.logger.error('Float32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as float 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 64 array serializer.\n * \n * @type {Float64ArraySerializer}\n */\nexport class Float64ArraySerializer implements Serializer<Float64Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float64Array>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float64Array>, serializerContext: SerializerContext<Float64Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Float64Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Float64ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as float 64 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float64Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float64Array>): TypeLike<Float64Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Float64Array.from(x);\n }\n\n serializerContext.logger.error('Float64ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value to a float 64 array.`, x);\n\n return undefined;\n }\n}\n","export * from './any-serializer';\nexport * from './array-buffer-serializer';\nexport * from './array-serializer';\nexport * from './boolean-serializer';\nexport * from './data-view-serializer';\nexport * from './date-serializer';\nexport * from './float-32-array-serializer';\nexport * from './float-64-array-serializer';\nexport * from './int-8-array-serializer';\nexport * from './int-16-array-serializer';\nexport * from './int-32-array-serializer';\nexport * from './map-serializer';\nexport * from './number-serializer';\nexport * from './set-serializer';\nexport * from './string-serializer';\nexport * from './type-serializer';\nexport * from './uint-8-array-serializer';\nexport * from './uint-8-clamped-array-serializer';\nexport * from './uint-16-array-serializer';\nexport * from './uint-32-array-serializer';\nexport * from './unknown-serializer';\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 16 array serializer.\n * \n * @type {Int16ArraySerializer}\n */\nexport class Int16ArraySerializer implements Serializer<Int16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int16Array>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int16Array>, serializerContext: SerializerContext<Int16Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int16Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Int16ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 16 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int16Array>): TypeLike<Int16Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int16Array.from(x);\n }\n\n serializerContext.logger.error('Int16ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 16 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 32 array serializer.\n * \n * @type {Int32ArraySerializer}\n */\nexport class Int32ArraySerializer implements Serializer<Int32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int32Array>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int32Array>, serializerContext: SerializerContext<Int32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int32Array)\n {\n return Array.from(x);\n }\n \n serializerContext.logger.error('Int32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int32Array>): TypeLike<Int32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int32Array.from(x);\n }\n\n serializerContext.logger.error('Int32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 8 array serializer.\n * \n * @type {Int8ArraySerializer}\n */\nexport class Int8ArraySerializer implements Serializer<Int8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int8Array>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int8Array>, serializerContext: SerializerContext<Int8Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int8Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Int8ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 8 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int8Array>): TypeLike<Int8Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int8Array.from(x);\n }\n\n serializerContext.logger.error('Int8ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 8 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Map serializer.\n * \n * @type {MapSerializer}\n */\nexport class MapSerializer implements Serializer<Map<any, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Map<any, any>>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Map<any, any>>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Map)\n {\n return serializerContext.defineReference(x, () =>\n {\n const map = x;\n const array = new Array<any>(x.size);\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();\n\n keySerializerContext.jsonPathKey = 'key';\n keySerializerContext.typeState = genericKeySerializerContext.typeState;\n keySerializerContext.referenceValueSetter = (v, k) => array[keyArraySerializerContext.jsonPathKey][k] = v;\n\n valueSerializerContext.jsonPathKey = 'value';\n valueSerializerContext.typeState = genericValueSerializerContext.typeState;\n valueSerializerContext.referenceValueSetter = (v, k) => array[valueArraySerializerContext.jsonPathKey][k] = v;\n \n const keySerializer = keySerializerContext.serializer;\n const valueSerializer = valueSerializerContext.serializer;\n\n let i = -1;\n\n for (const [mk, mv] of map.entries())\n {\n i++;\n\n keyArraySerializerContext.jsonPathKey = i;\n valueArraySerializerContext.jsonPathKey = i;\n\n array[i] = {};\n array[i][keySerializerContext.jsonPathKey] = keySerializer.serialize(mk, keySerializerContext);\n array[i][valueSerializerContext.jsonPathKey] = valueSerializer.serialize(mv, valueSerializerContext);\n }\n\n return array;\n });\n }\n\n serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: cannot serialize value as map.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Map<any, any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<Map<any, any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const map = new Map<any, any>();\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();\n\n keySerializerContext.jsonPathKey = 'key';\n keySerializerContext.typeState = genericKeySerializerContext.typeState;\n keySerializerContext.referenceValueSetter = v => map.set(v, undefined);\n\n valueSerializerContext.jsonPathKey = 'value';\n valueSerializerContext.typeState = genericValueSerializerContext.typeState;\n valueSerializerContext.referenceValueSetter = v => map.set(v, undefined);\n \n const keySerializer = keySerializerContext.serializer;\n const valueSerializer = valueSerializerContext.serializer;\n\n for (let i = 0; i < array.length; i++)\n {\n const mk = array[i][keySerializerContext.jsonPathKey];\n const mv = array[i][valueSerializerContext.jsonPathKey];\n\n keyArraySerializerContext.jsonPathKey = i;\n valueArraySerializerContext.jsonPathKey = i;\n\n const key = keySerializer.deserialize(mk, keySerializerContext);\n\n valueSerializerContext.referenceValueSetter = v => map.set(key, v);\n\n const value = valueSerializer.deserialize(mv, valueSerializerContext);\n \n map.set(key, value);\n }\n\n return map;\n });\n }\n\n serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: Cannot deserialize value as map!`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Number serializer.\n * \n * @type {NumberSerializer}\n */\nexport class NumberSerializer implements Serializer<number>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<number>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<number>, serializerContext: SerializerContext<number>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'number')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot serialize value as number.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<number>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<number>): TypeLike<number>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'number')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot deserialize value as number.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<number>} Converted value.\n */\n private convert(x: any, serializerContext: SerializerContext<number>): TypeLike<number>\n {\n if (typeof x === 'string' || typeof x === 'boolean')\n {\n return Number(x);\n }\n \n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot convert value to a number.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Set serializer.\n * \n * @type {SetSerializer}\n */\nexport class SetSerializer implements Serializer<Set<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Set<any>>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Set<any>>, serializerContext: SerializerContext<Set<any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Set)\n {\n return serializerContext.defineReference(x, () =>\n {\n const set = x;\n const array = new Array<any>(set.size);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => array[k] = v;\n\n let i = -1;\n \n for (const v of set)\n {\n i++;\n\n valueSerializerContext.jsonPathKey = i;\n\n array[i] = serializer.serialize(v, valueSerializerContext);\n }\n\n return array;\n });\n }\n\n serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot serialize value as set.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Set<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Set<any>>): TypeLike<Set<any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const set = new Set<any>();\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n \n valueSerializerContext.referenceValueSetter = v => set.add(v);\n\n for (let i = 0; i < array.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n set.add(serializer.deserialize(array[i], valueSerializerContext));\n }\n\n return set;\n });\n }\n\n serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot deserialize value as set.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * String serializer.\n * \n * @type {StringSerializer}\n */\nexport class StringSerializer implements Serializer<string>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<string>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<string>, serializerContext: SerializerContext<string>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return x;\n }\n \n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot serialize value as string.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<string>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<string>): TypeLike<string>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot deserialize value as string.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<string>} serializerContext Type serializer context.\n * \n * @returns {TypeLike<string>} Converted value or original value.\n */\n private convert(x: any, serializerContext: SerializerContext<string>): TypeLike<string>\n {\n if (typeof x === 'number' || typeof x === 'boolean') \n {\n return String(x);\n }\n\n if (x instanceof Date)\n {\n return x.toISOString();\n }\n\n if (typeof x === 'object')\n {\n return JSON.stringify(x);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot convert value to string.`, x);\n \n return undefined;\n }\n}\n","import { PropertyName } from '../property-name';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeEntry } from '../type-entry';\nimport { TypeLike } from '../type-like';\n\n/**\n * Type serializer.\n * \n * @type {TypeSerializer}\n */\nexport class TypeSerializer implements Serializer<Record<string, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Record<string, any>>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Record<string, any>>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'object')\n {\n return serializerContext.defineReference(x, () =>\n {\n const type = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x.constructor) \n : serializerContext;\n\n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext();\n const typeState = typeSerializerContext.typeState;\n const object = {} as Record<string, any>;\n\n propertySerializerContext.referenceValueSetter = (v, k) => \n {\n const declaringObject = propertySerializerContext.referenceMap.get(type);\n \n if (declaringObject !== undefined)\n {\n declaringObject[k] = v;\n }\n };\n\n for (let i = 0; i < typeState.sortedPropertyMetadatas.length; i++)\n {\n const propertyMetadata = typeState.sortedPropertyMetadatas[i];\n const propertyState = propertyMetadata.propertyState;\n\n if (!propertyState.serializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyState.serializedPropertyName;\n const deserializedPropertyName = propertyState.deserializedPropertyName;\n const propertyValue = type[deserializedPropertyName];\n\n propertySerializerContext.jsonPathKey = serializedPropertyName;\n propertySerializerContext.propertyState = propertyState;\n propertySerializerContext.typeState = propertyState.typeMetadata.typeState;\n propertySerializerContext.genericMetadatas = propertyState.genericMetadatas;\n\n const serializer = propertySerializerContext.serializer;\n const value = serializer.serialize(propertyValue, propertySerializerContext);\n\n object[serializedPropertyName] = value;\n }\n\n if (typeState.preserveDiscriminator)\n {\n object[typeState.discriminator] = typeState.discriminant;\n } \n else if (object.hasOwnProperty(typeState.discriminator))\n {\n delete object[typeState.discriminator];\n }\n\n return object;\n });\n }\n\n serializerContext.logger.error('TypeSerializer', `${serializerContext.jsonPath}: cannot serialize value as type.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Record<string, any>>} Deserialized value or undefined.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<Record<string, any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'object')\n {\n return serializerContext.restoreReference(x, () =>\n {\n const object = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x) \n : serializerContext;\n \n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext();\n const typeState = typeSerializerContext.typeState;\n const typeEntryMap = new Map<PropertyName, TypeEntry<any, any>>();\n\n propertySerializerContext.referenceValueSetter = (v, k) => \n {\n const declaringType = propertySerializerContext.referenceMap.get(object);\n\n if (declaringType !== undefined)\n {\n declaringType[k] = v;\n }\n };\n\n for (let i = 0; i < typeState.sortedPropertyMetadatas.length; i++)\n {\n const propertyMetadata = typeState.sortedPropertyMetadatas[i];\n const propertyState = propertyMetadata.propertyState;\n\n if (!propertyState.deserializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyState.serializedPropertyName;\n const deserializedPropertyName = propertyState.deserializedPropertyName;\n const propertyValue = object[serializedPropertyName];\n\n propertySerializerContext.jsonPathKey = serializedPropertyName;\n propertySerializerContext.propertyState = propertyState;\n propertySerializerContext.typeState = propertyState.typeMetadata.typeState;\n propertySerializerContext.genericMetadatas = propertyState.genericMetadatas;\n\n const serializer = propertySerializerContext.serializer;\n const value = serializer.deserialize(propertyValue, propertySerializerContext);\n\n typeEntryMap.set(deserializedPropertyName, { key: deserializedPropertyName, value: value, propertyMetadata: propertyMetadata });\n typeEntryMap.set(serializedPropertyName, { key: serializedPropertyName, value: value, propertyMetadata: propertyMetadata });\n }\n\n for (const propertyName in object)\n {\n if (object.hasOwnProperty(propertyName) && !typeEntryMap.has(propertyName))\n {\n typeEntryMap.set(propertyName, { key: propertyName, value: object[propertyName] });\n }\n }\n\n const factory = typeState.factory;\n const injector = typeState.injector;\n const type = factory.build(typeState.typeMetadata, typeEntryMap, injector);\n\n if (typeState.preserveDiscriminator)\n {\n type[typeState.discriminator] = typeState.discriminant;\n }\n else if (type.hasOwnProperty(typeState.discriminator))\n {\n delete type[typeState.discriminator];\n }\n\n return type;\n });\n }\n \n serializerContext.logger.error('TypeSerializer', `${serializerContext.jsonPath}: cannot deserialize value as type.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 16 array serializer.\n * \n * @type {Uint16ArraySerializer}\n */\nexport class Uint16ArraySerializer implements Serializer<Uint16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint16Array>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint16Array>, serializerContext: SerializerContext<Uint16Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint16Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint16ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 16 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint16Array>): TypeLike<Uint16Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint16Array.from(x);\n }\n\n serializerContext.logger.error('Uint16ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 16 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 32 array serializer.\n * \n * @type {Uint32ArraySerializer}\n */\nexport class Uint32ArraySerializer implements Serializer<Uint32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint32Array>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint32Array>, serializerContext: SerializerContext<Uint32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint32Array)\n {\n return Array.from(x);\n }\n \n serializerContext.logger.error('Uint32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint32Array>): TypeLike<Uint32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint32Array.from(x);\n }\n\n serializerContext.logger.error('Uint32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 array serializer.\n * \n * @type {Uint8ArraySerializer}\n */\nexport class Uint8ArraySerializer implements Serializer<Uint8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8Array>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8Array>, serializerContext: SerializerContext<Uint8Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint8Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 8 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8Array>): TypeLike<Uint8Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint8Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 8 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 clamped array serializer.\n * \n * @type {Uint8ClampedArraySerializer}\n */\nexport class Uint8ClampedArraySerializer implements Serializer<Uint8ClampedArray>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8ClampedArray>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8ClampedArray>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint8ClampedArray)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ClampedArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 8 clamped array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8ClampedArray>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<Uint8ClampedArray>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint8ClampedArray.from(x);\n }\n\n serializerContext.logger.error('Uint8ClampedArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 8 clamped array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Unknown serializer.\n * \n * @type {UnknownSerializer}\n */\nexport class UnknownSerializer implements Serializer<unknown>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<unknown>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<unknown>, serializerContext: SerializerContext<unknown>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<unknown>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<unknown>): TypeLike<unknown>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { CustomKey } from './custom-key';\nimport { TypeExtensionMetadataCtor } from './type-extension-metadata-ctor';\n\n/**\n * Type extension metadata constructor set key.\n * \n * @type {CustomKey<Set<TypeExtensionMetadataCtor<any, any, any>>>}\n */\nexport const TYPE_EXTENSION_METADATA_CTOR_SET_KEY: CustomKey<Set<\n TypeExtensionMetadataCtor<any, any, any>\n>> = new CustomKey<Set<\n TypeExtensionMetadataCtor<any, any, any>\n>>('$DSTypeExtensionMetadataCtorSet', () => new Set<\n TypeExtensionMetadataCtor<any, any, any>\n>());\n","import { TypeExtensionOptions } from './type-extension-options';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Type extension metadata used by plugins to provide additional features for type metadata \n * using custom keys. Descendant classes are just wrappers to get convenient access to custom context.\n * \n * @type {TypeExtensionMetadata<TObject, TTypeExtensionOptions>}\n */\nexport abstract class TypeExtensionMetadata<TObject, TTypeExtensionOptions extends TypeExtensionOptions>\n{\n /**\n * Type metadata which we extend.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata which we extend.\n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n */\n public constructor(typeMetadata: TypeMetadata<TObject>, typeExtensionOptions: TTypeExtensionOptions)\n {\n this.typeMetadata = typeMetadata;\n\n this.configure(typeExtensionOptions);\n\n return;\n }\n\n /**\n * Configures type extension.\n * \n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n * \n * @returns {this} Type extension metadata.\n */\n public abstract configure(typeExtensionOptions: TTypeExtensionOptions): this;\n}\n","import { Alias } from './alias';\nimport { Any } from './any';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { CustomKey } from './custom-key';\nimport { CustomValue } from './custom-value';\nimport { TypeFactory } from './factories/type-factory';\nimport { jsonParse } from './functions/json-parse';\nimport { jsonStringify } from './functions/json-stringify';\nimport { GenericArgument } from './generic-argument';\nimport { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { SingletonInjector } from './injectors/singleton-injector';\nimport { Logger } from './logger';\nimport { LoggerLevel } from './logger-level';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { ReferenceCallback } from './reference-callback';\nimport { CircularReferenceHandler } from './reference-handlers/circular-reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { SerializerContext } from './serializer-context';\nimport { AnySerializer } from './serializers/any-serializer';\nimport { ArrayBufferSerializer } from './serializers/array-buffer-serializer';\nimport { ArraySerializer } from './serializers/array-serializer';\nimport { BooleanSerializer } from './serializers/boolean-serializer';\nimport { DataViewSerializer } from './serializers/data-view-serializer';\nimport { DateSerializer } from './serializers/date-serializer';\nimport { Float32ArraySerializer } from './serializers/float-32-array-serializer';\nimport { Float64ArraySerializer } from './serializers/float-64-array-serializer';\nimport { Int16ArraySerializer } from './serializers/int-16-array-serializer';\nimport { Int32ArraySerializer } from './serializers/int-32-array-serializer';\nimport { Int8ArraySerializer } from './serializers/int-8-array-serializer';\nimport { MapSerializer } from './serializers/map-serializer';\nimport { NumberSerializer } from './serializers/number-serializer';\nimport { SetSerializer } from './serializers/set-serializer';\nimport { StringSerializer } from './serializers/string-serializer';\nimport { TypeSerializer } from './serializers/type-serializer';\nimport { Uint16ArraySerializer } from './serializers/uint-16-array-serializer';\nimport { Uint32ArraySerializer } from './serializers/uint-32-array-serializer';\nimport { Uint8ArraySerializer } from './serializers/uint-8-array-serializer';\nimport { Uint8ClampedArraySerializer } from './serializers/uint-8-clamped-array-serializer';\nimport { UnknownSerializer } from './serializers/unknown-serializer';\nimport { TypeConfiguration } from './type-configuration';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeManagerOptions } from './type-manager-options';\nimport { TypeMetadata } from './type-metadata';\nimport { TYPE_METADATA_SYMBOL } from './type-metadata-symbol';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\nimport { TypeScope } from './type-scope';\nimport { Unknown } from './unknown';\n\n/**\n * Type manager class.\n * \n * @type {TypeManager}\n */\nexport class TypeManager\n{\n /**\n * Static shared options of any type which applied to any instance of type manager\n * by default.\n * \n * @type {TypeOptionsBase<any>}\n */\n private static readonly defaultTypeOptionsBase: TypeOptionsBase<any> = {\n customValueMap: new Map<CustomKey<any>, CustomValue>(),\n discriminator: '$type',\n factory: new TypeFactory(),\n injector: new SingletonInjector(),\n logger: new Logger(LoggerLevel.Error),\n preserveDiscriminator: false,\n referenceHandler: new CircularReferenceHandler(),\n serializer: new TypeSerializer(),\n preserveNull: true,\n useDefaultValue: false,\n useImplicitConversion: false\n };\n \n /**\n * Static type options per type which applied to any instance of type manager\n * by default.\n * \n * @type {ReadonlyMap<TypeFn<any>, TypeOptions<any>>}\n */\n private static readonly defaultTypeOptionsMap: ReadonlyMap<TypeFn<any>, TypeOptions<any>> = new Map<TypeFn<any>, TypeOptions<any>>([\n [Any, { serializer: new AnySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [ArrayBuffer, { serializer: new ArrayBufferSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Array, { serializer: new ArraySerializer(), serializedDefaultValue: () => [], deserializedDefaultValue: () => [] }],\n [Boolean, { serializer: new BooleanSerializer(), serializedDefaultValue: false, deserializedDefaultValue: false }],\n [DataView, { serializer: new DataViewSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Date, { serializer: new DateSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float32Array, { serializer: new Float32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float64Array, { serializer: new Float64ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int8Array, { serializer: new Int8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int16Array, { serializer: new Int16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int32Array, { serializer: new Int32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Map, { serializer: new MapSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Number, { serializer: new NumberSerializer(), serializedDefaultValue: 0, deserializedDefaultValue: 0 }],\n [Set, { serializer: new SetSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [String, { serializer: new StringSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8Array, { serializer: new Uint8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8ClampedArray, { serializer: new Uint8ClampedArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint16Array, { serializer: new Uint16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint32Array, { serializer: new Uint32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Unknown, { serializer: new UnknownSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }]\n ]);\n\n /**\n * Static type manager instance which is used for decorator based configurations and\n * static declarative based configurations.\n *\n * @type {TypeManager}\n */\n public static readonly staticTypeManager: TypeManager = new TypeManager();\n\n /**\n * Type scope to work with registration in static context.\n * \n * @type {TypeScope}\n */\n public static readonly typeScope: TypeScope = new TypeScope();\n\n /**\n * Symbol of current instance which is used to store type metadata within types.\n * \n * @type {symbol}\n */\n public readonly symbol: symbol;\n\n /**\n * Type manager options.\n * \n * @type {TypeManagerOptions}\n */\n private readonly typeManagerOptions: TypeManagerOptions;\n\n /**\n * Type function map for types with aliases.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n private readonly typeFnMap: Map<Alias, TypeFn<any>>;\n \n /**\n * Type metadata set for the current instance of type manager.\n * \n * @type {Set<TypeMetadata<any>>}\n */\n private readonly typeMetadataSet: Set<TypeMetadata<any>>;\n \n /**\n * Constructor.\n * \n * Creating an instance of type manager allows to have multiple configs. By default only static \n * instance of type manager is created on the background and all decorator based and declarative based\n * configurations are applied to it. Note that all options which are passed to a constructor are\n * mutated and all references are kept. This allow to have different managers with intersected data.\n * If such behaviour is not required then use configure methods after creating instance of type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n */\n public constructor(typeManagerOptions: TypeManagerOptions = {})\n {\n this.symbol = Symbol(TYPE_METADATA_SYMBOL.description);\n this.typeManagerOptions = this.constructTypeManagerOptions(typeManagerOptions);\n this.typeFnMap = new Map<Alias, TypeFn<any>>();\n this.typeMetadataSet = new Set<TypeMetadata<any>>();\n\n this.configure(typeManagerOptions);\n\n return;\n }\n\n /**\n * Gets symbol in static context.\n * \n * @returns {symbol} Type manager symbol.\n */\n public static get symbol(): symbol\n {\n return this.staticTypeManager.symbol;\n }\n\n /**\n * Gets logger in static context.\n * \n * @returns {Logger} Logger.\n */\n public static get logger(): Logger\n {\n return this.staticTypeManager.logger;\n }\n \n /**\n * Gets logger.\n * \n * @returns {Logger} Logger.\n */\n public get logger(): Logger\n {\n return this.typeOptionsBase.logger;\n }\n\n /**\n * Gets type options base in static context.\n * \n * @returns {Readonly<TypeOptionsBase<any>>} Type options base.\n */\n public static get typeOptionsBase(): Readonly<TypeOptionsBase<any>>\n {\n return this.staticTypeManager.typeOptionsBase;\n }\n\n /**\n * Gets type options base.\n * \n * @returns {Readonly<TypeOptionsBase<any>>} Type options base.\n */\n public get typeOptionsBase(): Readonly<TypeOptionsBase<any>>\n {\n let typeOptionsBase = this.typeManagerOptions.typeOptionsBase;\n\n if (typeOptionsBase === undefined)\n {\n typeOptionsBase = {};\n\n this.typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n return typeOptionsBase as TypeOptionsBase<any>;\n }\n\n /**\n * Gets type options map in static context.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public static get typeOptionsMap(): ReadonlyMap<TypeFn<any>, TypeOptions<any>>\n {\n return this.staticTypeManager.typeOptionsMap;\n }\n\n /**\n * Gets type options map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public get typeOptionsMap(): ReadonlyMap<TypeFn<any>, TypeOptions<any>>\n {\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeOptionsMap;\n }\n\n /**\n * Gets type configuration map in static context.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public static get typeConfigurationMap(): ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>\n {\n return this.staticTypeManager.typeConfigurationMap;\n }\n\n /**\n * Gets type configuration map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public get typeConfigurationMap(): ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>\n {\n let typeConfigurationMap = this.typeManagerOptions.typeConfigurationMap;\n\n if (typeConfigurationMap === undefined)\n {\n typeConfigurationMap = new Map<TypeFn<any>, TypeConfiguration<any>>();\n\n this.typeManagerOptions.typeConfigurationMap = typeConfigurationMap;\n }\n\n return typeConfigurationMap;\n }\n\n /**\n * Constructs initial type manager options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManagerOptions} Constructed type manager options.\n */\n private constructTypeManagerOptions(typeManagerOptions: TypeManagerOptions): TypeManagerOptions\n {\n let typeOptionsBase = typeManagerOptions.typeOptionsBase;\n\n if (typeOptionsBase === undefined)\n {\n typeOptionsBase = {};\n\n typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n let typeOptionsMap = typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeManagerOptions;\n }\n\n /**\n * Constructs type options base.\n * \n * @param {Partial<TypeOptionsBase<any>>} typeOptionsBase Type options base.\n * \n * @returns {Partial<TypeOptionsBase<any>>} Constructed type options base.\n */\n private constructTypeOptionsBase(typeOptionsBase: Partial<TypeOptionsBase<any>>): Partial<TypeOptionsBase<any>>\n {\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n const initialTypeOptionsBase = Object.assign({}, TypeManager.defaultTypeOptionsBase, { customValueMap: customValueMap }, typeOptionsBase);\n \n Object.assign(typeOptionsBase, initialTypeOptionsBase);\n\n return typeOptionsBase;\n }\n\n /**\n * Constructs type options map.\n * \n * @param {Map<TypeFn<any>, TypeOptions<any>>} typeOptionsMap Type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Constructed type options map.\n */\n private constructTypeOptionsMap(typeOptionsMap: Map<TypeFn<any>, TypeOptions<any>>): Map<TypeFn<any>, TypeOptions<any>>\n {\n const initialTypeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n for (const [typeFn, typeOptions] of TypeManager.defaultTypeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, Object.assign(mapTypeOptions, typeOptions));\n }\n\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, Object.assign(typeOptions, Object.assign(mapTypeOptions, typeOptions)));\n }\n\n typeOptionsMap.clear();\n\n for (const [typeFn, typeOptions] of initialTypeOptionsMap)\n {\n typeOptionsMap.set(typeFn, typeOptions);\n }\n\n return typeOptionsMap;\n }\n\n /**\n * Configures type metadata for provided type function in a static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public static configureTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n return this.staticTypeManager.configureTypeMetadata(typeFn, typeOptions);\n }\n\n /**\n * Configures type metadata for provided type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public configureTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TObject> : this.declareTypeMetadata(typeFn, typeOptions);\n\n if (!typeMetadataDefined)\n {\n Object.defineProperty(prototype, symbol, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: typeMetadata\n });\n }\n\n if (typeMetadataDefined && typeOptions !== undefined)\n {\n typeMetadata.configure(typeOptions);\n }\n\n return typeMetadata;\n }\n\n /**\n * Declares type metadata for provided type function based on general configuration.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n private declareTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n let mapTypeOptions = typeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = typeOptions ?? {};\n\n typeOptionsMap.set(typeFn, mapTypeOptions);\n }\n\n const typeFnMap = this.typeFnMap;\n const typeMetadataSet = this.typeMetadataSet;\n const symbol = this.symbol;\n const parentPrototype = Object.getPrototypeOf(typeFn.prototype) ?? {};\n const parentTypeMetadata = parentPrototype[symbol];\n const typeMetadata = new TypeMetadata(this, typeFnMap, typeMetadataSet, typeFn, mapTypeOptions, parentTypeMetadata);\n\n typeMetadataSet.add(typeMetadata);\n\n return typeMetadata;\n }\n\n /**\n * Extracts type metadata from provided type function in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public static extractTypeMetadata<TObject>(typeFn: TypeFn<TObject>): TypeMetadata<TObject>\n {\n return this.staticTypeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Extracts type metadata from provided type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public extractTypeMetadata<TObject>(typeFn: TypeFn<TObject>): TypeMetadata<TObject>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TObject> : this.configureTypeMetadata(typeFn);\n\n return typeMetadata;\n }\n\n /**\n * Applies shared type options in static context.\n * \n * @param {Partial<TypeOptionsBase<TObject>>} typeOptionsBase Type options base.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsBase<TObject>(typeOptionsBase: Partial<TypeOptionsBase<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsBase(typeOptionsBase);\n }\n \n /**\n * Applies shared type options.\n * \n * @param {Partial<TypeOptionsBase<TObject>>} typeOptionsBase Type options base.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptionsBase<TObject>(typeOptionsBase: Partial<TypeOptionsBase<TObject>>): this\n {\n const customValueMap = this.typeOptionsBase.customValueMap;\n\n Object.assign(this.typeOptionsBase, typeOptionsBase, { customValueMap: customValueMap });\n\n if (typeOptionsBase.customValueMap !== undefined)\n {\n for (const [customKey, customValue] of typeOptionsBase.customValueMap)\n {\n customValueMap.set(customKey, customValue);\n }\n }\n\n for (const typeMetadata of this.typeMetadataSet)\n {\n typeMetadata.unresolveTypeState();\n }\n\n return this;\n }\n\n /**\n * Applies type options map in static context.\n * \n * @param {Map<TypeFn<TObject>, TypeOptions<TObject>>} typeOptionsMap Type options map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsMap<TObject>(typeOptionsMap: Map<TypeFn<TObject>, TypeOptions<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsMap(typeOptionsMap);\n }\n\n /**\n * Applies type options map.\n * \n * @param {Map<TypeFn<TObject>, TypeOptions<TObject>>} typeOptionsMap Type options map.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptionsMap<TObject>(typeOptionsMap: Map<TypeFn<TObject>, TypeOptions<TObject>>): this\n {\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n this.applyTypeOptions(typeFn, typeOptions);\n }\n\n return this;\n }\n\n /**\n * Applies type options in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptions<TObject>(typeFn: TypeFn<TObject>, typeOptions: TypeOptions<TObject>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptions(typeFn, typeOptions);\n }\n\n /**\n * Applies type options.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptions<TObject>(typeFn: TypeFn<TObject>, typeOptions: TypeOptions<TObject>): this\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeMetadata.configure(typeOptions);\n\n return this;\n }\n\n /**\n * Applies type configuration map in static context.\n * \n * @param {Map<TypeFn<TObject>, TypeConfiguration<TObject>>} typeConfigurationMap Type configuration map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfigurationMap<TObject>(typeConfigurationMap: Map<TypeFn<TObject>, TypeConfiguration<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfigurationMap(typeConfigurationMap);\n }\n\n /**\n * Applies type configuration map.\n * \n * @param {Map<TypeFn<TObject>, TypeConfiguration<TObject>>} typeConfigurationMap Type configuration map.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeConfigurationMap<TObject>(typeConfigurationMap: Map<TypeFn<TObject>, TypeConfiguration<TObject>>): this\n {\n for (const [typeFn, typeConfiguration] of typeConfigurationMap)\n {\n this.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n return this;\n }\n\n /**\n * Applies type configuration in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeConfiguration<TObject>} typeConfiguration Type configuration.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfiguration<TObject>(typeFn: TypeFn<TObject>, typeConfiguration: TypeConfiguration<TObject>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n /**\n * Applies type configuration.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeConfiguration<TObject>} typeConfiguration Type configuration.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeConfiguration<TObject>(typeFn: TypeFn<TObject>, typeConfiguration: TypeConfiguration<TObject>): this\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeConfiguration.configure(typeMetadata);\n\n return this;\n }\n\n /**\n * Configures type manager in static context.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static configure(typeManagerOptions: TypeManagerOptions): TypeManager\n {\n return this.staticTypeManager.configure(typeManagerOptions);\n }\n\n /**\n * Configures type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {this} Instance of type manager.\n */\n public configure(typeManagerOptions: TypeManagerOptions): this\n {\n if (typeManagerOptions.typeOptionsBase !== undefined) \n {\n this.applyTypeOptionsBase(typeManagerOptions.typeOptionsBase);\n }\n\n if (typeManagerOptions.typeOptionsMap !== undefined) \n {\n this.applyTypeOptionsMap(typeManagerOptions.typeOptionsMap);\n }\n\n if (typeManagerOptions.typeConfigurationMap !== undefined) \n {\n this.applyTypeConfigurationMap(typeManagerOptions.typeConfigurationMap);\n }\n\n return this;\n }\n\n /**\n * Defines serializer context for x in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TObject>} Serializer context.\n */\n public static defineSerializerContext<TObject>(typeFn: TypeFn<TObject>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TObject>\n {\n return this.staticTypeManager.defineSerializerContext(typeFn, x, genericArguments);\n }\n\n /**\n * Defines serializer context for x.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TObject>} Serializer context.\n */\n public defineSerializerContext<TObject>(typeFn: TypeFn<TObject>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TObject>\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n const genericMetadatas = genericArguments === undefined ? EMPTY_ARRAY : typeMetadata.resolveGenericMetadatas(genericArguments);\n \n return new SerializerContext(\n x,\n new Map<ReferenceKey, ReferenceValue>(), \n new Map<ReferenceKey, Array<ReferenceCallback>>(),\n undefined,\n '$',\n typeMetadata.typeState,\n genericMetadatas,\n undefined,\n undefined\n );\n }\n\n /**\n * Create a new clone of the static type manager. This method returns a shallow \n * copy, preserving its current configuration and registered types.\n * \n * @returns {TypeManager} A new instance that duplicates the static type manager.\n */\n public static clone(): TypeManager\n {\n return this.staticTypeManager.clone();\n }\n\n /**\n * Create a new clone of this type manager instance. The clone will contain \n * copies of this instance base options and mappings, but will be completely \n * independent: subsequent changes on the clone or the original will not affect \n * each other.\n * \n * @returns {TypeManager} A fresh type manager instance with the same configuration and registered types.\n */\n public clone(): TypeManager\n {\n const typeOptionsBase = this.cloneTypeOptionsBase();\n const typeOptionsMap = this.cloneTypeOptionsMap();\n const typeManagerOptions = { typeOptionsBase: typeOptionsBase, typeOptionsMap: typeOptionsMap };\n const typeManager = new TypeManager(typeManagerOptions);\n\n return typeManager;\n }\n\n /**\n * Creates a clone of type options base.\n * \n * @returns {TypeOptionsBase<any>} Type options base clone.\n */\n private cloneTypeOptionsBase(): TypeOptionsBase<any>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const customValueMap = typeOptionsBase.customValueMap;\n const customValueMapClone = new Map<CustomKey<any>, CustomValue>();\n const typeOptionsBaseClone = Object.assign({}, typeOptionsBase, { customValueMap: customValueMapClone });\n\n for (const [customKey, customValue] of customValueMap)\n {\n customValueMapClone.set(customKey, customValue);\n }\n\n return typeOptionsBaseClone;\n }\n\n /**\n * Creates a clone of type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map clone.\n */\n private cloneTypeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\n {\n const typeOptionsMap = this.typeOptionsMap;\n const typeOptionsMapClone = new Map<TypeFn<any>, TypeOptions<any>>();\n\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n const typeOptionsClone = Object.assign({}, typeOptions);\n const typeCustomValueMap = typeOptions.customValueMap;\n\n if (typeCustomValueMap !== undefined)\n {\n const typeCustomValueMapClone = new Map<CustomKey<any>, CustomValue>();\n\n for (const [customKey, customValue] of typeCustomValueMap)\n {\n typeCustomValueMapClone.set(customKey, customValue);\n }\n\n typeOptionsClone.customValueMap = typeCustomValueMapClone;\n }\n\n const propertyOptionsMap = typeOptions.propertyOptionsMap;\n\n if (propertyOptionsMap !== undefined)\n {\n const propertyOptionsMapClone = new Map<PropertyName, PropertyOptions<any>>();\n\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\n {\n const propertyOptionsClone = Object.assign({}, propertyOptions);\n const propertyCustomValueMap = propertyOptions.customValueMap;\n\n if (propertyCustomValueMap !== undefined)\n {\n const propertyCustomValueMapClone = new Map<CustomKey<any>, CustomValue>();\n\n for (const [customKey, customValue] of propertyCustomValueMap)\n {\n propertyCustomValueMapClone.set(customKey, customValue);\n }\n\n propertyOptionsClone.customValueMap = propertyCustomValueMapClone;\n }\n\n propertyOptionsMapClone.set(propertyName, propertyOptionsClone);\n }\n\n typeOptionsClone.propertyOptionsMap = propertyOptionsMapClone;\n }\n\n const injectOptionsMap = typeOptions.injectOptionsMap;\n\n if (injectOptionsMap !== undefined)\n {\n const injectOptionsMapClone = new Map<InjectIndex, InjectOptions<any>>();\n\n for (const [injectIndex, injectOptions] of injectOptionsMap)\n {\n const injectOptionsClone = Object.assign({}, injectOptions);\n\n injectOptionsMapClone.set(injectIndex, injectOptionsClone);\n }\n\n typeOptionsClone.injectOptionsMap = injectOptionsMapClone;\n }\n\n typeOptionsMapClone.set(typeFn, typeOptionsClone);\n }\n\n return typeOptionsMapClone;\n }\n\n /**\n * Clears all type registrations from the static type manager. After calling this \n * method, the static type manager will no longer hold any registered type metadata.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static clear(): TypeManager\n {\n return this.staticTypeManager.clear();\n }\n\n /**\n * Clears all type registrations from the type manager. After calling this \n * method, the type manager will no longer hold any registered type metadata.\n * \n * @returns {this} Instance of type manager.\n */\n public clear(): this\n {\n const symbol = this.symbol;\n const typeFnMap = this.typeFnMap;\n const typeMetadataSet = this.typeMetadataSet;\n\n for (const typeMetadata of typeMetadataSet)\n {\n const prototype = typeMetadata.typeFn.prototype ?? {};\n\n delete prototype[symbol];\n }\n\n typeMetadataSet.clear();\n typeFnMap.clear();\n\n return this;\n }\n\n /**\n * Serializes provided value based on the type in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<TObject>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: Array<TObject>): Array<any>;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: TObject): any;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<TObject | Array<TObject>>): TypeLike<any>\n {\n return this.staticTypeManager.serialize(typeFn, x);\n }\n\n /**\n * Serializes provided value based on the type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<TObject>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: Array<TObject>): Array<any>;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: TObject): any;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<TObject | Array<TObject>>): TypeLike<any>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (Array.isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).serialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).serialize(x as any);\n }\n\n /**\n * Deserializes provided value based on the type function in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: Array<any>): Array<TObject>;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: any): TObject;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<any>): TypeLike<TObject | Array<TObject>>\n {\n return this.staticTypeManager.deserialize(typeFn, x);\n }\n\n /**\n * Deserializes provided value based on the type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: Array<any>): Array<TObject>;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: any): TObject;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<any>): TypeLike<TObject | Array<TObject>>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (Array.isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).deserialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).deserialize(x as any);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public static stringify<TObject>(typeFn: TypeFn<TObject>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return this.staticTypeManager.stringify(typeFn, x, replacer, space);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public stringify<TObject>(typeFn: TypeFn<TObject>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return jsonStringify(this.serialize(typeFn, x), replacer, space);\n }\n\n /**\n * Converts a JavaScript Object Notation (JSON) string into a type in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public static parse<TObject>(typeFn: TypeFn<TObject>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TObject>\n {\n return this.staticTypeManager.parse(typeFn, x, reviver);\n }\n \n /**\n * Converts a JavaScript Object Notation (JSON) string into a type.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public parse<TObject>(typeFn: TypeFn<TObject>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TObject>\n {\n return this.deserialize(typeFn, jsonParse(x, reviver));\n }\n}\n","/**\n * Unique symbol used to store type metadata.\n * \n * @type {unique symbol}\n */\n export const TYPE_METADATA_SYMBOL: unique symbol = Symbol.for('$DSTypeMetadata');\n","import { Alias } from './alias';\nimport { DEFAULT_VALUE_RESOLVER } from './constants/default-value-resolver';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { EMPTY_MAP } from './constants/empty-map';\nimport { NULL_VALUE_RESOLVER } from './constants/null-value-resolver';\nimport { CustomKey } from './custom-key';\nimport { CustomOption } from './custom-option';\nimport { CustomValue } from './custom-value';\nimport { DefaultValue } from './default-value';\nimport { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { nameOf } from './functions/name-of';\nimport { InjectIndex } from './inject-index';\nimport { InjectMetadata } from './inject-metadata';\nimport { InjectOptions } from './inject-options';\nimport { InjectSorter } from './inject-sorter';\nimport { Injector } from './injector';\nimport { Logger } from './logger';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyMetadata } from './property-metadata';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { PropertySorter } from './property-sorter';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeArgument } from './type-argument';\nimport { TypeExtensionMetadata } from './type-extension-metadata';\nimport { TypeExtensionMetadataCtor } from './type-extension-metadata-ctor';\nimport { TYPE_EXTENSION_METADATA_CTOR_SET_KEY } from './type-extension-metadata-ctor-set-key';\nimport { TypeExtensionOptions } from './type-extension-options';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeName } from './type-name';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\nimport { TypeState } from './type-state';\nimport { ResolvedTypeState } from './type-states/resolved-type-state';\nimport { UnresolvedTypeState } from './type-states/unresolved-type-state';\n\n/**\n * Main class used to describe a certain type.\n * \n * @type {TypeMetadata<TObject>}\n */\nexport class TypeMetadata<TObject> extends Metadata\n{\n /**\n * Type name. \n * \n * Defined at runtime based on the constructor function.\n * \n * @type {TypeName}\n */\n public readonly typeName: TypeName;\n\n /**\n * Type function.\n * \n * @type {TypeFn<TObject>}\n */\n public readonly typeFn: TypeFn<TObject>;\n\n /**\n * Parent type metadata.\n * \n * @type {Optional<TypeMetadata<any>>}\n */\n public readonly parentTypeMetadata: Optional<TypeMetadata<any>>;\n\n /**\n * Type options used as a fallback.\n * \n * @type {TypeOptionsBase<TObject>}\n */\n private readonly typeOptionsBase: TypeOptionsBase<TObject>;\n\n /**\n * Type options.\n * \n * @type {TypeOptions<TObject>}\n */\n private readonly typeOptions: TypeOptions<TObject>;\n\n /**\n * Type metadata set.\n * \n * @type {ReadonlySet<TypeMetadata<any>>}\n */\n private readonly typeMetadataSet: ReadonlySet<TypeMetadata<any>>;\n\n /**\n * Current type function map.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n private readonly currentTypeFnMap: Map<Alias, TypeFn<any>>;\n\n /**\n * Current child type metadata map.\n * \n * @type {Map<TypeFn<TObject>, TypeMetadata<any>>}\n */\n private readonly currentChildTypeMetadataMap: Map<TypeFn<any>, TypeMetadata<any>>;\n\n /**\n * Current property metadata map.\n * \n * @type {Map<PropertyName, PropertyMetadata<TObject, any>>}\n */\n private readonly currentPropertyMetadataMap: Map<PropertyName, PropertyMetadata<TObject, any>>;\n \n /**\n * Current inject metadata map.\n * \n * @type {Map<InjectIndex, InjectMetadata<TObject, any>>}\n */\n private readonly currentInjectMetadataMap: Map<InjectIndex, InjectMetadata<TObject, any>>;\n\n /**\n * Current type state.\n * \n * @type {TypeState<TObject>}\n */\n private currentTypeState: TypeState<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {Map<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {ReadonlySet<TypeMetadata<any>>} typeMetadataSet Type metadata set.\n * @param {TypeFn<any>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * @param {Optional<TypeMetadata<any>>} parentTypeMetadata Parent type metadata.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: Map<Alias, TypeFn<any>>,\n typeMetadataSet: ReadonlySet<TypeMetadata<any>>,\n typeFn: TypeFn<TObject>,\n typeOptions: TypeOptions<TObject>,\n parentTypeMetadata: Optional<TypeMetadata<any>>\n )\n {\n super(typeManager, typeFnMap);\n \n this.typeName = nameOf(typeFn);\n this.typeFn = typeFn;\n this.parentTypeMetadata = parentTypeMetadata;\n this.typeOptionsBase = typeManager.typeOptionsBase;\n this.typeOptions = this.constructTypeOptions(typeOptions);\n this.typeMetadataSet = typeMetadataSet;\n this.currentTypeFnMap = typeFnMap;\n this.currentChildTypeMetadataMap = new Map<TypeFn<any>, TypeMetadata<any>>();\n this.currentPropertyMetadataMap = new Map<PropertyName, PropertyMetadata<TObject, any>>();\n this.currentInjectMetadataMap = new Map<InjectIndex, InjectMetadata<TObject, any>>();\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n this.extendParentTypeMetadata();\n this.configure(typeOptions);\n\n return;\n }\n \n /**\n * Gets type state.\n * \n * @returns {TypeState<TObject>} Type state.\n */\n public get typeState(): TypeState<TObject>\n {\n return this.currentTypeState;\n }\n\n /**\n * Gets inject metadata map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>}\n */\n public get injectMetadataMap(): ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n {\n return this.currentTypeState.injectMetadataMap;\n }\n\n /**\n * Gets property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public get propertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n return this.currentTypeState.propertyMetadataMap;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias or undefined.\n */\n public get alias(): Optional<Alias>\n {\n return this.currentTypeState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n return this.currentTypeState.customValueMap;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value.\n */\n public get serializedNullValue(): Nullable<any>\n {\n return this.currentTypeState.serializedNullValueResolver();\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n return this.currentTypeState.serializedDefaultValueResolver();\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n return this.currentTypeState.deserializedNullValueResolver();\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n return this.currentTypeState.deserializedDefaultValueResolver();\n }\n \n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.currentTypeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.currentTypeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.currentTypeState.factory;\n }\n\n /**\n * Gets injectable value.\n * \n * @returns {boolean} Injectable indicator.\n */\n public get injectable(): boolean\n {\n return this.currentTypeState.injectable;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector.\n */\n public get injector(): Injector\n {\n return this.currentTypeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger instance.\n */\n public get logger(): Logger\n {\n return this.currentTypeState.logger;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention or undefined.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n return this.currentTypeState.namingConvention;\n }\n\n /**\n * Gets indicator if current type metadata is polymorphic.\n * \n * @returns {boolean} True when type metadata is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.currentTypeState.polymorphic;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.currentTypeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.currentTypeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n return this.currentTypeState.serializer;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.currentTypeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.currentTypeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.currentTypeState.useImplicitConversion;\n }\n\n /**\n * Gets property sorter.\n * \n * @returns {Optional<PropertySorter>} Property sorter or undefined.\n */\n public get propertySorter(): Optional<PropertySorter>\n {\n return this.currentTypeState.propertySorter;\n }\n\n /**\n * Gets sorted property metadatas.\n * \n * @returns {ReadonlyArray<PropertyMetadata<TObject, any>>} Readonly array of property metadatas.\n */\n public get sortedPropertyMetadatas(): ReadonlyArray<PropertyMetadata<TObject, any>>\n {\n return this.currentTypeState.sortedPropertyMetadatas;\n }\n\n /**\n * Gets inject sorter.\n * \n * @returns {Optional<InjectSorter>} Property sorter or undefined.\n */\n public get injectSorter(): Optional<InjectSorter>\n {\n return this.currentTypeState.injectSorter;\n }\n\n /**\n * Gets sorted inject metadatas.\n * \n * @returns {ReadonlyArray<InjectMetadata<TObject, any>>} Iterable of inject metadatas.\n */\n public get sortedInjectMetadatas(): ReadonlyArray<InjectMetadata<TObject, any>>\n {\n return this.currentTypeState.sortedInjectMetadatas;\n }\n\n /**\n * Gets parent type arguments.\n * \n * @returns {ReadonlyArray<TypeArgument<any>>} Parent arguments.\n */\n public get parentTypeArguments(): ReadonlyArray<TypeArgument<any>>\n {\n return this.currentTypeState.parentTypeArguments;\n }\n\n /**\n * Gets property options map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyOptions<any>>} Property options map.\n */\n public get propertyOptionsMap(): ReadonlyMap<PropertyName, PropertyOptions<any>>\n {\n return this.currentTypeState.propertyOptionsMap;\n }\n\n /**\n * Gets inject options map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectOptions<any>>} Inject options map.\n */\n public get injectOptionsMap(): ReadonlyMap<InjectIndex, InjectOptions<any>>\n {\n return this.currentTypeState.injectOptionsMap;\n }\n\n /**\n * Constructs initial type options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeOptions<TObject>} Constructed type options.\n */\n private constructTypeOptions(typeOptions: TypeOptions<TObject>): TypeOptions<TObject>\n {\n if (typeOptions.customValueMap === undefined)\n {\n typeOptions.customValueMap = new Map<CustomKey<any>, CustomValue>();\n }\n\n if (typeOptions.propertyOptionsMap === undefined)\n {\n typeOptions.propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n }\n\n if (typeOptions.injectOptionsMap === undefined)\n {\n typeOptions.injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n }\n \n return typeOptions;\n }\n\n /**\n * Configures type extension metadata.\n * \n * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor.\n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n * \n * @returns {TTypeExtensionMetadata} Type extension metadata\n */\n public configureTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(\n typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>, \n typeExtensionOptions?: TTypeExtensionOptions\n ): TTypeExtensionMetadata\n {\n const typeExtensionMetadataCtorSet = this.extractTypeExtensionMetadataCtorSet();\n\n if (!typeExtensionMetadataCtorSet.has(typeExtensionMetadataCtor))\n {\n typeExtensionMetadataCtorSet.add(typeExtensionMetadataCtor);\n }\n\n const initialTypeExtensionOptions = typeExtensionOptions ?? {} as TTypeExtensionOptions;\n const typeExtensionMetadata = new typeExtensionMetadataCtor(this, initialTypeExtensionOptions);\n\n return typeExtensionMetadata;\n }\n\n /**\n * Extracts type extension metadata.\n * \n * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor.\n * \n * @returns {Optional<TTypeExtensionMetadata>} Type extension metadata or undefined.\n */\n public extractTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(\n typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>\n ): Optional<TTypeExtensionMetadata>\n {\n const typeExtensionMetadataCtorSet = this.extractTypeExtensionMetadataCtorSet();\n\n if (!typeExtensionMetadataCtorSet.has(typeExtensionMetadataCtor)) \n {\n return undefined;\n }\n \n const initialTypeExtensionOptions = {} as TTypeExtensionOptions;\n const typeExtensionMetadata = new typeExtensionMetadataCtor(this, initialTypeExtensionOptions);\n\n return typeExtensionMetadata;\n }\n\n /**\n * Extracts type extension metadata ctor set from custom value map.\n * \n * @returns {Set<TypeExtensionMetadataCtor<any, any, any>>} Type extension metadata ctor set.\n */\n private extractTypeExtensionMetadataCtorSet(): Set<TypeExtensionMetadataCtor<any, any, any>>\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n let typeExtensionMetadataCtorSet = customValueMap.get(TYPE_EXTENSION_METADATA_CTOR_SET_KEY) as Optional<Set<TypeExtensionMetadataCtor<any, any, any>>>;\n\n if (typeExtensionMetadataCtorSet === undefined)\n {\n typeExtensionMetadataCtorSet = new Set<TypeExtensionMetadataCtor<any, any, any>>();\n\n customValueMap.set(TYPE_EXTENSION_METADATA_CTOR_SET_KEY, typeExtensionMetadataCtorSet);\n }\n\n return typeExtensionMetadataCtorSet;\n }\n\n /**\n * Resolves type state.\n * \n * Calling this method has side effects by recomputing type state. If you need current\n * type state then use provided getter for that.\n * \n * @returns {ResolvedTypeState<TObject>} Resolved type state.\n */\n public resolveTypeState(): ResolvedTypeState<TObject>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const typeOptions = this.typeOptions;\n const typeName = this.typeName;\n const alias = typeOptions.alias;\n const customValueMap = this.resolveCustomValueMap();\n\n const preserveNull = typeOptions.preserveNull === undefined \n ? typeOptionsBase.preserveNull\n : typeOptions.preserveNull;\n\n const useDefaultValue = typeOptions.useDefaultValue === undefined \n ? typeOptionsBase.useDefaultValue \n : typeOptions.useDefaultValue;\n\n const useImplicitConversion = typeOptions.useImplicitConversion === undefined \n ? typeOptionsBase.useImplicitConversion \n : typeOptions.useImplicitConversion;\n\n const serializedDefaultValue = typeOptions.defaultValue === undefined \n ? typeOptions.serializedDefaultValue\n : typeOptions.defaultValue;\n \n const serializedDefaultValueResolver = useDefaultValue \n ? (typeof serializedDefaultValue === 'function' ? serializedDefaultValue : () => serializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const serializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER \n : serializedDefaultValueResolver;\n\n const deserializedDefaultValue = typeOptions.defaultValue === undefined \n ? typeOptions.deserializedDefaultValue\n : typeOptions.defaultValue;\n \n const deserializedDefaultValueResolver = useDefaultValue\n ? (typeof deserializedDefaultValue === 'function' ? deserializedDefaultValue : () => deserializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const deserializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER\n : deserializedDefaultValueResolver;\n \n const discriminant = typeOptions.discriminant === undefined\n ? typeName\n : typeOptions.discriminant;\n\n const discriminator = typeOptions.discriminator === undefined\n ? typeOptionsBase.discriminator\n : typeOptions.discriminator;\n\n const factory = typeOptions.factory === undefined\n ? typeOptionsBase.factory\n : typeOptions.factory;\n \n const injectable = typeOptions.injectable === true;\n\n const injector = typeOptions.injector === undefined\n ? typeOptionsBase.injector\n : typeOptions.injector;\n\n const logger = typeOptions.logger === undefined\n ? typeOptionsBase.logger\n : typeOptions.logger;\n\n const namingConvention = typeOptions.namingConvention === undefined\n ? typeOptionsBase.namingConvention\n : typeOptions.namingConvention;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n \n const ownParentTypeMetadatas = this.resolveOwnParentTypeMetadatas(parentTypeArguments);\n const ownChildTypeMetadatas = this.resolveOwnChildTypeMetadatas();\n const parentTypeMetadataSet = this.resolveParentTypeMetadataSet(this);\n const parentTypeMetadatas = Array.from(parentTypeMetadataSet);\n const childTypeMetadataSet = this.resolveChildTypeMetadataSet(this);\n const childTypeMetadatas = Array.from(childTypeMetadataSet);\n\n const typeMetadataMap = new Map<TypeFn<any>, TypeMetadata<any>>();\n const polymorphic = childTypeMetadatas.length > 1;\n\n for (let i = 0; i < childTypeMetadatas.length; i++)\n {\n const childTypeMetadata = childTypeMetadatas[i];\n\n typeMetadataMap.set(childTypeMetadata.typeFn, childTypeMetadata);\n }\n\n const preserveDiscriminator = typeOptions.preserveDiscriminator === undefined \n ? typeOptionsBase.preserveDiscriminator\n : typeOptions.preserveDiscriminator;\n\n const referenceHandler = typeOptions.referenceHandler === undefined \n ? typeOptionsBase.referenceHandler\n : typeOptions.referenceHandler;\n\n const serializer = typeOptions.serializer === undefined \n ? typeOptionsBase.serializer\n : typeOptions.serializer;\n\n const propertySorter = typeOptions.propertySorter === undefined \n ? typeOptionsBase.propertySorter\n : typeOptions.propertySorter;\n\n const ownPropertyMetadataMap = this.currentPropertyMetadataMap;\n const propertyMetadataMap = this.resolvePropertyMetadataMap(parentTypeMetadatas);\n\n const sortedPropertyMetadatas = propertySorter === undefined\n ? Array.from(propertyMetadataMap.values())\n : Array.from(propertyMetadataMap.values()).sort(propertySorter.sort);\n\n const injectMetadataMap = this.currentInjectMetadataMap;\n\n const injectSorter = typeOptions.injectSorter === undefined \n ? typeOptionsBase.injectSorter\n : typeOptions.injectSorter;\n\n const sortedInjectMetadatas = injectSorter === undefined\n ? Array.from(injectMetadataMap.values())\n : Array.from(injectMetadataMap.values()).sort(injectSorter.sort);\n \n const propertyOptionsMap = typeOptions.propertyOptionsMap === undefined \n ? EMPTY_MAP\n : typeOptions.propertyOptionsMap;\n\n const injectOptionsMap = typeOptions.injectOptionsMap === undefined \n ? EMPTY_MAP\n : typeOptions.injectOptionsMap;\n\n const resolvedTypeState = new ResolvedTypeState(\n this,\n alias,\n customValueMap,\n serializedNullValueResolver,\n serializedDefaultValue,\n serializedDefaultValueResolver,\n deserializedNullValueResolver,\n deserializedDefaultValue,\n deserializedDefaultValueResolver,\n discriminant,\n discriminator,\n factory,\n injectable,\n injector,\n logger,\n namingConvention,\n polymorphic,\n typeMetadataMap,\n preserveDiscriminator,\n referenceHandler,\n serializer,\n preserveNull,\n useDefaultValue,\n useImplicitConversion,\n propertySorter,\n sortedPropertyMetadatas,\n injectSorter,\n sortedInjectMetadatas,\n parentTypeArguments,\n parentTypeMetadatas,\n ownParentTypeMetadatas,\n childTypeMetadatas,\n ownChildTypeMetadatas,\n propertyOptionsMap,\n propertyMetadataMap,\n ownPropertyMetadataMap,\n injectOptionsMap,\n injectMetadataMap\n );\n\n this.currentTypeState = resolvedTypeState;\n\n return resolvedTypeState;\n }\n\n /**\n * Unresolves type state.\n * \n * Calling this method has side effects by resetting type state. \n * \n * @returns {UnresolvedTypeState<TObject>} Unresolved type state.\n */\n public unresolveTypeState(): UnresolvedTypeState<TObject>\n {\n const unresolvedTypeState = new UnresolvedTypeState<TObject>(this);\n\n this.currentTypeState = unresolvedTypeState;\n\n return unresolvedTypeState;\n }\n\n /**\n * Resolves custom value map the same way as it is done for the main options.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map.\n */\n private resolveCustomValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const typeOptions = this.typeOptions;\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n if (typeOptions.customValueMap === undefined)\n {\n return customValueMap;\n }\n\n const baseCustomValueMap = typeOptionsBase.customValueMap === undefined\n ? EMPTY_MAP\n : typeOptionsBase.customValueMap;\n \n for (const [customKey, customValue] of typeOptions.customValueMap)\n {\n if (customValue === undefined)\n {\n customValueMap.set(customKey, baseCustomValueMap.get(customKey));\n\n continue;\n }\n\n customValueMap.set(customKey, customValue);\n }\n\n return customValueMap;\n }\n\n /**\n * Resolves own parent type metadatas.\n * \n * @param {ReadonlyArray<TypeArgument<any>>} parentTypeArguments Resolved parent type arguments.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own parent type metadatas.\n */\n private resolveOwnParentTypeMetadatas(parentTypeArguments: ReadonlyArray<TypeArgument<any>>): ReadonlyArray<TypeMetadata<any>>\n {\n const ownParentTypeMetadatas = new Array<TypeMetadata<any>>();\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n ownParentTypeMetadatas.push(parentTypeMetadatas[i]);\n }\n\n if (this.parentTypeMetadata !== undefined)\n {\n ownParentTypeMetadatas.push(this.parentTypeMetadata);\n }\n\n return ownParentTypeMetadatas;\n }\n\n /**\n * Resolves own child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own child type metadatas.\n */\n private resolveOwnChildTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n const ownChildTypeMetadatas = new Array<TypeMetadata<any>>();\n\n for (const childTypeMetadata of this.currentChildTypeMetadataMap.values())\n {\n ownChildTypeMetadatas.push(childTypeMetadata);\n }\n\n for (const setTypeMetadata of this.typeMetadataSet)\n {\n const typeOptions = setTypeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = 0; i < parentTypeMetadatas.length; i++)\n {\n if (parentTypeMetadatas[i] === this)\n {\n ownChildTypeMetadatas.push(setTypeMetadata);\n\n break;\n }\n }\n }\n\n return ownChildTypeMetadatas;\n }\n\n /**\n * Resolves parent type metadata set for provided type metadata reflecting inheritance order where the \n * first element is the current type metadata and the last element is the most abstract parent. This\n * collection is used to define all properties which are declared for the provided type metadata \n * respecting nested declarations.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata. \n * @param {Set<TypeMetadata<any>>} parentTypeMetadataSet Parent type metadata set.\n * \n * @returns {ReadonlySet<TypeMetadata<any>>} Parent type metadata set.\n */\n private resolveParentTypeMetadataSet(\n typeMetadata: TypeMetadata<any>, \n parentTypeMetadataSet: Set<TypeMetadata<any>> = new Set<TypeMetadata<any>>()\n ): ReadonlySet<TypeMetadata<any>>\n {\n if (parentTypeMetadataSet.has(typeMetadata))\n {\n return parentTypeMetadataSet;\n }\n\n parentTypeMetadataSet.add(typeMetadata);\n\n const typeOptions = typeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n this.resolveParentTypeMetadataSet(parentTypeMetadatas[i], parentTypeMetadataSet);\n }\n\n if (typeMetadata.parentTypeMetadata !== undefined) \n {\n this.resolveParentTypeMetadataSet(typeMetadata.parentTypeMetadata, parentTypeMetadataSet);\n }\n \n return parentTypeMetadataSet;\n }\n\n /**\n * Resolved child type metadata set for provided type metadata reflecting inheritance order where the \n * first element is the current type metadata and the last element is the most specific child. This \n * collection is used to define polymorphic relationships between types.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata. \n * @param {Set<TypeMetadata<any>>} childTypeMetadataSet Child type metadata set.\n * \n * @returns {ReadonlySet<TypeMetadata<any>>} Child type metadata set.\n */\n private resolveChildTypeMetadataSet(\n typeMetadata: TypeMetadata<any>, \n childTypeMetadataSet: Set<TypeMetadata<any>> = new Set<TypeMetadata<any>>()\n ): ReadonlySet<TypeMetadata<any>>\n {\n if (childTypeMetadataSet.has(typeMetadata))\n {\n return childTypeMetadataSet;\n }\n\n childTypeMetadataSet.add(typeMetadata);\n\n for (const childTypeMetadata of typeMetadata.currentChildTypeMetadataMap.values())\n {\n this.resolveChildTypeMetadataSet(childTypeMetadata, childTypeMetadataSet);\n\n childTypeMetadata.unresolveTypeState();\n }\n\n for (const setTypeMetadata of this.typeMetadataSet)\n {\n const typeOptions = setTypeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = 0; i < parentTypeMetadatas.length; i++)\n {\n if (parentTypeMetadatas[i] === typeMetadata)\n {\n this.resolveChildTypeMetadataSet(setTypeMetadata, childTypeMetadataSet);\n \n setTypeMetadata.unresolveTypeState();\n\n break;\n }\n }\n }\n\n return childTypeMetadataSet;\n }\n\n /**\n * Resolves property metadata map.\n * \n * @param {ReadonlyArray<TypeMetadata<any>>} parentTypeMetadatas Resolved parent type metadatas.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Resolved property metadata map.\n */\n private resolvePropertyMetadataMap(parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n const propertyMetadataMap = new Map<PropertyName, PropertyMetadata<TObject, any>>();\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n for (const [propertyName, propertyMetadata] of parentTypeMetadatas[i].currentPropertyMetadataMap)\n {\n propertyMetadataMap.set(propertyName, propertyMetadata);\n }\n }\n\n for (const propertyMetadata of this.currentPropertyMetadataMap.values())\n {\n propertyMetadata.unresolvePropertyState();\n }\n\n return propertyMetadataMap;\n }\n\n /**\n * Extends parent type metadata.\n * \n * @returns {this} Current instance of type metadata.\n */\n private extendParentTypeMetadata(): this\n {\n const parentTypeMetadata = this.parentTypeMetadata;\n\n if (parentTypeMetadata !== undefined) \n {\n parentTypeMetadata.currentChildTypeMetadataMap.set(this.typeFn, this);\n }\n\n return this;\n }\n \n /**\n * Reflects inject metadata.\n * \n * Used to configure inject metadata based on reflect metadata as inject decorators may be omitted.\n * \n * @returns {this} Current instance of type metadata.\n */\n public reflectInjectMetadata(): this\n {\n if (this.typeFn.length === 0)\n {\n return this;\n }\n\n const injectTypeFns = (getOwnReflectMetadata('design:paramtypes', this.typeFn) ?? new Array<TypeFn<any>>()) as Array<TypeFn<any>>;\n\n for (let injectIndex = 0; injectIndex < injectTypeFns.length; injectIndex++)\n {\n if (!this.currentInjectMetadataMap.has(injectIndex))\n {\n this.configureInjectMetadata(injectIndex, { typeArgument: injectTypeFns[injectIndex] });\n }\n }\n\n return this;\n }\n\n /**\n * Configures alias.\n * \n * @param {Optional<Alias>} alias Alias.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasAlias(alias: Optional<Alias>): this\n {\n this.releaseAlias();\n\n this.typeOptions.alias = alias;\n\n if (alias !== undefined) \n {\n this.currentTypeFnMap.set(alias, this.typeFn);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Releases alias.\n * \n * @returns {this} Current instance of type metadata. \n */\n private releaseAlias(): this\n {\n const alias = this.typeOptions.alias;\n\n if (alias !== undefined && this.currentTypeFnMap.has(alias))\n {\n this.currentTypeFnMap.delete(alias);\n }\n\n return this;\n }\n\n /**\n * Configures custom value map.\n * \n * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this\n {\n let currentCustomValueMap = this.typeOptions.customValueMap;\n\n if (currentCustomValueMap === undefined)\n {\n currentCustomValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = currentCustomValueMap;\n }\n\n if (customValueMap !== undefined)\n {\n if (currentCustomValueMap !== customValueMap)\n {\n currentCustomValueMap.clear();\n }\n\n for (const [customKey, customValue] of customValueMap)\n {\n currentCustomValueMap.set(customKey, customValue);\n }\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * @param {TCustomValue} customValue Custom value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n customValueMap.set(customKey, customValue);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Extracts value by custom key.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * \n * @returns {TCustomValue} Custom value.\n */\n public extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\n {\n let customValue = this.typeState.customValueMap.get(customKey) as TCustomValue;\n\n if (customValue === undefined && customKey.customValueResolver !== undefined)\n {\n customValue = customKey.customValueResolver();\n }\n\n return customValue;\n }\n\n /**\n * Configures custom options.\n * \n * @param {ReadonlyArray<CustomOption>} customOptions Custom options.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n for (let i = 0; i < customOptions.length; i++)\n {\n customValueMap.set(customOptions[i][0], customOptions[i][1]);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): this\n {\n this.typeOptions.defaultValue = defaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this\n {\n this.typeOptions.serializedDefaultValue = serializedDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this\n {\n this.typeOptions.deserializedDefaultValue = deserializedDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures discriminator.\n * \n * @param {Optional<Discriminator>} discriminator Discriminator.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDiscriminator(discriminator: Optional<Discriminator>): this\n {\n this.typeOptions.discriminator = discriminator;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n \n /**\n * Configures discriminant.\n * \n * @param {Optional<Discriminant>} discriminant Discriminant.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDiscriminant(discriminant: Optional<Discriminant>): this\n {\n this.typeOptions.discriminant = discriminant;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures factory.\n * \n * @param {Optional<Factory>} factory Factory.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasFactory(factory: Optional<Factory>): this\n {\n this.typeOptions.factory = factory;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures injectable.\n * \n * @param {boolean} injectable Injectable.\n * \n * @returns {this} Current instance of type metadata.\n */\n public isInjectable(injectable: boolean = true): this\n {\n this.typeOptions.injectable = injectable;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures injector.\n * \n * @param {Optional<Injector>} injector Injector.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjector(injector: Optional<Injector>): this\n {\n this.typeOptions.injector = injector;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures logger.\n * \n * @param {Optional<Logger>} logger Logger.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasLogger(logger: Optional<Logger>): this\n {\n this.typeOptions.logger = logger;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasNamingConvention(namingConvention: Optional<NamingConvention>): this\n {\n this.typeOptions.namingConvention = namingConvention;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve discriminator.\n * \n * @param {boolean} preserveDiscriminator Preserve discriminator.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldPreserveDiscriminator(preserveDiscriminator: boolean = true): this\n {\n this.typeOptions.preserveDiscriminator = preserveDiscriminator;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {Optional<ReferenceHandler>} referenceHandler Reference handler.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this\n {\n this.typeOptions.referenceHandler = referenceHandler;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Optional<Serializer<TObject>>} serializer Serializer.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasSerializer(serializer: Optional<Serializer<TObject>>): this\n {\n this.typeOptions.serializer = serializer;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): this\n {\n this.typeOptions.preserveNull = preserveNull;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): this\n {\n this.typeOptions.useDefaultValue = useDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): this\n {\n this.typeOptions.useImplicitConversion = useImplicitConversion;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures property sorter.\n * \n * @param {Optional<PropertySorter>} propertySorter Property sorter.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasPropertySorter(propertySorter: Optional<PropertySorter>): this\n {\n this.typeOptions.propertySorter = propertySorter;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures inject sorter.\n * \n * @param {Optional<InjectSorter>} injectSorter Inject sorter.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjectSorter(injectSorter: Optional<InjectSorter>): this\n {\n this.typeOptions.injectSorter = injectSorter;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures parent type arguments.\n * \n * @param {Array<TypeArgument<any>>} parentTypeArguments Parent type arguments.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasParentTypeArguments(parentTypeArguments: Array<TypeArgument<any>>): this\n {\n this.typeOptions.parentTypeArguments = parentTypeArguments;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures certain property metadata.\n * \n * @param {PropertyName} propertyName Property name. \n * @param {PropertyOptions<TPropertyType>} propertyOptions Property options.\n * \n * @returns {PropertyMetadata<TObject, TPropertyType>} Configured property metadata.\n */\n public configurePropertyMetadata<TPropertyType>(propertyName: PropertyName, propertyOptions?: PropertyOptions<TPropertyType>): PropertyMetadata<TObject, TPropertyType>\n {\n let propertyOptionsMap = this.typeOptions.propertyOptionsMap;\n\n if (propertyOptionsMap === undefined)\n {\n propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n\n this.typeOptions.propertyOptionsMap = propertyOptionsMap;\n }\n\n let propertyMetadata = this.currentPropertyMetadataMap.get(propertyName);\n\n if (propertyMetadata === undefined)\n {\n propertyOptions = propertyOptions ?? {} as PropertyOptions<TPropertyType>;\n propertyMetadata = new PropertyMetadata(this.typeManager, this.currentTypeFnMap, this, propertyName, propertyOptions);\n\n this.currentPropertyMetadataMap.set(propertyName, propertyMetadata);\n\n propertyOptionsMap.set(propertyName, propertyOptions);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return propertyMetadata;\n }\n\n if (propertyOptions !== undefined)\n {\n propertyMetadata.configure(propertyOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return propertyMetadata;\n }\n\n /**\n * Configures certain inject metadata.\n * \n * @param {InjectIndex} injectIndex Inject index. \n * @param {InjectOptions<TInjectType>} injectOptions Inject options.\n * \n * @returns {InjectMetadata<TObject, TInjectType>} Configured inject metadata.\n */\n public configureInjectMetadata<TInjectType>(injectIndex: InjectIndex, injectOptions?: InjectOptions<TInjectType>): InjectMetadata<TObject, TInjectType>\n {\n let injectOptionsMap = this.typeOptions.injectOptionsMap;\n\n if (injectOptionsMap === undefined)\n {\n injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n\n this.typeOptions.injectOptionsMap = injectOptionsMap;\n }\n\n let injectMetadata = this.currentInjectMetadataMap.get(injectIndex);\n\n if (injectMetadata === undefined)\n {\n injectOptions = injectOptions ?? {} as InjectOptions<TInjectType>;\n injectMetadata = new InjectMetadata(this.typeManager, this.currentTypeFnMap, this, injectIndex, injectOptions);\n\n this.currentInjectMetadataMap.set(injectIndex, injectMetadata);\n\n injectOptionsMap.set(injectIndex, injectOptions);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n \n return injectMetadata;\n }\n\n if (injectOptions !== undefined)\n {\n injectMetadata.configure(injectOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return injectMetadata;\n }\n\n /**\n * Configures property metadata map.\n * \n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasPropertyMetadataMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): this\n {\n const currentPropertyOptionsMap = this.clearPropertyOptionsMap(propertyOptionsMap);\n\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\n {\n const propertyMetadata = new PropertyMetadata(this.typeManager, this.currentTypeFnMap, this, propertyName, propertyOptions);\n\n this.currentPropertyMetadataMap.set(propertyName, propertyMetadata);\n\n currentPropertyOptionsMap.set(propertyName, propertyOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Clears property options map.\n * \n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\n * \n * @returns {Map<PropertyName, PropertyOptions<any>>} Cleared property options map.\n */\n private clearPropertyOptionsMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): Map<PropertyName, PropertyOptions<any>>\n {\n let currentPropertyOptionsMap = this.typeOptions.propertyOptionsMap;\n\n if (currentPropertyOptionsMap === undefined)\n {\n currentPropertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n\n this.typeOptions.propertyOptionsMap = currentPropertyOptionsMap;\n }\n\n if (currentPropertyOptionsMap !== propertyOptionsMap)\n {\n currentPropertyOptionsMap.clear();\n\n this.currentPropertyMetadataMap.clear();\n }\n\n return currentPropertyOptionsMap;\n }\n\n /**\n * Configures inject metadata map.\n * \n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjectMetadataMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): this\n {\n const currentInjectOptionsMap = this.clearInjectOptionsMap(injectOptionsMap);\n\n for (const [injectIndex, injectOptions] of injectOptionsMap)\n {\n const injectMetadata = new InjectMetadata(this.typeManager, this.currentTypeFnMap, this, injectIndex, injectOptions);\n\n this.currentInjectMetadataMap.set(injectIndex, injectMetadata);\n\n currentInjectOptionsMap.set(injectIndex, injectOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Clears inject options map.\n * \n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\n * \n * @returns {Map<InjectIndex, InjectOptions<any>>} Cleared inject options map.\n */\n private clearInjectOptionsMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): Map<InjectIndex, InjectOptions<any>>\n {\n let currentInjectOptionsMap = this.typeOptions.injectOptionsMap;\n\n if (currentInjectOptionsMap === undefined)\n {\n currentInjectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n\n this.typeOptions.injectOptionsMap = currentInjectOptionsMap;\n }\n\n if (currentInjectOptionsMap !== injectOptionsMap)\n {\n currentInjectOptionsMap.clear();\n\n this.currentInjectMetadataMap.clear();\n }\n\n return currentInjectOptionsMap;\n }\n\n /**\n * Configures type metadata based on provided options.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {this} Current instance of type metadata.\n */\n public configure(typeOptions: TypeOptions<TObject>): this\n {\n if (typeOptions.alias !== undefined) \n {\n this.hasAlias(typeOptions.alias);\n }\n\n if (typeOptions.customValueMap !== undefined)\n {\n this.hasCustomValueMap(typeOptions.customValueMap);\n }\n\n if (typeOptions.defaultValue !== undefined)\n {\n this.hasDefaultValue(typeOptions.defaultValue);\n }\n\n if (typeOptions.serializedDefaultValue !== undefined)\n {\n this.hasSerializedDefaultValue(typeOptions.serializedDefaultValue);\n }\n\n if (typeOptions.deserializedDefaultValue !== undefined) \n {\n this.hasDeserializedDefaultValue(typeOptions.deserializedDefaultValue);\n }\n\n if (typeOptions.discriminator !== undefined) \n {\n this.hasDiscriminator(typeOptions.discriminator);\n }\n\n if (typeOptions.discriminant !== undefined)\n {\n this.hasDiscriminant(typeOptions.discriminant);\n }\n\n if (typeOptions.factory !== undefined) \n {\n this.hasFactory(typeOptions.factory);\n }\n\n if (typeOptions.injectable !== undefined)\n {\n this.isInjectable(typeOptions.injectable);\n }\n\n if (typeOptions.injector !== undefined)\n {\n this.hasInjector(typeOptions.injector);\n }\n\n if (typeOptions.logger !== undefined)\n {\n this.hasLogger(typeOptions.logger);\n }\n\n if (typeOptions.namingConvention !== undefined)\n {\n this.hasNamingConvention(typeOptions.namingConvention);\n }\n\n if (typeOptions.preserveDiscriminator !== undefined)\n {\n this.shouldPreserveDiscriminator(typeOptions.preserveDiscriminator);\n }\n\n if (typeOptions.referenceHandler !== undefined)\n {\n this.hasReferenceHandler(typeOptions.referenceHandler);\n }\n\n if (typeOptions.serializer !== undefined)\n {\n this.hasSerializer(typeOptions.serializer);\n }\n\n if (typeOptions.preserveNull !== undefined)\n {\n this.shouldPreserveNull(typeOptions.preserveNull);\n }\n\n if (typeOptions.useDefaultValue !== undefined) \n {\n this.shouldUseDefaultValue(typeOptions.useDefaultValue);\n }\n\n if (typeOptions.useImplicitConversion !== undefined) \n {\n this.shouldUseImplicitConversion(typeOptions.useImplicitConversion);\n }\n\n if (typeOptions.propertyOptionsMap !== undefined)\n {\n this.hasPropertyMetadataMap(typeOptions.propertyOptionsMap);\n }\n\n if (typeOptions.injectOptionsMap !== undefined)\n {\n this.hasInjectMetadataMap(typeOptions.injectOptionsMap);\n }\n\n if (typeOptions.propertySorter !== undefined)\n {\n this.hasPropertySorter(typeOptions.propertySorter);\n }\n\n if (typeOptions.injectSorter !== undefined)\n {\n this.hasInjectSorter(typeOptions.injectSorter);\n }\n\n if (typeOptions.parentTypeArguments !== undefined)\n {\n this.hasParentTypeArguments(typeOptions.parentTypeArguments);\n }\n\n return this;\n }\n}\n","import { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Special class to create a scope over a certain type. This class used only in \n * combination with decorators and not required for declarative configuration.\n * \n * @type {TypeScope}\n */\nexport class TypeScope\n{\n /**\n * Scope open?\n * \n * @type {boolean};\n */\n private opened: boolean;\n\n /**\n * Property options array map.\n * \n * @type {Map<PropertyName, Array<PropertyOptions<any>>>}\n */\n private propertyOptionsArrayMap: Map<PropertyName, Array<PropertyOptions<any>>>;\n\n /**\n * Inject options array map.\n * \n * @type {Map<InjectIndex, Array<InjectOptions<any>>>}\n */\n private injectOptionsArrayMap: Map<InjectIndex, Array<InjectOptions<any>>>;\n\n /**\n * Constructor.\n */\n public constructor()\n {\n this.opened = false;\n this.propertyOptionsArrayMap = new Map<PropertyName, Array<PropertyOptions<any>>>();\n this.injectOptionsArrayMap = new Map<InjectIndex, Array<InjectOptions<any>>>();\n\n return;\n }\n\n /**\n * Opens a scope.\n * \n * @returns {this} Type scope.\n */\n public open(): this\n {\n this.opened = true;\n this.propertyOptionsArrayMap.clear();\n this.injectOptionsArrayMap.clear();\n\n return this;\n }\n\n /**\n * Adds property options to the type scope.\n * \n * @param {PropertyName} propertyName Property name.\n * @param {PropertyOptions<any>} propertyOptions Property options.\n * \n * @returns {this} Type scope.\n */\n public addPropertyOptions(propertyName: PropertyName, propertyOptions: PropertyOptions<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n let propertyOptionsArray = this.propertyOptionsArrayMap.get(propertyName);\n\n if (propertyOptionsArray === undefined) \n {\n propertyOptionsArray = new Array<PropertyOptions<any>>();\n\n this.propertyOptionsArrayMap.set(propertyName, propertyOptionsArray);\n }\n\n propertyOptionsArray.push(propertyOptions);\n\n return this;\n }\n\n /**\n * Adds inject options to the type scope.\n * \n * @param {InjectIndex} injectIndex Inject index.\n * @param {InjectOptions<any>} injectOptions Inject options.\n * \n * @returns {this} Type scope.\n */\n public addInjectOptions(injectIndex: InjectIndex, injectOptions: InjectOptions<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n let injectOptionsArray = this.injectOptionsArrayMap.get(injectIndex);\n\n if (injectOptionsArray === undefined) \n {\n injectOptionsArray = new Array<InjectOptions<any>>();\n\n this.injectOptionsArrayMap.set(injectIndex, injectOptionsArray);\n }\n\n injectOptionsArray.push(injectOptions);\n\n return this;\n }\n\n /**\n * Closes scope and applies state for type metadata.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata.\n * \n * @returns {this} Type scope.\n */\n public close(typeMetadata: TypeMetadata<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n for (const [propertyName, propertyOptionsArray] of this.propertyOptionsArrayMap)\n {\n for (let i = 0; i < propertyOptionsArray.length; i++)\n {\n typeMetadata.configurePropertyMetadata(propertyName, propertyOptionsArray[i]);\n }\n }\n\n for (const [injectIndex, injectOptionsArray] of this.injectOptionsArrayMap)\n {\n for (let i = 0; i < injectOptionsArray.length; i++)\n {\n typeMetadata.configureInjectMetadata(injectIndex, injectOptionsArray[i]);\n }\n }\n\n this.injectOptionsArrayMap.clear();\n this.propertyOptionsArrayMap.clear();\n this.opened = false;\n\n return this;\n }\n}\n","export * from './resolved-type-state';\nexport * from './unresolved-type-state';\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValue } from '../default-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { Discriminant } from '../discriminant';\nimport { Discriminator } from '../discriminator';\nimport { Factory } from '../factory';\nimport { InjectIndex } from '../inject-index';\nimport { InjectMetadata } from '../inject-metadata';\nimport { InjectOptions } from '../inject-options';\nimport { InjectSorter } from '../inject-sorter';\nimport { Injector } from '../injector';\nimport { Logger } from '../logger';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyOptions } from '../property-options';\nimport { PropertySorter } from '../property-sorter';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeFn } from '../type-fn';\nimport { TypeMetadata } from '../type-metadata';\nimport { TypeState } from '../type-state';\n\n/**\n * Represents resolved type state.\n * \n * @type {ResolvedTypeState<TObject>}\n */\nexport class ResolvedTypeState<TObject> implements TypeState<TObject>\n{\n /**\n * Type metadata for which state is defined.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Alias.\n * \n * @type {Optional<Alias>}\n */\n public readonly alias: Optional<Alias>;\n\n /**\n * Custom value map.\n * \n * @type {ReadonlyMap<CustomKey<any>, CustomValue>}\n */\n public readonly customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>;\n\n /**\n * Serialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly serializedNullValueResolver: NullValueResolver;\n\n /**\n * Serialized default value.\n * \n * @type {DefaultValue}\n */\n public readonly serializedDefaultValue: DefaultValue;\n \n /**\n * Serialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly serializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Deserialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly deserializedNullValueResolver: NullValueResolver;\n\n /**\n * Deserialized default value.\n * \n * @type {DefaultValue}\n */\n public readonly deserializedDefaultValue: DefaultValue;\n\n /**\n * Deserialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly deserializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Discriminant.\n * \n * @type {Discriminant}\n */\n public readonly discriminant: Discriminant;\n\n /**\n * Discriminator.\n * \n * @type {Discriminator}\n */\n public readonly discriminator: Discriminator;\n\n /**\n * Factory.\n * \n * @type {Factory}\n */\n public readonly factory: Factory;\n\n /**\n * Injectable value.\n * \n * @type {Factory}\n */\n public readonly injectable: boolean;\n\n /**\n * Injector.\n * \n * @type {Injector}\n */\n public readonly injector: Injector;\n\n /**\n * Logger.\n * \n * @type {Logger}\n */\n public readonly logger: Logger;\n \n /**\n * Naming convention.\n * \n * @type {Optional<NamingConvention>}\n */\n public readonly namingConvention: Optional<NamingConvention>;\n\n /**\n * Indicator if current type metadata is polymorphic.\n * \n * @type {boolean}\n */\n public readonly polymorphic: boolean;\n\n /**\n * Type metadata map.\n * \n * @type {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>}\n */\n public readonly typeMetadataMap: ReadonlyMap<TypeFn<any>, TypeMetadata<any>>;\n\n /**\n * Indicator if discriminator should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveDiscriminator: boolean;\n\n /**\n * Reference handler.\n * \n * @type {ReferenceHandler}\n */\n public readonly referenceHandler: ReferenceHandler;\n \n /**\n * Serializer.\n * \n * @type {Serializer<TObject>}\n */\n public readonly serializer: Serializer<TObject>;\n\n /**\n * Indicator if null value should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveNull: boolean;\n\n /**\n * Indicator if default value should be used.\n * \n * @type {boolean}\n */\n public readonly useDefaultValue: boolean;\n\n /**\n * Indicator if implicit conversion should be used.\n * \n * @type {boolean}\n */\n public readonly useImplicitConversion: boolean;\n\n /**\n * Property sorter.\n * \n * @type {Optional<PropertySorter>}\n */\n public readonly propertySorter: Optional<PropertySorter>;\n\n /**\n * Sorted property metadatas.\n * \n * @type {ReadonlyArray<PropertyMetadata<TObject, any>>}\n */\n public readonly sortedPropertyMetadatas: ReadonlyArray<PropertyMetadata<TObject, any>>;\n\n /**\n * Inject sorter.\n * \n * @type {Optional<InjectSorter>}\n */\n public readonly injectSorter: Optional<InjectSorter>;\n\n /**\n * Sorted inject metadatas.\n * \n * @type {ReadonlyArray<InjectMetadata<TObject, any>>}\n */\n public readonly sortedInjectMetadatas: ReadonlyArray<InjectMetadata<TObject, any>>;\n\n /**\n * Parent type arguments.\n * \n * @type {ReadonlyArray<TypeArgument<any>>}\n */\n public readonly parentTypeArguments: ReadonlyArray<TypeArgument<any>>;\n \n /**\n * Parent type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Own parent type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly ownParentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Child type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly childTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n \n /**\n * Own child type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly ownChildTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Property options map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyOptions<any>>}\n */\n public readonly propertyOptionsMap: ReadonlyMap<PropertyName, PropertyOptions<any>>;\n\n /**\n * Property metadata map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public readonly propertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>;\n\n /**\n * Own property metadata map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public readonly ownPropertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>;\n\n /**\n * Inject options map.\n * \n * @type {ReadonlyMap<InjectIndex, PropertyOptions<any>>}\n */\n public readonly injectOptionsMap: ReadonlyMap<InjectIndex, InjectOptions<any>>;\n\n /**\n * Inject metadata map.\n * \n * @type {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>}\n */\n public readonly injectMetadataMap: ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata for which state is defined.\n * @param {Optional<Alias>} alias Alias.\n * @param {ReadonlyMap<CustomKey<any>, CustomValue>} customValueMap Custom value map.\n * @param {NullValueResolver} serializedNullValueResolver Serialized null value resolver.\n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * @param {DefaultValueResolver} serializedDefaultValueResolver Serialized default value resolver.\n * @param {NullValueResolver} deserializedNullValueResolver Deserialized null value resolver.\n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * @param {DefaultValueResolver} deserializedDefaultValueResolver Deserialized default value resolver.\n * @param {Discriminant} discriminant Discriminant.\n * @param {Discriminator} discriminator Discriminator.\n * @param {Factory} factory Factory.\n * @param {boolean} injectable Injectable value.\n * @param {Injector} injector Injector.\n * @param {Logger} logger Logger.\n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * @param {boolean} polymorphic Indicator if current type metadata is polymorphic.\n * @param {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>} typeMetadataMap Type metadata map.\n * @param {boolean} preserveDiscriminator Indicator if discriminator should be preserved.\n * @param {ReferenceHandler} referenceHandler Reference handler.\n * @param {Serializer<TObject>} serializer Serializer.\n * @param {boolean} preserveNull Indicator if null value should be preserved.\n * @param {boolean} useDefaultValue Indicator if default value should be used.\n * @param {boolean} useImplicitConversion Indicator if implicit conversion should be used.\n * @param {Optional<PropertySorter>} propertySorter Property sorter.\n * @param {ReadonlyArray<PropertyMetadata<TObject, any>>} sortedPropertyMetadatas Sorted property metadatas.\n * @param {Optional<InjectSorter>} injectSorter Inject sorter.\n * @param {ReadonlyArray<InjectMetadata<TObject, any>>} sortedInjectMetadatas Sorted inject metadatas.\n * @param {ReadonlyArray<TypeArgument<any>>} parentTypeArguments Parent type arguments.\n * @param {ReadonlyArray<TypeMetadata<any>>} parentTypeMetadatas Parent type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} ownParentTypeMetadatas Own parent type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} childTypeMetadatas Child type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} ownChildTypeMetadatas Own child type metadatas.\n * @param {ReadonlyMap<PropertyName, PropertyOptions<any>>} propertyOptionsMap Property options map.\n * @param {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} propertyMetadataMap Property metadata map.\n * @param {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} ownPropertyMetadataMap Own property metadata map.\n * @param {ReadonlyMap<InjectIndex, PropertyOptions<any>>} injectOptionsMap Inject options map.\n * @param {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>} injectMetadataMap Inject metadata map.\n */\n public constructor(\n typeMetadata: TypeMetadata<TObject>,\n alias: Optional<Alias>,\n customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>,\n serializedNullValueResolver: NullValueResolver,\n serializedDefaultValue: DefaultValue,\n serializedDefaultValueResolver: DefaultValueResolver,\n deserializedNullValueResolver: NullValueResolver,\n deserializedDefaultValue: DefaultValue,\n deserializedDefaultValueResolver: DefaultValueResolver,\n discriminant: Discriminant,\n discriminator: Discriminator,\n factory: Factory,\n injectable: boolean,\n injector: Injector,\n logger: Logger,\n namingConvention: Optional<NamingConvention>,\n polymorphic: boolean,\n typeMetadataMap: ReadonlyMap<TypeFn<any>, TypeMetadata<any>>,\n preserveDiscriminator: boolean,\n referenceHandler: ReferenceHandler,\n serializer: Serializer<TObject>,\n preserveNull: boolean,\n useDefaultValue: boolean,\n useImplicitConversion: boolean,\n propertySorter: Optional<PropertySorter>,\n sortedPropertyMetadatas: ReadonlyArray<PropertyMetadata<TObject, any>>,\n injectSorter: Optional<InjectSorter>,\n sortedInjectMetadatas: ReadonlyArray<InjectMetadata<TObject, any>>,\n parentTypeArguments: ReadonlyArray<TypeArgument<any>>,\n parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n ownParentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n childTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n ownChildTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n propertyOptionsMap: ReadonlyMap<PropertyName, PropertyOptions<any>>,\n propertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>,\n ownPropertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>,\n injectOptionsMap: ReadonlyMap<InjectIndex, PropertyOptions<any>>,\n injectMetadataMap: ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n ) \n {\n this.typeMetadata = typeMetadata;\n this.alias = alias;\n this.customValueMap = customValueMap;\n this.serializedNullValueResolver = serializedNullValueResolver;\n this.serializedDefaultValue = serializedDefaultValue;\n this.serializedDefaultValueResolver = serializedDefaultValueResolver;\n this.deserializedNullValueResolver = deserializedNullValueResolver;\n this.deserializedDefaultValue = deserializedDefaultValue;\n this.deserializedDefaultValueResolver = deserializedDefaultValueResolver;\n this.discriminant = discriminant;\n this.discriminator = discriminator;\n this.factory = factory;\n this.injectable = injectable;\n this.injector = injector;\n this.logger = logger;\n this.namingConvention = namingConvention;\n this.polymorphic = polymorphic;\n this.typeMetadataMap = typeMetadataMap;\n this.preserveDiscriminator = preserveDiscriminator;\n this.referenceHandler = referenceHandler;\n this.serializer = serializer;\n this.preserveNull = preserveNull;\n this.useDefaultValue = useDefaultValue;\n this.useImplicitConversion = useImplicitConversion;\n this.propertySorter = propertySorter;\n this.sortedPropertyMetadatas = sortedPropertyMetadatas;\n this.injectSorter = injectSorter;\n this.sortedInjectMetadatas = sortedInjectMetadatas;\n this.parentTypeArguments = parentTypeArguments;\n this.parentTypeMetadatas = parentTypeMetadatas;\n this.ownParentTypeMetadatas = ownParentTypeMetadatas;\n this.childTypeMetadatas = childTypeMetadatas;\n this.ownChildTypeMetadatas = ownChildTypeMetadatas;\n this.propertyOptionsMap = propertyOptionsMap;\n this.propertyMetadataMap = propertyMetadataMap;\n this.ownPropertyMetadataMap = ownPropertyMetadataMap;\n this.injectOptionsMap = injectOptionsMap;\n this.injectMetadataMap = injectMetadataMap;\n\n return;\n }\n}\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValue } from '../default-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { Discriminant } from '../discriminant';\nimport { Discriminator } from '../discriminator';\nimport { Factory } from '../factory';\nimport { InjectIndex } from '../inject-index';\nimport { InjectMetadata } from '../inject-metadata';\nimport { InjectOptions } from '../inject-options';\nimport { InjectSorter } from '../inject-sorter';\nimport { Injector } from '../injector';\nimport { Logger } from '../logger';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyOptions } from '../property-options';\nimport { PropertySorter } from '../property-sorter';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeFn } from '../type-fn';\nimport { TypeMetadata } from '../type-metadata';\nimport { TypeState } from '../type-state';\nimport { ResolvedTypeState } from './resolved-type-state';\n\n/**\n * Represents unresolved type state.\n * \n * @type {UnresolvedTypeState<TObject>}\n */\nexport class UnresolvedTypeState<TObject> implements TypeState<TObject>\n{\n /**\n * Type metadata for which state is defined.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Resolved type state.\n * \n * @type {ResolvedTypeState<TObject>}\n */\n private resolvedTypeState?: ResolvedTypeState<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata for which state is defined.\n */\n public constructor(typeMetadata: TypeMetadata<TObject>)\n {\n this.typeMetadata = typeMetadata;\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias.\n */\n public get alias(): Optional<Alias>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.customValueMap;\n }\n\n /**\n * Gets serialized null value resolver.\n * \n * @returns {NullValueResolver} Serialized null value resolver.\n */\n public get serializedNullValueResolver(): NullValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedNullValueResolver;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {DefaultValue} Serialized default value.\n */\n public get serializedDefaultValue(): DefaultValue\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value resolver.\n * \n * @returns {DefaultValueResolver} Serialized default value resolver.\n */\n public get serializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedDefaultValueResolver;\n }\n\n /**\n * Gets deserialized null value resolver.\n * \n * @returns {NullValueResolver} Deserialized null value resolver.\n */\n public get deserializedNullValueResolver(): NullValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedNullValueResolver;\n }\n\n /**\n * Gets deserialized default value.\n * \n * @returns {DefaultValue} Serialized default value.\n */\n public get deserializedDefaultValue(): DefaultValue\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedDefaultValue;\n }\n\n /**\n * Gets deserialized default value resolver.\n * \n * @returns {DefaultValueResolver} Deserialized default value resolver.\n */\n public get deserializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedDefaultValueResolver;\n }\n\n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.factory;\n }\n\n /**\n * Gets injectable value.\n * \n * @returns {boolean} Injectable value.\n */\n public get injectable(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectable;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector.\n */\n public get injector(): Injector\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger.\n */\n public get logger(): Logger\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.logger;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.namingConvention;\n }\n\n /**\n * Gets indicator if current type metadata is polymorphic.\n * \n * @returns {boolean} Indicator if polymorphic.\n */\n public get polymorphic(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.polymorphic;\n }\n \n /**\n * Gets type metadata map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>} Type metadata map.\n */\n public get typeMetadataMap(): ReadonlyMap<TypeFn<any>, TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.typeMetadataMap;\n }\n \n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} Preserve discriminator.\n */\n public get preserveDiscriminator(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializer;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} Preserve null value.\n */\n public get preserveNull(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value.\n */\n public get useDefaultValue(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion.\n */\n public get useImplicitConversion(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.useImplicitConversion;\n }\n\n /**\n * Gets property sorter.\n * \n * @returns {Optional<PropertySorter>} Property sorter.\n */\n public get propertySorter(): Optional<PropertySorter>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertySorter;\n }\n\n /**\n * Gets sorted property metadatas.\n * \n * @returns {ReadonlyArray<PropertyMetadata<TObject, any>>} Sorted property metadatas.\n */\n public get sortedPropertyMetadatas(): ReadonlyArray<PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.sortedPropertyMetadatas;\n }\n\n /**\n * Gets inject sorter.\n * \n * @returns {Optional<InjectSorter>} Inject sorter.\n */\n public get injectSorter(): Optional<InjectSorter>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectSorter;\n }\n\n /**\n * Gets sorted inject metadatas.\n * \n * @returns {ReadonlyArray<InjectMetadata<TObject, any>>} Sorted inject metadatas.\n */\n public get sortedInjectMetadatas(): ReadonlyArray<InjectMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.sortedInjectMetadatas;\n }\n\n /**\n * Gets parent type arguments.\n * \n * @returns {ReadonlyArray<TypeArgument<any>>} Parent type arguments.\n */\n public get parentTypeArguments(): ReadonlyArray<TypeArgument<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.parentTypeArguments;\n }\n\n /**\n * Gets parent type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Parent type metadatas.\n */\n public get parentTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.parentTypeMetadatas;\n }\n\n /**\n * Gets own parent type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Own parent type metadatas.\n */\n public get ownParentTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownParentTypeMetadatas;\n }\n\n /**\n * Gets child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Child type metadatas.\n */\n public get childTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.childTypeMetadatas;\n }\n\n /**\n * Gets own child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Own child type metadatas.\n */\n public get ownChildTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownChildTypeMetadatas;\n }\n\n /**\n * Gets property options map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyOptions<any>>} Property options map.\n */\n public get propertyOptionsMap(): ReadonlyMap<PropertyName, PropertyOptions<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertyOptionsMap;\n }\n\n /**\n * Gets property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Property metadata map.\n */\n public get propertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertyMetadataMap;\n }\n\n /**\n * Gets own property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Own property metadata map.\n */\n public get ownPropertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownPropertyMetadataMap;\n }\n\n /**\n * Gets inject options map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectOptions<any>>} Inject options map.\n */\n public get injectOptionsMap(): ReadonlyMap<InjectIndex, InjectOptions<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectOptionsMap;\n }\n\n /**\n * Gets inject metadata map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>} Inject metadata map.\n */\n public get injectMetadataMap(): ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n \n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectMetadataMap;\n }\n}\n","import { TypeDecorator } from './type-decorator';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeOptions } from './type-options';\n\n/**\n * Type decorator.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n *\n * @returns {TypeDecorator} Type decorator.\n */\nexport function Type<TObject>(typeOptions?: TypeOptions<TObject>): TypeDecorator\n{\n TypeManager.typeScope.open();\n\n return function (target: any): any\n {\n const typeFn = target as TypeFn<TObject>;\n const typeMetadata = TypeManager.configureTypeMetadata(typeFn, typeOptions).reflectInjectMetadata();\n \n TypeManager.typeScope.close(typeMetadata);\n\n return target;\n };\n}\n","/**\n * In type script there is no explicit class for unknown type. We want to allow serialization and \n * deserialization without specify any serializers. However such behaviour should be visible in the \n * type metadata.\n * \n * @type {Unknown}\n */\nexport class Unknown\n{\n \n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(7729);\n"],"names":["root","factory","exports","module","define","amd","this","Any","DEFAULT_VALUE_RESOLVER","EMPTY_ARRAY","Array","EMPTY_MAP","Map","NULL_VALUE_RESOLVER","CustomKey","description","customValueResolver","build","typeMetadata","typeEntryMap","injector","typeCtor","typeFn","typeState","injectedKeys","Set","args","length","i","sortedInjectMetadatas","injectMetadata","injectState","argKey","key","undefined","typeEntry","get","injectIndex","value","add","type","values","propertyMetadata","has","propertyName","TypeFactory","metadataKey","target","Reflect","getOwnMetadata","propertyKey","getMetadata","rsAstralRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsApos","rsBreak","rsCombo","rsComboMarksRange","rsDingbat","rsLower","rsMisc","rsModifier","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","join","rsEmoji","reA","reB","reC","reF","reG","reUnicodeWord","RegExp","reUnicodeWords","reAsciiWords","x","test","match","getUnicodeWords","getAsciiWords","reviver","JSON","parse","replacer","space","spacing","isFinite","separator","seen","stringify","parent","node","level","toJSON","call","indent","out","isArray","delete","keys","Object","sort","name","typeManager","typeFnMap","declaringTypeMetadata","injectOptions","reflectTypeFn","getOwnReflectMetadata","currentInjectState","UnresolvedInjectState","configure","typeArgument","resolveInjectState","resolveTypeMetadata","resolvedInjectState","ResolvedInjectState","unresolveInjectState","unresolvedInjectState","hasKey","hasTypeArgument","Metadata","InjectMetadata","y","AscInjectSorter","DescInjectSorter","Error","nameOf","constructor","String","TypeManager","configureTypeMetadata","configureInjectMetadata","instanceMap","WeakMap","injectable","typeName","instance","init","set","SingletonInjector","LoggerLevel","loggerLevel","debugDisabled","Debug","infoDisabled","Info","warnDisabled","Warn","errorDisabled","supportsConsole","console","supportsConsoleLog","log","supportsConsoleInfo","info","supportsConsoleWarn","warn","supportsConsoleError","error","format","component","message","debug","debugMessage","optionalParams","infoMessage","warnMessage","errorMessage","Logger","resolveTypeMetadatas","typeArguments","typeMetadatas","resolveTypeMetadataUsingTypeResolver","resolveTypeMetadataUsingTypeFn","resolveTypeMetadataUsingAlias","resolveTypeMetadataUsingUnknownTypeFn","typeResolver","extractTypeMetadata","alias","logger","Unknown","resolveGenericMetadatas","genericArguments","genericMetadatas","genericArgument","convert","getWords","reduce","result","word","index","wordLowerCased","toLowerCase","toUpperCase","slice","CamelCaseNamingConvention","FlatCaseNamingConvention","FlatUpperCaseNamingConvention","KebabCaseNamingConvention","wordUpperCased","KebabUpperCaseNamingConvention","wordPascalCased","PascalCaseNamingConvention","SnakeCaseNamingConvention","SnakeUpperCaseNamingConvention","PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY","PropertyExtensionMetadata","propertyExtensionOptions","propertyOptions","normalizedPropertyName","toLocaleLowerCase","getReflectMetadata","prototype","constructPropertyOptions","currentPropertyState","UnresolvedPropertyState","customValueMap","serializedNullValueResolver","serializedDefaultValueResolver","deserializedNullValueResolver","deserializedDefaultValueResolver","serializedPropertyName","deserializedPropertyName","deserializable","namingConvention","referenceHandler","serializable","serializer","preserveNull","useDefaultValue","useImplicitConversion","configurePropertyExtensionMetadata","propertyExtensionMetadataCtor","propertyExtensionMetadataCtorSet","extractPropertyExtensionMetadataCtorSet","extractPropertyExtensionMetadata","resolvePropertyState","resolveCustomValueMap","serializedDefaultValue","defaultValue","deserializedDefaultValue","useDefaultSerialization","resolvedPropertyState","ResolvedPropertyState","unresolvePropertyState","unresolvedPropertyState","typeCustomValueMap","customKey","customValue","hasAlias","hasCustomValueMap","currentCustomValueMap","clear","hasCustomValue","extractCustomValue","propertyState","hasCustomOptions","customOptions","hasDefaultValue","hasSerializedDefaultValue","hasDeserializedDefaultValue","isDeserializable","isSerializable","hasGenericArguments","hasNamingConvention","hasReferenceHandler","hasSerializer","shouldPreserveNull","shouldUseDefaultValue","shouldUseImplicitConversion","PropertyMetadata","localeCompare","AscPropertySorter","DescPropertySorter","z","assign","context","hasOwnProperty","decoratorContext","kind","typeScope","addPropertyOptions","legacyTarget","configurePropertyMetadata","serializerContext","referenceKey","referenceValueGetter","referenceMap","referenceValue","resolveReferenceCallbacks","registerReferenceCallback","restore","CircularReferenceHandler","arrayKeyRegExp","referencePath","jsonPath","$ref","referenceTarget","defineReferenceTarget","pushReferenceCallback","$","referencePathArray","convertReferencePathToArray","shift","array","parts","split","j","push","JsonPathReferenceHandler","PlainReferenceHandler","referenceCallbackMap","parentSerializerContext","jsonPathKey","referenceValueSetter","discriminant","discriminator","polymorphic","preserveDiscriminator","serialize","deserialize","defineReference","restoreReference","referenceCallback","referenceCallbacks","defineChildSerializerContext","SerializerContext","defineGenericSerializerContext","genericIndex","genericMetadata","definePolymorphicSerializerContext","definePolymorphicSerializerContextByTypeFn","definePolymorphicSerializerContextByDiscriminant","typeMetadataMap","record","childTypeMetadatas","childTypeState","serializedNullValue","deserializedNullValue","AnySerializer","ArrayBuffer","arrayBufferView","Uint16Array","from","map","c","fromCharCode","arrayBuffer","charCodeAt","ArrayBufferSerializer","arrayInput","arrayOutput","valueSerializerContext","v","k","ArraySerializer","BooleanSerializer","DataView","buffer","DataViewSerializer","Date","toISOString","DateSerializer","Float32Array","Float32ArraySerializer","Float64Array","Float64ArraySerializer","Int16Array","Int16ArraySerializer","Int32Array","Int32ArraySerializer","Int8Array","Int8ArraySerializer","size","genericKeySerializerContext","genericValueSerializerContext","keyArraySerializerContext","valueArraySerializerContext","keySerializerContext","keySerializer","valueSerializer","entries","mk","mv","MapSerializer","Number","NumberSerializer","SetSerializer","StringSerializer","typeSerializerContext","propertySerializerContext","object","declaringObject","sortedPropertyMetadatas","propertyValue","declaringType","TypeSerializer","Uint16ArraySerializer","Uint32Array","Uint32ArraySerializer","Uint8Array","Uint8ArraySerializer","Uint8ClampedArray","Uint8ClampedArraySerializer","UnknownSerializer","TYPE_EXTENSION_METADATA_CTOR_SET_KEY","TypeExtensionMetadata","typeExtensionOptions","typeManagerOptions","symbol","Symbol","TYPE_METADATA_SYMBOL","constructTypeManagerOptions","typeMetadataSet","staticTypeManager","typeOptionsBase","constructTypeOptionsBase","typeOptionsMap","constructTypeOptionsMap","typeConfigurationMap","initialTypeOptionsBase","defaultTypeOptionsBase","initialTypeOptionsMap","defaultTypeOptionsMap","typeOptions","mapTypeOptions","typeMetadataDefined","declareTypeMetadata","defineProperty","enumerable","configurable","writable","parentTypeMetadata","getPrototypeOf","TypeMetadata","applyTypeOptionsBase","unresolveTypeState","applyTypeOptionsMap","applyTypeOptions","applyTypeConfigurationMap","typeConfiguration","applyTypeConfiguration","defineSerializerContext","clone","cloneTypeOptionsBase","cloneTypeOptionsMap","customValueMapClone","typeOptionsBaseClone","typeOptionsMapClone","typeOptionsClone","typeCustomValueMapClone","propertyOptionsMap","propertyOptionsMapClone","propertyOptionsClone","propertyCustomValueMap","propertyCustomValueMapClone","injectOptionsMap","injectOptionsMapClone","injectOptionsClone","arrayFn","jsonStringify","jsonParse","Boolean","TypeScope","for","constructTypeOptions","currentTypeFnMap","currentChildTypeMetadataMap","currentPropertyMetadataMap","currentInjectMetadataMap","currentTypeState","UnresolvedTypeState","extendParentTypeMetadata","injectMetadataMap","propertyMetadataMap","propertySorter","injectSorter","parentTypeArguments","configureTypeExtensionMetadata","typeExtensionMetadataCtor","typeExtensionMetadataCtorSet","extractTypeExtensionMetadataCtorSet","extractTypeExtensionMetadata","resolveTypeState","ownParentTypeMetadatas","resolveOwnParentTypeMetadatas","ownChildTypeMetadatas","resolveOwnChildTypeMetadatas","parentTypeMetadataSet","resolveParentTypeMetadataSet","parentTypeMetadatas","childTypeMetadataSet","resolveChildTypeMetadataSet","childTypeMetadata","ownPropertyMetadataMap","resolvePropertyMetadataMap","resolvedTypeState","ResolvedTypeState","unresolvedTypeState","baseCustomValueMap","setTypeMetadata","reflectInjectMetadata","injectTypeFns","releaseAlias","hasDiscriminator","hasDiscriminant","hasFactory","isInjectable","hasInjector","hasLogger","shouldPreserveDiscriminator","hasPropertySorter","hasInjectSorter","hasParentTypeArguments","hasPropertyMetadataMap","currentPropertyOptionsMap","clearPropertyOptionsMap","hasInjectMetadataMap","currentInjectOptionsMap","clearInjectOptionsMap","opened","propertyOptionsArrayMap","injectOptionsArrayMap","open","propertyOptionsArray","addInjectOptions","injectOptionsArray","close","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://$DSTypeManager/webpack/universalModuleDefinition","webpack://$DSTypeManager/./src/any.ts","webpack://$DSTypeManager/./src/constants/default-value-resolver.ts","webpack://$DSTypeManager/./src/constants/empty-array.ts","webpack://$DSTypeManager/./src/constants/empty-map.ts","webpack://$DSTypeManager/./src/constants/index.ts","webpack://$DSTypeManager/./src/constants/null-value-resolver.ts","webpack://$DSTypeManager/./src/custom-key.ts","webpack://$DSTypeManager/./src/factories/index.ts","webpack://$DSTypeManager/./src/factories/type-factory.ts","webpack://$DSTypeManager/./src/functions/get-own-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-words.ts","webpack://$DSTypeManager/./src/functions/index.ts","webpack://$DSTypeManager/./src/functions/json-parse.ts","webpack://$DSTypeManager/./src/functions/json-stringify.ts","webpack://$DSTypeManager/./src/functions/name-of.ts","webpack://$DSTypeManager/./src/index.ts","webpack://$DSTypeManager/./src/inject-metadata.ts","webpack://$DSTypeManager/./src/inject-sorters/asc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/desc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/index.ts","webpack://$DSTypeManager/./src/inject-states/index.ts","webpack://$DSTypeManager/./src/inject-states/resolved-inject-state.ts","webpack://$DSTypeManager/./src/inject-states/unresolved-inject-state.ts","webpack://$DSTypeManager/./src/inject.ts","webpack://$DSTypeManager/./src/injectors/index.ts","webpack://$DSTypeManager/./src/injectors/singleton-injector.ts","webpack://$DSTypeManager/./src/logger-level.ts","webpack://$DSTypeManager/./src/logger.ts","webpack://$DSTypeManager/./src/metadata.ts","webpack://$DSTypeManager/./src/naming-conventions/camel-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/index.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/pascal-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/property-extension-metadata-ctor-set-key.ts","webpack://$DSTypeManager/./src/property-extension-metadata.ts","webpack://$DSTypeManager/./src/property-metadata.ts","webpack://$DSTypeManager/./src/property-sorters/asc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/desc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/index.ts","webpack://$DSTypeManager/./src/property-states/index.ts","webpack://$DSTypeManager/./src/property-states/resolved-property-state.ts","webpack://$DSTypeManager/./src/property-states/unresolved-property-state.ts","webpack://$DSTypeManager/./src/property.ts","webpack://$DSTypeManager/./src/reference-handlers/circular-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/index.ts","webpack://$DSTypeManager/./src/reference-handlers/json-path-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/plain-reference-handler.ts","webpack://$DSTypeManager/./src/serializer-context.ts","webpack://$DSTypeManager/./src/serializers/any-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-buffer-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-serializer.ts","webpack://$DSTypeManager/./src/serializers/boolean-serializer.ts","webpack://$DSTypeManager/./src/serializers/data-view-serializer.ts","webpack://$DSTypeManager/./src/serializers/date-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-64-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/index.ts","webpack://$DSTypeManager/./src/serializers/int-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/map-serializer.ts","webpack://$DSTypeManager/./src/serializers/number-serializer.ts","webpack://$DSTypeManager/./src/serializers/set-serializer.ts","webpack://$DSTypeManager/./src/serializers/string-serializer.ts","webpack://$DSTypeManager/./src/serializers/type-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-clamped-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/unknown-serializer.ts","webpack://$DSTypeManager/./src/type-extension-metadata-ctor-set-key.ts","webpack://$DSTypeManager/./src/type-extension-metadata.ts","webpack://$DSTypeManager/./src/type-manager.ts","webpack://$DSTypeManager/./src/type-metadata-symbol.ts","webpack://$DSTypeManager/./src/type-metadata.ts","webpack://$DSTypeManager/./src/type-scope.ts","webpack://$DSTypeManager/./src/type-states/index.ts","webpack://$DSTypeManager/./src/type-states/resolved-type-state.ts","webpack://$DSTypeManager/./src/type-states/unresolved-type-state.ts","webpack://$DSTypeManager/./src/type.ts","webpack://$DSTypeManager/./src/unknown.ts","webpack://$DSTypeManager/webpack/bootstrap","webpack://$DSTypeManager/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"$DSTypeManager\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"$DSTypeManager\"] = factory();\n\telse\n\t\troot[\"$DSTypeManager\"] = factory();\n})(this, () => {\nreturn ","/**\n * In type script there is no explicit class for any type but sometimes such serialization is required.\n * This simple class will allow direct serialization and deserialization. No transformations will be applied \n * for properties which specify it as a type argument.\n * \n * @type {Any}\n */\nexport class Any\n{\n \n}\n","import { DefaultValueResolver } from '../default-value-resolver';\n\n/**\n * Represents a default value resolver.\n * \n * @type {DefaultValueResolver}\n */\nexport const DEFAULT_VALUE_RESOLVER: DefaultValueResolver = () => undefined;\n","/**\n * Represents an empty array.\n * \n * @type {ReadonlyArray<any>}\n */\nexport const EMPTY_ARRAY: ReadonlyArray<any> = new Array<any>();\n","/**\n * Represents an empty map.\n * \n * @type {ReadonlyMap<any, any>}\n */\nexport const EMPTY_MAP: ReadonlyMap<any, any> = new Map<any, any>();\n","export * from './default-value-resolver';\nexport * from './empty-array';\nexport * from './empty-map';\nexport * from './null-value-resolver';\n","import { NullValueResolver } from '../null-value-resolver';\n\n/**\n * Represents a null value resolver.\n * \n * @type {NullValueResolver}\n */\nexport const NULL_VALUE_RESOLVER: NullValueResolver = () => null;\n","import { CustomValueResolver } from './custom-value-resolver';\nimport { Optional } from './optional';\n\n/**\n * Key used to describe custom value. Such key is explicitly defined and used\n * by type manager plugins to store strongly typed custom values within metadata.\n * \n * @type {CustomKey<TCustomValue>}\n */\nexport class CustomKey<TCustomValue>\n{\n /**\n * Description.\n * \n * @type {string}\n */\n public readonly description: string;\n \n /**\n * Custom value resolver.\n * \n * @type {Optional<CustomValueResolver<TCustomValue>>}\n */\n public readonly customValueResolver: Optional<CustomValueResolver<TCustomValue>>;\n \n /**\n * Constructor.\n * \n * @param {string} description Description.\n * @param {CustomValueResolver<TCustomValue>} customValueResolver Custom value resolver.\n */\n public constructor(description: string, customValueResolver?: CustomValueResolver<TCustomValue>)\n {\n this.description = description;\n this.customValueResolver = customValueResolver;\n\n return;\n }\n}\n","export * from './type-factory';\n","import { Factory } from '../factory';\nimport { Injector } from '../injector';\nimport { PropertyName } from '../property-name';\nimport { TypeCtor } from '../type-ctor';\nimport { TypeEntry } from '../type-entry';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Type factory.\n * \n * @type {TypeFactory}\n */\nexport class TypeFactory implements Factory\n{\n /**\n * Builds type described by provided type context.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * @param {ReadonlyMap<PropertyName, TypeEntry<TObject, any>>} typeEntryMap Type entry map.\n * @param {Injector} injector Injector.\n * \n * @returns {TObject} Object instance described by provided type context.\n */\n public build<TObject>(typeMetadata: TypeMetadata<TObject>, typeEntryMap: ReadonlyMap<PropertyName, TypeEntry<TObject, any>>, injector: Injector): TObject\n {\n const typeCtor = typeMetadata.typeFn as TypeCtor<TObject>;\n const typeState = typeMetadata.typeState;\n const injectedKeys = new Set<string>();\n const args = new Array<any>(typeCtor.length);\n\n for (let i = 0; i < typeState.sortedInjectMetadatas.length; i++)\n {\n const injectMetadata = typeState.sortedInjectMetadatas[i];\n const injectState = injectMetadata.injectState;\n const argKey = injectState.key;\n\n if (argKey === undefined)\n {\n args[injectMetadata.injectIndex] = injector.get(injectState.typeMetadata);\n\n continue;\n }\n\n const typeEntry = typeEntryMap.get(argKey);\n\n if (typeEntry !== undefined)\n {\n args[injectMetadata.injectIndex] = typeEntry.value;\n }\n\n injectedKeys.add(argKey);\n }\n \n const type = new typeCtor(...args) as any;\n\n for (const typeEntry of typeEntryMap.values())\n {\n const propertyMetadata = typeEntry.propertyMetadata;\n\n if (\n propertyMetadata !== undefined \n && typeEntry.value !== undefined \n && !injectedKeys.has(propertyMetadata.propertyName)\n )\n {\n type[propertyMetadata.propertyName] = typeEntry.value;\n }\n }\n\n return type;\n }\n}\n","/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect\n{\n /**\n * Gets metadata value of an own metadata key of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getOwnMetadata(metadataKey: string, target: any): any;\n}\n\n/**\n * Gets own reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getOwnReflectMetadata(metadataKey: string, target: any): any\n{\n if (typeof Reflect === 'object' && Reflect !== null && typeof Reflect.getOwnMetadata === 'function')\n {\n return Reflect.getOwnMetadata(metadataKey, target);\n }\n\n return undefined;\n}\n","/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect \n{\n /**\n * Gets metadata value of a metadata key on the prototype chain of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any;\n}\n\n/**\n * Gets reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getReflectMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any\n{\n if (typeof Reflect === 'object' && Reflect !== null && typeof Reflect.getMetadata === 'function')\n {\n return Reflect.getMetadata(metadataKey, target, propertyKey);\n }\n \n return undefined;\n}\n","import { EMPTY_ARRAY } from '../constants/empty-array';\n\n/** ------ Symbols and regular expressions used by words function ------ **/\nconst rsAstralRange = '\\\\ud800-\\\\udfff';\nconst rsComboMarksRange = '\\\\u0300-\\\\u036f';\nconst reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f';\nconst rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff';\nconst rsComboMarksExtendedRange = '\\\\u1ab0-\\\\u1aff';\nconst rsComboMarksSupplementRange = '\\\\u1dc0-\\\\u1dff';\nconst rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;\nconst rsDingbatRange = '\\\\u2700-\\\\u27bf';\nconst rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff';\nconst rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7';\nconst rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf';\nconst rsPunctuationRange = '\\\\u2000-\\\\u206f';\nconst rsSpaceRange = '\\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000';\nconst rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde';\nconst rsVarRange = '\\\\ufe0e\\\\ufe0f';\nconst rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\nconst rsApos = '[\\'\\\\u2019]';\nconst rsBreak = `[${rsBreakRange}]`;\nconst rsCombo = `[${rsComboRange}]`;\nconst rsDigit = '\\\\d';\nconst rsDingbat = `[${rsDingbatRange}]`;\nconst rsLower = `[${rsLowerRange}]`;\nconst rsMisc = `[^${rsAstralRange}${rsBreakRange + rsDigit + rsDingbatRange + rsLowerRange + rsUpperRange}]`;\nconst rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]';\nconst rsModifier = `(?:${rsCombo}|${rsFitz})`;\nconst rsNonAstral = `[^${rsAstralRange}]`;\nconst rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}';\nconst rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]';\nconst rsUpper = `[${rsUpperRange}]`;\nconst rsZWJ = '\\\\u200d';\nconst rsMiscLower = `(?:${rsLower}|${rsMisc})`;\nconst rsMiscUpper = `(?:${rsUpper}|${rsMisc})`;\nconst rsOptContrLower = `(?:${rsApos}(?:d|ll|m|re|s|t|ve))?`;\nconst rsOptContrUpper = `(?:${rsApos}(?:D|LL|M|RE|S|T|VE))?`;\nconst reOptMod = `${rsModifier}?`;\nconst rsOptVar = `[${rsVarRange}]?`;\nconst rsOptJoin = `(?:${rsZWJ}(?:${[rsNonAstral, rsRegional, rsSurrPair].join('|')})${rsOptVar + reOptMod})*`;\nconst rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])';\nconst rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])';\nconst rsSeq = rsOptVar + reOptMod + rsOptJoin;\nconst rsEmoji = `(?:${[rsDingbat, rsRegional, rsSurrPair].join('|')})${rsSeq}`;\nconst reA = `${rsUpper}?${rsLower}+${rsOptContrLower}(?=${[rsBreak, rsUpper, '$'].join('|')})`;\nconst reB = `${rsMiscUpper}+${rsOptContrUpper}(?=${[rsBreak, rsUpper + rsMiscLower, '$'].join('|')})`;\nconst reC = `${rsUpper}?${rsMiscLower}+${rsOptContrLower}`;\nconst reD = rsOrdUpper;\nconst reE = rsOrdLower;\nconst reF = `${rsDigit}+`;\nconst reG = rsEmoji;\nconst reUnicodeWord = new RegExp('[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9\\\\s]');\nconst reUnicodeWords = new RegExp([reA, reB, reC, reD, reE, reF, reG].join('|'), 'g');\nconst reAsciiWords = new RegExp('[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+', 'g');\n\n/**\n * Splits a Unicode string into an array of its words.\n * \n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nfunction getUnicodeWords(x: string): ReadonlyArray<string>\n{\n return x.match(reUnicodeWords) ?? EMPTY_ARRAY;\n}\n\n/**\n * Splits a ASCII string into an array of its words.\n *\n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nfunction getAsciiWords(x: string): ReadonlyArray<string>\n{\n return x.match(reAsciiWords) ?? EMPTY_ARRAY;\n}\n\n/**\n * Splits string into an array of its words.\n *\n * @param {string} x String.\n * \n * @returns {ReadonlyArray<string>} Readonly array with the words of provided string.\n */\nexport function getWords(x: string): ReadonlyArray<string>\n{\n return reUnicodeWord.test(x) ? getUnicodeWords(x) : getAsciiWords(x);\n}\n","export * from './get-own-reflect-metadata';\nexport * from './get-reflect-metadata';\nexport * from './get-words';\nexport * from './json-parse';\nexport * from './json-stringify';\nexport * from './name-of';\n","/**\n * Function which returns consistent results when parse JSON object.\n * \n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {any} Consistent JSON parse result.\n */\nexport function jsonParse(\n x: string,\n reviver?: (this: any, key: string, value: any) => any\n): any\n{\n return JSON.parse(x, reviver);\n}\n","/**\n * Function which returns consistent results when stringify JSON object.\n * \n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} Consistent JSON string which can be used for hashing.\n */\nexport function jsonStringify(\n x: any, \n replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null,\n space?: string | number\n): string\n{\n\tconst spacing = typeof space === 'number' ? new Array(isFinite(space) ? space + 1 : 0).join(' ') : (space ?? '');\n\tconst separator = spacing ? ': ' : ':';\n\tconst seen = new Set<any>();\n\t\n\tconst stringify = (parent: any, key: any, node: any, level: number): any =>\n {\n\t\tif (node && node.toJSON && typeof node.toJSON === 'function')\n {\n\t\t\tnode = node.toJSON();\n\t\t}\n\n\t\tif (replacer)\n\t\t{\n\t\t\tnode = replacer.call(parent, key, node);\n\t\t}\n\n\t\tif (node === undefined)\n {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof node === 'number')\n\t\t{\n\t\t\treturn isFinite(node) ? '' + node : 'null';\n\t\t}\n\n\t\tif (typeof node !== 'object')\n {\n\t\t\treturn JSON.stringify(node);\n\t\t}\n\n\t\tlet i = 0;\n\t\tlet indent = '';\n\t\tlet out = '';\n\n\t\tif (spacing)\n\t\t{\n\t\t\tindent += '\\n';\n\n\t\t\tfor (i = 0; i < level + 1; i++)\n\t\t\t{\n\t\t\t\tindent += spacing;\n\t\t\t}\n\t\t}\n\n\t\tif (Array.isArray(node))\n {\n\t\t\tout += '['; \n\n\t\t\tfor (i = 0; i < node.length; i++)\n {\n\t\t\t\tif (i) \n\t\t\t\t{\n\t\t\t\t\tout += ',';\n\t\t\t\t}\n\n\t\t\t\tconst value = stringify(node, i, node[i], level + 1) || 'null';\n\n\t\t\t\tout += indent + spacing + value;\n\t\t\t}\n\n\t\t\tout += indent;\n\t\t\tout += ']';\n\n\t\t\treturn out;\n\t\t}\n\n\t\tif (node === null)\n\t\t{\n\t\t\treturn 'null';\n\t\t}\n\n\t\tif (seen.has(node))\n {\n\t\t\tseen.delete(node);\n\n\t\t\treturn 'null';\n\t\t}\n\n\t\tseen.add(node);\n\n\t\tconst keys = Object.keys(node).sort();\n\n\t\tfor (i = 0; i < keys.length; i++)\n {\n\t\t\tconst key = keys[i];\n\t\t\tconst value = stringify(node, key, node[key], level + 1);\n\n\t\t\tif (!value) \n {\n continue; \n }\n\n\t\t\tif (out)\n\t\t\t{\n\t\t\t\tout += ',';\n\t\t\t}\n\n\t\t\tout += indent + spacing + JSON.stringify(key) + separator + value;\n\t\t}\n\n\t\tseen.delete(node);\n\n\t\treturn '{' + out + indent + '}';\n\t};\n\t\n\treturn stringify({ '': x }, '', x, 0);\n}\n","/**\n * Defines name for any value.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} Name when present. Unknown otherwise.\n */\nexport function nameOf(x: any): string\n{\n return typeof x === 'function' ? x.name : 'Unknown';\n}\n","export * from './constants';\nexport * from './factories';\nexport * from './functions';\nexport * from './inject-sorters';\nexport * from './inject-states';\nexport * from './injectors';\nexport * from './naming-conventions';\nexport * from './property-sorters';\nexport * from './property-states';\nexport * from './reference-handlers';\nexport * from './serializers';\nexport * from './type-states';\nexport * from './alias';\nexport * from './any';\nexport * from './custom-key';\nexport * from './custom-option';\nexport * from './custom-value-resolver';\nexport * from './custom-value';\nexport * from './default-value-resolver';\nexport * from './default-value';\nexport * from './discriminant';\nexport * from './discriminator';\nexport * from './factory';\nexport * from './generic-argument';\nexport * from './generic-metadata';\nexport * from './inject-decorator';\nexport * from './inject-index';\nexport * from './inject-metadata';\nexport * from './inject-options';\nexport * from './inject-sorter';\nexport * from './inject-state';\nexport * from './inject';\nexport * from './injector';\nexport * from './logger-level';\nexport * from './logger';\nexport * from './metadata';\nexport * from './naming-convention';\nexport * from './null-value-resolver';\nexport * from './nullable';\nexport * from './optional';\nexport * from './property-decorator';\nexport * from './property-extension-metadata-ctor-set-key';\nexport * from './property-extension-metadata-ctor';\nexport * from './property-extension-metadata';\nexport * from './property-extension-options';\nexport * from './property-metadata';\nexport * from './property-name';\nexport * from './property-options';\nexport * from './property-sorter';\nexport * from './property-state';\nexport * from './property';\nexport * from './reference-callback';\nexport * from './reference-handler';\nexport * from './reference-key';\nexport * from './reference-value-getter';\nexport * from './reference-value-setter';\nexport * from './reference-value';\nexport * from './serializer-context';\nexport * from './serializer';\nexport * from './type-abstraction';\nexport * from './type-argument';\nexport * from './type-configuration';\nexport * from './type-ctor';\nexport * from './type-decorator';\nexport * from './type-entry';\nexport * from './type-extension-metadata-ctor-set-key';\nexport * from './type-extension-metadata-ctor';\nexport * from './type-extension-metadata';\nexport * from './type-extension-options';\nexport * from './type-fn';\nexport * from './type-like';\nexport * from './type-manager-options';\nexport * from './type-manager';\nexport * from './type-metadata-symbol';\nexport * from './type-metadata';\nexport * from './type-name';\nexport * from './type-options-base';\nexport * from './type-options';\nexport * from './type-resolver';\nexport * from './type-scope';\nexport * from './type-state';\nexport * from './type';\nexport * from './unknown';\n","import { Alias } from './alias';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { InjectState } from './inject-state';\nimport { ResolvedInjectState } from './inject-states/resolved-inject-state';\nimport { UnresolvedInjectState } from './inject-states/unresolved-inject-state';\nimport { Metadata } from './metadata';\nimport { Optional } from './optional';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Main class used to describe an injection.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\nexport class InjectMetadata<TDeclaringObject, TObject> extends Metadata\n{\n /**\n * Type metadata to which inject metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringObject>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringObject>;\n\n /**\n * Index of injection within a type constructor function.\n * \n * @type {InjectIndex}\n */\n public readonly injectIndex: InjectIndex;\n\n /**\n * Inject options.\n * \n * @type {InjectOptions<TObject>}\n */\n private readonly injectOptions: InjectOptions<TObject>;\n\n /**\n * Type function defined using reflect metadata.\n * \n * @type {Optional<TypeFn<TObject>>}\n */\n private readonly reflectTypeFn: Optional<TypeFn<TObject>>;\n\n /**\n * Current inject state.\n * \n * @type {InjectState<TDeclaringObject, TObject>}\n */\n private currentInjectState: InjectState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {TypeMetadata<TDeclaringObject>} declaringTypeMetadata Type metadata to which inject metadata belongs to.\n * @param {InjectIndex} injectIndex Index of injection within a type constructor function.\n * @param {InjectOptions<TObject>} injectOptions Inject options.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: ReadonlyMap<Alias, TypeFn<any>>,\n declaringTypeMetadata: TypeMetadata<TDeclaringObject>, \n injectIndex: InjectIndex,\n injectOptions: InjectOptions<TObject>\n )\n {\n super(typeManager, typeFnMap);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.injectIndex = injectIndex;\n this.injectOptions = injectOptions;\n this.reflectTypeFn = (getOwnReflectMetadata('design:paramtypes', declaringTypeMetadata.typeFn) ?? EMPTY_ARRAY)[injectIndex];\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n this.configure(injectOptions);\n\n return;\n }\n\n /**\n * Gets inject state.\n * \n * @returns {InjectState<TDeclaringObject, TObject>} Inject state.\n */\n public get injectState(): InjectState<TDeclaringObject, TObject>\n {\n return this.currentInjectState;\n }\n\n /**\n * Gets key.\n * \n * @returns {Optional<string>} Key or undefined.\n */\n public get key(): Optional<string>\n {\n return this.currentInjectState.key;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n return this.currentInjectState.typeArgument;\n }\n\n /**\n * Gets inject type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.currentInjectState.typeMetadata;\n }\n\n /**\n * Resolves inject state.\n * \n * Calling this method has side effects by recomputing injection state. If you need current\n * inject state then use provided getter for that.\n * \n * @returns {ResolvedInjectState<TDeclaringObject, TObject>} Resolved inject state.\n */\n public resolveInjectState(): ResolvedInjectState<TDeclaringObject, TObject>\n {\n const injectOptions = this.injectOptions;\n const key = injectOptions.key;\n const typeArgument = injectOptions.typeArgument === undefined ? this.reflectTypeFn : injectOptions.typeArgument;\n const typeMetadata = this.resolveTypeMetadata(typeArgument);\n const resolvedInjectState = new ResolvedInjectState<TDeclaringObject, TObject>(this, key, typeArgument, typeMetadata);\n\n this.currentInjectState = resolvedInjectState;\n\n return resolvedInjectState;\n }\n\n /**\n * Unresolves inject state.\n * \n * Calling this method has side effects by resetting inject state. \n * \n * @returns {UnresolvedInjectState<TDeclaringObject, TObject>} Unresolved inject state.\n */\n public unresolveInjectState(): UnresolvedInjectState<TDeclaringObject, TObject>\n {\n const unresolvedInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n this.currentInjectState = unresolvedInjectState;\n\n return unresolvedInjectState;\n }\n\n /**\n * Configures key.\n * \n * @param {Optional<string>} key Key or undefined.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public hasKey(key: Optional<string>): this\n {\n this.injectOptions.key = key;\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures type argument.\n * \n * @param {Optional<TypeArgument<TObject>>} typeArgument Type argument or undefined.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public hasTypeArgument(typeArgument: Optional<TypeArgument<TObject>>): this\n {\n this.injectOptions.typeArgument = typeArgument;\n this.currentInjectState = new UnresolvedInjectState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures inject metadata based on provided options.\n * \n * @param {InjectOptions<TObject>} injectOptions Inject options.\n * \n * @returns {this} Current instance of inject metadata.\n */\n public configure(injectOptions: InjectOptions<TObject>): this\n {\n if (injectOptions.key !== undefined)\n {\n this.hasKey(injectOptions.key);\n }\n\n if (injectOptions.typeArgument !== undefined)\n {\n this.hasTypeArgument(injectOptions.typeArgument);\n }\n\n return this;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents asc inject sorter which sorts type injects in\n * ascending order by index.\n * \n * @type {AscInjectSorter}\n */\nexport class AscInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TObject, any>} x First inject.\n * @param {InjectMetadata<TObject, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: InjectMetadata<TObject, any>, y: InjectMetadata<TObject, any>): number\n {\n return x.injectIndex - y.injectIndex;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents desc inject sorter which sorts type injects in\n * descending order by index.\n * \n * @type {DescInjectSorter}\n */\nexport class DescInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TObject, any>} x First inject.\n * @param {InjectMetadata<TObject, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: InjectMetadata<TObject, any>, y: InjectMetadata<TObject, any>): number\n {\n return y.injectIndex - x.injectIndex;\n }\n}\n","export * from './asc-inject-sorter';\nexport * from './desc-inject-sorter';\n","export * from './resolved-inject-state';\nexport * from './unresolved-inject-state';\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectState } from '../inject-state';\nimport { Optional } from '../optional';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Represents resolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\nexport class ResolvedInjectState<TDeclaringObject, TObject> implements InjectState<TDeclaringObject, TObject>\n{\n /**\n * Inject metadata for which state is defined.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\n public readonly injectMetadata: InjectMetadata<TDeclaringObject, TObject>;\n\n /**\n * Parameter key to inject within a type context.\n * \n * @type {Optional<string>}\n */\n public readonly key: Optional<string>;\n\n /**\n * Type argument of the injection.\n * \n * @type {TypeArgument<TObject>}\n */\n public readonly typeArgument: TypeArgument<TObject>;\n\n /**\n * Type metadata of the injection.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Constructor.\n * \n * @param {InjectMetadata<TDeclaringObject, TObject>} injectMetadata Inject metadata for which state is defined.\n * @param {Optional<string>} key Parameter key to inject within a type context.\n * @param {TypeArgument<TObject>} typeArgument Type argument of the injection.\n * @param {TypeMetadata<TObject>} typeMetadata Type metadata of the injection.\n */\n public constructor(\n injectMetadata: InjectMetadata<TDeclaringObject, TObject>,\n key: Optional<string>,\n typeArgument: TypeArgument<TObject>,\n typeMetadata: TypeMetadata<TObject>\n )\n {\n this.injectMetadata = injectMetadata;\n this.key = key;\n this.typeArgument = typeArgument;\n this.typeMetadata = typeMetadata;\n\n return;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectState } from '../inject-state';\nimport { Optional } from '../optional';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\nimport { ResolvedInjectState } from './resolved-inject-state';\n\n/**\n * Represents unresolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\nexport class UnresolvedInjectState<TDeclaringObject, TObject> implements InjectState<TDeclaringObject, TObject>\n{\n /**\n * Inject metadata for which state is defined.\n * \n * @type {InjectMetadata<TDeclaringObject, TObject>}\n */\n public readonly injectMetadata: InjectMetadata<TDeclaringObject, TObject>;\n \n /**\n * Resolved inject state.\n * \n * @type {ResolvedInjectState<TDeclaringObject, TObject>}\n */\n private resolvedInjectState?: ResolvedInjectState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {InjectMetadata<TDeclaringObject, TObject>} injectMetadata Inject metadata for which state is defined.\n */\n public constructor(injectMetadata: InjectMetadata<TDeclaringObject, TObject>)\n {\n this.injectMetadata = injectMetadata;\n\n return;\n }\n\n /**\n * Gets parameter key to inject within a type context.\n * \n * @returns {Optional<string>} Key.\n */\n public get key(): Optional<string>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.key;\n }\n\n /**\n * Gets type argument of the injection.\n * \n * @type {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.typeArgument;\n }\n\n /**\n * Gets type metadata of the injection.\n * \n * @type {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n let resolvedInjectState = this.resolvedInjectState;\n\n if (resolvedInjectState === undefined)\n {\n resolvedInjectState = this.injectMetadata.resolveInjectState();\n\n this.resolvedInjectState = resolvedInjectState;\n }\n\n return resolvedInjectState.typeMetadata;\n }\n}\n","import { nameOf } from './functions/name-of';\nimport { InjectDecorator } from './inject-decorator';\nimport { InjectOptions } from './inject-options';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\n\n/**\n * Inject decorator.\n * \n * @param {InjectOptions<TObject>|TypeArgument<TObject>|string} x Inject options, type argument or key from the type context.\n * \n * @returns {InjectDecorator} Inject decorator.\n */\nexport function Inject<TObject>(x?: InjectOptions<TObject> | TypeArgument<TObject> | string): InjectDecorator\n{\n const injectOptions = (typeof x === 'object' ? x : {}) as InjectOptions<TObject>;\n\n if (injectOptions.key === undefined && typeof x === 'string')\n {\n injectOptions.key = x as string;\n }\n\n if (injectOptions.typeArgument === undefined && typeof x === 'function')\n {\n injectOptions.typeArgument = x as TypeArgument<TObject>;\n }\n \n return function (target: any, propertyName: string | symbol | undefined, injectIndex: number): void\n {\n if (typeof target === 'function' && target.name === '')\n {\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: inject decorator cannot be applied to a method.`);\n }\n \n if (typeof injectIndex !== 'number')\n {\n throw new Error(`${nameOf(target)}.${String(propertyName)}: inject decorator cannot be applied to a property.`);\n }\n \n const typeFn = target as TypeFn<any>;\n \n TypeManager.configureTypeMetadata(typeFn).configureInjectMetadata(injectIndex, injectOptions);\n\n return;\n };\n}\n","export * from './singleton-injector';\n","import { Injector } from '../injector';\nimport { TypeCtor } from '../type-ctor';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Singleton injector.\n * \n * @type {SingletonInjector}\n */\nexport class SingletonInjector implements Injector\n{\n /**\n * Map with resolved types.\n * \n * @type {WeakMap<TypeMetadata<any>, any>}\n */\n private readonly instanceMap: WeakMap<TypeMetadata<any>, any> = new WeakMap<TypeMetadata<any>, any>();\n\n /**\n * Method to get instance described by type metadata.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * \n * @returns {TObject} Instance of type described by type metadata or undefined.\n */\n public get<TObject>(typeMetadata: TypeMetadata<TObject>): TObject | undefined\n {\n if (!typeMetadata.injectable)\n {\n throw new Error(`${typeMetadata.typeName}: cannot resolve type! Have you registered it as injectable?`);\n }\n\n const instance = this.instanceMap.get(typeMetadata);\n\n if (instance === undefined)\n {\n return this.init(typeMetadata);\n }\n\n return instance;\n }\n\n /**\n * Creates instance described by type metadata.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * \n * @returns {TObject} Type instance described by type metadata.\n */\n private init<TObject>(typeMetadata: TypeMetadata<TObject>): TObject\n {\n const typeCtor = typeMetadata.typeFn as TypeCtor<TObject>;\n const args = new Array<any>(typeCtor.length);\n const sortedInjectMetadatas = typeMetadata.sortedInjectMetadatas;\n\n for (let i = 0; i < sortedInjectMetadatas.length; i++)\n {\n args[sortedInjectMetadatas[i].injectIndex] = this.get(sortedInjectMetadatas[i].typeMetadata);\n }\n \n const instance = new typeCtor(...args);\n\n this.instanceMap.set(typeMetadata, instance);\n\n return instance;\n }\n}\n","/**\n * Logger level.\n * \n * @type {LoggerLevel}\n */\nexport enum LoggerLevel\n{\n /**\n * All details are displayed. On this level everything\n * is logged including info, warn and errors.\n */\n Debug = 0,\n\n /**\n * Important details are displayed. Debug messages are not shown.\n * On this level warn and errors are included.\n */\n Info = 1,\n\n /**\n * Warning and errors are displayed without debug and info\n * messages.\n */\n Warn = 2,\n\n /**\n * Only errors are displayed.\n */\n Error = 3,\n\n /**\n * Nothing is displayed. All messages are hidden.\n */\n None = 4\n}\n","import { LoggerLevel } from './logger-level';\n\n/**\n * Main logger class used for displaying messages.\n * \n * @type {Logger}\n */\nexport class Logger\n{\n /**\n * Logger level defines what kind of messages should be displayed in the console.\n * \n * @type {LoggerLevel}\n */\n private readonly loggerLevel: LoggerLevel;\n \n /**\n * Debug disabled?\n * \n * @type {boolean}\n */\n private readonly debugDisabled: boolean;\n\n /**\n * Info disabled?\n * \n * @type {boolean}\n */\n private readonly infoDisabled: boolean;\n\n /**\n * Warn disabled?\n * \n * @type {boolean}\n */\n private readonly warnDisabled: boolean;\n\n /**\n * Error disabled?\n * \n * @type {boolean}\n */\n private readonly errorDisabled: boolean;\n\n /**\n * Supports console?\n * \n * @type {boolean}\n */\n private readonly supportsConsole: boolean;\n\n /**\n * Supports console log?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleLog: boolean;\n\n /**\n * Supports console info?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleInfo: boolean;\n\n /**\n * Supports console warn?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleWarn: boolean;\n\n /**\n * Supports console error?\n * \n * @type {boolean}\n */\n private readonly supportsConsoleError: boolean;\n\n /**\n * Constructor.\n * \n * @param {LoggerLevel} loggerLevel Logger level.\n */\n public constructor(loggerLevel: LoggerLevel)\n {\n this.loggerLevel = loggerLevel;\n this.debugDisabled = this.loggerLevel > LoggerLevel.Debug;\n this.infoDisabled = this.loggerLevel > LoggerLevel.Info;\n this.warnDisabled = this.loggerLevel > LoggerLevel.Warn;\n this.errorDisabled = this.loggerLevel > LoggerLevel.Error;\n this.supportsConsole = console !== undefined && console !== null;\n this.supportsConsoleLog = this.supportsConsole && console.log !== undefined && console.log !== null;\n this.supportsConsoleInfo = this.supportsConsole && console.info !== undefined && console.info !== null;\n this.supportsConsoleWarn = this.supportsConsole && console.warn !== undefined && console.warn !== null;\n this.supportsConsoleError = this.supportsConsole && console.error !== undefined && console.error !== null;\n\n return;\n }\n\n /**\n * Formats message based on component and level.\n * \n * @param {string} component Component which logs the message.\n * @param {string} loggerLevel Logger level.\n * @param {string} message Message to display.\n * \n * @returns {string} Formatted message.\n */\n private format(component: string, loggerLevel: string, message: string): string\n {\n return `[${component}][${loggerLevel}]: ${message}`;\n }\n\n /**\n * Displays debug message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public debug(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.debugDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const debugMessage = this.format(component, 'Debug', message);\n\n console.log(debugMessage, ...optionalParams);\n\n return;\n }\n\n return;\n }\n\n /**\n * Displays info message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public info(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.infoDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleInfo)\n {\n const infoMessage = this.format(component, 'Info', message);\n\n console.info(infoMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const infoMessage = this.format(component, 'Info', message);\n\n console.log(infoMessage, ...optionalParams);\n\n return;\n }\n\n return;\n }\n\n /**\n * Displays warn message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public warn(component: string, message: any, ...optionalParams: ReadonlyArray<any>): void\n {\n if (this.warnDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleWarn)\n {\n const warnMessage = this.format(component, 'Warn', message);\n\n console.warn(warnMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const warnMessage = this.format(component, 'Warn', message);\n\n console.log(warnMessage, ...optionalParams);\n \n return;\n }\n\n return;\n }\n\n /**\n * Displays error message.\n * \n * @param {string} component Component which logs the message.\n * @param {string} message Message to display.\n * @param {ReadonlyArray<any>} optionalParams Optional data related to a message.\n * \n * @returns {void} Nothing.\n */\n public error(component: string, message: string, ...optionalParams: ReadonlyArray<any>): void \n {\n if (this.errorDisabled)\n {\n return;\n }\n\n if (this.supportsConsoleError)\n {\n const errorMessage = this.format(component, 'Error', message);\n\n console.error(errorMessage, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n const errorMessage = this.format(component, 'Error', message);\n\n console.log(errorMessage, ...optionalParams);\n \n return;\n }\n\n return;\n }\n}\n","import { Alias } from './alias';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeResolver } from './type-resolver';\nimport { Unknown } from './unknown';\n\n/**\n * Metadata class.\n * \n * Encapsulates common methods and properties which can be used by all types of metadata.\n * \n * @type {Metadata}\n */\nexport class Metadata\n{\n /**\n * Type manager.\n * \n * @type {TypeManager}\n */\n public readonly typeManager: TypeManager;\n\n /**\n * Type function map for types with aliases.\n * \n * @type {ReadonlyMap<Alias, TypeFn<any>>}\n */\n private readonly typeFnMap: ReadonlyMap<Alias, TypeFn<any>>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n */\n public constructor(typeManager: TypeManager, typeFnMap: ReadonlyMap<Alias, TypeFn<any>>)\n {\n this.typeManager = typeManager;\n this.typeFnMap = typeFnMap;\n\n return;\n }\n\n /**\n * Resolves type metadatas for provided type arguments.\n * \n * @param {ReadonlyArray<TypeArgument<any>>} typeArguments Type arguments.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved type metadatas.\n */\n public resolveTypeMetadatas(typeArguments: ReadonlyArray<TypeArgument<any>>): ReadonlyArray<TypeMetadata<any>>\n {\n const typeMetadatas = new Array<TypeMetadata<any>>(typeArguments.length);\n\n for (let i = 0; i < typeArguments.length; i++)\n {\n typeMetadatas[i] = this.resolveTypeMetadata(typeArguments[i]);\n }\n\n return typeMetadatas;\n }\n\n /**\n * Resolves type metadata for provided type argument.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Resolved type metadata.\n */\n public resolveTypeMetadata(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n if (typeof typeArgument === 'function')\n {\n if (typeArgument.name === '')\n {\n return this.resolveTypeMetadataUsingTypeResolver(typeArgument);\n }\n\n return this.resolveTypeMetadataUsingTypeFn(typeArgument);\n }\n\n if (typeof typeArgument === 'string')\n {\n return this.resolveTypeMetadataUsingAlias(typeArgument);\n }\n\n return this.resolveTypeMetadataUsingUnknownTypeFn();\n }\n\n /**\n * Resolves type metadata using type resolver.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type resolver.\n */\n private resolveTypeMetadataUsingTypeResolver(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeResolver = typeArgument as TypeResolver<any>;\n\n return this.typeManager.extractTypeMetadata(typeResolver());\n }\n\n /**\n * Resolves type metadata using type function.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type function.\n */\n private resolveTypeMetadataUsingTypeFn(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeFn = typeArgument as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using alias.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using alias.\n */\n private resolveTypeMetadataUsingAlias(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const alias = typeArgument as Alias;\n const typeFn = this.typeFnMap.get(alias);\n\n if (typeFn === undefined)\n {\n this.typeManager.logger.error('Metadata', 'Cannot resolve type metadata for provided type alias.', alias);\n this.typeManager.logger.info('Metadata', 'Check if a type exists that defines such an alias. In the meantime, metadata for an unknown type will be used.');\n\n return this.resolveTypeMetadataUsingUnknownTypeFn();\n }\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using unknown type function.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using unknown type function.\n */\n private resolveTypeMetadataUsingUnknownTypeFn(): TypeMetadata<any>\n {\n const typeFn = Unknown as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves generic metadatas based on provided generic arguments.\n * \n * @param {ReadonlyArray<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Resolved generic metadatas.\n */\n public resolveGenericMetadatas(genericArguments: ReadonlyArray<GenericArgument<any>>): ReadonlyArray<GenericMetadata<any>>\n {\n const genericMetadatas = new Array<GenericMetadata<any>>(genericArguments.length);\n\n for (let i = 0; i < genericArguments.length; i++)\n {\n const genericArgument = genericArguments[i];\n\n if (Array.isArray(genericArgument))\n {\n genericMetadatas[i] = [\n this.resolveTypeMetadata(genericArgument[0]),\n this.resolveGenericMetadatas(genericArgument[1])\n ];\n\n continue;\n }\n \n genericMetadatas[i] = [\n this.resolveTypeMetadata(genericArgument),\n EMPTY_ARRAY\n ];\n }\n\n return genericMetadatas;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Camel case naming convention.\n * \n * @type {CamelCaseNamingConvention}\n */\nexport class CamelCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat case naming convention.\n * \n * @type {FlatCaseNamingConvention}\n */\nexport class FlatCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toLowerCase()}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat upper case naming convention.\n * \n * @type {FlatUpperCaseNamingConvention}\n */\nexport class FlatUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toUpperCase()}`;\n }\n}\n","export * from './camel-case-naming-convention';\nexport * from './flat-case-naming-convention';\nexport * from './flat-upper-case-naming-convention';\nexport * from './kebab-case-naming-convention';\nexport * from './kebab-upper-case-naming-convention';\nexport * from './pascal-case-naming-convention';\nexport * from './snake-case-naming-convention';\nexport * from './snake-upper-case-naming-convention';\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab case naming convention.\n * \n * @type {KebabCaseNamingConvention}\n */\nexport class KebabCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}-${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab upper naming case.\n * \n * @type {KebabUpperCaseNamingConvention}\n */\nexport class KebabUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}-${wordUpperCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Pascal case naming convention.\n * \n * @type {PascalCaseNamingConvention}\n */\nexport class PascalCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n const wordPascalCased = `${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n\n if (index === 0)\n {\n return wordPascalCased;\n }\n\n return `${result}${wordPascalCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake case naming convention.\n *\n * @type {SnakeCaseNamingConvention}\n */\nexport class SnakeCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}_${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake upper case naming convention.\n * \n * @type {SnakeUpperCaseNamingConvention}\n */\nexport class SnakeUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}_${wordUpperCased}`;\n }\n}\n","import { CustomKey } from './custom-key';\nimport { PropertyExtensionMetadataCtor } from './property-extension-metadata-ctor';\n\n/**\n * Property extension metadata constructor set key.\n * \n * @type {CustomKey<Set<PropertyExtensionMetadataCtor<any, any, any>>>}\n */\nexport const PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY: CustomKey<Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>> = new CustomKey<Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>>('$DSPropertyExtensionMetadataCtorSet', () => new Set<\n PropertyExtensionMetadataCtor<any, any, any, any>\n>());\n","import { PropertyExtensionOptions } from './property-extension-options';\nimport { PropertyMetadata } from './property-metadata';\n\n/**\n * Property extension metadata used by plugins to provide additional features for property metadata \n * using custom keys. Descendant classes are just wrappers to get convenient access to custom value map.\n * \n * @type {PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>}\n */\nexport abstract class PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions extends PropertyExtensionOptions>\n{\n /**\n * Property metadata which we extend.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata which we extend.\n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n */\n public constructor(propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>, propertyExtensionOptions: TPropertyExtensionOptions)\n {\n this.propertyMetadata = propertyMetadata;\n\n this.configure(propertyExtensionOptions);\n\n return;\n }\n \n /**\n * Configures property extension.\n * \n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n * \n * @returns {this} Property extension metadata.\n */\n public abstract configure(propertyExtensionOptions: TPropertyExtensionOptions): this;\n}\n","import { Alias } from './alias';\nimport { DEFAULT_VALUE_RESOLVER } from './constants/default-value-resolver';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { EMPTY_MAP } from './constants/empty-map';\nimport { NULL_VALUE_RESOLVER } from './constants/null-value-resolver';\nimport { CustomKey } from './custom-key';\nimport { CustomOption } from './custom-option';\nimport { CustomValue } from './custom-value';\nimport { DefaultValue } from './default-value';\nimport { getReflectMetadata } from './functions/get-reflect-metadata';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyExtensionMetadata } from './property-extension-metadata';\nimport { PropertyExtensionMetadataCtor } from './property-extension-metadata-ctor';\nimport { PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY } from './property-extension-metadata-ctor-set-key';\nimport { PropertyExtensionOptions } from './property-extension-options';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { PropertyState } from './property-state';\nimport { ResolvedPropertyState } from './property-states/resolved-property-state';\nimport { UnresolvedPropertyState } from './property-states/unresolved-property-state';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeState } from './type-state';\n\n/**\n * Main class used to describe a certain property.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\nexport class PropertyMetadata<TDeclaringObject, TObject> extends Metadata\n{\n /**\n * Type metadata to which property metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringObject>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringObject>;\n\n /**\n * Property name as declared in type.\n * \n * @type {PropertyName}\n */\n public readonly propertyName: PropertyName;\n\n /**\n * Normalized property name used for sorting.\n * \n * @type {PropertyName}\n */\n public readonly normalizedPropertyName: PropertyName;\n\n /**\n * Property options.\n * \n * @type {PropertyOptions<TObject>}\n */\n private readonly propertyOptions: PropertyOptions<TObject>;\n\n /**\n * Type function defined using reflect metadata.\n * \n * @type {Optional<TypeFn<TObject>>}\n */\n private readonly reflectTypeFn: Optional<TypeFn<TObject>>;\n\n /**\n * Current property state.\n * \n * @type {PropertyState<TDeclaringObject, TObject>}\n */\n private currentPropertyState: PropertyState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {TypeMetadata<TDeclaringObject>} declaringTypeMetadata Type metadata to which property metadata belongs to.\n * @param {PropertyName} propertyName Property name.\n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: ReadonlyMap<Alias, TypeFn<any>>,\n declaringTypeMetadata: TypeMetadata<TDeclaringObject>, \n propertyName: PropertyName,\n propertyOptions: PropertyOptions<TObject>\n )\n {\n super(typeManager, typeFnMap);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.propertyName = propertyName;\n this.normalizedPropertyName = propertyName.toLocaleLowerCase();\n this.reflectTypeFn = getReflectMetadata('design:type', declaringTypeMetadata.typeFn.prototype, propertyName);\n this.propertyOptions = this.constructPropertyOptions(propertyOptions);\n this.currentPropertyState = new UnresolvedPropertyState(this);\n\n this.configure(propertyOptions);\n\n return;\n }\n\n /**\n * Gets property state.\n * \n * @returns {PropertyState<TDeclaringObject, TObject>} Property state.\n */\n public get propertyState(): PropertyState<TDeclaringObject, TObject>\n {\n return this.currentPropertyState;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias or undefined.\n */\n public get alias(): Optional<Alias>\n {\n return this.currentPropertyState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n return this.currentPropertyState.customValueMap;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): Nullable<any>\n {\n return this.currentPropertyState.serializedNullValueResolver();\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n return this.currentPropertyState.serializedDefaultValueResolver();\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n return this.currentPropertyState.deserializedNullValueResolver();\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n return this.currentPropertyState.deserializedDefaultValueResolver();\n }\n\n /**\n * Gets serialized property name.\n * \n * @returns {string} Serialized property name.\n */\n public get serializedPropertyName(): string\n {\n return this.currentPropertyState.serializedPropertyName;\n }\n\n /**\n * Gets deserialized property name.\n * \n * @returns {string} Deserialized property name.\n */\n public get deserializedPropertyName(): string\n {\n return this.currentPropertyState.deserializedPropertyName;\n }\n\n /**\n * Gets deserializable value.\n * \n * @returns {boolean} Deserializable indicator.\n */\n public get deserializable(): boolean\n {\n return this.currentPropertyState.deserializable;\n }\n\n /**\n * Gets generic arguments.\n * \n * @returns {ReadonlyArray<GenericArgument<any>>} Generic arguments.\n */\n public get genericArguments(): ReadonlyArray<GenericArgument<any>>\n {\n return this.currentPropertyState.genericArguments;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Generic metadatas.\n */\n public get genericMetadatas(): ReadonlyArray<GenericMetadata<any>>\n {\n return this.currentPropertyState.genericMetadatas;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention or undefined.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n return this.currentPropertyState.namingConvention;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler \n {\n return this.currentPropertyState.referenceHandler;\n }\n\n /**\n * Gets serializable value.\n * \n * @returns {boolean} Serializable indicator.\n */\n public get serializable(): boolean\n {\n return this.currentPropertyState.serializable;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject> \n {\n return this.currentPropertyState.serializer;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n return this.currentPropertyState.typeArgument;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.currentPropertyState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.currentPropertyState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value indicator.\n */\n public get useDefaultValue(): boolean\n {\n return this.currentPropertyState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion indicator.\n */\n public get useImplicitConversion(): boolean\n {\n return this.currentPropertyState.useImplicitConversion;\n }\n\n /**\n * Constructs initial property options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n * \n * @returns {PropertyOptions<TObject>} Constructed type options.\n */\n private constructPropertyOptions(propertyOptions: PropertyOptions<TObject>): PropertyOptions<TObject>\n {\n if (propertyOptions.customValueMap === undefined)\n {\n propertyOptions.customValueMap = new Map<CustomKey<any>, CustomValue>();\n }\n\n return propertyOptions;\n }\n\n /**\n * Configures property extension metadata.\n * \n * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.\n * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.\n * \n * @returns {TPropertyExtensionMetadata} Property extension metadata\n */\n public configurePropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(\n propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>, \n propertyExtensionOptions?: TPropertyExtensionOptions\n ): TPropertyExtensionMetadata\n {\n const propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();\n\n if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor))\n {\n propertyExtensionMetadataCtorSet.add(propertyExtensionMetadataCtor);\n }\n\n const initialPropertyExtensionOptions = propertyExtensionOptions ?? {} as TPropertyExtensionOptions;\n const propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);\n\n return propertyExtensionMetadata;\n }\n\n /**\n * Extracts property extension metadata.\n * \n * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.\n * \n * @returns {Optional<TPropertyExtensionMetadata>} Property extension metadata or undefined.\n */\n public extractPropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(\n propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>\n ): Optional<TPropertyExtensionMetadata>\n {\n const propertyExtensionMetadataCtorSet = this.extractPropertyExtensionMetadataCtorSet();\n \n if (!propertyExtensionMetadataCtorSet.has(propertyExtensionMetadataCtor))\n {\n return undefined;\n }\n\n const initialPropertyExtensionOptions = {} as TPropertyExtensionOptions;\n const propertyExtensionMetadata = new propertyExtensionMetadataCtor(this, initialPropertyExtensionOptions);\n\n return propertyExtensionMetadata;\n }\n\n /**\n * Extracts property extension metadata ctor set from custom value map.\n * \n * @returns {Set<PropertyExtensionMetadataCtor<any, any, any, any>>} Property extension metadata ctor set.\n */\n private extractPropertyExtensionMetadataCtorSet(): Set<PropertyExtensionMetadataCtor<any, any, any, any>>\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n let propertyExtensionMetadataCtorSet = customValueMap.get(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY) as Optional<Set<PropertyExtensionMetadataCtor<any, any, any, any>>>;\n\n if (propertyExtensionMetadataCtorSet === undefined)\n {\n propertyExtensionMetadataCtorSet = new Set<PropertyExtensionMetadataCtor<any, any, any, any>>();\n\n customValueMap.set(PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY, propertyExtensionMetadataCtorSet);\n }\n\n return propertyExtensionMetadataCtorSet;\n }\n\n /**\n * Resolves property state.\n * \n * Calling this method has side effects by recomputing property state. If you need current\n * type state then use provided getter for that.\n * \n * @returns {ResolvedPropertyState<TDeclaringObject, TObject>} Resolved property state.\n */\n public resolvePropertyState(): ResolvedPropertyState<TDeclaringObject, TObject>\n {\n const propertyOptions = this.propertyOptions;\n const propertyName = this.propertyName;\n const alias = propertyOptions.alias;\n const deserializedPropertyName = propertyName;\n\n const typeArgument = propertyOptions.typeArgument === undefined \n ? this.reflectTypeFn \n : propertyOptions.typeArgument;\n\n const typeMetadata = this.resolveTypeMetadata(typeArgument);\n const typeState = typeMetadata.typeState;\n const customValueMap = this.resolveCustomValueMap(typeState);\n\n const preserveNull = propertyOptions.preserveNull === undefined \n ? typeState.preserveNull \n : propertyOptions.preserveNull;\n\n const useDefaultValue = propertyOptions.useDefaultValue === undefined \n ? typeState.useDefaultValue \n : propertyOptions.useDefaultValue;\n\n const useImplicitConversion = propertyOptions.useImplicitConversion === undefined \n ? typeState.useImplicitConversion \n : propertyOptions.useImplicitConversion;\n\n const serializedDefaultValue = propertyOptions.defaultValue === undefined \n ? (propertyOptions.serializedDefaultValue === undefined ? typeState.serializedDefaultValue : propertyOptions.serializedDefaultValue)\n : propertyOptions.defaultValue;\n \n const serializedDefaultValueResolver = useDefaultValue \n ? (typeof serializedDefaultValue === 'function' ? serializedDefaultValue : () => serializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const serializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER \n : serializedDefaultValueResolver;\n \n const deserializedDefaultValue = propertyOptions.defaultValue === undefined \n ? (propertyOptions.deserializedDefaultValue === undefined ? typeState.deserializedDefaultValue : propertyOptions.deserializedDefaultValue)\n : propertyOptions.defaultValue;\n \n const deserializedDefaultValueResolver = useDefaultValue\n ? (typeof deserializedDefaultValue === 'function' ? deserializedDefaultValue : () => deserializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const deserializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER\n : deserializedDefaultValueResolver;\n \n const namingConvention = propertyOptions.namingConvention === undefined\n ? this.declaringTypeMetadata.typeState.namingConvention\n : propertyOptions.namingConvention;\n\n const serializedPropertyName = alias === undefined\n ? (namingConvention === undefined ? propertyName : namingConvention.convert(propertyName))\n : alias;\n \n const useDefaultSerialization = propertyOptions.serializable === undefined \n && propertyOptions.deserializable === undefined;\n\n const serializable = useDefaultSerialization\n || propertyOptions.serializable === true;\n\n const deserializable = useDefaultSerialization\n || propertyOptions.deserializable === true;\n\n const genericArguments = propertyOptions.genericArguments === undefined\n ? EMPTY_ARRAY\n : propertyOptions.genericArguments;\n\n const genericMetadatas = this.resolveGenericMetadatas(genericArguments);\n\n const referenceHandler = propertyOptions.referenceHandler === undefined\n ? typeState.referenceHandler\n : propertyOptions.referenceHandler;\n\n const serializer = propertyOptions.serializer === undefined\n ? typeState.serializer\n : propertyOptions.serializer;\n \n const resolvedPropertyState = new ResolvedPropertyState<TDeclaringObject, TObject>(\n this,\n alias,\n customValueMap,\n serializedNullValueResolver,\n serializedDefaultValueResolver,\n deserializedNullValueResolver,\n deserializedDefaultValueResolver,\n serializedPropertyName,\n deserializedPropertyName,\n serializable,\n deserializable,\n genericArguments,\n genericMetadatas,\n namingConvention,\n referenceHandler,\n serializer,\n typeArgument,\n typeMetadata,\n preserveNull,\n useDefaultValue,\n useImplicitConversion\n );\n \n this.currentPropertyState = resolvedPropertyState;\n\n return resolvedPropertyState;\n }\n\n /**\n * Unresolves property state.\n * \n * Calling this method has side effects by resetting property state. \n * \n * @returns {UnresolvedPropertyState<TDeclaringObject, TObject>} Unresolved property state.\n */\n public unresolvePropertyState(): UnresolvedPropertyState<TDeclaringObject, TObject>\n {\n const unresolvedPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n this.currentPropertyState = unresolvedPropertyState;\n\n return unresolvedPropertyState;\n }\n\n /**\n * Resolves custom value map the same way as it is done for the main options.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map.\n */\n private resolveCustomValueMap(typeState: TypeState<TObject>): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n const propertyOptions = this.propertyOptions;\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n if (propertyOptions.customValueMap === undefined)\n {\n return customValueMap;\n }\n\n const typeCustomValueMap = typeState.customValueMap === undefined\n ? EMPTY_MAP\n : typeState.customValueMap;\n \n for (const [customKey, customValue] of propertyOptions.customValueMap)\n {\n if (customValue === undefined)\n {\n customValueMap.set(customKey, typeCustomValueMap.get(customKey));\n\n continue;\n }\n\n customValueMap.set(customKey, customValue);\n }\n\n return customValueMap;\n }\n\n /**\n * Configures alias.\n * \n * @param {Optional<Alias>} alias Alias or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasAlias(alias: Optional<Alias>): this\n {\n this.propertyOptions.alias = alias;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value map.\n * \n * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this\n {\n let currentCustomValueMap = this.propertyOptions.customValueMap;\n\n if (currentCustomValueMap === undefined)\n {\n currentCustomValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = currentCustomValueMap;\n }\n \n if (customValueMap !== undefined)\n {\n if (currentCustomValueMap !== customValueMap)\n {\n currentCustomValueMap.clear();\n }\n\n for (const [customKey, customValue] of customValueMap)\n {\n currentCustomValueMap.set(customKey, customValue);\n }\n }\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * @param {TCustomValue} customValue Custom value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n customValueMap.set(customKey, customValue);\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Extracts value by custom key.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * \n * @returns {TCustomValue} Custom value.\n */\n public extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\n {\n let customValue = this.propertyState.customValueMap.get(customKey) as TCustomValue;\n\n if (customValue === undefined && customKey.customValueResolver !== undefined)\n {\n customValue = customKey.customValueResolver();\n }\n\n return customValue;\n }\n\n /**\n * Configures custom options.\n * \n * @param {ReadonlyArray<CustomOption>} customOptions Custom options.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this\n {\n let customValueMap = this.propertyOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.propertyOptions.customValueMap = customValueMap;\n }\n\n for (let i = 0; i < customOptions.length; i++)\n {\n customValueMap.set(customOptions[i][0], customOptions[i][1]);\n }\n\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): this\n {\n this.propertyOptions.defaultValue = defaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this\n {\n this.propertyOptions.serializedDefaultValue = serializedDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this\n {\n this.propertyOptions.deserializedDefaultValue = deserializedDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserializable.\n * \n * @param {boolean} deserializable Deserializable.\n * \n * @returns {this} Current instance of property metadata.\n */\n public isDeserializable(deserializable: boolean = true): this\n {\n this.propertyOptions.deserializable = deserializable;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializable.\n * \n * @param {boolean} serializable Serializable.\n * \n * @returns {this} Current instance of property metadata.\n */\n public isSerializable(serializable: boolean = true): this\n {\n this.propertyOptions.serializable = serializable;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures generic arguments.\n * \n * @param {Optional<Array<GenericArgument<any>>>} genericArguments Generic arguments or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasGenericArguments(genericArguments: Optional<Array<GenericArgument<any>>>): this\n {\n this.propertyOptions.genericArguments = genericArguments;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {Optional<NamingConvention>} namingConvention Naming convention or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasNamingConvention(namingConvention: Optional<NamingConvention>): this\n {\n this.propertyOptions.namingConvention = namingConvention;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {Optional<ReferenceHandler>} referenceHandler Reference handler or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this\n {\n this.propertyOptions.referenceHandler = referenceHandler;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Optional<Serializer<TObject>>} serializer Serializer or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasSerializer(serializer: Optional<Serializer<TObject>>): this\n {\n this.propertyOptions.serializer = serializer;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures type argument.\n * \n * @param {Optional<TypeArgument<TObject>>} typeArgument Type argument or undefined.\n * \n * @returns {this} Current instance of property metadata.\n */\n public hasTypeArgument(typeArgument: Optional<TypeArgument<TObject>>): this\n {\n this.propertyOptions.typeArgument = typeArgument ?? this.reflectTypeFn;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): this\n {\n this.propertyOptions.preserveNull = preserveNull;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): this\n {\n this.propertyOptions.useDefaultValue = useDefaultValue;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {this} Current instance of property metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): this\n {\n this.propertyOptions.useImplicitConversion = useImplicitConversion;\n this.currentPropertyState = new UnresolvedPropertyState<TDeclaringObject, TObject>(this);\n\n return this;\n }\n\n /**\n * Configures property metadata based on provided options.\n * \n * @param {PropertyOptions<TObject>} propertyOptions Property options.\n * \n * @returns {this} Current instance of property metadata.\n */\n public configure(propertyOptions: PropertyOptions<TObject>): this\n {\n if (propertyOptions.alias !== undefined)\n {\n this.hasAlias(propertyOptions.alias);\n }\n\n if (propertyOptions.customValueMap !== undefined)\n {\n this.hasCustomValueMap(propertyOptions.customValueMap);\n }\n\n if (propertyOptions.defaultValue !== undefined)\n {\n this.hasDefaultValue(propertyOptions.defaultValue);\n }\n\n if (propertyOptions.serializedDefaultValue !== undefined)\n {\n this.hasSerializedDefaultValue(propertyOptions.serializedDefaultValue);\n }\n\n if (propertyOptions.deserializedDefaultValue !== undefined)\n {\n this.hasDeserializedDefaultValue(propertyOptions.deserializedDefaultValue);\n }\n\n if (propertyOptions.deserializable !== undefined)\n {\n this.isDeserializable(propertyOptions.deserializable);\n }\n\n if (propertyOptions.genericArguments !== undefined) \n {\n this.hasGenericArguments(propertyOptions.genericArguments);\n }\n\n if (propertyOptions.namingConvention !== undefined)\n {\n this.hasNamingConvention(propertyOptions.namingConvention);\n }\n\n if (propertyOptions.referenceHandler !== undefined) \n {\n this.hasReferenceHandler(propertyOptions.referenceHandler);\n }\n\n if (propertyOptions.serializable !== undefined) \n {\n this.isSerializable(propertyOptions.serializable);\n }\n\n if (propertyOptions.serializer !== undefined) \n {\n this.hasSerializer(propertyOptions.serializer);\n }\n\n if (propertyOptions.typeArgument !== undefined) \n {\n this.hasTypeArgument(propertyOptions.typeArgument);\n }\n\n if (propertyOptions.preserveNull !== undefined)\n {\n this.shouldPreserveNull(propertyOptions.preserveNull);\n }\n\n if (propertyOptions.useDefaultValue !== undefined)\n {\n this.shouldUseDefaultValue(propertyOptions.useDefaultValue);\n }\n\n if (propertyOptions.useImplicitConversion !== undefined) \n {\n this.shouldUseImplicitConversion(propertyOptions.useImplicitConversion);\n }\n\n return this;\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents asc property sorter which sorts type properties in\n * ascending order by name.\n * \n * @type {AscPropertySorter}\n */\nexport class AscPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TObject, any>} x First property.\n * @param {PropertyMetadata<TObject, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: PropertyMetadata<TObject, any>, y: PropertyMetadata<TObject, any>): number\n {\n return x.normalizedPropertyName.localeCompare(y.normalizedPropertyName);\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents desc property sorter which sorts type properties in\n * descending order by name.\n * \n * @type {DescPropertySorter}\n */\nexport class DescPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TObject, any>} x First property.\n * @param {PropertyMetadata<TObject, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TObject>(x: PropertyMetadata<TObject, any>, y: PropertyMetadata<TObject, any>): number\n {\n return y.normalizedPropertyName.localeCompare(x.normalizedPropertyName);\n }\n}\n","export * from './asc-property-sorter';\nexport * from './desc-property-sorter';\n","export * from './resolved-property-state';\nexport * from './unresolved-property-state';\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { GenericArgument } from '../generic-argument';\nimport { GenericMetadata } from '../generic-metadata';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyState } from '../property-state';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Represents resolved property state.\n * \n * @type {ResolvedPropertyState<TDeclaringObject, TObject>}\n */\nexport class ResolvedPropertyState<TDeclaringObject, TObject> implements PropertyState<TDeclaringObject, TObject>\n{\n /**\n * Property metadata for which state is defined.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Alias.\n * \n * @type {Optional<Alias>}\n */\n public readonly alias: Optional<Alias>;\n\n /**\n * Custom value map.\n * \n * @type {ReadonlyMap<CustomKey<any>, CustomValue>}\n */\n public readonly customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>;\n\n /**\n * Serialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly serializedNullValueResolver: NullValueResolver;\n\n /**\n * Serialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly serializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Deserialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly deserializedNullValueResolver: NullValueResolver;\n\n /**\n * Deserialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly deserializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Serialized property name.\n * \n * @type {PropertyName}\n */\n public readonly serializedPropertyName: PropertyName;\n\n /**\n * Deserialized property name.\n * \n * @type {PropertyName}\n */\n public readonly deserializedPropertyName: PropertyName;\n\n /**\n * Serializable value.\n * \n * @type {boolean}\n */\n public readonly serializable: boolean;\n\n /**\n * Deserializable value.\n * \n * @type {boolean}\n */\n public readonly deserializable: boolean;\n\n /**\n * Generic arguments.\n * \n * @type {ReadonlyArray<GenericArgument<any>>}\n */\n public readonly genericArguments: ReadonlyArray<GenericArgument<any>>;\n\n /**\n * Generic metadatas.\n * \n * @type {ReadonlyArray<GenericMetadata<any>>}\n */\n public readonly genericMetadatas: ReadonlyArray<GenericMetadata<any>>;\n\n /**\n * Naming convention.\n * \n * @type {Optional<NamingConvention>}\n */\n public readonly namingConvention: Optional<NamingConvention>;\n\n /**\n * Reference handler.\n * \n * @type {ReferenceHandler}\n */\n public readonly referenceHandler: ReferenceHandler;\n \n /**\n * Serializer.\n * \n * @type {Serializer<TObject>}\n */\n public readonly serializer: Serializer<TObject>;\n\n /**\n * Type argument.\n * \n * @type {TypeArgument<TObject>}\n */\n public readonly typeArgument: TypeArgument<TObject>;\n\n /**\n * Type metadata.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Indicator if null value should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveNull: boolean;\n\n /**\n * Indicator if default value should be used.\n * \n * @type {boolean}\n */\n public readonly useDefaultValue: boolean;\n\n /**\n * Indicator if implicit conversion should be used.\n * \n * @type {boolean}\n */\n public readonly useImplicitConversion: boolean;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata for which state is defined.\n * @param {Optional<Alias>} alias Alias.\n * @param {ReadonlyMap<CustomKey<any>, CustomValue>} customValueMap Custom value map.\n * @param {NullValueResolver} serializedNullValueResolver Serialized null value resolver.\n * @param {DefaultValueResolver} serializedDefaultValueResolver Serialized default value resolver.\n * @param {NullValueResolver} deserializedNullValueResolver Deserialized null value resolver.\n * @param {DefaultValueResolver} deserializedDefaultValueResolver Deserialized default value resolver.\n * @param {PropertyName} serializedPropertyName Serialized property name.\n * @param {PropertyName} deserializedPropertyName Deserialized property name.\n * @param {boolean} serializable Serializable value.\n * @param {boolean} deserializable Deserializable value.\n * @param {ReadonlyArray<GenericArgument<any>>} genericArguments Generic arguments.\n * @param {ReadonlyArray<GenericMetadata<any>>} genericMetadatas Generic metadatas.\n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * @param {ReferenceHandler} referenceHandler Reference handler.\n * @param {Serializer<TObject>} serializer Serializer.\n * @param {TypeArgument<TObject>} typeArgument Type argument.\n * @param {TypeMetadata<TObject>} typeMetadata Type metadata.\n * @param {boolean} preserveNull Indicator if null value should be preserved.\n * @param {boolean} useDefaultValue Indicator if default value should be used.\n * @param {boolean} useImplicitConversion Indicator if implicit conversion should be used.\n */\n public constructor(\n propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>,\n alias: Optional<Alias>,\n customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>,\n serializedNullValueResolver: NullValueResolver,\n serializedDefaultValueResolver: DefaultValueResolver,\n deserializedNullValueResolver: NullValueResolver,\n deserializedDefaultValueResolver: DefaultValueResolver,\n serializedPropertyName: PropertyName,\n deserializedPropertyName: PropertyName,\n serializable: boolean,\n deserializable: boolean,\n genericArguments: ReadonlyArray<GenericArgument<any>>,\n genericMetadatas: ReadonlyArray<GenericMetadata<any>>,\n namingConvention: Optional<NamingConvention>,\n referenceHandler: ReferenceHandler,\n serializer: Serializer<TObject>,\n typeArgument: TypeArgument<TObject>,\n typeMetadata: TypeMetadata<TObject>,\n preserveNull: boolean,\n useDefaultValue: boolean,\n useImplicitConversion: boolean\n )\n {\n this.propertyMetadata = propertyMetadata;\n this.alias = alias;\n this.customValueMap = customValueMap;\n this.serializedNullValueResolver = serializedNullValueResolver;\n this.serializedDefaultValueResolver = serializedDefaultValueResolver;\n this.deserializedNullValueResolver = deserializedNullValueResolver;\n this.deserializedDefaultValueResolver = deserializedDefaultValueResolver;\n this.serializedPropertyName = serializedPropertyName;\n this.deserializedPropertyName = deserializedPropertyName;\n this.serializable = serializable;\n this.deserializable = deserializable;\n this.genericArguments = genericArguments;\n this.genericMetadatas = genericMetadatas;\n this.namingConvention = namingConvention;\n this.referenceHandler = referenceHandler;\n this.serializer = serializer;\n this.typeArgument = typeArgument;\n this.typeMetadata = typeMetadata;\n this.preserveNull = preserveNull;\n this.useDefaultValue = useDefaultValue;\n this.useImplicitConversion = useImplicitConversion;\n\n return;\n }\n}\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { GenericArgument } from '../generic-argument';\nimport { GenericMetadata } from '../generic-metadata';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyState } from '../property-state';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeMetadata } from '../type-metadata';\nimport { ResolvedPropertyState } from './resolved-property-state';\n\n/**\n * Represents unresolved property state.\n * \n * @type {UnresolvedPropertyState<TDeclaringObject, TObject>}\n */\nexport class UnresolvedPropertyState<TDeclaringObject, TObject> implements PropertyState<TDeclaringObject, TObject>\n{\n /**\n * Property metadata for which state is defined.\n * \n * @type {PropertyMetadata<TDeclaringObject, TObject>}\n */\n public readonly propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>;\n\n /**\n * Resolved property state.\n * \n * @type {ResolvedPropertyState<TDeclaringObject, TObject>}\n */\n private resolvedPropertyState?: ResolvedPropertyState<TDeclaringObject, TObject>;\n\n /**\n * Constructor.\n * \n * @param {PropertyMetadata<TDeclaringObject, TObject>} propertyMetadata Property metadata for which state is defined.\n */\n public constructor(propertyMetadata: PropertyMetadata<TDeclaringObject, TObject>)\n {\n this.propertyMetadata = propertyMetadata;\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Optional alias.\n */\n public get alias(): Optional<Alias>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.customValueMap;\n }\n\n /**\n * Gets serialized null value resolver.\n * \n * @returns {NullValueResolver} Serialized null value resolver.\n */\n public get serializedNullValueResolver(): NullValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedNullValueResolver;\n }\n\n /**\n * Gets serialized default value resolver.\n * \n * @returns {DefaultValueResolver} Default value resolver.\n */\n public get serializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedDefaultValueResolver;\n }\n\n /**\n * Gets deserialized null value resolver.\n * \n * @returns {NullValueResolver} Deserialized null value resolver.\n */\n public get deserializedNullValueResolver(): NullValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedNullValueResolver;\n }\n\n /**\n * Gets deserialized default value resolver.\n * \n * @returns {DefaultValueResolver} Deserialized default value resolver.\n */\n public get deserializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedDefaultValueResolver;\n }\n\n /**\n * Gets serialized property name.\n * \n * @returns {PropertyName} Serialized property name.\n */\n public get serializedPropertyName(): PropertyName\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializedPropertyName;\n }\n\n /**\n * Gets deserialized property name.\n * \n * @returns {PropertyName} Deserialized property name.\n */\n public get deserializedPropertyName(): PropertyName\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializedPropertyName;\n }\n\n /**\n * Gets serializable value.\n * \n * @returns {boolean} Serializable value.\n */\n public get serializable(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializable;\n }\n\n /**\n * Gets deserializable value.\n * \n * @returns {boolean} Deserializable value.\n */\n public get deserializable(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.deserializable;\n }\n\n /**\n * Gets generic arguments.\n * \n * @returns {ReadonlyArray<GenericArgument<any>>} Generic arguments.\n */\n public get genericArguments(): ReadonlyArray<GenericArgument<any>>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.genericArguments;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {ReadonlyArray<GenericMetadata<any>>} Generic metadatas.\n */\n public get genericMetadatas(): ReadonlyArray<GenericMetadata<any>>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.genericMetadatas;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.namingConvention;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.referenceHandler;\n }\n \n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.serializer;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument<TObject>} Type argument.\n */\n public get typeArgument(): TypeArgument<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.typeArgument;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} Preserve null indicator.\n */\n public get preserveNull(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value indicator.\n */\n public get useDefaultValue(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion indicator.\n */\n public get useImplicitConversion(): boolean\n {\n let resolvedPropertyState = this.resolvedPropertyState;\n\n if (resolvedPropertyState === undefined)\n {\n resolvedPropertyState = this.propertyMetadata.resolvePropertyState();\n\n this.resolvedPropertyState = resolvedPropertyState;\n }\n\n return resolvedPropertyState.useImplicitConversion;\n }\n}\n","import { nameOf } from './functions/name-of';\nimport { GenericArgument } from './generic-argument';\nimport { PropertyDecorator } from './property-decorator';\nimport { PropertyOptions } from './property-options';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\n\n/**\n * Property decorator.\n * \n * @param {TypeArgument<TObject>|Array<GenericArgument<any>>|PropertyOptions<TObject>} x Type argument, generic arguments or property options.\n * @param {Array<GenericArgument<any>>|PropertyOptions<TObject>} y Generic arguments or property options if first parameter is type argument.\n * @param {PropertyOptions<TObject>} z Property options if second parameter are generic arguments.\n * \n * @returns {PropertyDecorator} Property decorator.\n */\nexport function Property<TObject>(\n x?: TypeArgument<TObject> | Array<GenericArgument<any>> | PropertyOptions<TObject>, \n y?: Array<GenericArgument<any>> | PropertyOptions<TObject>,\n z?: PropertyOptions<TObject>\n): PropertyDecorator\n{\n const propertyOptions = {} as PropertyOptions<TObject>;\n\n if (typeof z === 'object')\n {\n Object.assign(propertyOptions, z);\n }\n\n if (typeof y === 'object' && !Array.isArray(y))\n {\n Object.assign(propertyOptions, y);\n }\n\n if (typeof x === 'object' && !Array.isArray(x))\n {\n Object.assign(propertyOptions, x);\n }\n\n if (Array.isArray(y))\n {\n propertyOptions.genericArguments = y as Array<GenericArgument<any>>;\n }\n\n if (Array.isArray(x))\n {\n propertyOptions.genericArguments = x as Array<GenericArgument<any>>;\n }\n\n if (typeof x === 'string' || typeof x === 'function')\n {\n propertyOptions.typeArgument = x as TypeArgument<TObject>;\n }\n\n return function (target: any, context: any): any\n {\n // Modern decorator has a dynamic target which is dependent from where decorator \n // is applied (target), context as a second parameter (context) and optional \n // resolver like return type.\n if (context !== null && typeof context === 'object' && context.hasOwnProperty('kind'))\n {\n const decoratorContext = context as any;\n const kind = decoratorContext.kind;\n const propertyName = decoratorContext.name;\n\n if (kind === 'method' || kind === 'class')\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to a method or a class.`);\n }\n\n if (propertyName === undefined)\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to undefined values.`);\n }\n\n if (typeof propertyName === 'symbol')\n {\n throw new Error(`${String(propertyName)}: property decorator cannot be applied to a symbol.`);\n }\n\n TypeManager.typeScope.addPropertyOptions(propertyName, propertyOptions);\n\n return;\n }\n\n // Legacy decorator has class reference as a first parameter (target), property name \n // or symbol as a second parameter (context) and no return type.\n if (target !== null && typeof target === 'object' && (typeof context === 'string' || typeof context === 'symbol'))\n {\n const legacyTarget = target as any;\n const propertyName = context as string | symbol | undefined;\n \n if (typeof legacyTarget === 'function' && legacyTarget.name !== '')\n {\n throw new Error(`${nameOf(legacyTarget)}.${String(propertyName)}: property decorator cannot be applied to a static member.`);\n }\n\n if (propertyName === undefined)\n {\n throw new Error(`${nameOf(legacyTarget)}.${String(propertyName)}: property decorator cannot be applied to undefined values.`);\n }\n\n if (typeof propertyName === 'symbol')\n {\n throw new Error(`${nameOf(legacyTarget.constructor)}.${String(propertyName)}: property decorator cannot be applied to a symbol.`);\n }\n \n if (typeof legacyTarget[propertyName] === 'function')\n {\n throw new Error(`${nameOf(legacyTarget.constructor)}.${String(propertyName)}: property decorator cannot be applied to a method.`);\n }\n \n const typeFn = legacyTarget.constructor as TypeFn<any>;\n \n TypeManager.configureTypeMetadata(typeFn).configurePropertyMetadata(propertyName as string, propertyOptions);\n \n return;\n }\n\n throw new Error(`Property decorator was not able to detect correct resolver for the following target [${target}] and context [${context}].`);\n };\n}\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Circular reference handler which preserves references as is even if the circular is detected.\n * \n * @type {CircularReferenceHandler}\n */\nexport class CircularReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","export * from './circular-reference-handler';\nexport * from './json-path-reference-handler';\nexport * from './plain-reference-handler';\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Json path reference handler preserves references using JSONPath.\n * \n * @type {JsonPathReferenceHandler}\n */\nexport class JsonPathReferenceHandler implements ReferenceHandler\n{\n /**\n * Regular expression used to get array key from a certain place of the JSONPath.\n * \n * @type {RegExp}\n */\n private readonly arrayKeyRegExp: RegExp = new RegExp('\\\\[\\\\\\'?([^\\\\\\'\\\\[\\\\]]+)\\\\\\'?\\\\]', 'g');\n\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referencePath = referenceMap.get(referenceKey);\n\n if (referencePath === undefined)\n {\n referenceMap.set(referenceKey, serializerContext.jsonPath);\n\n const value = referenceValueGetter();\n\n return value;\n }\n\n return { $ref: referencePath };\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceTarget = this.defineReferenceTarget(serializerContext, referenceKey);\n const referenceValue = referenceMap.get(referenceTarget);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceTarget, referenceTarget);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceTarget, value);\n\n serializerContext.resolveReferenceCallbacks(referenceTarget);\n\n return value;\n }\n \n if (referenceTarget !== referenceKey) \n {\n serializerContext.pushReferenceCallback(referenceTarget, () =>\n {\n serializerContext.resolveReferenceCallbacks(referenceKey);\n });\n }\n\n if (referenceTarget === referenceValue)\n {\n serializerContext.registerReferenceCallback(referenceTarget);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Defines reference target based on reference key.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * \n * @returns {ReferenceKey} Reference which acts as a target key in context of JSONPath.\n */\n private defineReferenceTarget(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey): ReferenceKey\n {\n const $ = serializerContext.$;\n const referencePath = referenceKey.$ref;\n\n if (typeof referencePath !== 'string' || typeof $ !== 'object')\n {\n return referenceKey;\n }\n\n if (referencePath === '$')\n {\n return $;\n }\n\n const referencePathArray = this.convertReferencePathToArray(referencePath);\n\n referencePathArray.shift();\n\n let referenceTarget = $ as Record<string, any>;\n\n for (let i = 0; i < referencePathArray.length; i++)\n {\n referenceTarget = referenceTarget[referencePathArray[i]];\n }\n\n return referenceTarget;\n }\n\n /**\n * Converts reference path to array.\n * \n * @param {string} referencePath Reference path.\n * \n * @returns {Array<string>} Array reference path.\n */\n private convertReferencePathToArray(referencePath: string): Array<string> \n {\n const array = new Array<string>();\n const parts = referencePath.split('.');\n\n for (let i = 0; i < parts.length; i++) \n {\n const part = parts[i];\n const keys = part.split(this.arrayKeyRegExp);\n\n for (let j = 0; j < keys.length; j++)\n {\n const key = keys[j];\n\n if (key.length > 0) \n {\n array.push(key);\n }\n }\n }\n\n return array;\n }\n}\n","import { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Plain reference handler preserves references except circular. If circular reference is detected the it will \n * be setted to undefined so only first occurance is handled.\n * \n * @type {PlainReferenceHandler}\n */\nexport class PlainReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (referenceValue === undefined)\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","import { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { GenericMetadata } from './generic-metadata';\nimport { Injector } from './injector';\nimport { Logger } from './logger';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyState } from './property-state';\nimport { ReferenceCallback } from './reference-callback';\nimport { ReferenceHandler } from './reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { ReferenceValueGetter } from './reference-value-getter';\nimport { ReferenceValueSetter } from './reference-value-setter';\nimport { Serializer } from './serializer';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeState } from './type-state';\n\n/**\n * Serializer context of a certain type.\n * \n * @type {SerializerContext<TObject>}\n */\nexport class SerializerContext<TObject>\n{\n /**\n * Serializer context root.\n * \n * This is a value passed to the root serializer.\n * \n * @type {any}\n */\n public readonly $: any;\n\n /**\n * Reference map.\n * \n * Used to preserve object references.\n * \n * @type {Map<ReferenceKey, ReferenceValue>}\n */\n public readonly referenceMap: Map<ReferenceKey, ReferenceValue>;\n\n /**\n * Reference callback map.\n * \n * Used to assign object references in a later time due to circular dependency.\n * \n * @type {Map<ReferenceKey, Array<ReferenceCallback>>}\n */\n public readonly referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>;\n\n /**\n * Parent serializer context.\n * \n * Present when any serializer defines child context.\n * \n * @type {Optional<SerializerContext<any>>}\n */\n public readonly parentSerializerContext: Optional<SerializerContext<any>>;\n\n /**\n * Json path key.\n * \n * @type {any}\n */\n public jsonPathKey: any;\n\n /**\n * Type state.\n * \n * @type {TypeState<TObject>}\n */\n public typeState: TypeState<TObject>;\n\n /**\n * Property state.\n * \n * @type {TypeState<TObject>}\n */\n public genericMetadatas: ReadonlyArray<GenericMetadata<any>>;\n\n /**\n * Property state.\n * \n * @type {Optional<PropertyState<any, TObject>>}\n */\n public propertyState: Optional<PropertyState<any, TObject>>;\n\n /**\n * Reference value setter.\n * \n * @type {Optional<ReferenceValueSetter>}\n */\n public referenceValueSetter: Optional<ReferenceValueSetter>;\n\n /**\n * Constructor.\n * \n * @param {any} $ Serializer context root.\n * @param {Map<ReferenceKey, ReferenceValue>} referenceMap Reference map.\n * @param {Map<ReferenceKey, Array<ReferenceCallback>>} referenceCallbackMap Reference callback map.\n * @param {Optional<SerializerContext<any>>} parentSerializerContext Parent serializer context.\n * @param {any} jsonPathKey Json path key.\n * @param {TypeState<TObject>} typeState Type state.\n * @param {ReadonlyArray<GenericMetadata<any>>} genericMetadatas Generic metadatas.\n * @param {Optional<PropertyState<any, TObject>>} propertyState Property state.\n * @param {Optional<ReferenceValueSetter>} referenceValueSetter Reference value setter.\n */\n public constructor(\n $: any,\n referenceMap: Map<ReferenceKey, ReferenceValue>,\n referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>,\n parentSerializerContext: Optional<SerializerContext<any>>,\n jsonPathKey: any,\n typeState: TypeState<TObject>,\n genericMetadatas: ReadonlyArray<GenericMetadata<any>>,\n propertyState: Optional<PropertyState<any, TObject>>,\n referenceValueSetter: Optional<ReferenceValueSetter>\n )\n {\n this.$ = $;\n this.referenceMap = referenceMap,\n this.referenceCallbackMap = referenceCallbackMap;\n this.parentSerializerContext = parentSerializerContext;\n this.jsonPathKey = jsonPathKey;\n this.typeState = typeState;\n this.genericMetadatas = genericMetadatas;\n this.propertyState = propertyState;\n this.referenceValueSetter = referenceValueSetter;\n\n return;\n }\n\n /**\n * Gets json path from serializer context root.\n * \n * @returns {string} Json path.\n */\n public get jsonPath(): string\n {\n const jsonPathKey = this.jsonPathKey;\n const parentSerializerContext = this.parentSerializerContext;\n\n if (parentSerializerContext === undefined)\n {\n return `${jsonPathKey}`;\n }\n\n if (typeof jsonPathKey === 'number')\n {\n return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`;\n }\n\n return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): Nullable<any>\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n if (this.useDefaultValue)\n {\n return this.propertyState?.serializedDefaultValueResolver() ?? this.typeState.serializedDefaultValueResolver();\n }\n\n return undefined;\n }\n \n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.deserializedDefaultValue;\n }\n\n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n if (this.useDefaultValue)\n {\n return this.propertyState?.deserializedDefaultValueResolver() ?? this.typeState.deserializedDefaultValueResolver();\n }\n \n return undefined;\n }\n\n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.typeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.typeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.typeState.factory;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector\n */\n public get injector(): Injector\n {\n return this.typeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger instance.\n */\n public get logger(): Logger\n {\n return this.typeState.logger;\n }\n\n /**\n * Gets indicator if context is polymorphic.\n * \n * @returns {boolean} True when context is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.typeState.polymorphic;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.typeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.propertyState?.referenceHandler ?? this.typeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n return this.propertyState?.serializer ?? this.typeState.serializer;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TObject>\n {\n return this.typeState.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.propertyState?.preserveNull ?? this.typeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.propertyState?.useDefaultValue ?? this.typeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.propertyState?.useImplicitConversion ?? this.typeState.useImplicitConversion;\n }\n\n /**\n * Serializes provided value using context.\n * \n * @param {TypeLike<TObject>} x Some value.\n * \n * @returns {TypeLike<any>} Value serialized by context.\n */\n public serialize(x: TypeLike<TObject>): TypeLike<any>\n {\n return this.serializer.serialize(x, this);\n }\n\n /**\n * Deserializes provided value using context.\n * \n * @param {TypeLike<any>} x Some value.\n * \n * @returns {TypeLike<TObject>} Value deserialized by context.\n */\n public deserialize(x: TypeLike<any>): TypeLike<TObject>\n {\n return this.serializer.deserialize(x, this);\n }\n\n /**\n * Defines reference. \n * \n * May be called during serialization to define reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public defineReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.define(this, referenceKey, referenceValueGetter);\n }\n\n /**\n * Restores reference.\n * \n * May be called during deserialization to restore reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public restoreReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.restore(this, referenceKey, referenceValueGetter);\n }\n \n /**\n * Registers callback for provided reference key.\n * \n * May be called by reference handlers to register a callback resolver for a circular reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public registerReferenceCallback(referenceKey: ReferenceKey): void\n {\n const referenceValueSetter = this.referenceValueSetter;\n\n if (referenceValueSetter === undefined)\n {\n return;\n }\n\n const jsonPathKey = this.jsonPathKey;\n\n this.pushReferenceCallback(referenceKey, () =>\n {\n const referenceValue = this.referenceMap.get(referenceKey);\n\n referenceValueSetter(referenceValue, jsonPathKey);\n });\n\n return;\n }\n\n /**\n * Pushes callback for provided reference key.\n * \n * Called by reference handlers during handling of circular references.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceCallback} referenceCallback Reference callback.\n * \n * @returns {void}\n */\n public pushReferenceCallback(referenceKey: ReferenceKey, referenceCallback: ReferenceCallback): void\n {\n let referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (referenceCallbacks === undefined)\n {\n referenceCallbacks = new Array<ReferenceCallback>();\n\n this.referenceCallbackMap.set(referenceKey, referenceCallbacks);\n }\n\n referenceCallbacks.push(referenceCallback);\n\n return;\n }\n\n /**\n * Resolves callbacks for provided reference key.\n * \n * May be called by reference handlers when circular references can be resolved.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public resolveReferenceCallbacks(referenceKey: ReferenceKey): void\n {\n const referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (referenceCallbacks === undefined)\n {\n return;\n }\n \n for (let i = 0; i < referenceCallbacks.length; i++)\n {\n referenceCallbacks[i]();\n }\n\n return;\n }\n\n /**\n * Defines child serializer context.\n * \n * Called by serializers on drill down.\n * \n * @returns {SerializerContext<any>} Child serializer context.\n */\n public defineChildSerializerContext(): SerializerContext<any>\n {\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this,\n this.jsonPathKey,\n this.typeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines generic serializer context.\n * \n * Called by serializers which work with generics.\n * \n * @param {number} genericIndex Generic index.\n * \n * @returns {SerializerContext<any>} Generic serializer context.\n */\n public defineGenericSerializerContext(genericIndex: number): SerializerContext<any>\n {\n const genericMetadata = this.genericMetadatas[genericIndex];\n\n if (genericMetadata === undefined)\n {\n throw new Error(`${this.jsonPath}: cannot define generic metadata for index ${genericIndex}. This is usually caused by invalid configuration.`);\n }\n\n const typeMetadata = genericMetadata[0];\n const genericMetadatas = genericMetadata[1];\n\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap, \n this.parentSerializerContext,\n this.jsonPath,\n typeMetadata.typeState,\n genericMetadatas,\n undefined,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines polymorphic serializer context.\n * \n * Called by serializers which work with polymorphic types.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n public definePolymorphicSerializerContext(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n if (typeof x === 'function')\n {\n return this.definePolymorphicSerializerContextByTypeFn(x);\n }\n\n return this.definePolymorphicSerializerContextByDiscriminant(x);\n }\n\n /**\n * Defines polymorphic serializer context by type function.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByTypeFn(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n const typeFn = x as TypeFn<any>;\n const typeMetadata = this.typeState.typeMetadataMap.get(typeFn);\n\n if (typeMetadata === undefined)\n {\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this.parentSerializerContext,\n this.jsonPathKey,\n typeMetadata.typeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n\n /**\n * Defines polymorphic serializer context by discriminant.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByDiscriminant(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n const record = x as Record<string, any>;\n const childTypeMetadatas = this.typeState.childTypeMetadatas;\n\n for (let i = 0; i < childTypeMetadatas.length; i++)\n {\n const childTypeState = childTypeMetadatas[i].typeState;\n\n if (record[childTypeState.discriminator] === childTypeState.discriminant)\n {\n return new SerializerContext(\n this.$, \n this.referenceMap, \n this.referenceCallbackMap,\n this.parentSerializerContext,\n this.jsonPathKey,\n childTypeState,\n this.genericMetadatas,\n this.propertyState,\n this.referenceValueSetter\n );\n }\n }\n\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Any serializer.\n * \n * @type {AnySerializer}\n */\nexport class AnySerializer implements Serializer<any>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n \n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array buffer serializer.\n * \n * @type {ArrayBufferSerializer}\n */\nexport class ArrayBufferSerializer implements Serializer<ArrayBuffer>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<ArrayBuffer>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<ArrayBuffer>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof ArrayBuffer)\n {\n const arrayBufferView = new Uint16Array(x);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n serializerContext.logger.error('ArrayBufferSerializer', `${serializerContext.jsonPath}: cannot serialize value as array buffer.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<ArrayBuffer>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<ArrayBuffer>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return arrayBuffer;\n }\n\n serializerContext.logger.error('ArrayBufferSerializer', `${serializerContext.jsonPath}: cannot deserialize value as array buffer.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array serializer.\n * \n * @type {ArraySerializer}\n */\nexport class ArraySerializer implements Serializer<Array<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Array<any>>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Array<any>>, serializerContext: SerializerContext<Array<any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => arrayOutput[k] = v;\n\n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n arrayOutput[i] = serializer.serialize(arrayInput[i], valueSerializerContext);\n }\n \n return arrayOutput;\n });\n }\n\n serializerContext.logger.error('ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Array<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Array<any>>): TypeLike<Array<any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => arrayOutput[k] = v;\n\n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n arrayOutput[i] = serializer.deserialize(arrayInput[i], valueSerializerContext);\n }\n \n return arrayOutput;\n });\n }\n\n serializerContext.logger.error('ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Boolean serializer.\n * \n * @type {BooleanSerializer}\n */\nexport class BooleanSerializer implements Serializer<boolean>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<boolean>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<boolean>, serializerContext: SerializerContext<boolean>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'boolean')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot serialize value as boolean.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<boolean>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'boolean')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot deserialize value as boolean.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Type serializer context.\n * \n * @returns {TypeLike<boolean>} Converted value.\n */\n private convert(x: any, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\n {\n if (typeof x === 'string' && (x === 'true' || x === 'false'))\n {\n return x === 'true';\n }\n\n if (typeof x === 'string' && (x === '1' || x === '0'))\n {\n return x === '1';\n }\n\n if (typeof x === 'number' && (x === 1 || x === 0))\n {\n return x === 1;\n }\n\n serializerContext.logger.error('BooleanSerializer', `${serializerContext.jsonPath}: cannot convert value to boolean.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Data view serializer.\n * \n * @type {DataViewSerializer}\n */\nexport class DataViewSerializer implements Serializer<DataView>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<DataView>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<DataView>, serializerContext: SerializerContext<DataView>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof DataView)\n {\n const arrayBufferView = new Uint16Array(x.buffer);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n serializerContext.logger.error('DataViewSerializer', `${serializerContext.jsonPath}: cannot serialize value as data view.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<DataView>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<DataView>): TypeLike<DataView>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return new DataView(arrayBuffer);\n }\n\n serializerContext.logger.error('DataViewSerializer', `${serializerContext.jsonPath}: cannot deserialize value as data view.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Date serializer.\n * \n * @type {DateSerializer}\n */\nexport class DateSerializer implements Serializer<Date>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Date>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Date>, serializerContext: SerializerContext<Date>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Date)\n {\n return x.toISOString();\n }\n\n serializerContext.logger.error('DateSerializer', `${serializerContext.jsonPath}: cannot serialize value as date.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Date>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Date>): TypeLike<Date>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return new Date(x);\n }\n \n serializerContext.logger.error('DateSerializer', `${serializerContext.jsonPath}: cannot deserialize value as date.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 32 array serializer.\n * \n * @type {Float32ArraySerializer}\n */\nexport class Float32ArraySerializer implements Serializer<Float32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float32Array>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float32Array>, serializerContext: SerializerContext<Float32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Float32Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Float32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as float 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float32Array>): TypeLike<Float32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Float32Array.from(x);\n }\n\n serializerContext.logger.error('Float32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as float 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 64 array serializer.\n * \n * @type {Float64ArraySerializer}\n */\nexport class Float64ArraySerializer implements Serializer<Float64Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float64Array>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float64Array>, serializerContext: SerializerContext<Float64Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Float64Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Float64ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as float 64 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float64Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float64Array>): TypeLike<Float64Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Float64Array.from(x);\n }\n\n serializerContext.logger.error('Float64ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value to a float 64 array.`, x);\n\n return undefined;\n }\n}\n","export * from './any-serializer';\nexport * from './array-buffer-serializer';\nexport * from './array-serializer';\nexport * from './boolean-serializer';\nexport * from './data-view-serializer';\nexport * from './date-serializer';\nexport * from './float-32-array-serializer';\nexport * from './float-64-array-serializer';\nexport * from './int-8-array-serializer';\nexport * from './int-16-array-serializer';\nexport * from './int-32-array-serializer';\nexport * from './map-serializer';\nexport * from './number-serializer';\nexport * from './set-serializer';\nexport * from './string-serializer';\nexport * from './type-serializer';\nexport * from './uint-8-array-serializer';\nexport * from './uint-8-clamped-array-serializer';\nexport * from './uint-16-array-serializer';\nexport * from './uint-32-array-serializer';\nexport * from './unknown-serializer';\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 16 array serializer.\n * \n * @type {Int16ArraySerializer}\n */\nexport class Int16ArraySerializer implements Serializer<Int16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int16Array>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int16Array>, serializerContext: SerializerContext<Int16Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int16Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Int16ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 16 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int16Array>): TypeLike<Int16Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int16Array.from(x);\n }\n\n serializerContext.logger.error('Int16ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 16 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 32 array serializer.\n * \n * @type {Int32ArraySerializer}\n */\nexport class Int32ArraySerializer implements Serializer<Int32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int32Array>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int32Array>, serializerContext: SerializerContext<Int32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int32Array)\n {\n return Array.from(x);\n }\n \n serializerContext.logger.error('Int32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int32Array>): TypeLike<Int32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int32Array.from(x);\n }\n\n serializerContext.logger.error('Int32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 8 array serializer.\n * \n * @type {Int8ArraySerializer}\n */\nexport class Int8ArraySerializer implements Serializer<Int8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int8Array>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int8Array>, serializerContext: SerializerContext<Int8Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Int8Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Int8ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as int 8 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int8Array>): TypeLike<Int8Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Int8Array.from(x);\n }\n\n serializerContext.logger.error('Int8ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as int 8 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Map serializer.\n * \n * @type {MapSerializer}\n */\nexport class MapSerializer implements Serializer<Map<any, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Map<any, any>>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Map<any, any>>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Map)\n {\n return serializerContext.defineReference(x, () =>\n {\n const map = x;\n const array = new Array<any>(x.size);\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();\n\n keySerializerContext.jsonPathKey = 'key';\n keySerializerContext.typeState = genericKeySerializerContext.typeState;\n keySerializerContext.referenceValueSetter = (v, k) => array[keyArraySerializerContext.jsonPathKey][k] = v;\n\n valueSerializerContext.jsonPathKey = 'value';\n valueSerializerContext.typeState = genericValueSerializerContext.typeState;\n valueSerializerContext.referenceValueSetter = (v, k) => array[valueArraySerializerContext.jsonPathKey][k] = v;\n \n const keySerializer = keySerializerContext.serializer;\n const valueSerializer = valueSerializerContext.serializer;\n\n let i = -1;\n\n for (const [mk, mv] of map.entries())\n {\n i++;\n\n keyArraySerializerContext.jsonPathKey = i;\n valueArraySerializerContext.jsonPathKey = i;\n\n array[i] = {};\n array[i][keySerializerContext.jsonPathKey] = keySerializer.serialize(mk, keySerializerContext);\n array[i][valueSerializerContext.jsonPathKey] = valueSerializer.serialize(mv, valueSerializerContext);\n }\n\n return array;\n });\n }\n\n serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: cannot serialize value as map.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Map<any, any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<Map<any, any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const map = new Map<any, any>();\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext();\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext();\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext();\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext();\n\n keySerializerContext.jsonPathKey = 'key';\n keySerializerContext.typeState = genericKeySerializerContext.typeState;\n keySerializerContext.referenceValueSetter = v => map.set(v, undefined);\n\n valueSerializerContext.jsonPathKey = 'value';\n valueSerializerContext.typeState = genericValueSerializerContext.typeState;\n valueSerializerContext.referenceValueSetter = v => map.set(v, undefined);\n \n const keySerializer = keySerializerContext.serializer;\n const valueSerializer = valueSerializerContext.serializer;\n\n for (let i = 0; i < array.length; i++)\n {\n const mk = array[i][keySerializerContext.jsonPathKey];\n const mv = array[i][valueSerializerContext.jsonPathKey];\n\n keyArraySerializerContext.jsonPathKey = i;\n valueArraySerializerContext.jsonPathKey = i;\n\n const key = keySerializer.deserialize(mk, keySerializerContext);\n\n valueSerializerContext.referenceValueSetter = v => map.set(key, v);\n\n const value = valueSerializer.deserialize(mv, valueSerializerContext);\n \n map.set(key, value);\n }\n\n return map;\n });\n }\n\n serializerContext.logger.error('MapSerializer', `${serializerContext.jsonPath}: Cannot deserialize value as map!`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Number serializer.\n * \n * @type {NumberSerializer}\n */\nexport class NumberSerializer implements Serializer<number>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<number>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<number>, serializerContext: SerializerContext<number>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'number')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot serialize value as number.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<number>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<number>): TypeLike<number>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'number')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot deserialize value as number.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<number>} Converted value.\n */\n private convert(x: any, serializerContext: SerializerContext<number>): TypeLike<number>\n {\n if (typeof x === 'string' || typeof x === 'boolean')\n {\n return Number(x);\n }\n \n serializerContext.logger.error('NumberSerializer', `${serializerContext.jsonPath}: cannot convert value to a number.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Set serializer.\n * \n * @type {SetSerializer}\n */\nexport class SetSerializer implements Serializer<Set<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Set<any>>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Set<any>>, serializerContext: SerializerContext<Set<any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Set)\n {\n return serializerContext.defineReference(x, () =>\n {\n const set = x;\n const array = new Array<any>(set.size);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n\n valueSerializerContext.referenceValueSetter = (v, k) => array[k] = v;\n\n let i = -1;\n \n for (const v of set)\n {\n i++;\n\n valueSerializerContext.jsonPathKey = i;\n\n array[i] = serializer.serialize(v, valueSerializerContext);\n }\n\n return array;\n });\n }\n\n serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot serialize value as set.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Set<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Set<any>>): TypeLike<Set<any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const set = new Set<any>();\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext();\n const serializer = valueSerializerContext.serializer;\n \n valueSerializerContext.referenceValueSetter = v => set.add(v);\n\n for (let i = 0; i < array.length; i++)\n {\n valueSerializerContext.jsonPathKey = i;\n\n set.add(serializer.deserialize(array[i], valueSerializerContext));\n }\n\n return set;\n });\n }\n\n serializerContext.logger.error('SetSerializer', `${serializerContext.jsonPath}: cannot deserialize value as set.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * String serializer.\n * \n * @type {StringSerializer}\n */\nexport class StringSerializer implements Serializer<string>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<string>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<string>, serializerContext: SerializerContext<string>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return x;\n }\n \n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot serialize value as string.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<string>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<string>): TypeLike<string>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'string')\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot deserialize value as string.`, x);\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<string>} serializerContext Type serializer context.\n * \n * @returns {TypeLike<string>} Converted value or original value.\n */\n private convert(x: any, serializerContext: SerializerContext<string>): TypeLike<string>\n {\n if (typeof x === 'number' || typeof x === 'boolean') \n {\n return String(x);\n }\n\n if (x instanceof Date)\n {\n return x.toISOString();\n }\n\n if (typeof x === 'object')\n {\n return JSON.stringify(x);\n }\n\n serializerContext.logger.error('StringSerializer', `${serializerContext.jsonPath}: cannot convert value to string.`, x);\n \n return undefined;\n }\n}\n","import { PropertyName } from '../property-name';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeEntry } from '../type-entry';\nimport { TypeLike } from '../type-like';\n\n/**\n * Type serializer.\n * \n * @type {TypeSerializer}\n */\nexport class TypeSerializer implements Serializer<Record<string, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Record<string, any>>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Record<string, any>>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (typeof x === 'object')\n {\n return serializerContext.defineReference(x, () =>\n {\n const type = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x.constructor) \n : serializerContext;\n\n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext();\n const typeState = typeSerializerContext.typeState;\n const object = {} as Record<string, any>;\n\n propertySerializerContext.referenceValueSetter = (v, k) => \n {\n const declaringObject = propertySerializerContext.referenceMap.get(type);\n \n if (declaringObject !== undefined)\n {\n declaringObject[k] = v;\n }\n };\n\n for (let i = 0; i < typeState.sortedPropertyMetadatas.length; i++)\n {\n const propertyMetadata = typeState.sortedPropertyMetadatas[i];\n const propertyState = propertyMetadata.propertyState;\n\n if (!propertyState.serializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyState.serializedPropertyName;\n const deserializedPropertyName = propertyState.deserializedPropertyName;\n const propertyValue = type[deserializedPropertyName];\n\n propertySerializerContext.jsonPathKey = serializedPropertyName;\n propertySerializerContext.propertyState = propertyState;\n propertySerializerContext.typeState = propertyState.typeMetadata.typeState;\n propertySerializerContext.genericMetadatas = propertyState.genericMetadatas;\n\n const serializer = propertySerializerContext.serializer;\n const value = serializer.serialize(propertyValue, propertySerializerContext);\n\n object[serializedPropertyName] = value;\n }\n\n if (typeState.preserveDiscriminator)\n {\n object[typeState.discriminator] = typeState.discriminant;\n } \n else if (object.hasOwnProperty(typeState.discriminator))\n {\n delete object[typeState.discriminator];\n }\n\n return object;\n });\n }\n\n serializerContext.logger.error('TypeSerializer', `${serializerContext.jsonPath}: cannot serialize value as type.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Record<string, any>>} Deserialized value or undefined.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<Record<string, any>>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (typeof x === 'object')\n {\n return serializerContext.restoreReference(x, () =>\n {\n const object = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x) \n : serializerContext;\n \n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext();\n const typeState = typeSerializerContext.typeState;\n const typeEntryMap = new Map<PropertyName, TypeEntry<any, any>>();\n\n propertySerializerContext.referenceValueSetter = (v, k) => \n {\n const declaringType = propertySerializerContext.referenceMap.get(object);\n\n if (declaringType !== undefined)\n {\n declaringType[k] = v;\n }\n };\n\n for (let i = 0; i < typeState.sortedPropertyMetadatas.length; i++)\n {\n const propertyMetadata = typeState.sortedPropertyMetadatas[i];\n const propertyState = propertyMetadata.propertyState;\n\n if (!propertyState.deserializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyState.serializedPropertyName;\n const deserializedPropertyName = propertyState.deserializedPropertyName;\n const propertyValue = object[serializedPropertyName];\n\n propertySerializerContext.jsonPathKey = serializedPropertyName;\n propertySerializerContext.propertyState = propertyState;\n propertySerializerContext.typeState = propertyState.typeMetadata.typeState;\n propertySerializerContext.genericMetadatas = propertyState.genericMetadatas;\n\n const serializer = propertySerializerContext.serializer;\n const value = serializer.deserialize(propertyValue, propertySerializerContext);\n\n typeEntryMap.set(deserializedPropertyName, { key: deserializedPropertyName, value: value, propertyMetadata: propertyMetadata });\n typeEntryMap.set(serializedPropertyName, { key: serializedPropertyName, value: value, propertyMetadata: propertyMetadata });\n }\n\n for (const propertyName in object)\n {\n if (object.hasOwnProperty(propertyName) && !typeEntryMap.has(propertyName))\n {\n typeEntryMap.set(propertyName, { key: propertyName, value: object[propertyName] });\n }\n }\n\n const factory = typeState.factory;\n const injector = typeState.injector;\n const type = factory.build(typeState.typeMetadata, typeEntryMap, injector);\n\n if (typeState.preserveDiscriminator)\n {\n type[typeState.discriminator] = typeState.discriminant;\n }\n else if (type.hasOwnProperty(typeState.discriminator))\n {\n delete type[typeState.discriminator];\n }\n\n return type;\n });\n }\n \n serializerContext.logger.error('TypeSerializer', `${serializerContext.jsonPath}: cannot deserialize value as type.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 16 array serializer.\n * \n * @type {Uint16ArraySerializer}\n */\nexport class Uint16ArraySerializer implements Serializer<Uint16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint16Array>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint16Array>, serializerContext: SerializerContext<Uint16Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint16Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint16ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 16 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint16Array>): TypeLike<Uint16Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint16Array.from(x);\n }\n\n serializerContext.logger.error('Uint16ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 16 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 32 array serializer.\n * \n * @type {Uint32ArraySerializer}\n */\nexport class Uint32ArraySerializer implements Serializer<Uint32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint32Array>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint32Array>, serializerContext: SerializerContext<Uint32Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint32Array)\n {\n return Array.from(x);\n }\n \n serializerContext.logger.error('Uint32ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 32 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint32Array>): TypeLike<Uint32Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint32Array.from(x);\n }\n\n serializerContext.logger.error('Uint32ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 32 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 array serializer.\n * \n * @type {Uint8ArraySerializer}\n */\nexport class Uint8ArraySerializer implements Serializer<Uint8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8Array>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8Array>, serializerContext: SerializerContext<Uint8Array>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint8Array)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 8 array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8Array>): TypeLike<Uint8Array>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint8Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 8 array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 clamped array serializer.\n * \n * @type {Uint8ClampedArraySerializer}\n */\nexport class Uint8ClampedArraySerializer implements Serializer<Uint8ClampedArray>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8ClampedArray>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8ClampedArray>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n if (x instanceof Uint8ClampedArray)\n {\n return Array.from(x);\n }\n\n serializerContext.logger.error('Uint8ClampedArraySerializer', `${serializerContext.jsonPath}: cannot serialize value as uint 8 clamped array.`, x);\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8ClampedArray>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<Uint8ClampedArray>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (Array.isArray(x))\n {\n return Uint8ClampedArray.from(x);\n }\n\n serializerContext.logger.error('Uint8ClampedArraySerializer', `${serializerContext.jsonPath}: cannot deserialize value as uint 8 clamped array.`, x);\n\n return undefined;\n }\n}\n","import { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Unknown serializer.\n * \n * @type {UnknownSerializer}\n */\nexport class UnknownSerializer implements Serializer<unknown>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<unknown>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<unknown>, serializerContext: SerializerContext<unknown>): TypeLike<any>\n {\n if (x === undefined)\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<unknown>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<unknown>): TypeLike<unknown>\n {\n if (x === undefined)\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (x === null)\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { CustomKey } from './custom-key';\nimport { TypeExtensionMetadataCtor } from './type-extension-metadata-ctor';\n\n/**\n * Type extension metadata constructor set key.\n * \n * @type {CustomKey<Set<TypeExtensionMetadataCtor<any, any, any>>>}\n */\nexport const TYPE_EXTENSION_METADATA_CTOR_SET_KEY: CustomKey<Set<\n TypeExtensionMetadataCtor<any, any, any>\n>> = new CustomKey<Set<\n TypeExtensionMetadataCtor<any, any, any>\n>>('$DSTypeExtensionMetadataCtorSet', () => new Set<\n TypeExtensionMetadataCtor<any, any, any>\n>());\n","import { TypeExtensionOptions } from './type-extension-options';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Type extension metadata used by plugins to provide additional features for type metadata \n * using custom keys. Descendant classes are just wrappers to get convenient access to custom context.\n * \n * @type {TypeExtensionMetadata<TObject, TTypeExtensionOptions>}\n */\nexport abstract class TypeExtensionMetadata<TObject, TTypeExtensionOptions extends TypeExtensionOptions>\n{\n /**\n * Type metadata which we extend.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata which we extend.\n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n */\n public constructor(typeMetadata: TypeMetadata<TObject>, typeExtensionOptions: TTypeExtensionOptions)\n {\n this.typeMetadata = typeMetadata;\n\n this.configure(typeExtensionOptions);\n\n return;\n }\n\n /**\n * Configures type extension.\n * \n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n * \n * @returns {this} Type extension metadata.\n */\n public abstract configure(typeExtensionOptions: TTypeExtensionOptions): this;\n}\n","import { Alias } from './alias';\nimport { Any } from './any';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { CustomKey } from './custom-key';\nimport { CustomValue } from './custom-value';\nimport { TypeFactory } from './factories/type-factory';\nimport { jsonParse } from './functions/json-parse';\nimport { jsonStringify } from './functions/json-stringify';\nimport { GenericArgument } from './generic-argument';\nimport { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { SingletonInjector } from './injectors/singleton-injector';\nimport { Logger } from './logger';\nimport { LoggerLevel } from './logger-level';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { ReferenceCallback } from './reference-callback';\nimport { CircularReferenceHandler } from './reference-handlers/circular-reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { SerializerContext } from './serializer-context';\nimport { AnySerializer } from './serializers/any-serializer';\nimport { ArrayBufferSerializer } from './serializers/array-buffer-serializer';\nimport { ArraySerializer } from './serializers/array-serializer';\nimport { BooleanSerializer } from './serializers/boolean-serializer';\nimport { DataViewSerializer } from './serializers/data-view-serializer';\nimport { DateSerializer } from './serializers/date-serializer';\nimport { Float32ArraySerializer } from './serializers/float-32-array-serializer';\nimport { Float64ArraySerializer } from './serializers/float-64-array-serializer';\nimport { Int16ArraySerializer } from './serializers/int-16-array-serializer';\nimport { Int32ArraySerializer } from './serializers/int-32-array-serializer';\nimport { Int8ArraySerializer } from './serializers/int-8-array-serializer';\nimport { MapSerializer } from './serializers/map-serializer';\nimport { NumberSerializer } from './serializers/number-serializer';\nimport { SetSerializer } from './serializers/set-serializer';\nimport { StringSerializer } from './serializers/string-serializer';\nimport { TypeSerializer } from './serializers/type-serializer';\nimport { Uint16ArraySerializer } from './serializers/uint-16-array-serializer';\nimport { Uint32ArraySerializer } from './serializers/uint-32-array-serializer';\nimport { Uint8ArraySerializer } from './serializers/uint-8-array-serializer';\nimport { Uint8ClampedArraySerializer } from './serializers/uint-8-clamped-array-serializer';\nimport { UnknownSerializer } from './serializers/unknown-serializer';\nimport { TypeConfiguration } from './type-configuration';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeManagerOptions } from './type-manager-options';\nimport { TypeMetadata } from './type-metadata';\nimport { TYPE_METADATA_SYMBOL } from './type-metadata-symbol';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\nimport { TypeScope } from './type-scope';\nimport { Unknown } from './unknown';\n\n/**\n * Type manager class.\n * \n * @type {TypeManager}\n */\nexport class TypeManager\n{\n /**\n * Static shared options of any type which applied to any instance of type manager\n * by default.\n * \n * @type {TypeOptionsBase<any>}\n */\n private static readonly defaultTypeOptionsBase: TypeOptionsBase<any> = {\n customValueMap: new Map<CustomKey<any>, CustomValue>(),\n discriminator: '$type',\n factory: new TypeFactory(),\n injector: new SingletonInjector(),\n logger: new Logger(LoggerLevel.Error),\n preserveDiscriminator: false,\n referenceHandler: new CircularReferenceHandler(),\n serializer: new TypeSerializer(),\n preserveNull: true,\n useDefaultValue: false,\n useImplicitConversion: false\n };\n \n /**\n * Static type options per type which applied to any instance of type manager\n * by default.\n * \n * @type {ReadonlyMap<TypeFn<any>, TypeOptions<any>>}\n */\n private static readonly defaultTypeOptionsMap: ReadonlyMap<TypeFn<any>, TypeOptions<any>> = new Map<TypeFn<any>, TypeOptions<any>>([\n [Any, { serializer: new AnySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [ArrayBuffer, { serializer: new ArrayBufferSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Array, { serializer: new ArraySerializer(), serializedDefaultValue: () => [], deserializedDefaultValue: () => [] }],\n [Boolean, { serializer: new BooleanSerializer(), serializedDefaultValue: false, deserializedDefaultValue: false }],\n [DataView, { serializer: new DataViewSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Date, { serializer: new DateSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float32Array, { serializer: new Float32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float64Array, { serializer: new Float64ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int8Array, { serializer: new Int8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int16Array, { serializer: new Int16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int32Array, { serializer: new Int32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Map, { serializer: new MapSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Number, { serializer: new NumberSerializer(), serializedDefaultValue: 0, deserializedDefaultValue: 0 }],\n [Set, { serializer: new SetSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [String, { serializer: new StringSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8Array, { serializer: new Uint8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8ClampedArray, { serializer: new Uint8ClampedArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint16Array, { serializer: new Uint16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint32Array, { serializer: new Uint32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Unknown, { serializer: new UnknownSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }]\n ]);\n\n /**\n * Static type manager instance which is used for decorator based configurations and\n * static declarative based configurations.\n *\n * @type {TypeManager}\n */\n public static readonly staticTypeManager: TypeManager = new TypeManager();\n\n /**\n * Type scope to work with registration in static context.\n * \n * @type {TypeScope}\n */\n public static readonly typeScope: TypeScope = new TypeScope();\n\n /**\n * Symbol of current instance which is used to store type metadata within types.\n * \n * @type {symbol}\n */\n public readonly symbol: symbol;\n\n /**\n * Type manager options.\n * \n * @type {TypeManagerOptions}\n */\n private readonly typeManagerOptions: TypeManagerOptions;\n\n /**\n * Type function map for types with aliases.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n private readonly typeFnMap: Map<Alias, TypeFn<any>>;\n \n /**\n * Type metadata set for the current instance of type manager.\n * \n * @type {Set<TypeMetadata<any>>}\n */\n private readonly typeMetadataSet: Set<TypeMetadata<any>>;\n \n /**\n * Constructor.\n * \n * Creating an instance of type manager allows to have multiple configs. By default only static \n * instance of type manager is created on the background and all decorator based and declarative based\n * configurations are applied to it. Note that all options which are passed to a constructor are\n * mutated and all references are kept. This allow to have different managers with intersected data.\n * If such behaviour is not required then use configure methods after creating instance of type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n */\n public constructor(typeManagerOptions: TypeManagerOptions = {})\n {\n this.symbol = Symbol(TYPE_METADATA_SYMBOL.description);\n this.typeManagerOptions = this.constructTypeManagerOptions(typeManagerOptions);\n this.typeFnMap = new Map<Alias, TypeFn<any>>();\n this.typeMetadataSet = new Set<TypeMetadata<any>>();\n\n this.configure(typeManagerOptions);\n\n return;\n }\n\n /**\n * Gets symbol in static context.\n * \n * @returns {symbol} Type manager symbol.\n */\n public static get symbol(): symbol\n {\n return this.staticTypeManager.symbol;\n }\n\n /**\n * Gets logger in static context.\n * \n * @returns {Logger} Logger.\n */\n public static get logger(): Logger\n {\n return this.staticTypeManager.logger;\n }\n \n /**\n * Gets logger.\n * \n * @returns {Logger} Logger.\n */\n public get logger(): Logger\n {\n return this.typeOptionsBase.logger;\n }\n\n /**\n * Gets type options base in static context.\n * \n * @returns {Readonly<TypeOptionsBase<any>>} Type options base.\n */\n public static get typeOptionsBase(): Readonly<TypeOptionsBase<any>>\n {\n return this.staticTypeManager.typeOptionsBase;\n }\n\n /**\n * Gets type options base.\n * \n * @returns {Readonly<TypeOptionsBase<any>>} Type options base.\n */\n public get typeOptionsBase(): Readonly<TypeOptionsBase<any>>\n {\n let typeOptionsBase = this.typeManagerOptions.typeOptionsBase;\n\n if (typeOptionsBase === undefined)\n {\n typeOptionsBase = {};\n\n this.typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n return typeOptionsBase as TypeOptionsBase<any>;\n }\n\n /**\n * Gets type options map in static context.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public static get typeOptionsMap(): ReadonlyMap<TypeFn<any>, TypeOptions<any>>\n {\n return this.staticTypeManager.typeOptionsMap;\n }\n\n /**\n * Gets type options map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public get typeOptionsMap(): ReadonlyMap<TypeFn<any>, TypeOptions<any>>\n {\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeOptionsMap;\n }\n\n /**\n * Gets type configuration map in static context.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public static get typeConfigurationMap(): ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>\n {\n return this.staticTypeManager.typeConfigurationMap;\n }\n\n /**\n * Gets type configuration map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public get typeConfigurationMap(): ReadonlyMap<TypeFn<any>, TypeConfiguration<any>>\n {\n let typeConfigurationMap = this.typeManagerOptions.typeConfigurationMap;\n\n if (typeConfigurationMap === undefined)\n {\n typeConfigurationMap = new Map<TypeFn<any>, TypeConfiguration<any>>();\n\n this.typeManagerOptions.typeConfigurationMap = typeConfigurationMap;\n }\n\n return typeConfigurationMap;\n }\n\n /**\n * Constructs initial type manager options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManagerOptions} Constructed type manager options.\n */\n private constructTypeManagerOptions(typeManagerOptions: TypeManagerOptions): TypeManagerOptions\n {\n let typeOptionsBase = typeManagerOptions.typeOptionsBase;\n\n if (typeOptionsBase === undefined)\n {\n typeOptionsBase = {};\n\n typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n let typeOptionsMap = typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeManagerOptions;\n }\n\n /**\n * Constructs type options base.\n * \n * @param {Partial<TypeOptionsBase<any>>} typeOptionsBase Type options base.\n * \n * @returns {Partial<TypeOptionsBase<any>>} Constructed type options base.\n */\n private constructTypeOptionsBase(typeOptionsBase: Partial<TypeOptionsBase<any>>): Partial<TypeOptionsBase<any>>\n {\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n const initialTypeOptionsBase = Object.assign({}, TypeManager.defaultTypeOptionsBase, { customValueMap: customValueMap }, typeOptionsBase);\n \n Object.assign(typeOptionsBase, initialTypeOptionsBase);\n\n return typeOptionsBase;\n }\n\n /**\n * Constructs type options map.\n * \n * @param {Map<TypeFn<any>, TypeOptions<any>>} typeOptionsMap Type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Constructed type options map.\n */\n private constructTypeOptionsMap(typeOptionsMap: Map<TypeFn<any>, TypeOptions<any>>): Map<TypeFn<any>, TypeOptions<any>>\n {\n const initialTypeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n for (const [typeFn, typeOptions] of TypeManager.defaultTypeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, Object.assign(mapTypeOptions, typeOptions));\n }\n\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, Object.assign(typeOptions, Object.assign(mapTypeOptions, typeOptions)));\n }\n\n typeOptionsMap.clear();\n\n for (const [typeFn, typeOptions] of initialTypeOptionsMap)\n {\n typeOptionsMap.set(typeFn, typeOptions);\n }\n\n return typeOptionsMap;\n }\n\n /**\n * Configures type metadata for provided type function in a static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public static configureTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n return this.staticTypeManager.configureTypeMetadata(typeFn, typeOptions);\n }\n\n /**\n * Configures type metadata for provided type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public configureTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TObject> : this.declareTypeMetadata(typeFn, typeOptions);\n\n if (!typeMetadataDefined)\n {\n Object.defineProperty(prototype, symbol, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: typeMetadata\n });\n }\n\n if (typeMetadataDefined && typeOptions !== undefined)\n {\n typeMetadata.configure(typeOptions);\n }\n\n return typeMetadata;\n }\n\n /**\n * Declares type metadata for provided type function based on general configuration.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TObject>} Type metadata.\n */\n private declareTypeMetadata<TObject>(typeFn: TypeFn<TObject>, typeOptions?: TypeOptions<TObject>): TypeMetadata<TObject>\n {\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\n\n if (typeOptionsMap === undefined)\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n let mapTypeOptions = typeOptionsMap.get(typeFn);\n\n if (mapTypeOptions === undefined)\n {\n mapTypeOptions = typeOptions ?? {};\n\n typeOptionsMap.set(typeFn, mapTypeOptions);\n }\n\n const typeFnMap = this.typeFnMap;\n const typeMetadataSet = this.typeMetadataSet;\n const symbol = this.symbol;\n const parentPrototype = Object.getPrototypeOf(typeFn.prototype) ?? {};\n const parentTypeMetadata = parentPrototype[symbol];\n const typeMetadata = new TypeMetadata(this, typeFnMap, typeMetadataSet, typeFn, mapTypeOptions, parentTypeMetadata);\n\n typeMetadataSet.add(typeMetadata);\n\n return typeMetadata;\n }\n\n /**\n * Extracts type metadata from provided type function in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public static extractTypeMetadata<TObject>(typeFn: TypeFn<TObject>): TypeMetadata<TObject>\n {\n return this.staticTypeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Extracts type metadata from provided type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * \n * @returns {TypeMetadata<TObject>} Type metadata for provided type function.\n */\n public extractTypeMetadata<TObject>(typeFn: TypeFn<TObject>): TypeMetadata<TObject>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TObject> : this.configureTypeMetadata(typeFn);\n\n return typeMetadata;\n }\n\n /**\n * Applies shared type options in static context.\n * \n * @param {Partial<TypeOptionsBase<TObject>>} typeOptionsBase Type options base.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsBase<TObject>(typeOptionsBase: Partial<TypeOptionsBase<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsBase(typeOptionsBase);\n }\n \n /**\n * Applies shared type options.\n * \n * @param {Partial<TypeOptionsBase<TObject>>} typeOptionsBase Type options base.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptionsBase<TObject>(typeOptionsBase: Partial<TypeOptionsBase<TObject>>): this\n {\n const customValueMap = this.typeOptionsBase.customValueMap;\n\n Object.assign(this.typeOptionsBase, typeOptionsBase, { customValueMap: customValueMap });\n\n if (typeOptionsBase.customValueMap !== undefined)\n {\n for (const [customKey, customValue] of typeOptionsBase.customValueMap)\n {\n customValueMap.set(customKey, customValue);\n }\n }\n\n for (const typeMetadata of this.typeMetadataSet)\n {\n typeMetadata.unresolveTypeState();\n }\n\n return this;\n }\n\n /**\n * Applies type options map in static context.\n * \n * @param {Map<TypeFn<TObject>, TypeOptions<TObject>>} typeOptionsMap Type options map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsMap<TObject>(typeOptionsMap: Map<TypeFn<TObject>, TypeOptions<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsMap(typeOptionsMap);\n }\n\n /**\n * Applies type options map.\n * \n * @param {Map<TypeFn<TObject>, TypeOptions<TObject>>} typeOptionsMap Type options map.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptionsMap<TObject>(typeOptionsMap: Map<TypeFn<TObject>, TypeOptions<TObject>>): this\n {\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n this.applyTypeOptions(typeFn, typeOptions);\n }\n\n return this;\n }\n\n /**\n * Applies type options in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptions<TObject>(typeFn: TypeFn<TObject>, typeOptions: TypeOptions<TObject>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptions(typeFn, typeOptions);\n }\n\n /**\n * Applies type options.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeOptions<TObject>(typeFn: TypeFn<TObject>, typeOptions: TypeOptions<TObject>): this\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeMetadata.configure(typeOptions);\n\n return this;\n }\n\n /**\n * Applies type configuration map in static context.\n * \n * @param {Map<TypeFn<TObject>, TypeConfiguration<TObject>>} typeConfigurationMap Type configuration map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfigurationMap<TObject>(typeConfigurationMap: Map<TypeFn<TObject>, TypeConfiguration<TObject>>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfigurationMap(typeConfigurationMap);\n }\n\n /**\n * Applies type configuration map.\n * \n * @param {Map<TypeFn<TObject>, TypeConfiguration<TObject>>} typeConfigurationMap Type configuration map.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeConfigurationMap<TObject>(typeConfigurationMap: Map<TypeFn<TObject>, TypeConfiguration<TObject>>): this\n {\n for (const [typeFn, typeConfiguration] of typeConfigurationMap)\n {\n this.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n return this;\n }\n\n /**\n * Applies type configuration in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeConfiguration<TObject>} typeConfiguration Type configuration.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfiguration<TObject>(typeFn: TypeFn<TObject>, typeConfiguration: TypeConfiguration<TObject>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n /**\n * Applies type configuration.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeConfiguration<TObject>} typeConfiguration Type configuration.\n * \n * @returns {this} Instance of type manager.\n */\n public applyTypeConfiguration<TObject>(typeFn: TypeFn<TObject>, typeConfiguration: TypeConfiguration<TObject>): this\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeConfiguration.configure(typeMetadata);\n\n return this;\n }\n\n /**\n * Configures type manager in static context.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static configure(typeManagerOptions: TypeManagerOptions): TypeManager\n {\n return this.staticTypeManager.configure(typeManagerOptions);\n }\n\n /**\n * Configures type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {this} Instance of type manager.\n */\n public configure(typeManagerOptions: TypeManagerOptions): this\n {\n if (typeManagerOptions.typeOptionsBase !== undefined) \n {\n this.applyTypeOptionsBase(typeManagerOptions.typeOptionsBase);\n }\n\n if (typeManagerOptions.typeOptionsMap !== undefined) \n {\n this.applyTypeOptionsMap(typeManagerOptions.typeOptionsMap);\n }\n\n if (typeManagerOptions.typeConfigurationMap !== undefined) \n {\n this.applyTypeConfigurationMap(typeManagerOptions.typeConfigurationMap);\n }\n\n return this;\n }\n\n /**\n * Defines serializer context for x in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TObject>} Serializer context.\n */\n public static defineSerializerContext<TObject>(typeFn: TypeFn<TObject>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TObject>\n {\n return this.staticTypeManager.defineSerializerContext(typeFn, x, genericArguments);\n }\n\n /**\n * Defines serializer context for x.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TObject>} Serializer context.\n */\n public defineSerializerContext<TObject>(typeFn: TypeFn<TObject>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TObject>\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n const genericMetadatas = genericArguments === undefined ? EMPTY_ARRAY : typeMetadata.resolveGenericMetadatas(genericArguments);\n \n return new SerializerContext(\n x,\n new Map<ReferenceKey, ReferenceValue>(), \n new Map<ReferenceKey, Array<ReferenceCallback>>(),\n undefined,\n '$',\n typeMetadata.typeState,\n genericMetadatas,\n undefined,\n undefined\n );\n }\n\n /**\n * Create a new clone of the static type manager. This method returns a shallow \n * copy, preserving its current configuration and registered types.\n * \n * @returns {TypeManager} A new instance that duplicates the static type manager.\n */\n public static clone(): TypeManager\n {\n return this.staticTypeManager.clone();\n }\n\n /**\n * Create a new clone of this type manager instance. The clone will contain \n * copies of this instance base options and mappings, but will be completely \n * independent: subsequent changes on the clone or the original will not affect \n * each other.\n * \n * @returns {TypeManager} A fresh type manager instance with the same configuration and registered types.\n */\n public clone(): TypeManager\n {\n const typeOptionsBase = this.cloneTypeOptionsBase();\n const typeOptionsMap = this.cloneTypeOptionsMap();\n const typeManagerOptions = { typeOptionsBase: typeOptionsBase, typeOptionsMap: typeOptionsMap };\n const typeManager = new TypeManager(typeManagerOptions);\n\n return typeManager;\n }\n\n /**\n * Creates a clone of type options base.\n * \n * @returns {TypeOptionsBase<any>} Type options base clone.\n */\n private cloneTypeOptionsBase(): TypeOptionsBase<any>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const customValueMap = typeOptionsBase.customValueMap;\n const customValueMapClone = new Map<CustomKey<any>, CustomValue>();\n const typeOptionsBaseClone = Object.assign({}, typeOptionsBase, { customValueMap: customValueMapClone });\n\n for (const [customKey, customValue] of customValueMap)\n {\n customValueMapClone.set(customKey, customValue);\n }\n\n return typeOptionsBaseClone;\n }\n\n /**\n * Creates a clone of type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map clone.\n */\n private cloneTypeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\n {\n const typeOptionsMap = this.typeOptionsMap;\n const typeOptionsMapClone = new Map<TypeFn<any>, TypeOptions<any>>();\n\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n const typeOptionsClone = Object.assign({}, typeOptions);\n const typeCustomValueMap = typeOptions.customValueMap;\n\n if (typeCustomValueMap !== undefined)\n {\n const typeCustomValueMapClone = new Map<CustomKey<any>, CustomValue>();\n\n for (const [customKey, customValue] of typeCustomValueMap)\n {\n typeCustomValueMapClone.set(customKey, customValue);\n }\n\n typeOptionsClone.customValueMap = typeCustomValueMapClone;\n }\n\n const propertyOptionsMap = typeOptions.propertyOptionsMap;\n\n if (propertyOptionsMap !== undefined)\n {\n const propertyOptionsMapClone = new Map<PropertyName, PropertyOptions<any>>();\n\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\n {\n const propertyOptionsClone = Object.assign({}, propertyOptions);\n const propertyCustomValueMap = propertyOptions.customValueMap;\n\n if (propertyCustomValueMap !== undefined)\n {\n const propertyCustomValueMapClone = new Map<CustomKey<any>, CustomValue>();\n\n for (const [customKey, customValue] of propertyCustomValueMap)\n {\n propertyCustomValueMapClone.set(customKey, customValue);\n }\n\n propertyOptionsClone.customValueMap = propertyCustomValueMapClone;\n }\n\n propertyOptionsMapClone.set(propertyName, propertyOptionsClone);\n }\n\n typeOptionsClone.propertyOptionsMap = propertyOptionsMapClone;\n }\n\n const injectOptionsMap = typeOptions.injectOptionsMap;\n\n if (injectOptionsMap !== undefined)\n {\n const injectOptionsMapClone = new Map<InjectIndex, InjectOptions<any>>();\n\n for (const [injectIndex, injectOptions] of injectOptionsMap)\n {\n const injectOptionsClone = Object.assign({}, injectOptions);\n\n injectOptionsMapClone.set(injectIndex, injectOptionsClone);\n }\n\n typeOptionsClone.injectOptionsMap = injectOptionsMapClone;\n }\n\n typeOptionsMapClone.set(typeFn, typeOptionsClone);\n }\n\n return typeOptionsMapClone;\n }\n\n /**\n * Clears all type registrations from the static type manager. After calling this \n * method, the static type manager will no longer hold any registered type metadata.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static clear(): TypeManager\n {\n return this.staticTypeManager.clear();\n }\n\n /**\n * Clears all type registrations from the type manager. After calling this \n * method, the type manager will no longer hold any registered type metadata.\n * \n * @returns {this} Instance of type manager.\n */\n public clear(): this\n {\n const symbol = this.symbol;\n const typeMetadataSet = this.typeMetadataSet;\n \n for (const typeMetadata of typeMetadataSet)\n {\n const prototype = typeMetadata.typeFn.prototype ?? {};\n\n delete prototype[symbol];\n }\n\n typeMetadataSet.clear();\n\n return this;\n }\n\n /**\n * Serializes provided value based on the type in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<TObject>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: Array<TObject>): Array<any>;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: TObject): any;\n public static serialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<TObject | Array<TObject>>): TypeLike<any>\n {\n return this.staticTypeManager.serialize(typeFn, x);\n }\n\n /**\n * Serializes provided value based on the type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<TObject>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: Array<TObject>): Array<any>;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: TObject): any;\n public serialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<TObject | Array<TObject>>): TypeLike<any>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (Array.isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).serialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).serialize(x as any);\n }\n\n /**\n * Deserializes provided value based on the type function in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: Array<any>): Array<TObject>;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: any): TObject;\n public static deserialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<any>): TypeLike<TObject | Array<TObject>>\n {\n return this.staticTypeManager.deserialize(typeFn, x);\n }\n\n /**\n * Deserializes provided value based on the type function.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: undefined): any;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: null): null;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: Array<any>): Array<TObject>;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: any): TObject;\n public deserialize<TObject>(typeFn: TypeFn<TObject>, x: TypeLike<any>): TypeLike<TObject | Array<TObject>>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (Array.isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).deserialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).deserialize(x as any);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public static stringify<TObject>(typeFn: TypeFn<TObject>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return this.staticTypeManager.stringify(typeFn, x, replacer, space);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public stringify<TObject>(typeFn: TypeFn<TObject>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return jsonStringify(this.serialize(typeFn, x), replacer, space);\n }\n\n /**\n * Converts a JavaScript Object Notation (JSON) string into a type in static context.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public static parse<TObject>(typeFn: TypeFn<TObject>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TObject>\n {\n return this.staticTypeManager.parse(typeFn, x, reviver);\n }\n \n /**\n * Converts a JavaScript Object Notation (JSON) string into a type.\n * \n * @param {TypeFn<TObject>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TObject>} Type created from provided input value or undefined.\n */\n public parse<TObject>(typeFn: TypeFn<TObject>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TObject>\n {\n return this.deserialize(typeFn, jsonParse(x, reviver));\n }\n}\n","/**\n * Unique symbol used to store type metadata.\n * \n * @type {unique symbol}\n */\n export const TYPE_METADATA_SYMBOL: unique symbol = Symbol.for('$DSTypeMetadata');\n","import { Alias } from './alias';\nimport { DEFAULT_VALUE_RESOLVER } from './constants/default-value-resolver';\nimport { EMPTY_ARRAY } from './constants/empty-array';\nimport { EMPTY_MAP } from './constants/empty-map';\nimport { NULL_VALUE_RESOLVER } from './constants/null-value-resolver';\nimport { CustomKey } from './custom-key';\nimport { CustomOption } from './custom-option';\nimport { CustomValue } from './custom-value';\nimport { DefaultValue } from './default-value';\nimport { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { nameOf } from './functions/name-of';\nimport { InjectIndex } from './inject-index';\nimport { InjectMetadata } from './inject-metadata';\nimport { InjectOptions } from './inject-options';\nimport { InjectSorter } from './inject-sorter';\nimport { Injector } from './injector';\nimport { Logger } from './logger';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { Nullable } from './nullable';\nimport { Optional } from './optional';\nimport { PropertyMetadata } from './property-metadata';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { PropertySorter } from './property-sorter';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeArgument } from './type-argument';\nimport { TypeExtensionMetadata } from './type-extension-metadata';\nimport { TypeExtensionMetadataCtor } from './type-extension-metadata-ctor';\nimport { TYPE_EXTENSION_METADATA_CTOR_SET_KEY } from './type-extension-metadata-ctor-set-key';\nimport { TypeExtensionOptions } from './type-extension-options';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeName } from './type-name';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\nimport { TypeState } from './type-state';\nimport { ResolvedTypeState } from './type-states/resolved-type-state';\nimport { UnresolvedTypeState } from './type-states/unresolved-type-state';\n\n/**\n * Main class used to describe a certain type.\n * \n * @type {TypeMetadata<TObject>}\n */\nexport class TypeMetadata<TObject> extends Metadata\n{\n /**\n * Type name. \n * \n * Defined at runtime based on the constructor function.\n * \n * @type {TypeName}\n */\n public readonly typeName: TypeName;\n\n /**\n * Type function.\n * \n * @type {TypeFn<TObject>}\n */\n public readonly typeFn: TypeFn<TObject>;\n\n /**\n * Parent type metadata.\n * \n * @type {Optional<TypeMetadata<any>>}\n */\n public readonly parentTypeMetadata: Optional<TypeMetadata<any>>;\n\n /**\n * Type options used as a fallback.\n * \n * @type {TypeOptionsBase<TObject>}\n */\n private readonly typeOptionsBase: TypeOptionsBase<TObject>;\n\n /**\n * Type options.\n * \n * @type {TypeOptions<TObject>}\n */\n private readonly typeOptions: TypeOptions<TObject>;\n\n /**\n * Type metadata set.\n * \n * @type {ReadonlySet<TypeMetadata<any>>}\n */\n private readonly typeMetadataSet: ReadonlySet<TypeMetadata<any>>;\n\n /**\n * Current type function map.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n private readonly currentTypeFnMap: Map<Alias, TypeFn<any>>;\n\n /**\n * Current child type metadata map.\n * \n * @type {Map<TypeFn<TObject>, TypeMetadata<any>>}\n */\n private readonly currentChildTypeMetadataMap: Map<TypeFn<any>, TypeMetadata<any>>;\n\n /**\n * Current property metadata map.\n * \n * @type {Map<PropertyName, PropertyMetadata<TObject, any>>}\n */\n private readonly currentPropertyMetadataMap: Map<PropertyName, PropertyMetadata<TObject, any>>;\n \n /**\n * Current inject metadata map.\n * \n * @type {Map<InjectIndex, InjectMetadata<TObject, any>>}\n */\n private readonly currentInjectMetadataMap: Map<InjectIndex, InjectMetadata<TObject, any>>;\n\n /**\n * Current type state.\n * \n * @type {TypeState<TObject>}\n */\n private currentTypeState: TypeState<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {Map<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.\n * @param {ReadonlySet<TypeMetadata<any>>} typeMetadataSet Type metadata set.\n * @param {TypeFn<any>} typeFn Type function.\n * @param {TypeOptions<TObject>} typeOptions Type options.\n * @param {Optional<TypeMetadata<any>>} parentTypeMetadata Parent type metadata.\n */\n public constructor(\n typeManager: TypeManager, \n typeFnMap: Map<Alias, TypeFn<any>>,\n typeMetadataSet: ReadonlySet<TypeMetadata<any>>,\n typeFn: TypeFn<TObject>,\n typeOptions: TypeOptions<TObject>,\n parentTypeMetadata: Optional<TypeMetadata<any>>\n )\n {\n super(typeManager, typeFnMap);\n \n this.typeName = nameOf(typeFn);\n this.typeFn = typeFn;\n this.parentTypeMetadata = parentTypeMetadata;\n this.typeOptionsBase = typeManager.typeOptionsBase;\n this.typeOptions = this.constructTypeOptions(typeOptions);\n this.typeMetadataSet = typeMetadataSet;\n this.currentTypeFnMap = typeFnMap;\n this.currentChildTypeMetadataMap = new Map<TypeFn<any>, TypeMetadata<any>>();\n this.currentPropertyMetadataMap = new Map<PropertyName, PropertyMetadata<TObject, any>>();\n this.currentInjectMetadataMap = new Map<InjectIndex, InjectMetadata<TObject, any>>();\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n this.extendParentTypeMetadata();\n this.configure(typeOptions);\n\n return;\n }\n \n /**\n * Gets type state.\n * \n * @returns {TypeState<TObject>} Type state.\n */\n public get typeState(): TypeState<TObject>\n {\n return this.currentTypeState;\n }\n\n /**\n * Gets inject metadata map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>}\n */\n public get injectMetadataMap(): ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n {\n return this.currentTypeState.injectMetadataMap;\n }\n\n /**\n * Gets property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public get propertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n return this.currentTypeState.propertyMetadataMap;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias or undefined.\n */\n public get alias(): Optional<Alias>\n {\n return this.currentTypeState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n return this.currentTypeState.customValueMap;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {Nullable<any>} Resolved serialized null value.\n */\n public get serializedNullValue(): Nullable<any>\n {\n return this.currentTypeState.serializedNullValueResolver();\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {Optional<any>} Resolved serialized default value.\n */\n public get serializedDefaultValue(): Optional<any>\n {\n return this.currentTypeState.serializedDefaultValueResolver();\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {Nullable<any>} Resolved deserialized null value.\n */\n public get deserializedNullValue(): Nullable<any>\n {\n return this.currentTypeState.deserializedNullValueResolver();\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {Optional<any>} Resolved deserialized default value.\n */\n public get deserializedDefaultValue(): Optional<any>\n {\n return this.currentTypeState.deserializedDefaultValueResolver();\n }\n \n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.currentTypeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.currentTypeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.currentTypeState.factory;\n }\n\n /**\n * Gets injectable value.\n * \n * @returns {boolean} Injectable indicator.\n */\n public get injectable(): boolean\n {\n return this.currentTypeState.injectable;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector.\n */\n public get injector(): Injector\n {\n return this.currentTypeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger instance.\n */\n public get logger(): Logger\n {\n return this.currentTypeState.logger;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention or undefined.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n return this.currentTypeState.namingConvention;\n }\n\n /**\n * Gets indicator if current type metadata is polymorphic.\n * \n * @returns {boolean} True when type metadata is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.currentTypeState.polymorphic;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.currentTypeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.currentTypeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n return this.currentTypeState.serializer;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.currentTypeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.currentTypeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.currentTypeState.useImplicitConversion;\n }\n\n /**\n * Gets property sorter.\n * \n * @returns {Optional<PropertySorter>} Property sorter or undefined.\n */\n public get propertySorter(): Optional<PropertySorter>\n {\n return this.currentTypeState.propertySorter;\n }\n\n /**\n * Gets sorted property metadatas.\n * \n * @returns {ReadonlyArray<PropertyMetadata<TObject, any>>} Readonly array of property metadatas.\n */\n public get sortedPropertyMetadatas(): ReadonlyArray<PropertyMetadata<TObject, any>>\n {\n return this.currentTypeState.sortedPropertyMetadatas;\n }\n\n /**\n * Gets inject sorter.\n * \n * @returns {Optional<InjectSorter>} Property sorter or undefined.\n */\n public get injectSorter(): Optional<InjectSorter>\n {\n return this.currentTypeState.injectSorter;\n }\n\n /**\n * Gets sorted inject metadatas.\n * \n * @returns {ReadonlyArray<InjectMetadata<TObject, any>>} Iterable of inject metadatas.\n */\n public get sortedInjectMetadatas(): ReadonlyArray<InjectMetadata<TObject, any>>\n {\n return this.currentTypeState.sortedInjectMetadatas;\n }\n\n /**\n * Gets parent type arguments.\n * \n * @returns {ReadonlyArray<TypeArgument<any>>} Parent arguments.\n */\n public get parentTypeArguments(): ReadonlyArray<TypeArgument<any>>\n {\n return this.currentTypeState.parentTypeArguments;\n }\n\n /**\n * Gets property options map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyOptions<any>>} Property options map.\n */\n public get propertyOptionsMap(): ReadonlyMap<PropertyName, PropertyOptions<any>>\n {\n return this.currentTypeState.propertyOptionsMap;\n }\n\n /**\n * Gets inject options map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectOptions<any>>} Inject options map.\n */\n public get injectOptionsMap(): ReadonlyMap<InjectIndex, InjectOptions<any>>\n {\n return this.currentTypeState.injectOptionsMap;\n }\n\n /**\n * Constructs initial type options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {TypeOptions<TObject>} Constructed type options.\n */\n private constructTypeOptions(typeOptions: TypeOptions<TObject>): TypeOptions<TObject>\n {\n if (typeOptions.customValueMap === undefined)\n {\n typeOptions.customValueMap = new Map<CustomKey<any>, CustomValue>();\n }\n\n if (typeOptions.propertyOptionsMap === undefined)\n {\n typeOptions.propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n }\n\n if (typeOptions.injectOptionsMap === undefined)\n {\n typeOptions.injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n }\n \n return typeOptions;\n }\n\n /**\n * Configures type extension metadata.\n * \n * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor.\n * @param {TTypeExtensionOptions} typeExtensionOptions Type extension options.\n * \n * @returns {TTypeExtensionMetadata} Type extension metadata\n */\n public configureTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(\n typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>, \n typeExtensionOptions?: TTypeExtensionOptions\n ): TTypeExtensionMetadata\n {\n const typeExtensionMetadataCtorSet = this.extractTypeExtensionMetadataCtorSet();\n\n if (!typeExtensionMetadataCtorSet.has(typeExtensionMetadataCtor))\n {\n typeExtensionMetadataCtorSet.add(typeExtensionMetadataCtor);\n }\n\n const initialTypeExtensionOptions = typeExtensionOptions ?? {} as TTypeExtensionOptions;\n const typeExtensionMetadata = new typeExtensionMetadataCtor(this, initialTypeExtensionOptions);\n\n return typeExtensionMetadata;\n }\n\n /**\n * Extracts type extension metadata.\n * \n * @param {TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>} typeExtensionMetadataCtor Type extension metadata constructor.\n * \n * @returns {Optional<TTypeExtensionMetadata>} Type extension metadata or undefined.\n */\n public extractTypeExtensionMetadata<TTypeExtensionMetadata extends TypeExtensionMetadata<TObject, TTypeExtensionOptions>, TTypeExtensionOptions extends TypeExtensionOptions>(\n typeExtensionMetadataCtor: TypeExtensionMetadataCtor<TTypeExtensionMetadata, TTypeExtensionOptions, TObject>\n ): Optional<TTypeExtensionMetadata>\n {\n const typeExtensionMetadataCtorSet = this.extractTypeExtensionMetadataCtorSet();\n\n if (!typeExtensionMetadataCtorSet.has(typeExtensionMetadataCtor)) \n {\n return undefined;\n }\n \n const initialTypeExtensionOptions = {} as TTypeExtensionOptions;\n const typeExtensionMetadata = new typeExtensionMetadataCtor(this, initialTypeExtensionOptions);\n\n return typeExtensionMetadata;\n }\n\n /**\n * Extracts type extension metadata ctor set from custom value map.\n * \n * @returns {Set<TypeExtensionMetadataCtor<any, any, any>>} Type extension metadata ctor set.\n */\n private extractTypeExtensionMetadataCtorSet(): Set<TypeExtensionMetadataCtor<any, any, any>>\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n let typeExtensionMetadataCtorSet = customValueMap.get(TYPE_EXTENSION_METADATA_CTOR_SET_KEY) as Optional<Set<TypeExtensionMetadataCtor<any, any, any>>>;\n\n if (typeExtensionMetadataCtorSet === undefined)\n {\n typeExtensionMetadataCtorSet = new Set<TypeExtensionMetadataCtor<any, any, any>>();\n\n customValueMap.set(TYPE_EXTENSION_METADATA_CTOR_SET_KEY, typeExtensionMetadataCtorSet);\n }\n\n return typeExtensionMetadataCtorSet;\n }\n\n /**\n * Resolves type state.\n * \n * Calling this method has side effects by recomputing type state. If you need current\n * type state then use provided getter for that.\n * \n * @returns {ResolvedTypeState<TObject>} Resolved type state.\n */\n public resolveTypeState(): ResolvedTypeState<TObject>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const typeOptions = this.typeOptions;\n const typeName = this.typeName;\n const alias = typeOptions.alias;\n const customValueMap = this.resolveCustomValueMap();\n\n const preserveNull = typeOptions.preserveNull === undefined \n ? typeOptionsBase.preserveNull\n : typeOptions.preserveNull;\n\n const useDefaultValue = typeOptions.useDefaultValue === undefined \n ? typeOptionsBase.useDefaultValue \n : typeOptions.useDefaultValue;\n\n const useImplicitConversion = typeOptions.useImplicitConversion === undefined \n ? typeOptionsBase.useImplicitConversion \n : typeOptions.useImplicitConversion;\n\n const serializedDefaultValue = typeOptions.defaultValue === undefined \n ? typeOptions.serializedDefaultValue\n : typeOptions.defaultValue;\n \n const serializedDefaultValueResolver = useDefaultValue \n ? (typeof serializedDefaultValue === 'function' ? serializedDefaultValue : () => serializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const serializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER \n : serializedDefaultValueResolver;\n\n const deserializedDefaultValue = typeOptions.defaultValue === undefined \n ? typeOptions.deserializedDefaultValue\n : typeOptions.defaultValue;\n \n const deserializedDefaultValueResolver = useDefaultValue\n ? (typeof deserializedDefaultValue === 'function' ? deserializedDefaultValue : () => deserializedDefaultValue)\n : DEFAULT_VALUE_RESOLVER;\n\n const deserializedNullValueResolver = preserveNull \n ? NULL_VALUE_RESOLVER\n : deserializedDefaultValueResolver;\n \n const discriminant = typeOptions.discriminant === undefined\n ? typeName\n : typeOptions.discriminant;\n\n const discriminator = typeOptions.discriminator === undefined\n ? typeOptionsBase.discriminator\n : typeOptions.discriminator;\n\n const factory = typeOptions.factory === undefined\n ? typeOptionsBase.factory\n : typeOptions.factory;\n \n const injectable = typeOptions.injectable === true;\n\n const injector = typeOptions.injector === undefined\n ? typeOptionsBase.injector\n : typeOptions.injector;\n\n const logger = typeOptions.logger === undefined\n ? typeOptionsBase.logger\n : typeOptions.logger;\n\n const namingConvention = typeOptions.namingConvention === undefined\n ? typeOptionsBase.namingConvention\n : typeOptions.namingConvention;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n \n const ownParentTypeMetadatas = this.resolveOwnParentTypeMetadatas(parentTypeArguments);\n const ownChildTypeMetadatas = this.resolveOwnChildTypeMetadatas();\n const parentTypeMetadataSet = this.resolveParentTypeMetadataSet(this);\n const parentTypeMetadatas = Array.from(parentTypeMetadataSet);\n const childTypeMetadataSet = this.resolveChildTypeMetadataSet(this);\n const childTypeMetadatas = Array.from(childTypeMetadataSet);\n\n const typeMetadataMap = new Map<TypeFn<any>, TypeMetadata<any>>();\n const polymorphic = childTypeMetadatas.length > 1;\n\n for (let i = 0; i < childTypeMetadatas.length; i++)\n {\n const childTypeMetadata = childTypeMetadatas[i];\n\n typeMetadataMap.set(childTypeMetadata.typeFn, childTypeMetadata);\n }\n\n const preserveDiscriminator = typeOptions.preserveDiscriminator === undefined \n ? typeOptionsBase.preserveDiscriminator\n : typeOptions.preserveDiscriminator;\n\n const referenceHandler = typeOptions.referenceHandler === undefined \n ? typeOptionsBase.referenceHandler\n : typeOptions.referenceHandler;\n\n const serializer = typeOptions.serializer === undefined \n ? typeOptionsBase.serializer\n : typeOptions.serializer;\n\n const propertySorter = typeOptions.propertySorter === undefined \n ? typeOptionsBase.propertySorter\n : typeOptions.propertySorter;\n\n const ownPropertyMetadataMap = this.currentPropertyMetadataMap;\n const propertyMetadataMap = this.resolvePropertyMetadataMap(parentTypeMetadatas);\n\n const sortedPropertyMetadatas = propertySorter === undefined\n ? Array.from(propertyMetadataMap.values())\n : Array.from(propertyMetadataMap.values()).sort(propertySorter.sort);\n\n const injectMetadataMap = this.currentInjectMetadataMap;\n\n const injectSorter = typeOptions.injectSorter === undefined \n ? typeOptionsBase.injectSorter\n : typeOptions.injectSorter;\n\n const sortedInjectMetadatas = injectSorter === undefined\n ? Array.from(injectMetadataMap.values())\n : Array.from(injectMetadataMap.values()).sort(injectSorter.sort);\n \n const propertyOptionsMap = typeOptions.propertyOptionsMap === undefined \n ? EMPTY_MAP\n : typeOptions.propertyOptionsMap;\n\n const injectOptionsMap = typeOptions.injectOptionsMap === undefined \n ? EMPTY_MAP\n : typeOptions.injectOptionsMap;\n\n const resolvedTypeState = new ResolvedTypeState(\n this,\n alias,\n customValueMap,\n serializedNullValueResolver,\n serializedDefaultValue,\n serializedDefaultValueResolver,\n deserializedNullValueResolver,\n deserializedDefaultValue,\n deserializedDefaultValueResolver,\n discriminant,\n discriminator,\n factory,\n injectable,\n injector,\n logger,\n namingConvention,\n polymorphic,\n typeMetadataMap,\n preserveDiscriminator,\n referenceHandler,\n serializer,\n preserveNull,\n useDefaultValue,\n useImplicitConversion,\n propertySorter,\n sortedPropertyMetadatas,\n injectSorter,\n sortedInjectMetadatas,\n parentTypeArguments,\n parentTypeMetadatas,\n ownParentTypeMetadatas,\n childTypeMetadatas,\n ownChildTypeMetadatas,\n propertyOptionsMap,\n propertyMetadataMap,\n ownPropertyMetadataMap,\n injectOptionsMap,\n injectMetadataMap\n );\n\n this.currentTypeState = resolvedTypeState;\n\n return resolvedTypeState;\n }\n\n /**\n * Unresolves type state.\n * \n * Calling this method has side effects by resetting type state. \n * \n * @returns {UnresolvedTypeState<TObject>} Unresolved type state.\n */\n public unresolveTypeState(): UnresolvedTypeState<TObject>\n {\n const unresolvedTypeState = new UnresolvedTypeState<TObject>(this);\n\n this.currentTypeState = unresolvedTypeState;\n\n return unresolvedTypeState;\n }\n\n /**\n * Resolves custom value map the same way as it is done for the main options.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map.\n */\n private resolveCustomValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n const typeOptionsBase = this.typeOptionsBase;\n const typeOptions = this.typeOptions;\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n if (typeOptions.customValueMap === undefined)\n {\n return customValueMap;\n }\n\n const baseCustomValueMap = typeOptionsBase.customValueMap === undefined\n ? EMPTY_MAP\n : typeOptionsBase.customValueMap;\n \n for (const [customKey, customValue] of typeOptions.customValueMap)\n {\n if (customValue === undefined)\n {\n customValueMap.set(customKey, baseCustomValueMap.get(customKey));\n\n continue;\n }\n\n customValueMap.set(customKey, customValue);\n }\n\n return customValueMap;\n }\n\n /**\n * Resolves own parent type metadatas.\n * \n * @param {ReadonlyArray<TypeArgument<any>>} parentTypeArguments Resolved parent type arguments.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own parent type metadatas.\n */\n private resolveOwnParentTypeMetadatas(parentTypeArguments: ReadonlyArray<TypeArgument<any>>): ReadonlyArray<TypeMetadata<any>>\n {\n const ownParentTypeMetadatas = new Array<TypeMetadata<any>>();\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n ownParentTypeMetadatas.push(parentTypeMetadatas[i]);\n }\n\n if (this.parentTypeMetadata !== undefined)\n {\n ownParentTypeMetadatas.push(this.parentTypeMetadata);\n }\n\n return ownParentTypeMetadatas;\n }\n\n /**\n * Resolves own child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Resolved own child type metadatas.\n */\n private resolveOwnChildTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n const ownChildTypeMetadatas = new Array<TypeMetadata<any>>();\n\n for (const childTypeMetadata of this.currentChildTypeMetadataMap.values())\n {\n ownChildTypeMetadatas.push(childTypeMetadata);\n }\n\n for (const setTypeMetadata of this.typeMetadataSet)\n {\n const typeOptions = setTypeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = 0; i < parentTypeMetadatas.length; i++)\n {\n if (parentTypeMetadatas[i] === this)\n {\n ownChildTypeMetadatas.push(setTypeMetadata);\n\n break;\n }\n }\n }\n\n return ownChildTypeMetadatas;\n }\n\n /**\n * Resolves parent type metadata set for provided type metadata reflecting inheritance order where the \n * first element is the current type metadata and the last element is the most abstract parent. This\n * collection is used to define all properties which are declared for the provided type metadata \n * respecting nested declarations.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata. \n * @param {Set<TypeMetadata<any>>} parentTypeMetadataSet Parent type metadata set.\n * \n * @returns {ReadonlySet<TypeMetadata<any>>} Parent type metadata set.\n */\n private resolveParentTypeMetadataSet(\n typeMetadata: TypeMetadata<any>, \n parentTypeMetadataSet: Set<TypeMetadata<any>> = new Set<TypeMetadata<any>>()\n ): ReadonlySet<TypeMetadata<any>>\n {\n if (parentTypeMetadataSet.has(typeMetadata))\n {\n return parentTypeMetadataSet;\n }\n\n parentTypeMetadataSet.add(typeMetadata);\n\n const typeOptions = typeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n this.resolveParentTypeMetadataSet(parentTypeMetadatas[i], parentTypeMetadataSet);\n }\n\n if (typeMetadata.parentTypeMetadata !== undefined) \n {\n this.resolveParentTypeMetadataSet(typeMetadata.parentTypeMetadata, parentTypeMetadataSet);\n }\n \n return parentTypeMetadataSet;\n }\n\n /**\n * Resolved child type metadata set for provided type metadata reflecting inheritance order where the \n * first element is the current type metadata and the last element is the most specific child. This \n * collection is used to define polymorphic relationships between types.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata. \n * @param {Set<TypeMetadata<any>>} childTypeMetadataSet Child type metadata set.\n * \n * @returns {ReadonlySet<TypeMetadata<any>>} Child type metadata set.\n */\n private resolveChildTypeMetadataSet(\n typeMetadata: TypeMetadata<any>, \n childTypeMetadataSet: Set<TypeMetadata<any>> = new Set<TypeMetadata<any>>()\n ): ReadonlySet<TypeMetadata<any>>\n {\n if (childTypeMetadataSet.has(typeMetadata))\n {\n return childTypeMetadataSet;\n }\n\n childTypeMetadataSet.add(typeMetadata);\n\n for (const childTypeMetadata of typeMetadata.currentChildTypeMetadataMap.values())\n {\n this.resolveChildTypeMetadataSet(childTypeMetadata, childTypeMetadataSet);\n\n childTypeMetadata.unresolveTypeState();\n }\n\n for (const setTypeMetadata of this.typeMetadataSet)\n {\n const typeOptions = setTypeMetadata.typeOptions;\n\n const parentTypeArguments = typeOptions.parentTypeArguments === undefined\n ? EMPTY_ARRAY\n : typeOptions.parentTypeArguments;\n\n const parentTypeMetadatas = this.resolveTypeMetadatas(parentTypeArguments);\n\n for (let i = 0; i < parentTypeMetadatas.length; i++)\n {\n if (parentTypeMetadatas[i] === typeMetadata)\n {\n this.resolveChildTypeMetadataSet(setTypeMetadata, childTypeMetadataSet);\n \n setTypeMetadata.unresolveTypeState();\n\n break;\n }\n }\n }\n\n return childTypeMetadataSet;\n }\n\n /**\n * Resolves property metadata map.\n * \n * @param {ReadonlyArray<TypeMetadata<any>>} parentTypeMetadatas Resolved parent type metadatas.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Resolved property metadata map.\n */\n private resolvePropertyMetadataMap(parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n const propertyMetadataMap = new Map<PropertyName, PropertyMetadata<TObject, any>>();\n\n for (let i = parentTypeMetadatas.length - 1; i >= 0; i--)\n {\n for (const [propertyName, propertyMetadata] of parentTypeMetadatas[i].currentPropertyMetadataMap)\n {\n propertyMetadataMap.set(propertyName, propertyMetadata);\n }\n }\n\n for (const propertyMetadata of this.currentPropertyMetadataMap.values())\n {\n propertyMetadata.unresolvePropertyState();\n }\n\n return propertyMetadataMap;\n }\n\n /**\n * Extends parent type metadata.\n * \n * @returns {this} Current instance of type metadata.\n */\n private extendParentTypeMetadata(): this\n {\n const parentTypeMetadata = this.parentTypeMetadata;\n\n if (parentTypeMetadata !== undefined) \n {\n parentTypeMetadata.currentChildTypeMetadataMap.set(this.typeFn, this);\n }\n\n return this;\n }\n \n /**\n * Reflects inject metadata.\n * \n * Used to configure inject metadata based on reflect metadata as inject decorators may be omitted.\n * \n * @returns {this} Current instance of type metadata.\n */\n public reflectInjectMetadata(): this\n {\n if (this.typeFn.length === 0)\n {\n return this;\n }\n\n const injectTypeFns = (getOwnReflectMetadata('design:paramtypes', this.typeFn) ?? new Array<TypeFn<any>>()) as Array<TypeFn<any>>;\n\n for (let injectIndex = 0; injectIndex < injectTypeFns.length; injectIndex++)\n {\n if (!this.currentInjectMetadataMap.has(injectIndex))\n {\n this.configureInjectMetadata(injectIndex, { typeArgument: injectTypeFns[injectIndex] });\n }\n }\n\n return this;\n }\n\n /**\n * Configures alias.\n * \n * @param {Optional<Alias>} alias Alias.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasAlias(alias: Optional<Alias>): this\n {\n this.releaseAlias();\n\n this.typeOptions.alias = alias;\n\n if (alias !== undefined) \n {\n this.currentTypeFnMap.set(alias, this.typeFn);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Releases alias.\n * \n * @returns {this} Current instance of type metadata. \n */\n private releaseAlias(): this\n {\n const alias = this.typeOptions.alias;\n\n if (alias !== undefined && this.currentTypeFnMap.has(alias))\n {\n this.currentTypeFnMap.delete(alias);\n }\n\n return this;\n }\n\n /**\n * Configures custom value map.\n * \n * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this\n {\n let currentCustomValueMap = this.typeOptions.customValueMap;\n\n if (currentCustomValueMap === undefined)\n {\n currentCustomValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = currentCustomValueMap;\n }\n\n if (customValueMap !== undefined)\n {\n if (currentCustomValueMap !== customValueMap)\n {\n currentCustomValueMap.clear();\n }\n\n for (const [customKey, customValue] of customValueMap)\n {\n currentCustomValueMap.set(customKey, customValue);\n }\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures custom value.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * @param {TCustomValue} customValue Custom value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n customValueMap.set(customKey, customValue);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Extracts value by custom key.\n * \n * @param {CustomKey<TCustomValue>} customKey Custom key.\n * \n * @returns {TCustomValue} Custom value.\n */\n public extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\n {\n let customValue = this.typeState.customValueMap.get(customKey) as TCustomValue;\n\n if (customValue === undefined && customKey.customValueResolver !== undefined)\n {\n customValue = customKey.customValueResolver();\n }\n\n return customValue;\n }\n\n /**\n * Configures custom options.\n * \n * @param {ReadonlyArray<CustomOption>} customOptions Custom options.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this\n {\n let customValueMap = this.typeOptions.customValueMap;\n\n if (customValueMap === undefined)\n {\n customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n this.typeOptions.customValueMap = customValueMap;\n }\n\n for (let i = 0; i < customOptions.length; i++)\n {\n customValueMap.set(customOptions[i][0], customOptions[i][1]);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): this\n {\n this.typeOptions.defaultValue = defaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this\n {\n this.typeOptions.serializedDefaultValue = serializedDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this\n {\n this.typeOptions.deserializedDefaultValue = deserializedDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures discriminator.\n * \n * @param {Optional<Discriminator>} discriminator Discriminator.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDiscriminator(discriminator: Optional<Discriminator>): this\n {\n this.typeOptions.discriminator = discriminator;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n \n /**\n * Configures discriminant.\n * \n * @param {Optional<Discriminant>} discriminant Discriminant.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasDiscriminant(discriminant: Optional<Discriminant>): this\n {\n this.typeOptions.discriminant = discriminant;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures factory.\n * \n * @param {Optional<Factory>} factory Factory.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasFactory(factory: Optional<Factory>): this\n {\n this.typeOptions.factory = factory;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures injectable.\n * \n * @param {boolean} injectable Injectable.\n * \n * @returns {this} Current instance of type metadata.\n */\n public isInjectable(injectable: boolean = true): this\n {\n this.typeOptions.injectable = injectable;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures injector.\n * \n * @param {Optional<Injector>} injector Injector.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjector(injector: Optional<Injector>): this\n {\n this.typeOptions.injector = injector;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures logger.\n * \n * @param {Optional<Logger>} logger Logger.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasLogger(logger: Optional<Logger>): this\n {\n this.typeOptions.logger = logger;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasNamingConvention(namingConvention: Optional<NamingConvention>): this\n {\n this.typeOptions.namingConvention = namingConvention;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve discriminator.\n * \n * @param {boolean} preserveDiscriminator Preserve discriminator.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldPreserveDiscriminator(preserveDiscriminator: boolean = true): this\n {\n this.typeOptions.preserveDiscriminator = preserveDiscriminator;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {Optional<ReferenceHandler>} referenceHandler Reference handler.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this\n {\n this.typeOptions.referenceHandler = referenceHandler;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Optional<Serializer<TObject>>} serializer Serializer.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasSerializer(serializer: Optional<Serializer<TObject>>): this\n {\n this.typeOptions.serializer = serializer;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): this\n {\n this.typeOptions.preserveNull = preserveNull;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): this\n {\n this.typeOptions.useDefaultValue = useDefaultValue;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {this} Current instance of type metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): this\n {\n this.typeOptions.useImplicitConversion = useImplicitConversion;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures property sorter.\n * \n * @param {Optional<PropertySorter>} propertySorter Property sorter.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasPropertySorter(propertySorter: Optional<PropertySorter>): this\n {\n this.typeOptions.propertySorter = propertySorter;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures inject sorter.\n * \n * @param {Optional<InjectSorter>} injectSorter Inject sorter.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjectSorter(injectSorter: Optional<InjectSorter>): this\n {\n this.typeOptions.injectSorter = injectSorter;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures parent type arguments.\n * \n * @param {Array<TypeArgument<any>>} parentTypeArguments Parent type arguments.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasParentTypeArguments(parentTypeArguments: Array<TypeArgument<any>>): this\n {\n this.typeOptions.parentTypeArguments = parentTypeArguments;\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Configures certain property metadata.\n * \n * @param {PropertyName} propertyName Property name. \n * @param {PropertyOptions<TPropertyType>} propertyOptions Property options.\n * \n * @returns {PropertyMetadata<TObject, TPropertyType>} Configured property metadata.\n */\n public configurePropertyMetadata<TPropertyType>(propertyName: PropertyName, propertyOptions?: PropertyOptions<TPropertyType>): PropertyMetadata<TObject, TPropertyType>\n {\n let propertyOptionsMap = this.typeOptions.propertyOptionsMap;\n\n if (propertyOptionsMap === undefined)\n {\n propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n\n this.typeOptions.propertyOptionsMap = propertyOptionsMap;\n }\n\n let propertyMetadata = this.currentPropertyMetadataMap.get(propertyName);\n\n if (propertyMetadata === undefined)\n {\n propertyOptions = propertyOptions ?? {} as PropertyOptions<TPropertyType>;\n propertyMetadata = new PropertyMetadata(this.typeManager, this.currentTypeFnMap, this, propertyName, propertyOptions);\n\n this.currentPropertyMetadataMap.set(propertyName, propertyMetadata);\n\n propertyOptionsMap.set(propertyName, propertyOptions);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return propertyMetadata;\n }\n\n if (propertyOptions !== undefined)\n {\n propertyMetadata.configure(propertyOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return propertyMetadata;\n }\n\n /**\n * Configures certain inject metadata.\n * \n * @param {InjectIndex} injectIndex Inject index. \n * @param {InjectOptions<TInjectType>} injectOptions Inject options.\n * \n * @returns {InjectMetadata<TObject, TInjectType>} Configured inject metadata.\n */\n public configureInjectMetadata<TInjectType>(injectIndex: InjectIndex, injectOptions?: InjectOptions<TInjectType>): InjectMetadata<TObject, TInjectType>\n {\n let injectOptionsMap = this.typeOptions.injectOptionsMap;\n\n if (injectOptionsMap === undefined)\n {\n injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n\n this.typeOptions.injectOptionsMap = injectOptionsMap;\n }\n\n let injectMetadata = this.currentInjectMetadataMap.get(injectIndex);\n\n if (injectMetadata === undefined)\n {\n injectOptions = injectOptions ?? {} as InjectOptions<TInjectType>;\n injectMetadata = new InjectMetadata(this.typeManager, this.currentTypeFnMap, this, injectIndex, injectOptions);\n\n this.currentInjectMetadataMap.set(injectIndex, injectMetadata);\n\n injectOptionsMap.set(injectIndex, injectOptions);\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n \n return injectMetadata;\n }\n\n if (injectOptions !== undefined)\n {\n injectMetadata.configure(injectOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return injectMetadata;\n }\n\n /**\n * Configures property metadata map.\n * \n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasPropertyMetadataMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): this\n {\n const currentPropertyOptionsMap = this.clearPropertyOptionsMap(propertyOptionsMap);\n\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\n {\n const propertyMetadata = new PropertyMetadata(this.typeManager, this.currentTypeFnMap, this, propertyName, propertyOptions);\n\n this.currentPropertyMetadataMap.set(propertyName, propertyMetadata);\n\n currentPropertyOptionsMap.set(propertyName, propertyOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Clears property options map.\n * \n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\n * \n * @returns {Map<PropertyName, PropertyOptions<any>>} Cleared property options map.\n */\n private clearPropertyOptionsMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): Map<PropertyName, PropertyOptions<any>>\n {\n let currentPropertyOptionsMap = this.typeOptions.propertyOptionsMap;\n\n if (currentPropertyOptionsMap === undefined)\n {\n currentPropertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n\n this.typeOptions.propertyOptionsMap = currentPropertyOptionsMap;\n }\n\n if (currentPropertyOptionsMap !== propertyOptionsMap)\n {\n currentPropertyOptionsMap.clear();\n\n this.currentPropertyMetadataMap.clear();\n }\n\n return currentPropertyOptionsMap;\n }\n\n /**\n * Configures inject metadata map.\n * \n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\n * \n * @returns {this} Current instance of type metadata.\n */\n public hasInjectMetadataMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): this\n {\n const currentInjectOptionsMap = this.clearInjectOptionsMap(injectOptionsMap);\n\n for (const [injectIndex, injectOptions] of injectOptionsMap)\n {\n const injectMetadata = new InjectMetadata(this.typeManager, this.currentTypeFnMap, this, injectIndex, injectOptions);\n\n this.currentInjectMetadataMap.set(injectIndex, injectMetadata);\n\n currentInjectOptionsMap.set(injectIndex, injectOptions);\n }\n\n this.currentTypeState = new UnresolvedTypeState<TObject>(this);\n\n return this;\n }\n\n /**\n * Clears inject options map.\n * \n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\n * \n * @returns {Map<InjectIndex, InjectOptions<any>>} Cleared inject options map.\n */\n private clearInjectOptionsMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): Map<InjectIndex, InjectOptions<any>>\n {\n let currentInjectOptionsMap = this.typeOptions.injectOptionsMap;\n\n if (currentInjectOptionsMap === undefined)\n {\n currentInjectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n\n this.typeOptions.injectOptionsMap = currentInjectOptionsMap;\n }\n\n if (currentInjectOptionsMap !== injectOptionsMap)\n {\n currentInjectOptionsMap.clear();\n\n this.currentInjectMetadataMap.clear();\n }\n\n return currentInjectOptionsMap;\n }\n\n /**\n * Configures type metadata based on provided options.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n * \n * @returns {this} Current instance of type metadata.\n */\n public configure(typeOptions: TypeOptions<TObject>): this\n {\n if (typeOptions.alias !== undefined) \n {\n this.hasAlias(typeOptions.alias);\n }\n\n if (typeOptions.customValueMap !== undefined)\n {\n this.hasCustomValueMap(typeOptions.customValueMap);\n }\n\n if (typeOptions.defaultValue !== undefined)\n {\n this.hasDefaultValue(typeOptions.defaultValue);\n }\n\n if (typeOptions.serializedDefaultValue !== undefined)\n {\n this.hasSerializedDefaultValue(typeOptions.serializedDefaultValue);\n }\n\n if (typeOptions.deserializedDefaultValue !== undefined) \n {\n this.hasDeserializedDefaultValue(typeOptions.deserializedDefaultValue);\n }\n\n if (typeOptions.discriminator !== undefined) \n {\n this.hasDiscriminator(typeOptions.discriminator);\n }\n\n if (typeOptions.discriminant !== undefined)\n {\n this.hasDiscriminant(typeOptions.discriminant);\n }\n\n if (typeOptions.factory !== undefined) \n {\n this.hasFactory(typeOptions.factory);\n }\n\n if (typeOptions.injectable !== undefined)\n {\n this.isInjectable(typeOptions.injectable);\n }\n\n if (typeOptions.injector !== undefined)\n {\n this.hasInjector(typeOptions.injector);\n }\n\n if (typeOptions.logger !== undefined)\n {\n this.hasLogger(typeOptions.logger);\n }\n\n if (typeOptions.namingConvention !== undefined)\n {\n this.hasNamingConvention(typeOptions.namingConvention);\n }\n\n if (typeOptions.preserveDiscriminator !== undefined)\n {\n this.shouldPreserveDiscriminator(typeOptions.preserveDiscriminator);\n }\n\n if (typeOptions.referenceHandler !== undefined)\n {\n this.hasReferenceHandler(typeOptions.referenceHandler);\n }\n\n if (typeOptions.serializer !== undefined)\n {\n this.hasSerializer(typeOptions.serializer);\n }\n\n if (typeOptions.preserveNull !== undefined)\n {\n this.shouldPreserveNull(typeOptions.preserveNull);\n }\n\n if (typeOptions.useDefaultValue !== undefined) \n {\n this.shouldUseDefaultValue(typeOptions.useDefaultValue);\n }\n\n if (typeOptions.useImplicitConversion !== undefined) \n {\n this.shouldUseImplicitConversion(typeOptions.useImplicitConversion);\n }\n\n if (typeOptions.propertyOptionsMap !== undefined)\n {\n this.hasPropertyMetadataMap(typeOptions.propertyOptionsMap);\n }\n\n if (typeOptions.injectOptionsMap !== undefined)\n {\n this.hasInjectMetadataMap(typeOptions.injectOptionsMap);\n }\n\n if (typeOptions.propertySorter !== undefined)\n {\n this.hasPropertySorter(typeOptions.propertySorter);\n }\n\n if (typeOptions.injectSorter !== undefined)\n {\n this.hasInjectSorter(typeOptions.injectSorter);\n }\n\n if (typeOptions.parentTypeArguments !== undefined)\n {\n this.hasParentTypeArguments(typeOptions.parentTypeArguments);\n }\n\n return this;\n }\n}\n","import { InjectIndex } from './inject-index';\nimport { InjectOptions } from './inject-options';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Special class to create a scope over a certain type. This class used only in \n * combination with decorators and not required for declarative configuration.\n * \n * @type {TypeScope}\n */\nexport class TypeScope\n{\n /**\n * Scope open?\n * \n * @type {boolean};\n */\n private opened: boolean;\n\n /**\n * Property options array map.\n * \n * @type {Map<PropertyName, Array<PropertyOptions<any>>>}\n */\n private propertyOptionsArrayMap: Map<PropertyName, Array<PropertyOptions<any>>>;\n\n /**\n * Inject options array map.\n * \n * @type {Map<InjectIndex, Array<InjectOptions<any>>>}\n */\n private injectOptionsArrayMap: Map<InjectIndex, Array<InjectOptions<any>>>;\n\n /**\n * Constructor.\n */\n public constructor()\n {\n this.opened = false;\n this.propertyOptionsArrayMap = new Map<PropertyName, Array<PropertyOptions<any>>>();\n this.injectOptionsArrayMap = new Map<InjectIndex, Array<InjectOptions<any>>>();\n\n return;\n }\n\n /**\n * Opens a scope.\n * \n * @returns {this} Type scope.\n */\n public open(): this\n {\n this.opened = true;\n this.propertyOptionsArrayMap.clear();\n this.injectOptionsArrayMap.clear();\n\n return this;\n }\n\n /**\n * Adds property options to the type scope.\n * \n * @param {PropertyName} propertyName Property name.\n * @param {PropertyOptions<any>} propertyOptions Property options.\n * \n * @returns {this} Type scope.\n */\n public addPropertyOptions(propertyName: PropertyName, propertyOptions: PropertyOptions<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n let propertyOptionsArray = this.propertyOptionsArrayMap.get(propertyName);\n\n if (propertyOptionsArray === undefined) \n {\n propertyOptionsArray = new Array<PropertyOptions<any>>();\n\n this.propertyOptionsArrayMap.set(propertyName, propertyOptionsArray);\n }\n\n propertyOptionsArray.push(propertyOptions);\n\n return this;\n }\n\n /**\n * Adds inject options to the type scope.\n * \n * @param {InjectIndex} injectIndex Inject index.\n * @param {InjectOptions<any>} injectOptions Inject options.\n * \n * @returns {this} Type scope.\n */\n public addInjectOptions(injectIndex: InjectIndex, injectOptions: InjectOptions<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n let injectOptionsArray = this.injectOptionsArrayMap.get(injectIndex);\n\n if (injectOptionsArray === undefined) \n {\n injectOptionsArray = new Array<InjectOptions<any>>();\n\n this.injectOptionsArrayMap.set(injectIndex, injectOptionsArray);\n }\n\n injectOptionsArray.push(injectOptions);\n\n return this;\n }\n\n /**\n * Closes scope and applies state for type metadata.\n * \n * @param {TypeMetadata<any>} typeMetadata Type metadata.\n * \n * @returns {this} Type scope.\n */\n public close(typeMetadata: TypeMetadata<any>): this\n {\n if (!this.opened)\n {\n return this;\n }\n\n for (const [propertyName, propertyOptionsArray] of this.propertyOptionsArrayMap)\n {\n for (let i = 0; i < propertyOptionsArray.length; i++)\n {\n typeMetadata.configurePropertyMetadata(propertyName, propertyOptionsArray[i]);\n }\n }\n\n for (const [injectIndex, injectOptionsArray] of this.injectOptionsArrayMap)\n {\n for (let i = 0; i < injectOptionsArray.length; i++)\n {\n typeMetadata.configureInjectMetadata(injectIndex, injectOptionsArray[i]);\n }\n }\n\n this.injectOptionsArrayMap.clear();\n this.propertyOptionsArrayMap.clear();\n this.opened = false;\n\n return this;\n }\n}\n","export * from './resolved-type-state';\nexport * from './unresolved-type-state';\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValue } from '../default-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { Discriminant } from '../discriminant';\nimport { Discriminator } from '../discriminator';\nimport { Factory } from '../factory';\nimport { InjectIndex } from '../inject-index';\nimport { InjectMetadata } from '../inject-metadata';\nimport { InjectOptions } from '../inject-options';\nimport { InjectSorter } from '../inject-sorter';\nimport { Injector } from '../injector';\nimport { Logger } from '../logger';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyOptions } from '../property-options';\nimport { PropertySorter } from '../property-sorter';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeFn } from '../type-fn';\nimport { TypeMetadata } from '../type-metadata';\nimport { TypeState } from '../type-state';\n\n/**\n * Represents resolved type state.\n * \n * @type {ResolvedTypeState<TObject>}\n */\nexport class ResolvedTypeState<TObject> implements TypeState<TObject>\n{\n /**\n * Type metadata for which state is defined.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Alias.\n * \n * @type {Optional<Alias>}\n */\n public readonly alias: Optional<Alias>;\n\n /**\n * Custom value map.\n * \n * @type {ReadonlyMap<CustomKey<any>, CustomValue>}\n */\n public readonly customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>;\n\n /**\n * Serialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly serializedNullValueResolver: NullValueResolver;\n\n /**\n * Serialized default value.\n * \n * @type {DefaultValue}\n */\n public readonly serializedDefaultValue: DefaultValue;\n \n /**\n * Serialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly serializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Deserialized null value resolver.\n * \n * @type {NullValueResolver}\n */\n public readonly deserializedNullValueResolver: NullValueResolver;\n\n /**\n * Deserialized default value.\n * \n * @type {DefaultValue}\n */\n public readonly deserializedDefaultValue: DefaultValue;\n\n /**\n * Deserialized default value resolver.\n * \n * @type {DefaultValueResolver}\n */\n public readonly deserializedDefaultValueResolver: DefaultValueResolver;\n\n /**\n * Discriminant.\n * \n * @type {Discriminant}\n */\n public readonly discriminant: Discriminant;\n\n /**\n * Discriminator.\n * \n * @type {Discriminator}\n */\n public readonly discriminator: Discriminator;\n\n /**\n * Factory.\n * \n * @type {Factory}\n */\n public readonly factory: Factory;\n\n /**\n * Injectable value.\n * \n * @type {Factory}\n */\n public readonly injectable: boolean;\n\n /**\n * Injector.\n * \n * @type {Injector}\n */\n public readonly injector: Injector;\n\n /**\n * Logger.\n * \n * @type {Logger}\n */\n public readonly logger: Logger;\n \n /**\n * Naming convention.\n * \n * @type {Optional<NamingConvention>}\n */\n public readonly namingConvention: Optional<NamingConvention>;\n\n /**\n * Indicator if current type metadata is polymorphic.\n * \n * @type {boolean}\n */\n public readonly polymorphic: boolean;\n\n /**\n * Type metadata map.\n * \n * @type {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>}\n */\n public readonly typeMetadataMap: ReadonlyMap<TypeFn<any>, TypeMetadata<any>>;\n\n /**\n * Indicator if discriminator should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveDiscriminator: boolean;\n\n /**\n * Reference handler.\n * \n * @type {ReferenceHandler}\n */\n public readonly referenceHandler: ReferenceHandler;\n \n /**\n * Serializer.\n * \n * @type {Serializer<TObject>}\n */\n public readonly serializer: Serializer<TObject>;\n\n /**\n * Indicator if null value should be preserved.\n * \n * @type {boolean}\n */\n public readonly preserveNull: boolean;\n\n /**\n * Indicator if default value should be used.\n * \n * @type {boolean}\n */\n public readonly useDefaultValue: boolean;\n\n /**\n * Indicator if implicit conversion should be used.\n * \n * @type {boolean}\n */\n public readonly useImplicitConversion: boolean;\n\n /**\n * Property sorter.\n * \n * @type {Optional<PropertySorter>}\n */\n public readonly propertySorter: Optional<PropertySorter>;\n\n /**\n * Sorted property metadatas.\n * \n * @type {ReadonlyArray<PropertyMetadata<TObject, any>>}\n */\n public readonly sortedPropertyMetadatas: ReadonlyArray<PropertyMetadata<TObject, any>>;\n\n /**\n * Inject sorter.\n * \n * @type {Optional<InjectSorter>}\n */\n public readonly injectSorter: Optional<InjectSorter>;\n\n /**\n * Sorted inject metadatas.\n * \n * @type {ReadonlyArray<InjectMetadata<TObject, any>>}\n */\n public readonly sortedInjectMetadatas: ReadonlyArray<InjectMetadata<TObject, any>>;\n\n /**\n * Parent type arguments.\n * \n * @type {ReadonlyArray<TypeArgument<any>>}\n */\n public readonly parentTypeArguments: ReadonlyArray<TypeArgument<any>>;\n \n /**\n * Parent type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Own parent type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly ownParentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Child type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly childTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n \n /**\n * Own child type metadatas.\n * \n * @type {ReadonlyArray<TypeMetadata<any>>}\n */\n public readonly ownChildTypeMetadatas: ReadonlyArray<TypeMetadata<any>>;\n\n /**\n * Property options map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyOptions<any>>}\n */\n public readonly propertyOptionsMap: ReadonlyMap<PropertyName, PropertyOptions<any>>;\n\n /**\n * Property metadata map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public readonly propertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>;\n\n /**\n * Own property metadata map.\n * \n * @type {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>}\n */\n public readonly ownPropertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>;\n\n /**\n * Inject options map.\n * \n * @type {ReadonlyMap<InjectIndex, PropertyOptions<any>>}\n */\n public readonly injectOptionsMap: ReadonlyMap<InjectIndex, InjectOptions<any>>;\n\n /**\n * Inject metadata map.\n * \n * @type {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>}\n */\n public readonly injectMetadataMap: ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata for which state is defined.\n * @param {Optional<Alias>} alias Alias.\n * @param {ReadonlyMap<CustomKey<any>, CustomValue>} customValueMap Custom value map.\n * @param {NullValueResolver} serializedNullValueResolver Serialized null value resolver.\n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * @param {DefaultValueResolver} serializedDefaultValueResolver Serialized default value resolver.\n * @param {NullValueResolver} deserializedNullValueResolver Deserialized null value resolver.\n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * @param {DefaultValueResolver} deserializedDefaultValueResolver Deserialized default value resolver.\n * @param {Discriminant} discriminant Discriminant.\n * @param {Discriminator} discriminator Discriminator.\n * @param {Factory} factory Factory.\n * @param {boolean} injectable Injectable value.\n * @param {Injector} injector Injector.\n * @param {Logger} logger Logger.\n * @param {Optional<NamingConvention>} namingConvention Naming convention.\n * @param {boolean} polymorphic Indicator if current type metadata is polymorphic.\n * @param {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>} typeMetadataMap Type metadata map.\n * @param {boolean} preserveDiscriminator Indicator if discriminator should be preserved.\n * @param {ReferenceHandler} referenceHandler Reference handler.\n * @param {Serializer<TObject>} serializer Serializer.\n * @param {boolean} preserveNull Indicator if null value should be preserved.\n * @param {boolean} useDefaultValue Indicator if default value should be used.\n * @param {boolean} useImplicitConversion Indicator if implicit conversion should be used.\n * @param {Optional<PropertySorter>} propertySorter Property sorter.\n * @param {ReadonlyArray<PropertyMetadata<TObject, any>>} sortedPropertyMetadatas Sorted property metadatas.\n * @param {Optional<InjectSorter>} injectSorter Inject sorter.\n * @param {ReadonlyArray<InjectMetadata<TObject, any>>} sortedInjectMetadatas Sorted inject metadatas.\n * @param {ReadonlyArray<TypeArgument<any>>} parentTypeArguments Parent type arguments.\n * @param {ReadonlyArray<TypeMetadata<any>>} parentTypeMetadatas Parent type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} ownParentTypeMetadatas Own parent type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} childTypeMetadatas Child type metadatas.\n * @param {ReadonlyArray<TypeMetadata<any>>} ownChildTypeMetadatas Own child type metadatas.\n * @param {ReadonlyMap<PropertyName, PropertyOptions<any>>} propertyOptionsMap Property options map.\n * @param {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} propertyMetadataMap Property metadata map.\n * @param {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} ownPropertyMetadataMap Own property metadata map.\n * @param {ReadonlyMap<InjectIndex, PropertyOptions<any>>} injectOptionsMap Inject options map.\n * @param {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>} injectMetadataMap Inject metadata map.\n */\n public constructor(\n typeMetadata: TypeMetadata<TObject>,\n alias: Optional<Alias>,\n customValueMap: ReadonlyMap<CustomKey<any>, CustomValue>,\n serializedNullValueResolver: NullValueResolver,\n serializedDefaultValue: DefaultValue,\n serializedDefaultValueResolver: DefaultValueResolver,\n deserializedNullValueResolver: NullValueResolver,\n deserializedDefaultValue: DefaultValue,\n deserializedDefaultValueResolver: DefaultValueResolver,\n discriminant: Discriminant,\n discriminator: Discriminator,\n factory: Factory,\n injectable: boolean,\n injector: Injector,\n logger: Logger,\n namingConvention: Optional<NamingConvention>,\n polymorphic: boolean,\n typeMetadataMap: ReadonlyMap<TypeFn<any>, TypeMetadata<any>>,\n preserveDiscriminator: boolean,\n referenceHandler: ReferenceHandler,\n serializer: Serializer<TObject>,\n preserveNull: boolean,\n useDefaultValue: boolean,\n useImplicitConversion: boolean,\n propertySorter: Optional<PropertySorter>,\n sortedPropertyMetadatas: ReadonlyArray<PropertyMetadata<TObject, any>>,\n injectSorter: Optional<InjectSorter>,\n sortedInjectMetadatas: ReadonlyArray<InjectMetadata<TObject, any>>,\n parentTypeArguments: ReadonlyArray<TypeArgument<any>>,\n parentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n ownParentTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n childTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n ownChildTypeMetadatas: ReadonlyArray<TypeMetadata<any>>,\n propertyOptionsMap: ReadonlyMap<PropertyName, PropertyOptions<any>>,\n propertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>,\n ownPropertyMetadataMap: ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>,\n injectOptionsMap: ReadonlyMap<InjectIndex, PropertyOptions<any>>,\n injectMetadataMap: ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n ) \n {\n this.typeMetadata = typeMetadata;\n this.alias = alias;\n this.customValueMap = customValueMap;\n this.serializedNullValueResolver = serializedNullValueResolver;\n this.serializedDefaultValue = serializedDefaultValue;\n this.serializedDefaultValueResolver = serializedDefaultValueResolver;\n this.deserializedNullValueResolver = deserializedNullValueResolver;\n this.deserializedDefaultValue = deserializedDefaultValue;\n this.deserializedDefaultValueResolver = deserializedDefaultValueResolver;\n this.discriminant = discriminant;\n this.discriminator = discriminator;\n this.factory = factory;\n this.injectable = injectable;\n this.injector = injector;\n this.logger = logger;\n this.namingConvention = namingConvention;\n this.polymorphic = polymorphic;\n this.typeMetadataMap = typeMetadataMap;\n this.preserveDiscriminator = preserveDiscriminator;\n this.referenceHandler = referenceHandler;\n this.serializer = serializer;\n this.preserveNull = preserveNull;\n this.useDefaultValue = useDefaultValue;\n this.useImplicitConversion = useImplicitConversion;\n this.propertySorter = propertySorter;\n this.sortedPropertyMetadatas = sortedPropertyMetadatas;\n this.injectSorter = injectSorter;\n this.sortedInjectMetadatas = sortedInjectMetadatas;\n this.parentTypeArguments = parentTypeArguments;\n this.parentTypeMetadatas = parentTypeMetadatas;\n this.ownParentTypeMetadatas = ownParentTypeMetadatas;\n this.childTypeMetadatas = childTypeMetadatas;\n this.ownChildTypeMetadatas = ownChildTypeMetadatas;\n this.propertyOptionsMap = propertyOptionsMap;\n this.propertyMetadataMap = propertyMetadataMap;\n this.ownPropertyMetadataMap = ownPropertyMetadataMap;\n this.injectOptionsMap = injectOptionsMap;\n this.injectMetadataMap = injectMetadataMap;\n\n return;\n }\n}\n","import { Alias } from '../alias';\nimport { CustomKey } from '../custom-key';\nimport { CustomValue } from '../custom-value';\nimport { DefaultValue } from '../default-value';\nimport { DefaultValueResolver } from '../default-value-resolver';\nimport { Discriminant } from '../discriminant';\nimport { Discriminator } from '../discriminator';\nimport { Factory } from '../factory';\nimport { InjectIndex } from '../inject-index';\nimport { InjectMetadata } from '../inject-metadata';\nimport { InjectOptions } from '../inject-options';\nimport { InjectSorter } from '../inject-sorter';\nimport { Injector } from '../injector';\nimport { Logger } from '../logger';\nimport { NamingConvention } from '../naming-convention';\nimport { NullValueResolver } from '../null-value-resolver';\nimport { Optional } from '../optional';\nimport { PropertyMetadata } from '../property-metadata';\nimport { PropertyName } from '../property-name';\nimport { PropertyOptions } from '../property-options';\nimport { PropertySorter } from '../property-sorter';\nimport { ReferenceHandler } from '../reference-handler';\nimport { Serializer } from '../serializer';\nimport { TypeArgument } from '../type-argument';\nimport { TypeFn } from '../type-fn';\nimport { TypeMetadata } from '../type-metadata';\nimport { TypeState } from '../type-state';\nimport { ResolvedTypeState } from './resolved-type-state';\n\n/**\n * Represents unresolved type state.\n * \n * @type {UnresolvedTypeState<TObject>}\n */\nexport class UnresolvedTypeState<TObject> implements TypeState<TObject>\n{\n /**\n * Type metadata for which state is defined.\n * \n * @type {TypeMetadata<TObject>}\n */\n public readonly typeMetadata: TypeMetadata<TObject>;\n\n /**\n * Resolved type state.\n * \n * @type {ResolvedTypeState<TObject>}\n */\n private resolvedTypeState?: ResolvedTypeState<TObject>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TObject>} typeMetadata Type metadata for which state is defined.\n */\n public constructor(typeMetadata: TypeMetadata<TObject>)\n {\n this.typeMetadata = typeMetadata;\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Optional<Alias>} Alias.\n */\n public get alias(): Optional<Alias>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.alias;\n }\n\n /**\n * Gets custom value map.\n * \n * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.\n */\n public get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.customValueMap;\n }\n\n /**\n * Gets serialized null value resolver.\n * \n * @returns {NullValueResolver} Serialized null value resolver.\n */\n public get serializedNullValueResolver(): NullValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedNullValueResolver;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {DefaultValue} Serialized default value.\n */\n public get serializedDefaultValue(): DefaultValue\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value resolver.\n * \n * @returns {DefaultValueResolver} Serialized default value resolver.\n */\n public get serializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializedDefaultValueResolver;\n }\n\n /**\n * Gets deserialized null value resolver.\n * \n * @returns {NullValueResolver} Deserialized null value resolver.\n */\n public get deserializedNullValueResolver(): NullValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedNullValueResolver;\n }\n\n /**\n * Gets deserialized default value.\n * \n * @returns {DefaultValue} Serialized default value.\n */\n public get deserializedDefaultValue(): DefaultValue\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedDefaultValue;\n }\n\n /**\n * Gets deserialized default value resolver.\n * \n * @returns {DefaultValueResolver} Deserialized default value resolver.\n */\n public get deserializedDefaultValueResolver(): DefaultValueResolver\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.deserializedDefaultValueResolver;\n }\n\n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.discriminant;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.factory;\n }\n\n /**\n * Gets injectable value.\n * \n * @returns {boolean} Injectable value.\n */\n public get injectable(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectable;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector.\n */\n public get injector(): Injector\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injector;\n }\n\n /**\n * Gets logger.\n * \n * @returns {Logger} Logger.\n */\n public get logger(): Logger\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.logger;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {Optional<NamingConvention>} Naming convention.\n */\n public get namingConvention(): Optional<NamingConvention>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.namingConvention;\n }\n\n /**\n * Gets indicator if current type metadata is polymorphic.\n * \n * @returns {boolean} Indicator if polymorphic.\n */\n public get polymorphic(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.polymorphic;\n }\n \n /**\n * Gets type metadata map.\n * \n * @returns {ReadonlyMap<TypeFn<any>, TypeMetadata<any>>} Type metadata map.\n */\n public get typeMetadataMap(): ReadonlyMap<TypeFn<any>, TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.typeMetadataMap;\n }\n \n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} Preserve discriminator.\n */\n public get preserveDiscriminator(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TObject>} Serializer.\n */\n public get serializer(): Serializer<TObject>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.serializer;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} Preserve null value.\n */\n public get preserveNull(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value.\n */\n public get useDefaultValue(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion.\n */\n public get useImplicitConversion(): boolean\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.useImplicitConversion;\n }\n\n /**\n * Gets property sorter.\n * \n * @returns {Optional<PropertySorter>} Property sorter.\n */\n public get propertySorter(): Optional<PropertySorter>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertySorter;\n }\n\n /**\n * Gets sorted property metadatas.\n * \n * @returns {ReadonlyArray<PropertyMetadata<TObject, any>>} Sorted property metadatas.\n */\n public get sortedPropertyMetadatas(): ReadonlyArray<PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.sortedPropertyMetadatas;\n }\n\n /**\n * Gets inject sorter.\n * \n * @returns {Optional<InjectSorter>} Inject sorter.\n */\n public get injectSorter(): Optional<InjectSorter>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectSorter;\n }\n\n /**\n * Gets sorted inject metadatas.\n * \n * @returns {ReadonlyArray<InjectMetadata<TObject, any>>} Sorted inject metadatas.\n */\n public get sortedInjectMetadatas(): ReadonlyArray<InjectMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.sortedInjectMetadatas;\n }\n\n /**\n * Gets parent type arguments.\n * \n * @returns {ReadonlyArray<TypeArgument<any>>} Parent type arguments.\n */\n public get parentTypeArguments(): ReadonlyArray<TypeArgument<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.parentTypeArguments;\n }\n\n /**\n * Gets parent type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Parent type metadatas.\n */\n public get parentTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.parentTypeMetadatas;\n }\n\n /**\n * Gets own parent type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Own parent type metadatas.\n */\n public get ownParentTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownParentTypeMetadatas;\n }\n\n /**\n * Gets child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Child type metadatas.\n */\n public get childTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.childTypeMetadatas;\n }\n\n /**\n * Gets own child type metadatas.\n * \n * @returns {ReadonlyArray<TypeMetadata<any>>} Own child type metadatas.\n */\n public get ownChildTypeMetadatas(): ReadonlyArray<TypeMetadata<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownChildTypeMetadatas;\n }\n\n /**\n * Gets property options map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyOptions<any>>} Property options map.\n */\n public get propertyOptionsMap(): ReadonlyMap<PropertyName, PropertyOptions<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertyOptionsMap;\n }\n\n /**\n * Gets property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Property metadata map.\n */\n public get propertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.propertyMetadataMap;\n }\n\n /**\n * Gets own property metadata map.\n * \n * @returns {ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>} Own property metadata map.\n */\n public get ownPropertyMetadataMap(): ReadonlyMap<PropertyName, PropertyMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.ownPropertyMetadataMap;\n }\n\n /**\n * Gets inject options map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectOptions<any>>} Inject options map.\n */\n public get injectOptionsMap(): ReadonlyMap<InjectIndex, InjectOptions<any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n\n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectOptionsMap;\n }\n\n /**\n * Gets inject metadata map.\n * \n * @returns {ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>} Inject metadata map.\n */\n public get injectMetadataMap(): ReadonlyMap<InjectIndex, InjectMetadata<TObject, any>>\n {\n let resolvedTypeState = this.resolvedTypeState;\n\n if (resolvedTypeState === undefined)\n {\n resolvedTypeState = this.typeMetadata.resolveTypeState();\n \n this.resolvedTypeState = resolvedTypeState;\n }\n\n return resolvedTypeState.injectMetadataMap;\n }\n}\n","import { TypeDecorator } from './type-decorator';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeOptions } from './type-options';\n\n/**\n * Type decorator.\n * \n * @param {TypeOptions<TObject>} typeOptions Type options.\n *\n * @returns {TypeDecorator} Type decorator.\n */\nexport function Type<TObject>(typeOptions?: TypeOptions<TObject>): TypeDecorator\n{\n TypeManager.typeScope.open();\n\n return function (target: any): any\n {\n const typeFn = target as TypeFn<TObject>;\n const typeMetadata = TypeManager.configureTypeMetadata(typeFn, typeOptions).reflectInjectMetadata();\n \n TypeManager.typeScope.close(typeMetadata);\n\n return target;\n };\n}\n","/**\n * In type script there is no explicit class for unknown type. We want to allow serialization and \n * deserialization without specify any serializers. However such behaviour should be visible in the \n * type metadata.\n * \n * @type {Unknown}\n */\nexport class Unknown\n{\n \n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(7729);\n"],"names":["root","factory","exports","module","define","amd","this","Any","DEFAULT_VALUE_RESOLVER","EMPTY_ARRAY","Array","EMPTY_MAP","Map","NULL_VALUE_RESOLVER","CustomKey","description","customValueResolver","build","typeMetadata","typeEntryMap","injector","typeCtor","typeFn","typeState","injectedKeys","Set","args","length","i","sortedInjectMetadatas","injectMetadata","injectState","argKey","key","undefined","typeEntry","get","injectIndex","value","add","type","values","propertyMetadata","has","propertyName","TypeFactory","metadataKey","target","Reflect","getOwnMetadata","propertyKey","getMetadata","rsAstralRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsApos","rsBreak","rsCombo","rsComboMarksRange","rsDingbat","rsLower","rsMisc","rsModifier","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","join","rsEmoji","reA","reB","reC","reF","reG","reUnicodeWord","RegExp","reUnicodeWords","reAsciiWords","x","test","match","getUnicodeWords","getAsciiWords","reviver","JSON","parse","replacer","space","spacing","isFinite","separator","seen","stringify","parent","node","level","toJSON","call","indent","out","isArray","delete","keys","Object","sort","name","typeManager","typeFnMap","declaringTypeMetadata","injectOptions","reflectTypeFn","getOwnReflectMetadata","currentInjectState","UnresolvedInjectState","configure","typeArgument","resolveInjectState","resolveTypeMetadata","resolvedInjectState","ResolvedInjectState","unresolveInjectState","unresolvedInjectState","hasKey","hasTypeArgument","Metadata","InjectMetadata","y","AscInjectSorter","DescInjectSorter","Error","nameOf","constructor","String","TypeManager","configureTypeMetadata","configureInjectMetadata","instanceMap","WeakMap","injectable","typeName","instance","init","set","SingletonInjector","LoggerLevel","loggerLevel","debugDisabled","Debug","infoDisabled","Info","warnDisabled","Warn","errorDisabled","supportsConsole","console","supportsConsoleLog","log","supportsConsoleInfo","info","supportsConsoleWarn","warn","supportsConsoleError","error","format","component","message","debug","debugMessage","optionalParams","infoMessage","warnMessage","errorMessage","Logger","resolveTypeMetadatas","typeArguments","typeMetadatas","resolveTypeMetadataUsingTypeResolver","resolveTypeMetadataUsingTypeFn","resolveTypeMetadataUsingAlias","resolveTypeMetadataUsingUnknownTypeFn","typeResolver","extractTypeMetadata","alias","logger","Unknown","resolveGenericMetadatas","genericArguments","genericMetadatas","genericArgument","convert","getWords","reduce","result","word","index","wordLowerCased","toLowerCase","toUpperCase","slice","CamelCaseNamingConvention","FlatCaseNamingConvention","FlatUpperCaseNamingConvention","KebabCaseNamingConvention","wordUpperCased","KebabUpperCaseNamingConvention","wordPascalCased","PascalCaseNamingConvention","SnakeCaseNamingConvention","SnakeUpperCaseNamingConvention","PROPERTY_EXTENSION_METADATA_CTOR_SET_KEY","PropertyExtensionMetadata","propertyExtensionOptions","propertyOptions","normalizedPropertyName","toLocaleLowerCase","getReflectMetadata","prototype","constructPropertyOptions","currentPropertyState","UnresolvedPropertyState","customValueMap","serializedNullValueResolver","serializedDefaultValueResolver","deserializedNullValueResolver","deserializedDefaultValueResolver","serializedPropertyName","deserializedPropertyName","deserializable","namingConvention","referenceHandler","serializable","serializer","preserveNull","useDefaultValue","useImplicitConversion","configurePropertyExtensionMetadata","propertyExtensionMetadataCtor","propertyExtensionMetadataCtorSet","extractPropertyExtensionMetadataCtorSet","extractPropertyExtensionMetadata","resolvePropertyState","resolveCustomValueMap","serializedDefaultValue","defaultValue","deserializedDefaultValue","useDefaultSerialization","resolvedPropertyState","ResolvedPropertyState","unresolvePropertyState","unresolvedPropertyState","typeCustomValueMap","customKey","customValue","hasAlias","hasCustomValueMap","currentCustomValueMap","clear","hasCustomValue","extractCustomValue","propertyState","hasCustomOptions","customOptions","hasDefaultValue","hasSerializedDefaultValue","hasDeserializedDefaultValue","isDeserializable","isSerializable","hasGenericArguments","hasNamingConvention","hasReferenceHandler","hasSerializer","shouldPreserveNull","shouldUseDefaultValue","shouldUseImplicitConversion","PropertyMetadata","localeCompare","AscPropertySorter","DescPropertySorter","z","assign","context","hasOwnProperty","decoratorContext","kind","typeScope","addPropertyOptions","legacyTarget","configurePropertyMetadata","serializerContext","referenceKey","referenceValueGetter","referenceMap","referenceValue","resolveReferenceCallbacks","registerReferenceCallback","restore","CircularReferenceHandler","arrayKeyRegExp","referencePath","jsonPath","$ref","referenceTarget","defineReferenceTarget","pushReferenceCallback","$","referencePathArray","convertReferencePathToArray","shift","array","parts","split","j","push","JsonPathReferenceHandler","PlainReferenceHandler","referenceCallbackMap","parentSerializerContext","jsonPathKey","referenceValueSetter","discriminant","discriminator","polymorphic","preserveDiscriminator","serialize","deserialize","defineReference","restoreReference","referenceCallback","referenceCallbacks","defineChildSerializerContext","SerializerContext","defineGenericSerializerContext","genericIndex","genericMetadata","definePolymorphicSerializerContext","definePolymorphicSerializerContextByTypeFn","definePolymorphicSerializerContextByDiscriminant","typeMetadataMap","record","childTypeMetadatas","childTypeState","serializedNullValue","deserializedNullValue","AnySerializer","ArrayBuffer","arrayBufferView","Uint16Array","from","map","c","fromCharCode","arrayBuffer","charCodeAt","ArrayBufferSerializer","arrayInput","arrayOutput","valueSerializerContext","v","k","ArraySerializer","BooleanSerializer","DataView","buffer","DataViewSerializer","Date","toISOString","DateSerializer","Float32Array","Float32ArraySerializer","Float64Array","Float64ArraySerializer","Int16Array","Int16ArraySerializer","Int32Array","Int32ArraySerializer","Int8Array","Int8ArraySerializer","size","genericKeySerializerContext","genericValueSerializerContext","keyArraySerializerContext","valueArraySerializerContext","keySerializerContext","keySerializer","valueSerializer","entries","mk","mv","MapSerializer","Number","NumberSerializer","SetSerializer","StringSerializer","typeSerializerContext","propertySerializerContext","object","declaringObject","sortedPropertyMetadatas","propertyValue","declaringType","TypeSerializer","Uint16ArraySerializer","Uint32Array","Uint32ArraySerializer","Uint8Array","Uint8ArraySerializer","Uint8ClampedArray","Uint8ClampedArraySerializer","UnknownSerializer","TYPE_EXTENSION_METADATA_CTOR_SET_KEY","TypeExtensionMetadata","typeExtensionOptions","typeManagerOptions","symbol","Symbol","TYPE_METADATA_SYMBOL","constructTypeManagerOptions","typeMetadataSet","staticTypeManager","typeOptionsBase","constructTypeOptionsBase","typeOptionsMap","constructTypeOptionsMap","typeConfigurationMap","initialTypeOptionsBase","defaultTypeOptionsBase","initialTypeOptionsMap","defaultTypeOptionsMap","typeOptions","mapTypeOptions","typeMetadataDefined","declareTypeMetadata","defineProperty","enumerable","configurable","writable","parentTypeMetadata","getPrototypeOf","TypeMetadata","applyTypeOptionsBase","unresolveTypeState","applyTypeOptionsMap","applyTypeOptions","applyTypeConfigurationMap","typeConfiguration","applyTypeConfiguration","defineSerializerContext","clone","cloneTypeOptionsBase","cloneTypeOptionsMap","customValueMapClone","typeOptionsBaseClone","typeOptionsMapClone","typeOptionsClone","typeCustomValueMapClone","propertyOptionsMap","propertyOptionsMapClone","propertyOptionsClone","propertyCustomValueMap","propertyCustomValueMapClone","injectOptionsMap","injectOptionsMapClone","injectOptionsClone","arrayFn","jsonStringify","jsonParse","Boolean","TypeScope","for","constructTypeOptions","currentTypeFnMap","currentChildTypeMetadataMap","currentPropertyMetadataMap","currentInjectMetadataMap","currentTypeState","UnresolvedTypeState","extendParentTypeMetadata","injectMetadataMap","propertyMetadataMap","propertySorter","injectSorter","parentTypeArguments","configureTypeExtensionMetadata","typeExtensionMetadataCtor","typeExtensionMetadataCtorSet","extractTypeExtensionMetadataCtorSet","extractTypeExtensionMetadata","resolveTypeState","ownParentTypeMetadatas","resolveOwnParentTypeMetadatas","ownChildTypeMetadatas","resolveOwnChildTypeMetadatas","parentTypeMetadataSet","resolveParentTypeMetadataSet","parentTypeMetadatas","childTypeMetadataSet","resolveChildTypeMetadataSet","childTypeMetadata","ownPropertyMetadataMap","resolvePropertyMetadataMap","resolvedTypeState","ResolvedTypeState","unresolvedTypeState","baseCustomValueMap","setTypeMetadata","reflectInjectMetadata","injectTypeFns","releaseAlias","hasDiscriminator","hasDiscriminant","hasFactory","isInjectable","hasInjector","hasLogger","shouldPreserveDiscriminator","hasPropertySorter","hasInjectSorter","hasParentTypeArguments","hasPropertyMetadataMap","currentPropertyOptionsMap","clearPropertyOptionsMap","hasInjectMetadataMap","currentInjectOptionsMap","clearInjectOptionsMap","opened","propertyOptionsArrayMap","injectOptionsArrayMap","open","propertyOptionsArray","addInjectOptions","injectOptionsArray","close","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|