diff --git a/js/typedjson.js b/js/typedjson.js index 514933d..d8a4bc4 100644 --- a/js/typedjson.js +++ b/js/typedjson.js @@ -128,6 +128,20 @@ function isPrimitiveValue(obj) { function isObject(value) { return typeof value === "object"; } +function shouldOmitParseString(jsonStr, expectedType) { + var expectsTypesSerializedAsStrings = expectedType === String + || expectedType === ArrayBuffer + || expectedType === DataView; + var hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length - 1] === '"'; + var isInteger = /^\d+$/.test(jsonStr.trim()); + return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date); +} +function parseToJSObject(json, expectedType) { + if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) { + return json; + } + return JSON.parse(json); +} /** * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B'). * @param A The supposed derived type. @@ -1435,7 +1449,7 @@ var typedjson_TypedJSON = /** @class */ (function () { */ TypedJSON.prototype.parse = function (object) { var _this = this; - var json = JSON.parse(object); + var json = parseToJSObject(object, this.rootConstructor); var rootMetadata = metadata_JsonObjectMetadata.getFromConstructor(this.rootConstructor); var result; var knownTypes = new Map(); @@ -1460,7 +1474,7 @@ var typedjson_TypedJSON = /** @class */ (function () { }; TypedJSON.prototype.parseAsArray = function (object, dimensions) { if (dimensions === void 0) { dimensions = 1; } - var json = JSON.parse(object); + var json = parseToJSObject(object, Array); if (json instanceof Array) { return this.deserializer.convertAsArray(json, { selfConstructor: Array, @@ -1477,7 +1491,7 @@ var typedjson_TypedJSON = /** @class */ (function () { return []; }; TypedJSON.prototype.parseAsSet = function (object) { - var json = JSON.parse(object); + var json = parseToJSObject(object, Set); // A Set is serialized as T[]. if (json instanceof Array) { return this.deserializer.convertAsSet(json, { @@ -1493,7 +1507,7 @@ var typedjson_TypedJSON = /** @class */ (function () { return new Set(); }; TypedJSON.prototype.parseAsMap = function (object, keyConstructor) { - var json = JSON.parse(object); + var json = parseToJSObject(object, Map); // A Set is serialized as T[]. if (json instanceof Array) { return this.deserializer.convertAsMap(json, { diff --git a/js/typedjson.js.map b/js/typedjson.js.map index d34f203..887ace1 100644 --- a/js/typedjson.js.map +++ b/js/typedjson.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://typedjson/webpack/universalModuleDefinition","webpack://typedjson/webpack/bootstrap","webpack://typedjson/./src/typedjson/helpers.ts","webpack://typedjson/./src/typedjson/metadata.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson.ts"],"names":[],"mappings":"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","file":"typedjson.js","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(\"typedjson\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"typedjson\"] = factory();\n\telse\n\t\troot[\"typedjson\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","declare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport function getDefaultValue(type: { new (): T }): T|undefined\n{\n switch (type as any)\n {\n case Number:\n return 0 as any;\n\n case String:\n return \"\" as any;\n\n case Boolean:\n return false as any;\n\n case Array:\n return [] as any;\n\n default:\n return undefined;\n }\n}\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param ctor The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean\n{\n return !!(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean\n{\n return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isPrimitiveValue(obj: any): boolean\n{\n switch (typeof obj)\n {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return true;\n default:\n return (obj instanceof String || obj instanceof Number || obj instanceof Boolean);\n }\n}\n\nexport function isObject(value: any): value is Object\n{\n return typeof value === \"object\";\n}\n\n/**\n * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B').\n * @param A The supposed derived type.\n * @param B The supposed base type.\n */\nexport function isSubtypeOf(A: Function, B: Function)\n{\n return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.error === \"function\")\n {\n console.error.apply(console, [message].concat(optionalParams));\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"ERROR: \" + message].concat(optionalParams));\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [message].concat(optionalParams));\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.warn === \"function\")\n {\n console.warn.apply(console, [message].concat(optionalParams));\n } else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"WARNING: \" + message].concat(optionalParams));\n }\n}\n\n/**\n * Checks if the value is considered defined (not undefined and not null).\n * @param value\n */\nexport function isValueDefined(value: T): value is Exclude\n{\n return !(typeof value === \"undefined\" || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean\n{\n if (typeof value === \"number\")\n {\n return (constructor === Number);\n }\n else if (typeof value === \"string\")\n {\n return (constructor === String);\n }\n else if (typeof value === \"boolean\")\n {\n return (constructor === Boolean);\n }\n else if (isObject(value))\n {\n return (value instanceof constructor);\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n (typeof Reflect === \"object\" && typeof Reflect.getMetadata === \"function\");\n\n/**\n * Gets the name of a function.\n * @param fn The function whose name to get.\n */\nexport function nameof(fn: Function & { name?: string })\n{\n if (typeof fn.name === \"string\")\n {\n return fn.name;\n }\n else\n {\n return \"undefined\";\n }\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\n\nexport interface JsonMemberMetadata\n{\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean;\n\n /** Member name as it appears in the serialized JSON. */\n name: string;\n\n /** Property or field key of the json member. */\n key: string;\n\n /** Constuctor (type) reference of the member. */\n ctor?: Function;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */\n elementType?: Function[];\n\n /** If the json member is a map, sets member options of array keys. */\n keyType?: Function;\n\n /** Custom deserializer to use. */\n deserializer?: (json: any) => any;\n\n /** Custom serializer to use. */\n serializer?: (value: any) => any;\n}\n\nexport class JsonObjectMetadata\n{\n //#region Static\n /**\n * Gets the name of a class as it appears in a serialized JSON string.\n * @param ctor The constructor of a class (with or without jsonObject).\n */\n public static getJsonObjectName(ctor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata ? nameof(metadata.classType) : nameof(ctor);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n public static getFromConstructor(ctor: Function): JsonObjectMetadata|undefined\n {\n const prototype = ctor.prototype;\n if (!prototype)\n {\n return;\n }\n\n let metadata: JsonObjectMetadata|undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // The class prototype contains own jsonObject metadata\n metadata = prototype[METADATA_FIELD_KEY];\n }\n\n // Ignore implicitly added jsonObject (through jsonMember)\n if (metadata && metadata.isExplicitlyMarked)\n {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor))\n {\n const primitiveMeta = new JsonObjectMetadata(ctor);\n primitiveMeta.isExplicitlyMarked = true;\n // we do not store the metadata here to not modify builtin prototype\n return primitiveMeta;\n }\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n public static getKnownTypeNameFromType(constructor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean\n {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n //#endregion\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\n public dataMembers: Map = new Map();\n\n public knownTypes: Set = new Set();\n\n public knownTypeMethodName?: string;\n\n /** Gets or sets the constructor function for the jsonObject. */\n public classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n public isExplicitlyMarked: boolean = false;\n\n /**\n * Indicates whether this type is handled without annotation. This is usually\n * used for the builtin types (except for Maps, Sets, and normal Arrays).\n */\n public isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n public name?: string;\n\n public onDeserializedMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(constructor.constructor)}.${String(propKey)}`; // For error messages.\n let objectMetadata: JsonObjectMetadata;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor function.\n // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators\n // ... and static members are not supported here, so abort.\n if (typeof constructor === \"function\")\n {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // @ts-ignore symbol indexing is not supported by ts\n if (typeof constructor[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.ctor && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown ctor.`);\n return;\n }\n\n // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype).\n // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well.\n if (!constructor.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // No *own* metadata, create new.\n objectMetadata = new JsonObjectMetadata(constructor.constructor);\n\n // Inherit @JsonMembers from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = constructor[METADATA_FIELD_KEY];\n if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY)\n {\n parentMetadata.dataMembers.forEach((_metadata, _propKey) => objectMetadata.dataMembers.set(_propKey, _metadata));\n }\n\n // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype).\n Object.defineProperty(constructor, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // JsonObjectMetadata already exists on 'constructor'.\n objectMetadata = constructor[METADATA_FIELD_KEY];\n }\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n objectMetadata.knownTypes.add(metadata.ctor);\n }\n\n if (metadata.keyType)\n objectMetadata.knownTypes.add(metadata.keyType);\n\n if (metadata.elementType)\n metadata.elementType.forEach(elemCtor => objectMetadata.knownTypes.add(elemCtor));\n\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\n/**\n * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree.\n * It is used after parsing a JSON-string.\n */\nexport class Deserializer\n{\n private _typeResolver: (sourceObject: Object, knownTypes: Map) => Function|undefined;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeResolver = (sourceObject: any, knownTypes: Map) =>\n {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: (sourceObject: Object, knownTypes: Map) => Function)\n {\n if (typeof typeResolverCallback !== \"function\") throw new TypeError(\"'typeResolverCallback' is not a function.\");\n\n this._typeResolver = typeResolverCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n public convertAsObject(\n sourceObject: IndexedObject,\n sourceObjectTypeInfo: IScopeTypeInfo,\n objectName = \"object\",\n ) {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n this._errorHandler(new TypeError(`Cannot deserialize ${objectName}: 'sourceObject' must be a defined object.`));\n return undefined;\n }\n\n let expectedSelfType = sourceObjectTypeInfo.selfConstructor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = sourceObjectTypeInfo.knownTypes;\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n\n // Check if a type-hint is available from the source object.\n let typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint)\n {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType))\n {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata)\n {\n // Also merge new known types from subtype.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked)\n {\n const sourceMetadata = sourceObjectMetadata;\n // Strong-typed deserialization available, get to it.\n // First deserialize properties into a temporary object.\n const sourceObjectWithDeserializedProperties = {} as IndexedObject;\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((memberMetadata, propKey) =>\n {\n const memberValue = sourceObject[propKey];\n const memberNameForDebug = `${nameof(sourceMetadata.classType)}.${propKey}`;\n\n let revivedValue;\n if (memberMetadata.deserializer) {\n revivedValue = memberMetadata.deserializer(memberValue);\n } else if (memberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n memberValue,\n {\n selfConstructor: memberMetadata.ctor,\n elementConstructor: memberMetadata.elementType,\n keyConstructor: memberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n memberNameForDebug,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${memberNameForDebug} thers is`\n + ` no constructor nor deserlization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue))\n {\n sourceObjectWithDeserializedProperties[memberMetadata.key] = revivedValue;\n }\n else if (memberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${memberNameForDebug}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === \"function\")\n {\n try\n {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject)\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n }\n else if (!(targetObject instanceof sourceObjectMetadata.classType))\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + `'initializer' returned '${nameof(targetObject.constructor)}'`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected,`\n + `and '${nameof(targetObject.constructor)}' is not a subtype of`\n + ` '${nameof(sourceObjectMetadata.classType)}'`,\n );\n }\n }\n catch (e)\n {\n this._errorHandler(e);\n return undefined;\n }\n }\n else\n {\n targetObject = this._instantiateType(expectedSelfType);\n }\n\n // Finally, assign deserialized properties to target object.\n Object.assign(targetObject, sourceObjectWithDeserializedProperties);\n\n // Call onDeserialized method (if any).\n if (sourceObjectMetadata.onDeserializedMethodName)\n {\n if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n this._errorHandler(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`\n ));\n }\n }\n\n return targetObject;\n }\n else\n {\n // Untyped deserialization into Object instance.\n let targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(sourceObject[sourceKey], {\n selfConstructor: sourceObject[sourceKey].constructor,\n knownTypes: sourceObjectTypeInfo.knownTypes,\n elementConstructor: sourceObjectTypeInfo.elementConstructor,\n keyConstructor: sourceObjectTypeInfo.keyConstructor\n }, sourceKey);\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (!isValueDefined(sourceObject))\n {\n return sourceObject;\n }\n else if (this._isDirectlyDeserializableNativeType(expectedSelfType))\n {\n if (sourceObject.constructor === expectedSelfType)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName));\n }\n }\n else if (expectedSelfType === Date)\n {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === \"string\" || (typeof sourceObject === \"number\" && sourceObject > 0))\n return new Date(sourceObject as any);\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array)\n {\n // Deserialize Float32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float32Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float64Array)\n {\n // Deserialize Float64Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float64Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float64Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8Array)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8ClampedArray)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8ClampedArray(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8ClampedArray\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint16Array)\n {\n // Deserialize Uint16Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint16Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint16Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint32Array)\n {\n // Deserialize Uint32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint32Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === ArrayBuffer)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToArrayBuffer(sourceObject);\n else\n this._throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === DataView)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToDataView(sourceObject);\n else\n this._throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Array)\n {\n if (sourceObject instanceof Array)\n return this.convertAsArray(sourceObject, typeInfo, memberName);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (sourceObject instanceof Array)\n return this.convertAsSet(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (sourceObject instanceof Array)\n return this.convertAsMap(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n public convertAsArray(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\"): any[]\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n return sourceObject.map(element =>\n {\n // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try\n {\n return this.convertSingleValue(element, elementTypeInfo);\n }\n catch (e)\n {\n this._errorHandler(e);\n\n // Keep filling the array here with undefined to keep original ordering.\n // Note: this is just aesthetics, not returning anything produces the same result.\n return undefined;\n }\n });\n }\n\n public convertAsSet(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`));\n return new Set();\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n let resultSet = new Set();\n\n sourceObject.forEach((element, i) =>\n {\n try\n {\n resultSet.add(this.convertSingleValue(element, elementTypeInfo, memberName + `[${i}]`));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n\n if (!typeInfo.keyConstructor)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.keyConstructor,\n knownTypes: typeInfo.knownTypes\n };\n\n let valueTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n let resultMap = new Map();\n\n sourceObject.forEach((element: any) =>\n {\n try\n {\n let key = this.convertSingleValue(element.key, keyTypeInfo);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(key, this.convertSingleValue(\n element.value, valueTypeInfo, `${memberName}[${key}]`,\n ));\n }\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultMap;\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string = \"object\",\n ) {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n }\n\n private _makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName = \"object\")\n {\n let expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n let actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n }\n\n private _instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n private _mergeKnownTypes(...knownTypeMaps: Array>)\n {\n let result = new Map();\n\n knownTypeMaps.forEach(knownTypes =>\n {\n knownTypes.forEach((ctor, name) =>\n {\n if (this._nameResolver)\n {\n result.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n private _createKnownTypesMap(knowTypes: Set)\n {\n const map = new Map();\n\n knowTypes.forEach(ctor =>\n {\n if (this._nameResolver)\n {\n map.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name\n ? knownTypeMeta.name\n : ctor.name;\n map.set(name, ctor);\n }\n });\n\n return map;\n }\n\n private _isDirectlyDeserializableNativeType(ctor: any)\n {\n return ~([Number, String, Boolean].indexOf(ctor));\n }\n\n public convertNativeObject(sourceObject: any)\n {\n return sourceObject;\n }\n\n private _stringToArrayBuffer(str: string)\n {\n let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = str.length; i < strLen; i++)\n {\n bufView[i] = str.charCodeAt(i);\n }\n\n return buf;\n }\n\n private _stringToDataView(str: string)\n {\n return new DataView(this._stringToArrayBuffer(str));\n }\n}\n","import { nameof, logError, isValueDefined, isInstanceOf, isTypeTypedArray, isDirectlySerializableNativeType } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfType: Function;\n elementTypes?: Function[];\n keyType?: Function;\n}\n\nexport interface IScopeArrayTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Array;\n elementTypes: Function[];\n}\n\nfunction isArrayTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeArrayTypeInfo {\n return typeInfo.selfType === Array;\n}\n\nexport interface IScopeSetTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Set;\n elementTypes: [Function];\n}\n\nfunction isSetTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeSetTypeInfo {\n return typeInfo.selfType === Set;\n}\n\nexport interface IScopeMapTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Map;\n elementTypes: [Function];\n keyType: Function;\n}\n\nfunction isMapTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeMapTypeInfo {\n return typeInfo.selfType === Map;\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class instances, and so on) to an untyped javascript object (also\n * called \"simple javascript object\"), and emits any necessary type hints in the process (for polymorphism).\n *\n * The converted object tree is what will be given to `JSON.stringify` to convert to string as the last step, the serialization is basically like:\n *\n * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string\n */\nexport class Serializer\n{\n private _typeHintEmitter: (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeHintEmitter = (targetObject, sourceObject, expectedSourceType, sourceTypeMetadata?: JsonObjectMetadata) =>\n {\n // By default, we put a \"__type\" property on the output object if the actual object is not the same as the expected one, so that deserialization\n // will know what to deserialize into (given the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n const name = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n // TODO: Perhaps this can work correctly without string-literal access?\n // tslint:disable-next-line:no-string-literal\n targetObject[\"__type\"] = name;\n }\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setTypeHintEmitter(typeEmitterCallback: (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void)\n {\n if (typeof typeEmitterCallback !== \"function\")\n {\n throw new TypeError(\"'typeEmitterCallback' is not a function.\");\n }\n\n this._typeHintEmitter = typeEmitterCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n /**\n * Convert a value of any supported serializable type.\n * The value type will be detected, and the correct serialization method will be called.\n */\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName: string = \"object\"): any\n {\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeInfo.selfType))\n {\n let expectedName = nameof(typeInfo.selfType);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(`Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`));\n return;\n }\n\n if (isDirectlySerializableNativeType(typeInfo.selfType))\n {\n return sourceObject;\n }\n else if (typeInfo.selfType === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeInfo.selfType === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (isArrayTypeInfo(typeInfo))\n {\n return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName);\n }\n else if (isTypeTypedArray(typeInfo.selfType))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple javascript object for serialization.\n */\n public convertAsObject(sourceObject: IndexedObject, typeInfo: IScopeTypeInfo, memberName?: string)\n {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType)\n {\n // The source object is not of the expected type, but it is a valid subtype.\n // This is OK, and we'll proceed to gather object metadata from the subtype instead.\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor);\n }\n else\n {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeInfo.selfType);\n }\n\n if (sourceTypeMetadata)\n {\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), and perform recursive conversion on\n // each of them. The converted objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n sourceTypeMetadata.dataMembers.forEach((memberMetadata) =>\n {\n if (memberMetadata.serializer) {\n targetObject[memberMetadata.name] =\n memberMetadata.serializer(sourceObject[memberMetadata.key]);\n } else if (memberMetadata.ctor) {\n targetObject[memberMetadata.name] = this.convertSingleValue(\n sourceObject[memberMetadata.key],\n {\n selfType: memberMetadata.ctor,\n elementTypes: memberMetadata.elementType,\n keyType: memberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${memberMetadata.key}`,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${memberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n });\n }\n else\n {\n // Untyped serialization, \"as-is\", we'll just pass the object on.\n // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata);\n\n return targetObject;\n }\n\n /**\n * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for\n * serialization.\n * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsArray(sourceObject: any[], expectedElementType: Function[], memberName = \"object\"): any[]\n {\n if (expectedElementType.length === 0 || !expectedElementType[0])\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n\n // Check the type of each element, individually.\n // If at least one array element type is incorrect, we return undefined, which results in no value emitted during serialization.\n // This is so that invalid element types don't unexpectedly alter the ordering of other, valid elements, and that no unexpected undefined values are in\n // the emitted array.\n sourceObject.forEach((element, i) =>\n {\n if (!isInstanceOf(element, expectedElementType[0]))\n {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]: expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], // For multidimensional arrays.\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(element => this.convertSingleValue(element, typeInfoForElements, memberName));\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @returns\n */\n public convertAsSet(sourceObject: Set, expectedElementType: Function, memberName = \"object\"): any[]\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n };\n\n // For debugging and error tracking.\n if (memberName) memberName += \"[]\";\n\n let resultArray: any[] = [];\n\n // Convert each element of the set, and put it into an output array.\n // The output array is the one serialized, as JSON.stringify does not support Set serialization. (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName);\n\n // Add to output if the source element was undefined, OR the converted element is defined. This will add intentionally undefined values to output,\n // but not values that became undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement))\n {\n resultArray.push(resultElement);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a map of typed objects (or primitive values) into an array of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsMap(sourceObject: Map, expectedKeyType: Function, expectedElementType: Function, memberName = \"object\"): Array<{ key: any, value: any }>\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n\n if (!expectedKeyType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n elementTypes: [expectedElementType]\n };\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfType: expectedKeyType\n };\n\n if (memberName) memberName += \"[]\";\n\n let resultArray: Array<{ key: any, value: any }> = [];\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) =>\n {\n let resultKeyValuePairObj = {\n key: this.convertSingleValue(key, keyTypeInfo, memberName),\n value: this.convertSingleValue(value, elementTypeInfo, memberName)\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n if (isValueDefined(resultKeyValuePairObj.key) && isValueDefined(resultKeyValuePairObj.value))\n {\n resultArray.push(resultKeyValuePairObj);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a typed javascript array to a simple untyped javascript array.\n * This is needed because typed arrays are otherwise serialized as objects, so we'll end up with something like \"{ 0: 0, 1: 1, ... }\".\n *\n * @param sourceObject\n * @returns\n */\n public convertAsTypedArray(sourceObject: ArrayBufferView)\n {\n return Array.from(sourceObject as any);\n }\n\n /**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\n public convertAsArrayBuffer(buffer: ArrayBuffer)\n {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(\"\");\n }\n\n /**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n}\n","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IJsonObjectOptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints,\n * or the name of a static method used for determining known types.\n */\n knownTypes?: Function[] | string;\n\n /**\n * The name of a static or instance method to call when deserialization\n * of the object is completed.\n */\n onDeserialized?: string;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer: (sourceObject: T, rawSourceObject: T) => T;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer?: (sourceObject: T, rawSourceObject: T) => T;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: ParameterlessConstructor): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Constructor\n): ((target: Constructor) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n options = {};\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Function\n ): void {\n let objectMetadata: JsonObjectMetadata;\n\n // Create or obtain JsonObjectMetadata object.\n if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n objectMetadata = new JsonObjectMetadata(target);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = target.prototype[METADATA_FIELD_KEY];\n if (parentMetadata)\n {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) =>\n objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n }\n\n Object.defineProperty(target.prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // Target already has JsonObjectMetadata associated with it.\n objectMetadata = target.prototype[METADATA_FIELD_KEY];\n objectMetadata.classType = target;\n }\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name)\n {\n objectMetadata.name = options.name;\n }\n\n // Obtain known-types.\n if (typeof options.knownTypes === \"string\")\n {\n objectMetadata.knownTypeMethodName = options.knownTypes;\n }\n else if (options.knownTypes instanceof Array)\n {\n options.knownTypes\n .filter(knownType => !!knownType)\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property is part of the object when serializing, with additional options.\n * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared.\n * @param options Additional options.\n */\nexport function jsonMember(options: IJsonMemberOptions): PropertyDecorator;\n\n/**\n * Specifies that a property is part of the object when serializing.\n * This call signature requires ReflectDecorators and that the property type is always explicitly declared.\n */\nexport function jsonMember(target: Object, propertyKey: string | symbol): void;\n\nexport function jsonMember(optionsOrTarget?: IJsonMemberOptions | Object, propKey?: string | symbol): PropertyDecorator | void\n{\n if (optionsOrTarget instanceof Object && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const target = optionsOrTarget;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and propKey.\n // Obtain property constructor through ReflectDecorators.\n if (isReflectMetadataSupported)\n {\n const reflectPropCtor = Reflect.getMetadata(\"design:type\", target, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime.`);\n return;\n }\n\n if (isSpecialPropertyType(decoratorName, reflectPropCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: reflectPropCtor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n }\n else\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n else\n {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) =>\n {\n let options: IJsonMemberOptions = optionsOrTarget || {};\n let propCtor: Function|undefined;\n let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty(\"constructor\"))\n {\n if (!isValueDefined(options.constructor))\n {\n logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`);\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not.\n if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n\n propCtor = options.constructor;\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n propCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!propCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n }\n else if (!options.deserializer)\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (isSpecialPropertyType(decoratorName, propCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, _propKey, {\n ctor: propCtor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: _propKey.toString(),\n name: options.name || _propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n }\n}\n\nfunction isSpecialPropertyType(decoratorName: string, propCtor?: Function)\n{\n if (propCtor === Array)\n {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Set)\n {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Map)\n {\n logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n return false;\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property, of type array, is part of an object when serializing.\n * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(elementConstructor: Function, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`);\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1)\n {\n logError(`${decoratorName}: 'dimensions' option must be at least 1.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Array)\n {\n logError(`${decoratorName}: property is not an Array.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nfunction createArrayElementType(elementCtor: Function, dimensions: number) {\n const elementTypes = new Array(dimensions).fill(Array, 0, -1);\n elementTypes[dimensions-1] = elementCtor;\n return elementTypes;\n}\n","import { nameof } from \"./helpers\";\nimport { IJsonMemberOptions } from \"./json-member\";\nimport { JsonMemberMetadata, JsonObjectMetadata, injectMetadataInformation } from \"./metadata\";\nimport * as Helpers from \"./helpers\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Set.\n * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n var decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n Helpers.logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not.\n if (Helpers.isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n Helpers.logError(`${decoratorName}: property is not a Set.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Map.\n * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map').\n * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map').\n * @param options Additional options.\n */\nexport function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options: IJsonMapMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof keyConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (typeof valueConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map values at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Map)\n {\n logError(`${decoratorName}: property is not a Map.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, logWarning } from './typedjson/helpers';\nimport { Constructor } from \"./typedjson/types\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { Deserializer } from \"./typedjson/deserializer\";\nimport { Serializer } from \"./typedjson/serializer\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\n\nexport interface ITypedJSONSettings\n{\n /**\n * Sets the handler callback to invoke on errors during serializing and deserializing.\n * Re-throwing errors in this function will halt serialization/deserialization.\n * The default behavior is to log errors to the console.\n */\n errorHandler?: (e: Error) => void;\n\n /**\n * Sets a callback that determines the constructor of the correct sub-type of polymorphic\n * objects while deserializing.\n * The default behavior is to read the type-name from the '__type' property of 'sourceObject',\n * and look it up in 'knownTypes'.\n * The constructor of the sub-type should be returned.\n */\n typeResolver?: (sourceObject: Object, knownTypes: Map) => Function;\n\n nameResolver?: (ctor: Function) => string;\n\n /**\n * Sets a callback that writes type-hints to serialized objects.\n * The default behavior is to write the type-name to the '__type' property, if a derived type\n * is present in place of a base type.\n */\n typeHintEmitter?:\n (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void;\n\n /**\n * Sets the amount of indentation to use in produced JSON strings.\n * Default value is 0, or no indentation.\n */\n indent?: number;\n\n replacer?: (key: string, value: any) => any;\n\n knownTypes?: Array>;\n}\n\nexport class TypedJSON\n{\n //#region Static\n public static parse(\n object: any, rootType: Constructor, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: number\n ): any[] {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n public static parseAsSet(\n object: any, elementType: Constructor, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Constructor,\n valueType: Constructor,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): any[] {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n public static toPlainSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n public static stringifyAsSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n public static setGlobalConfig(config: ITypedJSONSettings)\n {\n if (this._globalConfig)\n {\n Object.assign(this._globalConfig, config);\n }\n else\n {\n this._globalConfig = config;\n }\n }\n\n //#endregion\n\n private serializer: Serializer = new Serializer();\n private deserializer: Deserializer = new Deserializer();\n private globalKnownTypes: Array> = [];\n private indent: number = 0;\n private rootConstructor: Constructor;\n private errorHandler: (e: Error) => void;\n private nameResolver: (ctor: Function) => string;\n private replacer?: (key: string, value: any) => any;\n\n /**\n * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object\n * instances of the specified root class type.\n * @param rootType The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings)\n {\n let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation))\n {\n throw new TypeError(\"The TypedJSON root data type must have the @jsonObject decorator used.\");\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings)\n {\n this.config(settings);\n }\n else if (TypedJSON._globalConfig)\n {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n public config(settings: ITypedJSONSettings)\n {\n if (TypedJSON._globalConfig)\n {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes)\n {\n // Merge known-types (also de-duplicate them, so Array -> Set -> Array).\n settings.knownTypes = Array.from(new Set(\n settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes),\n ));\n }\n }\n\n if (settings.errorHandler)\n {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) this.replacer = settings.replacer;\n if (settings.typeResolver) this.deserializer.setTypeResolver(settings.typeResolver);\n if (settings.typeHintEmitter) this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n if (settings.indent) this.indent = settings.indent;\n\n if (settings.nameResolver)\n {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes)\n {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) =>\n {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === \"undefined\" || knownType === null)\n {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`);\n }\n });\n\n this.globalKnownTypes = settings.knownTypes;\n }\n }\n\n /**\n * Converts a JSON string to the root class type.\n * @param object The JSON to parse and convert.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns Deserialized T or undefined if there were errors.\n */\n public parse(object: any): T|undefined\n {\n const json = JSON.parse(object);\n\n let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T|undefined;\n let knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata)\n {\n rootMetadata.knownTypes.forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try\n {\n result = this.deserializer.convertSingleValue(json, {\n selfConstructor: this.rootConstructor,\n knownTypes: knownTypes,\n }) as T;\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n public parseAsArray(object: any, dimensions?: 1): T[];\n public parseAsArray(object: any, dimensions: 2): T[][];\n public parseAsArray(object: any, dimensions: 3): T[][][];\n public parseAsArray(object: any, dimensions: 4): T[][][][];\n public parseAsArray(object: any, dimensions: 5): T[][][][][];\n public parseAsArray(object: any, dimensions: number): any[];\n public parseAsArray(object: any, dimensions: number = 1): any[]\n {\n const json = JSON.parse(object);\n if (json instanceof Array)\n {\n return this.deserializer.convertAsArray(json, {\n selfConstructor: Array,\n elementConstructor: new Array(dimensions - 1)\n .fill(Array)\n .concat(this.rootConstructor),\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define an Array`\n + `, but got ${typeof json}.`));\n }\n\n return [];\n }\n\n public parseAsSet(object: any): Set\n {\n const json = JSON.parse(object);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsSet(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes)\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Set();\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = JSON.parse(object);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsMap(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n keyConstructor: keyConstructor\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Map();\n }\n\n /**\n * Converts an instance of the specified class type to a plain JSON object.\n * @param object The instance to convert to a JSON string.\n * @returns Serialized object or undefined if an error has occured.\n */\n public toPlainJson(object: T): JsonTypes\n {\n try\n {\n return this.serializer.convertSingleValue(object, {\n selfType: this.rootConstructor\n });\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainArray(object: T[], dimensions?: 1): Object[];\n public toPlainArray(object: T[][], dimensions: 2): Object[][];\n public toPlainArray(object: T[][][], dimensions: 3): Object[][][];\n public toPlainArray(object: T[][][][], dimensions: 4): Object[][][][];\n public toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][];\n public toPlainArray(object: any[], dimensions: 1|2|3|4|5 = 1): Object[]|undefined\n {\n try\n {\n const elementConstructorArray =\n new Array(dimensions - 1).fill(Array).concat(this.rootConstructor);\n return this.serializer.convertAsArray(object, elementConstructorArray);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainSet(object: Set): Object[]|undefined\n {\n try\n {\n return this.serializer.convertAsSet(object, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): { key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n /**\n * Converts an instance of the specified class type to a JSON string.\n * @param object The instance to convert to a JSON string.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns String with the serialized object or an empty string if an error has occured, but\n * the errorHandler did not throw.\n */\n public stringify(object: T): string\n {\n const result = this.toPlainJson(object);\n if (result === undefined) {\n return '';\n }\n return JSON.stringify(result, this.replacer, this.indent);\n }\n\n public stringifyAsArray(object: T[], dimensions?: 1): string;\n public stringifyAsArray(object: T[][], dimensions: 2): string;\n public stringifyAsArray(object: T[][][], dimensions: 3): string;\n public stringifyAsArray(object: T[][][][], dimensions: 4): string;\n public stringifyAsArray(object: T[][][][][], dimensions: 5): string;\n public stringifyAsArray(object: any[], dimensions: any): string\n {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n public stringifyAsSet(object: Set): string\n {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n public stringifyAsMap(object: Map, keyConstructor: Constructor): string\n {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>)\n {\n let map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n\nexport { jsonObject } from \"./typedjson/json-object\";\nexport { jsonMember } from \"./typedjson/json-member\";\nexport { jsonArrayMember } from \"./typedjson/json-array-member\";\nexport { jsonSetMember } from \"./typedjson/json-set-member\";\nexport { jsonMapMember } from \"./typedjson/json-map-member\";\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://typedjson/webpack/universalModuleDefinition","webpack://typedjson/webpack/bootstrap","webpack://typedjson/./src/typedjson/helpers.ts","webpack://typedjson/./src/typedjson/metadata.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson.ts"],"names":[],"mappings":"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","file":"typedjson.js","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(\"typedjson\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"typedjson\"] = factory();\n\telse\n\t\troot[\"typedjson\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","declare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport function getDefaultValue(type: { new (): T }): T|undefined\n{\n switch (type as any)\n {\n case Number:\n return 0 as any;\n\n case String:\n return \"\" as any;\n\n case Boolean:\n return false as any;\n\n case Array:\n return [] as any;\n\n default:\n return undefined;\n }\n}\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param ctor The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean\n{\n return !!(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean\n{\n return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isPrimitiveValue(obj: any): boolean\n{\n switch (typeof obj)\n {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return true;\n default:\n return (obj instanceof String || obj instanceof Number || obj instanceof Boolean);\n }\n}\n\nexport function isObject(value: any): value is Object\n{\n return typeof value === \"object\";\n}\n\nfunction shouldOmitParseString(jsonStr: string, expectedType: Function): boolean {\n const expectsTypesSerializedAsStrings = expectedType === String\n || expectedType === ArrayBuffer\n || expectedType === DataView;\n\n const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '\"' && jsonStr[jsonStr.length-1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Function): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType))\n {\n return json;\n }\n return JSON.parse(json);\n}\n\n/**\n * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B').\n * @param A The supposed derived type.\n * @param B The supposed base type.\n */\nexport function isSubtypeOf(A: Function, B: Function)\n{\n return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.error === \"function\")\n {\n console.error.apply(console, [message].concat(optionalParams));\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"ERROR: \" + message].concat(optionalParams));\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [message].concat(optionalParams));\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.warn === \"function\")\n {\n console.warn.apply(console, [message].concat(optionalParams));\n } else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"WARNING: \" + message].concat(optionalParams));\n }\n}\n\n/**\n * Checks if the value is considered defined (not undefined and not null).\n * @param value\n */\nexport function isValueDefined(value: T): value is Exclude\n{\n return !(typeof value === \"undefined\" || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean\n{\n if (typeof value === \"number\")\n {\n return (constructor === Number);\n }\n else if (typeof value === \"string\")\n {\n return (constructor === String);\n }\n else if (typeof value === \"boolean\")\n {\n return (constructor === Boolean);\n }\n else if (isObject(value))\n {\n return (value instanceof constructor);\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n (typeof Reflect === \"object\" && typeof Reflect.getMetadata === \"function\");\n\n/**\n * Gets the name of a function.\n * @param fn The function whose name to get.\n */\nexport function nameof(fn: Function & { name?: string })\n{\n if (typeof fn.name === \"string\")\n {\n return fn.name;\n }\n else\n {\n return \"undefined\";\n }\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\n\nexport interface JsonMemberMetadata\n{\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean;\n\n /** Member name as it appears in the serialized JSON. */\n name: string;\n\n /** Property or field key of the json member. */\n key: string;\n\n /** Constuctor (type) reference of the member. */\n ctor?: Function;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */\n elementType?: Function[];\n\n /** If the json member is a map, sets member options of array keys. */\n keyType?: Function;\n\n /** Custom deserializer to use. */\n deserializer?: (json: any) => any;\n\n /** Custom serializer to use. */\n serializer?: (value: any) => any;\n}\n\nexport class JsonObjectMetadata\n{\n //#region Static\n /**\n * Gets the name of a class as it appears in a serialized JSON string.\n * @param ctor The constructor of a class (with or without jsonObject).\n */\n public static getJsonObjectName(ctor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata ? nameof(metadata.classType) : nameof(ctor);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n public static getFromConstructor(ctor: Function): JsonObjectMetadata|undefined\n {\n const prototype = ctor.prototype;\n if (!prototype)\n {\n return;\n }\n\n let metadata: JsonObjectMetadata|undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // The class prototype contains own jsonObject metadata\n metadata = prototype[METADATA_FIELD_KEY];\n }\n\n // Ignore implicitly added jsonObject (through jsonMember)\n if (metadata && metadata.isExplicitlyMarked)\n {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor))\n {\n const primitiveMeta = new JsonObjectMetadata(ctor);\n primitiveMeta.isExplicitlyMarked = true;\n // we do not store the metadata here to not modify builtin prototype\n return primitiveMeta;\n }\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n public static getKnownTypeNameFromType(constructor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean\n {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n //#endregion\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\n public dataMembers: Map = new Map();\n\n public knownTypes: Set = new Set();\n\n public knownTypeMethodName?: string;\n\n /** Gets or sets the constructor function for the jsonObject. */\n public classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n public isExplicitlyMarked: boolean = false;\n\n /**\n * Indicates whether this type is handled without annotation. This is usually\n * used for the builtin types (except for Maps, Sets, and normal Arrays).\n */\n public isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n public name?: string;\n\n public onDeserializedMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(constructor.constructor)}.${String(propKey)}`; // For error messages.\n let objectMetadata: JsonObjectMetadata;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor function.\n // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators\n // ... and static members are not supported here, so abort.\n if (typeof constructor === \"function\")\n {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // @ts-ignore symbol indexing is not supported by ts\n if (typeof constructor[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.ctor && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown ctor.`);\n return;\n }\n\n // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype).\n // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well.\n if (!constructor.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // No *own* metadata, create new.\n objectMetadata = new JsonObjectMetadata(constructor.constructor);\n\n // Inherit @JsonMembers from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = constructor[METADATA_FIELD_KEY];\n if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY)\n {\n parentMetadata.dataMembers.forEach((_metadata, _propKey) => objectMetadata.dataMembers.set(_propKey, _metadata));\n }\n\n // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype).\n Object.defineProperty(constructor, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // JsonObjectMetadata already exists on 'constructor'.\n objectMetadata = constructor[METADATA_FIELD_KEY];\n }\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n objectMetadata.knownTypes.add(metadata.ctor);\n }\n\n if (metadata.keyType)\n objectMetadata.knownTypes.add(metadata.keyType);\n\n if (metadata.elementType)\n metadata.elementType.forEach(elemCtor => objectMetadata.knownTypes.add(elemCtor));\n\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\n/**\n * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree.\n * It is used after parsing a JSON-string.\n */\nexport class Deserializer\n{\n private _typeResolver: (sourceObject: Object, knownTypes: Map) => Function|undefined;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeResolver = (sourceObject: any, knownTypes: Map) =>\n {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: (sourceObject: Object, knownTypes: Map) => Function)\n {\n if (typeof typeResolverCallback !== \"function\") throw new TypeError(\"'typeResolverCallback' is not a function.\");\n\n this._typeResolver = typeResolverCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n public convertAsObject(\n sourceObject: IndexedObject,\n sourceObjectTypeInfo: IScopeTypeInfo,\n objectName = \"object\",\n ) {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n this._errorHandler(new TypeError(`Cannot deserialize ${objectName}: 'sourceObject' must be a defined object.`));\n return undefined;\n }\n\n let expectedSelfType = sourceObjectTypeInfo.selfConstructor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = sourceObjectTypeInfo.knownTypes;\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n\n // Check if a type-hint is available from the source object.\n let typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint)\n {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType))\n {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata)\n {\n // Also merge new known types from subtype.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked)\n {\n const sourceMetadata = sourceObjectMetadata;\n // Strong-typed deserialization available, get to it.\n // First deserialize properties into a temporary object.\n const sourceObjectWithDeserializedProperties = {} as IndexedObject;\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((memberMetadata, propKey) =>\n {\n const memberValue = sourceObject[propKey];\n const memberNameForDebug = `${nameof(sourceMetadata.classType)}.${propKey}`;\n\n let revivedValue;\n if (memberMetadata.deserializer) {\n revivedValue = memberMetadata.deserializer(memberValue);\n } else if (memberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n memberValue,\n {\n selfConstructor: memberMetadata.ctor,\n elementConstructor: memberMetadata.elementType,\n keyConstructor: memberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n memberNameForDebug,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${memberNameForDebug} thers is`\n + ` no constructor nor deserlization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue))\n {\n sourceObjectWithDeserializedProperties[memberMetadata.key] = revivedValue;\n }\n else if (memberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${memberNameForDebug}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === \"function\")\n {\n try\n {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject)\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n }\n else if (!(targetObject instanceof sourceObjectMetadata.classType))\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + `'initializer' returned '${nameof(targetObject.constructor)}'`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected,`\n + `and '${nameof(targetObject.constructor)}' is not a subtype of`\n + ` '${nameof(sourceObjectMetadata.classType)}'`,\n );\n }\n }\n catch (e)\n {\n this._errorHandler(e);\n return undefined;\n }\n }\n else\n {\n targetObject = this._instantiateType(expectedSelfType);\n }\n\n // Finally, assign deserialized properties to target object.\n Object.assign(targetObject, sourceObjectWithDeserializedProperties);\n\n // Call onDeserialized method (if any).\n if (sourceObjectMetadata.onDeserializedMethodName)\n {\n if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n this._errorHandler(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`\n ));\n }\n }\n\n return targetObject;\n }\n else\n {\n // Untyped deserialization into Object instance.\n let targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(sourceObject[sourceKey], {\n selfConstructor: sourceObject[sourceKey].constructor,\n knownTypes: sourceObjectTypeInfo.knownTypes,\n elementConstructor: sourceObjectTypeInfo.elementConstructor,\n keyConstructor: sourceObjectTypeInfo.keyConstructor\n }, sourceKey);\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (!isValueDefined(sourceObject))\n {\n return sourceObject;\n }\n else if (this._isDirectlyDeserializableNativeType(expectedSelfType))\n {\n if (sourceObject.constructor === expectedSelfType)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName));\n }\n }\n else if (expectedSelfType === Date)\n {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === \"string\" || (typeof sourceObject === \"number\" && sourceObject > 0))\n return new Date(sourceObject as any);\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array)\n {\n // Deserialize Float32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float32Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float64Array)\n {\n // Deserialize Float64Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float64Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float64Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8Array)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8ClampedArray)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8ClampedArray(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8ClampedArray\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint16Array)\n {\n // Deserialize Uint16Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint16Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint16Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint32Array)\n {\n // Deserialize Uint32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint32Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === ArrayBuffer)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToArrayBuffer(sourceObject);\n else\n this._throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === DataView)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToDataView(sourceObject);\n else\n this._throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Array)\n {\n if (sourceObject instanceof Array)\n return this.convertAsArray(sourceObject, typeInfo, memberName);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (sourceObject instanceof Array)\n return this.convertAsSet(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (sourceObject instanceof Array)\n return this.convertAsMap(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n public convertAsArray(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\"): any[]\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n return sourceObject.map(element =>\n {\n // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try\n {\n return this.convertSingleValue(element, elementTypeInfo);\n }\n catch (e)\n {\n this._errorHandler(e);\n\n // Keep filling the array here with undefined to keep original ordering.\n // Note: this is just aesthetics, not returning anything produces the same result.\n return undefined;\n }\n });\n }\n\n public convertAsSet(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`));\n return new Set();\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n let resultSet = new Set();\n\n sourceObject.forEach((element, i) =>\n {\n try\n {\n resultSet.add(this.convertSingleValue(element, elementTypeInfo, memberName + `[${i}]`));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n\n if (!typeInfo.keyConstructor)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.keyConstructor,\n knownTypes: typeInfo.knownTypes\n };\n\n let valueTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n let resultMap = new Map();\n\n sourceObject.forEach((element: any) =>\n {\n try\n {\n let key = this.convertSingleValue(element.key, keyTypeInfo);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(key, this.convertSingleValue(\n element.value, valueTypeInfo, `${memberName}[${key}]`,\n ));\n }\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultMap;\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string = \"object\",\n ) {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n }\n\n private _makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName = \"object\")\n {\n let expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n let actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n }\n\n private _instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n private _mergeKnownTypes(...knownTypeMaps: Array>)\n {\n let result = new Map();\n\n knownTypeMaps.forEach(knownTypes =>\n {\n knownTypes.forEach((ctor, name) =>\n {\n if (this._nameResolver)\n {\n result.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n private _createKnownTypesMap(knowTypes: Set)\n {\n const map = new Map();\n\n knowTypes.forEach(ctor =>\n {\n if (this._nameResolver)\n {\n map.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name\n ? knownTypeMeta.name\n : ctor.name;\n map.set(name, ctor);\n }\n });\n\n return map;\n }\n\n private _isDirectlyDeserializableNativeType(ctor: any)\n {\n return ~([Number, String, Boolean].indexOf(ctor));\n }\n\n public convertNativeObject(sourceObject: any)\n {\n return sourceObject;\n }\n\n private _stringToArrayBuffer(str: string)\n {\n let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = str.length; i < strLen; i++)\n {\n bufView[i] = str.charCodeAt(i);\n }\n\n return buf;\n }\n\n private _stringToDataView(str: string)\n {\n return new DataView(this._stringToArrayBuffer(str));\n }\n}\n","import { nameof, logError, isValueDefined, isInstanceOf, isTypeTypedArray, isDirectlySerializableNativeType } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfType: Function;\n elementTypes?: Function[];\n keyType?: Function;\n}\n\nexport interface IScopeArrayTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Array;\n elementTypes: Function[];\n}\n\nfunction isArrayTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeArrayTypeInfo {\n return typeInfo.selfType === Array;\n}\n\nexport interface IScopeSetTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Set;\n elementTypes: [Function];\n}\n\nfunction isSetTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeSetTypeInfo {\n return typeInfo.selfType === Set;\n}\n\nexport interface IScopeMapTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Map;\n elementTypes: [Function];\n keyType: Function;\n}\n\nfunction isMapTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeMapTypeInfo {\n return typeInfo.selfType === Map;\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class instances, and so on) to an untyped javascript object (also\n * called \"simple javascript object\"), and emits any necessary type hints in the process (for polymorphism).\n *\n * The converted object tree is what will be given to `JSON.stringify` to convert to string as the last step, the serialization is basically like:\n *\n * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string\n */\nexport class Serializer\n{\n private _typeHintEmitter: (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeHintEmitter = (targetObject, sourceObject, expectedSourceType, sourceTypeMetadata?: JsonObjectMetadata) =>\n {\n // By default, we put a \"__type\" property on the output object if the actual object is not the same as the expected one, so that deserialization\n // will know what to deserialize into (given the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n const name = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n // TODO: Perhaps this can work correctly without string-literal access?\n // tslint:disable-next-line:no-string-literal\n targetObject[\"__type\"] = name;\n }\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setTypeHintEmitter(typeEmitterCallback: (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void)\n {\n if (typeof typeEmitterCallback !== \"function\")\n {\n throw new TypeError(\"'typeEmitterCallback' is not a function.\");\n }\n\n this._typeHintEmitter = typeEmitterCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n /**\n * Convert a value of any supported serializable type.\n * The value type will be detected, and the correct serialization method will be called.\n */\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName: string = \"object\"): any\n {\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeInfo.selfType))\n {\n let expectedName = nameof(typeInfo.selfType);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(`Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`));\n return;\n }\n\n if (isDirectlySerializableNativeType(typeInfo.selfType))\n {\n return sourceObject;\n }\n else if (typeInfo.selfType === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeInfo.selfType === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (isArrayTypeInfo(typeInfo))\n {\n return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName);\n }\n else if (isTypeTypedArray(typeInfo.selfType))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple javascript object for serialization.\n */\n public convertAsObject(sourceObject: IndexedObject, typeInfo: IScopeTypeInfo, memberName?: string)\n {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType)\n {\n // The source object is not of the expected type, but it is a valid subtype.\n // This is OK, and we'll proceed to gather object metadata from the subtype instead.\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor);\n }\n else\n {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeInfo.selfType);\n }\n\n if (sourceTypeMetadata)\n {\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), and perform recursive conversion on\n // each of them. The converted objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n sourceTypeMetadata.dataMembers.forEach((memberMetadata) =>\n {\n if (memberMetadata.serializer) {\n targetObject[memberMetadata.name] =\n memberMetadata.serializer(sourceObject[memberMetadata.key]);\n } else if (memberMetadata.ctor) {\n targetObject[memberMetadata.name] = this.convertSingleValue(\n sourceObject[memberMetadata.key],\n {\n selfType: memberMetadata.ctor,\n elementTypes: memberMetadata.elementType,\n keyType: memberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${memberMetadata.key}`,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${memberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n });\n }\n else\n {\n // Untyped serialization, \"as-is\", we'll just pass the object on.\n // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata);\n\n return targetObject;\n }\n\n /**\n * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for\n * serialization.\n * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsArray(sourceObject: any[], expectedElementType: Function[], memberName = \"object\"): any[]\n {\n if (expectedElementType.length === 0 || !expectedElementType[0])\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n\n // Check the type of each element, individually.\n // If at least one array element type is incorrect, we return undefined, which results in no value emitted during serialization.\n // This is so that invalid element types don't unexpectedly alter the ordering of other, valid elements, and that no unexpected undefined values are in\n // the emitted array.\n sourceObject.forEach((element, i) =>\n {\n if (!isInstanceOf(element, expectedElementType[0]))\n {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]: expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], // For multidimensional arrays.\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(element => this.convertSingleValue(element, typeInfoForElements, memberName));\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @returns\n */\n public convertAsSet(sourceObject: Set, expectedElementType: Function, memberName = \"object\"): any[]\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n };\n\n // For debugging and error tracking.\n if (memberName) memberName += \"[]\";\n\n let resultArray: any[] = [];\n\n // Convert each element of the set, and put it into an output array.\n // The output array is the one serialized, as JSON.stringify does not support Set serialization. (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName);\n\n // Add to output if the source element was undefined, OR the converted element is defined. This will add intentionally undefined values to output,\n // but not values that became undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement))\n {\n resultArray.push(resultElement);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a map of typed objects (or primitive values) into an array of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsMap(sourceObject: Map, expectedKeyType: Function, expectedElementType: Function, memberName = \"object\"): Array<{ key: any, value: any }>\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n\n if (!expectedKeyType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n elementTypes: [expectedElementType]\n };\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfType: expectedKeyType\n };\n\n if (memberName) memberName += \"[]\";\n\n let resultArray: Array<{ key: any, value: any }> = [];\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) =>\n {\n let resultKeyValuePairObj = {\n key: this.convertSingleValue(key, keyTypeInfo, memberName),\n value: this.convertSingleValue(value, elementTypeInfo, memberName)\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n if (isValueDefined(resultKeyValuePairObj.key) && isValueDefined(resultKeyValuePairObj.value))\n {\n resultArray.push(resultKeyValuePairObj);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a typed javascript array to a simple untyped javascript array.\n * This is needed because typed arrays are otherwise serialized as objects, so we'll end up with something like \"{ 0: 0, 1: 1, ... }\".\n *\n * @param sourceObject\n * @returns\n */\n public convertAsTypedArray(sourceObject: ArrayBufferView)\n {\n return Array.from(sourceObject as any);\n }\n\n /**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\n public convertAsArrayBuffer(buffer: ArrayBuffer)\n {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(\"\");\n }\n\n /**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n}\n","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IJsonObjectOptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints,\n * or the name of a static method used for determining known types.\n */\n knownTypes?: Function[] | string;\n\n /**\n * The name of a static or instance method to call when deserialization\n * of the object is completed.\n */\n onDeserialized?: string;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer: (sourceObject: T, rawSourceObject: T) => T;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer?: (sourceObject: T, rawSourceObject: T) => T;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: ParameterlessConstructor): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Constructor\n): ((target: Constructor) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n options = {};\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Function\n ): void {\n let objectMetadata: JsonObjectMetadata;\n\n // Create or obtain JsonObjectMetadata object.\n if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n objectMetadata = new JsonObjectMetadata(target);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = target.prototype[METADATA_FIELD_KEY];\n if (parentMetadata)\n {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) =>\n objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n }\n\n Object.defineProperty(target.prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // Target already has JsonObjectMetadata associated with it.\n objectMetadata = target.prototype[METADATA_FIELD_KEY];\n objectMetadata.classType = target;\n }\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name)\n {\n objectMetadata.name = options.name;\n }\n\n // Obtain known-types.\n if (typeof options.knownTypes === \"string\")\n {\n objectMetadata.knownTypeMethodName = options.knownTypes;\n }\n else if (options.knownTypes instanceof Array)\n {\n options.knownTypes\n .filter(knownType => !!knownType)\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property is part of the object when serializing, with additional options.\n * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared.\n * @param options Additional options.\n */\nexport function jsonMember(options: IJsonMemberOptions): PropertyDecorator;\n\n/**\n * Specifies that a property is part of the object when serializing.\n * This call signature requires ReflectDecorators and that the property type is always explicitly declared.\n */\nexport function jsonMember(target: Object, propertyKey: string | symbol): void;\n\nexport function jsonMember(optionsOrTarget?: IJsonMemberOptions | Object, propKey?: string | symbol): PropertyDecorator | void\n{\n if (optionsOrTarget instanceof Object && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const target = optionsOrTarget;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and propKey.\n // Obtain property constructor through ReflectDecorators.\n if (isReflectMetadataSupported)\n {\n const reflectPropCtor = Reflect.getMetadata(\"design:type\", target, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime.`);\n return;\n }\n\n if (isSpecialPropertyType(decoratorName, reflectPropCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: reflectPropCtor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n }\n else\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n else\n {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) =>\n {\n let options: IJsonMemberOptions = optionsOrTarget || {};\n let propCtor: Function|undefined;\n let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty(\"constructor\"))\n {\n if (!isValueDefined(options.constructor))\n {\n logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`);\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not.\n if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n\n propCtor = options.constructor;\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n propCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!propCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n }\n else if (!options.deserializer)\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (isSpecialPropertyType(decoratorName, propCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, _propKey, {\n ctor: propCtor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: _propKey.toString(),\n name: options.name || _propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n }\n}\n\nfunction isSpecialPropertyType(decoratorName: string, propCtor?: Function)\n{\n if (propCtor === Array)\n {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Set)\n {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Map)\n {\n logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n return false;\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property, of type array, is part of an object when serializing.\n * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(elementConstructor: Function, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`);\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1)\n {\n logError(`${decoratorName}: 'dimensions' option must be at least 1.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Array)\n {\n logError(`${decoratorName}: property is not an Array.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nfunction createArrayElementType(elementCtor: Function, dimensions: number) {\n const elementTypes = new Array(dimensions).fill(Array, 0, -1);\n elementTypes[dimensions-1] = elementCtor;\n return elementTypes;\n}\n","import { nameof } from \"./helpers\";\nimport { IJsonMemberOptions } from \"./json-member\";\nimport { JsonMemberMetadata, JsonObjectMetadata, injectMetadataInformation } from \"./metadata\";\nimport * as Helpers from \"./helpers\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Set.\n * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n var decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n Helpers.logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not.\n if (Helpers.isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n Helpers.logError(`${decoratorName}: property is not a Set.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Map.\n * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map').\n * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map').\n * @param options Additional options.\n */\nexport function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options: IJsonMapMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof keyConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (typeof valueConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map values at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Map)\n {\n logError(`${decoratorName}: property is not a Map.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, logWarning, parseToJSObject } from './typedjson/helpers';\nimport { Constructor } from \"./typedjson/types\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { Deserializer } from \"./typedjson/deserializer\";\nimport { Serializer } from \"./typedjson/serializer\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\n\nexport interface ITypedJSONSettings\n{\n /**\n * Sets the handler callback to invoke on errors during serializing and deserializing.\n * Re-throwing errors in this function will halt serialization/deserialization.\n * The default behavior is to log errors to the console.\n */\n errorHandler?: (e: Error) => void;\n\n /**\n * Sets a callback that determines the constructor of the correct sub-type of polymorphic\n * objects while deserializing.\n * The default behavior is to read the type-name from the '__type' property of 'sourceObject',\n * and look it up in 'knownTypes'.\n * The constructor of the sub-type should be returned.\n */\n typeResolver?: (sourceObject: Object, knownTypes: Map) => Function;\n\n nameResolver?: (ctor: Function) => string;\n\n /**\n * Sets a callback that writes type-hints to serialized objects.\n * The default behavior is to write the type-name to the '__type' property, if a derived type\n * is present in place of a base type.\n */\n typeHintEmitter?:\n (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void;\n\n /**\n * Sets the amount of indentation to use in produced JSON strings.\n * Default value is 0, or no indentation.\n */\n indent?: number;\n\n replacer?: (key: string, value: any) => any;\n\n knownTypes?: Array>;\n}\n\nexport class TypedJSON\n{\n //#region Static\n public static parse(\n object: any, rootType: Constructor, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: number\n ): any[] {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n public static parseAsSet(\n object: any, elementType: Constructor, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Constructor,\n valueType: Constructor,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): any[] {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n public static toPlainSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n public static stringifyAsSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n public static setGlobalConfig(config: ITypedJSONSettings)\n {\n if (this._globalConfig)\n {\n Object.assign(this._globalConfig, config);\n }\n else\n {\n this._globalConfig = config;\n }\n }\n\n //#endregion\n\n private serializer: Serializer = new Serializer();\n private deserializer: Deserializer = new Deserializer();\n private globalKnownTypes: Array> = [];\n private indent: number = 0;\n private rootConstructor: Constructor;\n private errorHandler: (e: Error) => void;\n private nameResolver: (ctor: Function) => string;\n private replacer?: (key: string, value: any) => any;\n\n /**\n * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object\n * instances of the specified root class type.\n * @param rootType The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings)\n {\n let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation))\n {\n throw new TypeError(\"The TypedJSON root data type must have the @jsonObject decorator used.\");\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings)\n {\n this.config(settings);\n }\n else if (TypedJSON._globalConfig)\n {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n public config(settings: ITypedJSONSettings)\n {\n if (TypedJSON._globalConfig)\n {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes)\n {\n // Merge known-types (also de-duplicate them, so Array -> Set -> Array).\n settings.knownTypes = Array.from(new Set(\n settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes),\n ));\n }\n }\n\n if (settings.errorHandler)\n {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) this.replacer = settings.replacer;\n if (settings.typeResolver) this.deserializer.setTypeResolver(settings.typeResolver);\n if (settings.typeHintEmitter) this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n if (settings.indent) this.indent = settings.indent;\n\n if (settings.nameResolver)\n {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes)\n {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) =>\n {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === \"undefined\" || knownType === null)\n {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`);\n }\n });\n\n this.globalKnownTypes = settings.knownTypes;\n }\n }\n\n /**\n * Converts a JSON string to the root class type.\n * @param object The JSON to parse and convert.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns Deserialized T or undefined if there were errors.\n */\n public parse(object: any): T|undefined\n {\n const json = parseToJSObject(object, this.rootConstructor);\n\n let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T|undefined;\n let knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata)\n {\n rootMetadata.knownTypes.forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try\n {\n result = this.deserializer.convertSingleValue(json, {\n selfConstructor: this.rootConstructor,\n knownTypes: knownTypes,\n }) as T;\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n public parseAsArray(object: any, dimensions?: 1): T[];\n public parseAsArray(object: any, dimensions: 2): T[][];\n public parseAsArray(object: any, dimensions: 3): T[][][];\n public parseAsArray(object: any, dimensions: 4): T[][][][];\n public parseAsArray(object: any, dimensions: 5): T[][][][][];\n public parseAsArray(object: any, dimensions: number): any[];\n public parseAsArray(object: any, dimensions: number = 1): any[]\n {\n const json = parseToJSObject(object, Array);\n if (json instanceof Array)\n {\n return this.deserializer.convertAsArray(json, {\n selfConstructor: Array,\n elementConstructor: new Array(dimensions - 1)\n .fill(Array)\n .concat(this.rootConstructor),\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define an Array`\n + `, but got ${typeof json}.`));\n }\n\n return [];\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsSet(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes)\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Set();\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsMap(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n keyConstructor: keyConstructor\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Map();\n }\n\n /**\n * Converts an instance of the specified class type to a plain JSON object.\n * @param object The instance to convert to a JSON string.\n * @returns Serialized object or undefined if an error has occured.\n */\n public toPlainJson(object: T): JsonTypes\n {\n try\n {\n return this.serializer.convertSingleValue(object, {\n selfType: this.rootConstructor\n });\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainArray(object: T[], dimensions?: 1): Object[];\n public toPlainArray(object: T[][], dimensions: 2): Object[][];\n public toPlainArray(object: T[][][], dimensions: 3): Object[][][];\n public toPlainArray(object: T[][][][], dimensions: 4): Object[][][][];\n public toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][];\n public toPlainArray(object: any[], dimensions: 1|2|3|4|5 = 1): Object[]|undefined\n {\n try\n {\n const elementConstructorArray =\n new Array(dimensions - 1).fill(Array).concat(this.rootConstructor);\n return this.serializer.convertAsArray(object, elementConstructorArray);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainSet(object: Set): Object[]|undefined\n {\n try\n {\n return this.serializer.convertAsSet(object, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): { key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n /**\n * Converts an instance of the specified class type to a JSON string.\n * @param object The instance to convert to a JSON string.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns String with the serialized object or an empty string if an error has occured, but\n * the errorHandler did not throw.\n */\n public stringify(object: T): string\n {\n const result = this.toPlainJson(object);\n if (result === undefined) {\n return '';\n }\n return JSON.stringify(result, this.replacer, this.indent);\n }\n\n public stringifyAsArray(object: T[], dimensions?: 1): string;\n public stringifyAsArray(object: T[][], dimensions: 2): string;\n public stringifyAsArray(object: T[][][], dimensions: 3): string;\n public stringifyAsArray(object: T[][][][], dimensions: 4): string;\n public stringifyAsArray(object: T[][][][][], dimensions: 5): string;\n public stringifyAsArray(object: any[], dimensions: any): string\n {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n public stringifyAsSet(object: Set): string\n {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n public stringifyAsMap(object: Map, keyConstructor: Constructor): string\n {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>)\n {\n let map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n\nexport { jsonObject } from \"./typedjson/json-object\";\nexport { jsonMember } from \"./typedjson/json-member\";\nexport { jsonArrayMember } from \"./typedjson/json-array-member\";\nexport { jsonSetMember } from \"./typedjson/json-set-member\";\nexport { jsonMapMember } from \"./typedjson/json-map-member\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson.min.js b/js/typedjson.min.js index 767cf4f..3748500 100644 --- a/js/typedjson.min.js +++ b/js/typedjson.min.js @@ -1,3 +1,3 @@ // [typedjson] Version: 1.2.1 - 2018-12-09 - !function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("typedjson",[],r):"object"==typeof exports?exports.typedjson=r():e.typedjson=r()}("undefined"!=typeof self?self:this,function(){return function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){"use strict";t.r(r);var n="__typedJsonJsonObjectMetadataInformation__";function o(e){return!!~[Date,Number,String,Boolean].indexOf(e)}function i(e){return!!~[Float32Array,Float64Array,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array].indexOf(e)}function s(e,r){return e===r||e.prototype instanceof r}function a(e){for(var r=[],t=1;t0)return new Date(e);this._throwTypeMismatchError("Date","an ISO-8601 string",o,t)}else if(n===Float32Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Float32Array(e);this._throwTypeMismatchError("Float32Array","a numeric source array",o,t)}else if(n===Float64Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Float64Array(e);this._throwTypeMismatchError("Float64Array","a numeric source array",o,t)}else if(n===Uint8Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint8Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint8Array","a numeric source array",o,t)}else if(n===Uint8ClampedArray){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint8ClampedArray(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint8ClampedArray","a numeric source array",o,t)}else if(n===Uint16Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint16Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint16Array","a numeric source array",o,t)}else if(n===Uint32Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint32Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint32Array","a numeric source array",o,t)}else if(n===ArrayBuffer){if("string"==typeof e)return this._stringToArrayBuffer(e);this._throwTypeMismatchError("ArrayBuffer","a string source",o,t)}else if(n===DataView){if("string"==typeof e)return this._stringToDataView(e);this._throwTypeMismatchError("DataView","a string source",o,t)}else{if(n===Array){if(e instanceof Array)return this.convertAsArray(e,r,t);throw new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))}if(n===Set){if(e instanceof Array)return this.convertAsSet(e,r,t);this._throwTypeMismatchError("Set","Array",o,t)}else if(n===Map){if(e instanceof Array)return this.convertAsMap(e,r,t);this._throwTypeMismatchError("Map","a source array of key-value-pair objects",o,t)}else if(e&&"object"==typeof e)return this.convertAsObject(e,r,t)}},e.prototype.convertAsArray=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!(e instanceof Array))return this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),[];if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Array: missing constructor reference of Array elements.")),[];var o={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes};return e.map(function(e){try{return n.convertSingleValue(e,o)}catch(e){return void n._errorHandler(e)}})},e.prototype.convertAsSet=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!(e instanceof Array))return this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),new Set;if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Set: missing constructor reference of Set elements.")),new Set;var o={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes},i=new Set;return e.forEach(function(e,r){try{i.add(n.convertSingleValue(e,o,t+"["+r+"]"))}catch(e){n._errorHandler(e)}}),i},e.prototype.convertAsMap=function(e,r,t){var n=this;if(void 0===t&&(t="object"),e instanceof Array||this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),!r.keyConstructor)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Map: missing key constructor.")),new Map;if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Map: missing value constructor.")),new Map;var o={selfConstructor:r.keyConstructor,knownTypes:r.knownTypes},i={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes},s=new Map;return e.forEach(function(e){try{var r=n.convertSingleValue(e.key,o);u(r)&&s.set(r,n.convertSingleValue(e.value,i,t+"["+r+"]"))}catch(e){n._errorHandler(e)}}),s},e.prototype._throwTypeMismatchError=function(e,r,t,n){throw void 0===n&&(n="object"),new TypeError("Could not deserialize "+n+" as "+e+": expected "+r+", got "+t+".")},e.prototype._makeTypeErrorMessage=function(e,r,t){return void 0===t&&(t="object"),"Could not deserialize "+t+": expected '"+("function"==typeof e?y(e):e)+"', got '"+("function"==typeof r?y(r):r)+"'."},e.prototype._instantiateType=function(e){return new e},e.prototype._mergeKnownTypes=function(){for(var e=this,r=[],t=0;t1?r.slice(1):[]};return t&&(t+="[]"),e.map(function(e){return n.convertSingleValue(e,o,t)})},e.prototype.convertAsSet=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!r)throw new TypeError("Could not serialize "+t+" as Set: missing element type definition.");var o={selfType:r};t&&(t+="[]");var i=[];return e.forEach(function(e){var r=n.convertSingleValue(e,o,t);u(e)&&!u(r)||i.push(r)}),i},e.prototype.convertAsMap=function(e,r,t,n){var o=this;if(void 0===n&&(n="object"),!t)throw new TypeError("Could not serialize "+n+" as Map: missing value type definition.");if(!r)throw new TypeError("Could not serialize "+n+" as Map: missing key type definition.");var i={selfType:t,elementTypes:[t]},s={selfType:r};n&&(n+="[]");var a=[];return e.forEach(function(e,r){var t={key:o.convertSingleValue(r,s,n),value:o.convertSingleValue(e,i,n)};u(t.key)&&u(t.value)&&a.push(t)}),a},e.prototype.convertAsTypedArray=function(e){return Array.from(e)},e.prototype.convertAsArrayBuffer=function(e){return Array.from(new Uint16Array(e)).map(function(e){return String.fromCharCode(e)}).join("")},e.prototype.convertAsDataView=function(e){return this.convertAsArrayBuffer(e.buffer)},e}();function w(e){var r;function t(e){var t;if(e.prototype.hasOwnProperty(n))(t=e.prototype[n]).classType=e;else{t=new f(e);var o=e.prototype[n];o&&(o.dataMembers.forEach(function(e,r){return t.dataMembers.set(r,e)}),o.knownTypes.forEach(function(e){return t.knownTypes.add(e)})),Object.defineProperty(e.prototype,n,{enumerable:!1,configurable:!1,writable:!1,value:t})}t.isExplicitlyMarked=!0,t.onDeserializedMethodName=r.onDeserialized,t.initializerCallback=r.initializer,r.name&&(t.name=r.name),"string"==typeof r.knownTypes?t.knownTypeMethodName=r.knownTypes:r.knownTypes instanceof Array&&r.knownTypes.filter(function(e){return!!e}).forEach(function(e){return t.knownTypes.add(e)})}if(r="function"==typeof e?{}:e||{},"function"!=typeof e)return t;t(e)}function T(e,r){if(!(e instanceof Object)||"string"!=typeof r&&"symbol"!=typeof r)return function(r,t){var n,o=e||{},i="@jsonMember on "+y(r.constructor)+"."+String(t);if(o.hasOwnProperty("constructor")){if(!u(o.constructor))return void a(i+": cannot resolve specified property constructor at runtime.");p&&!s(o.constructor,Reflect.getMetadata("design:type",r,t))&&c(i+": detected property type does not match 'constructor' option."),n=o.constructor}else if(p){if(!(n=Reflect.getMetadata("design:type",r,t)))return void a(i+": cannot resolve detected property constructor at runtime.")}else if(!o.deserializer)return void a(i+": ReflectDecorators is required if no 'constructor' option is specified.");g(i,n)||d(r,t,{ctor:n,emitDefaultValue:o.emitDefaultValue||!1,isRequired:o.isRequired||!1,key:t.toString(),name:o.name||t.toString(),deserializer:o.deserializer,serializer:o.serializer})};var t=e,n="@jsonMember on "+y(t.constructor)+"."+String(r);if(p){var o=Reflect.getMetadata("design:type",t,r);o?g(n,o)||d(t,r,{ctor:o,key:r.toString(),name:r.toString()}):a(n+": could not resolve detected property constructor at runtime.")}else a(n+": ReflectDecorators is required if no 'constructor' option is specified.")}function g(e,r){return r===Array?(a(e+": property is an Array. Use the jsonArrayMember decorator to serialize this property."),!0):r===Set?(a(e+": property is a Set. Use the jsonSetMember decorator to serialize this property."),!0):r===Map&&(a(e+": property is a Map. Use the jsonMapMember decorator to serialize this property."),!0)}function A(e,r){return void 0===r&&(r={}),function(t,n){var o="@jsonArrayMember on "+y(t.constructor)+"."+String(n);if("function"==typeof e){var i=void 0===r.dimensions?1:r.dimensions;!isNaN(i)&&i<1?a(o+": 'dimensions' option must be at least 1."):p&&Reflect.getMetadata("design:type",t,n)!==Array?a(o+": property is not an Array."):d(t,n,{ctor:Array,elementType:function(e,r){var t=new Array(r).fill(Array,0,-1);return t[r-1]=e,t}(e,i),emitDefaultValue:r.emitDefaultValue||!1,isRequired:r.isRequired||!1,key:n.toString(),name:r.name||n.toString(),deserializer:r.deserializer,serializer:r.serializer})}else a(o+": could not resolve constructor of array elements at runtime.")}}function b(e,r){return void 0===r&&(r={}),function(t,n){var o="@jsonSetMember on "+y(t.constructor)+"."+String(n);"function"==typeof e?p&&Reflect.getMetadata("design:type",t,n)!==Set?a(o+": property is not a Set."):d(t,n,{ctor:Set,elementType:[e],emitDefaultValue:r.emitDefaultValue||!1,isRequired:r.isRequired||!1,key:n.toString(),name:r.name||n.toString(),deserializer:r.deserializer,serializer:r.serializer}):a(o+": could not resolve constructor of set elements at runtime.")}}function M(e,r,t){return void 0===t&&(t={}),function(n,o){var i="@jsonMapMember on "+y(n.constructor)+"."+String(o);"function"==typeof e?"function"==typeof r?p&&Reflect.getMetadata("design:type",n,o)!==Map?a(i+": property is not a Map."):d(n,o,{ctor:Map,elementType:[r],keyType:e,emitDefaultValue:t.emitDefaultValue||!1,isRequired:t.isRequired||!1,key:o.toString(),name:t.name||o.toString(),deserializer:t.deserializer,serializer:t.serializer}):a(i+": could not resolve constructor of map values at runtime."):a(i+": could not resolve constructor of map keys at runtime.")}}t.d(r,"TypedJSON",function(){return k}),t.d(r,"jsonObject",function(){return w}),t.d(r,"jsonMember",function(){return T}),t.d(r,"jsonArrayMember",function(){return A}),t.d(r,"jsonSetMember",function(){return b}),t.d(r,"jsonMapMember",function(){return M});var C=Object.assign||function(e){for(var r,t=1,n=arguments.length;t=2&&'"'===e[0]&&'"'===e[e.length-1],o=/^\d+$/.test(e.trim());return t&&!n||!n&&!o&&r===Date}(e,r)?e:JSON.parse(e)}function a(e,r){return e===r||e.prototype instanceof r}function c(e){for(var r=[],t=1;t0)return new Date(e);this._throwTypeMismatchError("Date","an ISO-8601 string",o,t)}else if(n===Float32Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Float32Array(e);this._throwTypeMismatchError("Float32Array","a numeric source array",o,t)}else if(n===Float64Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Float64Array(e);this._throwTypeMismatchError("Float64Array","a numeric source array",o,t)}else if(n===Uint8Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint8Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint8Array","a numeric source array",o,t)}else if(n===Uint8ClampedArray){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint8ClampedArray(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint8ClampedArray","a numeric source array",o,t)}else if(n===Uint16Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint16Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint16Array","a numeric source array",o,t)}else if(n===Uint32Array){if(e instanceof Array&&e.every(function(e){return!isNaN(e)}))return new Uint32Array(e.map(function(e){return~~e}));this._throwTypeMismatchError("Uint32Array","a numeric source array",o,t)}else if(n===ArrayBuffer){if("string"==typeof e)return this._stringToArrayBuffer(e);this._throwTypeMismatchError("ArrayBuffer","a string source",o,t)}else if(n===DataView){if("string"==typeof e)return this._stringToDataView(e);this._throwTypeMismatchError("DataView","a string source",o,t)}else{if(n===Array){if(e instanceof Array)return this.convertAsArray(e,r,t);throw new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))}if(n===Set){if(e instanceof Array)return this.convertAsSet(e,r,t);this._throwTypeMismatchError("Set","Array",o,t)}else if(n===Map){if(e instanceof Array)return this.convertAsMap(e,r,t);this._throwTypeMismatchError("Map","a source array of key-value-pair objects",o,t)}else if(e&&"object"==typeof e)return this.convertAsObject(e,r,t)}},e.prototype.convertAsArray=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!(e instanceof Array))return this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),[];if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Array: missing constructor reference of Array elements.")),[];var o={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes};return e.map(function(e){try{return n.convertSingleValue(e,o)}catch(e){return void n._errorHandler(e)}})},e.prototype.convertAsSet=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!(e instanceof Array))return this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),new Set;if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Set: missing constructor reference of Set elements.")),new Set;var o={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes},i=new Set;return e.forEach(function(e,r){try{i.add(n.convertSingleValue(e,o,t+"["+r+"]"))}catch(e){n._errorHandler(e)}}),i},e.prototype.convertAsMap=function(e,r,t){var n=this;if(void 0===t&&(t="object"),e instanceof Array||this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array,e.constructor,t))),!r.keyConstructor)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Map: missing key constructor.")),new Map;if(!r.elementConstructor||!r.elementConstructor.length)return this._errorHandler(new TypeError("Could not deserialize "+t+" as Map: missing value constructor.")),new Map;var o={selfConstructor:r.keyConstructor,knownTypes:r.knownTypes},i={selfConstructor:r.elementConstructor[0],elementConstructor:r.elementConstructor.length>1?r.elementConstructor.slice(1):[],knownTypes:r.knownTypes},s=new Map;return e.forEach(function(e){try{var r=n.convertSingleValue(e.key,o);l(r)&&s.set(r,n.convertSingleValue(e.value,i,t+"["+r+"]"))}catch(e){n._errorHandler(e)}}),s},e.prototype._throwTypeMismatchError=function(e,r,t,n){throw void 0===n&&(n="object"),new TypeError("Could not deserialize "+n+" as "+e+": expected "+r+", got "+t+".")},e.prototype._makeTypeErrorMessage=function(e,r,t){return void 0===t&&(t="object"),"Could not deserialize "+t+": expected '"+("function"==typeof e?p(e):e)+"', got '"+("function"==typeof r?p(r):r)+"'."},e.prototype._instantiateType=function(e){return new e},e.prototype._mergeKnownTypes=function(){for(var e=this,r=[],t=0;t1?r.slice(1):[]};return t&&(t+="[]"),e.map(function(e){return n.convertSingleValue(e,o,t)})},e.prototype.convertAsSet=function(e,r,t){var n=this;if(void 0===t&&(t="object"),!r)throw new TypeError("Could not serialize "+t+" as Set: missing element type definition.");var o={selfType:r};t&&(t+="[]");var i=[];return e.forEach(function(e){var r=n.convertSingleValue(e,o,t);l(e)&&!l(r)||i.push(r)}),i},e.prototype.convertAsMap=function(e,r,t,n){var o=this;if(void 0===n&&(n="object"),!t)throw new TypeError("Could not serialize "+n+" as Map: missing value type definition.");if(!r)throw new TypeError("Could not serialize "+n+" as Map: missing key type definition.");var i={selfType:t,elementTypes:[t]},s={selfType:r};n&&(n+="[]");var a=[];return e.forEach(function(e,r){var t={key:o.convertSingleValue(r,s,n),value:o.convertSingleValue(e,i,n)};l(t.key)&&l(t.value)&&a.push(t)}),a},e.prototype.convertAsTypedArray=function(e){return Array.from(e)},e.prototype.convertAsArrayBuffer=function(e){return Array.from(new Uint16Array(e)).map(function(e){return String.fromCharCode(e)}).join("")},e.prototype.convertAsDataView=function(e){return this.convertAsArrayBuffer(e.buffer)},e}();function g(e){var r;function t(e){var t;if(e.prototype.hasOwnProperty(n))(t=e.prototype[n]).classType=e;else{t=new d(e);var o=e.prototype[n];o&&(o.dataMembers.forEach(function(e,r){return t.dataMembers.set(r,e)}),o.knownTypes.forEach(function(e){return t.knownTypes.add(e)})),Object.defineProperty(e.prototype,n,{enumerable:!1,configurable:!1,writable:!1,value:t})}t.isExplicitlyMarked=!0,t.onDeserializedMethodName=r.onDeserialized,t.initializerCallback=r.initializer,r.name&&(t.name=r.name),"string"==typeof r.knownTypes?t.knownTypeMethodName=r.knownTypes:r.knownTypes instanceof Array&&r.knownTypes.filter(function(e){return!!e}).forEach(function(e){return t.knownTypes.add(e)})}if(r="function"==typeof e?{}:e||{},"function"!=typeof e)return t;t(e)}function T(e,r){if(!(e instanceof Object)||"string"!=typeof r&&"symbol"!=typeof r)return function(r,t){var n,o=e||{},i="@jsonMember on "+p(r.constructor)+"."+String(t);if(o.hasOwnProperty("constructor")){if(!l(o.constructor))return void c(i+": cannot resolve specified property constructor at runtime.");f&&!a(o.constructor,Reflect.getMetadata("design:type",r,t))&&u(i+": detected property type does not match 'constructor' option."),n=o.constructor}else if(f){if(!(n=Reflect.getMetadata("design:type",r,t)))return void c(i+": cannot resolve detected property constructor at runtime.")}else if(!o.deserializer)return void c(i+": ReflectDecorators is required if no 'constructor' option is specified.");A(i,n)||h(r,t,{ctor:n,emitDefaultValue:o.emitDefaultValue||!1,isRequired:o.isRequired||!1,key:t.toString(),name:o.name||t.toString(),deserializer:o.deserializer,serializer:o.serializer})};var t=e,n="@jsonMember on "+p(t.constructor)+"."+String(r);if(f){var o=Reflect.getMetadata("design:type",t,r);o?A(n,o)||h(t,r,{ctor:o,key:r.toString(),name:r.toString()}):c(n+": could not resolve detected property constructor at runtime.")}else c(n+": ReflectDecorators is required if no 'constructor' option is specified.")}function A(e,r){return r===Array?(c(e+": property is an Array. Use the jsonArrayMember decorator to serialize this property."),!0):r===Set?(c(e+": property is a Set. Use the jsonSetMember decorator to serialize this property."),!0):r===Map&&(c(e+": property is a Map. Use the jsonMapMember decorator to serialize this property."),!0)}function b(e,r){return void 0===r&&(r={}),function(t,n){var o="@jsonArrayMember on "+p(t.constructor)+"."+String(n);if("function"==typeof e){var i=void 0===r.dimensions?1:r.dimensions;!isNaN(i)&&i<1?c(o+": 'dimensions' option must be at least 1."):f&&Reflect.getMetadata("design:type",t,n)!==Array?c(o+": property is not an Array."):h(t,n,{ctor:Array,elementType:function(e,r){var t=new Array(r).fill(Array,0,-1);return t[r-1]=e,t}(e,i),emitDefaultValue:r.emitDefaultValue||!1,isRequired:r.isRequired||!1,key:n.toString(),name:r.name||n.toString(),deserializer:r.deserializer,serializer:r.serializer})}else c(o+": could not resolve constructor of array elements at runtime.")}}function M(e,r){return void 0===r&&(r={}),function(t,n){var o="@jsonSetMember on "+p(t.constructor)+"."+String(n);"function"==typeof e?f&&Reflect.getMetadata("design:type",t,n)!==Set?c(o+": property is not a Set."):h(t,n,{ctor:Set,elementType:[e],emitDefaultValue:r.emitDefaultValue||!1,isRequired:r.isRequired||!1,key:n.toString(),name:r.name||n.toString(),deserializer:r.deserializer,serializer:r.serializer}):c(o+": could not resolve constructor of set elements at runtime.")}}function C(e,r,t){return void 0===t&&(t={}),function(n,o){var i="@jsonMapMember on "+p(n.constructor)+"."+String(o);"function"==typeof e?"function"==typeof r?f&&Reflect.getMetadata("design:type",n,o)!==Map?c(i+": property is not a Map."):h(n,o,{ctor:Map,elementType:[r],keyType:e,emitDefaultValue:t.emitDefaultValue||!1,isRequired:t.isRequired||!1,key:o.toString(),name:t.name||o.toString(),deserializer:t.deserializer,serializer:t.serializer}):c(i+": could not resolve constructor of map values at runtime."):c(i+": could not resolve constructor of map keys at runtime.")}}t.d(r,"TypedJSON",function(){return E}),t.d(r,"jsonObject",function(){return g}),t.d(r,"jsonMember",function(){return T}),t.d(r,"jsonArrayMember",function(){return b}),t.d(r,"jsonSetMember",function(){return M}),t.d(r,"jsonMapMember",function(){return C});var k=Object.assign||function(e){for(var r,t=1,n=arguments.length;t(type: { new (): T }): T|undefined\n{\n switch (type as any)\n {\n case Number:\n return 0 as any;\n\n case String:\n return \"\" as any;\n\n case Boolean:\n return false as any;\n\n case Array:\n return [] as any;\n\n default:\n return undefined;\n }\n}\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param ctor The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean\n{\n return !!(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean\n{\n return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isPrimitiveValue(obj: any): boolean\n{\n switch (typeof obj)\n {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return true;\n default:\n return (obj instanceof String || obj instanceof Number || obj instanceof Boolean);\n }\n}\n\nexport function isObject(value: any): value is Object\n{\n return typeof value === \"object\";\n}\n\n/**\n * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B').\n * @param A The supposed derived type.\n * @param B The supposed base type.\n */\nexport function isSubtypeOf(A: Function, B: Function)\n{\n return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.error === \"function\")\n {\n console.error.apply(console, [message].concat(optionalParams));\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"ERROR: \" + message].concat(optionalParams));\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [message].concat(optionalParams));\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.warn === \"function\")\n {\n console.warn.apply(console, [message].concat(optionalParams));\n } else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"WARNING: \" + message].concat(optionalParams));\n }\n}\n\n/**\n * Checks if the value is considered defined (not undefined and not null).\n * @param value\n */\nexport function isValueDefined(value: T): value is Exclude\n{\n return !(typeof value === \"undefined\" || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean\n{\n if (typeof value === \"number\")\n {\n return (constructor === Number);\n }\n else if (typeof value === \"string\")\n {\n return (constructor === String);\n }\n else if (typeof value === \"boolean\")\n {\n return (constructor === Boolean);\n }\n else if (isObject(value))\n {\n return (value instanceof constructor);\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n (typeof Reflect === \"object\" && typeof Reflect.getMetadata === \"function\");\n\n/**\n * Gets the name of a function.\n * @param fn The function whose name to get.\n */\nexport function nameof(fn: Function & { name?: string })\n{\n if (typeof fn.name === \"string\")\n {\n return fn.name;\n }\n else\n {\n return \"undefined\";\n }\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\n\nexport interface JsonMemberMetadata\n{\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean;\n\n /** Member name as it appears in the serialized JSON. */\n name: string;\n\n /** Property or field key of the json member. */\n key: string;\n\n /** Constuctor (type) reference of the member. */\n ctor?: Function;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */\n elementType?: Function[];\n\n /** If the json member is a map, sets member options of array keys. */\n keyType?: Function;\n\n /** Custom deserializer to use. */\n deserializer?: (json: any) => any;\n\n /** Custom serializer to use. */\n serializer?: (value: any) => any;\n}\n\nexport class JsonObjectMetadata\n{\n //#region Static\n /**\n * Gets the name of a class as it appears in a serialized JSON string.\n * @param ctor The constructor of a class (with or without jsonObject).\n */\n public static getJsonObjectName(ctor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata ? nameof(metadata.classType) : nameof(ctor);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n public static getFromConstructor(ctor: Function): JsonObjectMetadata|undefined\n {\n const prototype = ctor.prototype;\n if (!prototype)\n {\n return;\n }\n\n let metadata: JsonObjectMetadata|undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // The class prototype contains own jsonObject metadata\n metadata = prototype[METADATA_FIELD_KEY];\n }\n\n // Ignore implicitly added jsonObject (through jsonMember)\n if (metadata && metadata.isExplicitlyMarked)\n {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor))\n {\n const primitiveMeta = new JsonObjectMetadata(ctor);\n primitiveMeta.isExplicitlyMarked = true;\n // we do not store the metadata here to not modify builtin prototype\n return primitiveMeta;\n }\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n public static getKnownTypeNameFromType(constructor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean\n {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n //#endregion\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\n public dataMembers: Map = new Map();\n\n public knownTypes: Set = new Set();\n\n public knownTypeMethodName?: string;\n\n /** Gets or sets the constructor function for the jsonObject. */\n public classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n public isExplicitlyMarked: boolean = false;\n\n /**\n * Indicates whether this type is handled without annotation. This is usually\n * used for the builtin types (except for Maps, Sets, and normal Arrays).\n */\n public isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n public name?: string;\n\n public onDeserializedMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(constructor.constructor)}.${String(propKey)}`; // For error messages.\n let objectMetadata: JsonObjectMetadata;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor function.\n // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators\n // ... and static members are not supported here, so abort.\n if (typeof constructor === \"function\")\n {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // @ts-ignore symbol indexing is not supported by ts\n if (typeof constructor[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.ctor && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown ctor.`);\n return;\n }\n\n // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype).\n // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well.\n if (!constructor.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // No *own* metadata, create new.\n objectMetadata = new JsonObjectMetadata(constructor.constructor);\n\n // Inherit @JsonMembers from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = constructor[METADATA_FIELD_KEY];\n if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY)\n {\n parentMetadata.dataMembers.forEach((_metadata, _propKey) => objectMetadata.dataMembers.set(_propKey, _metadata));\n }\n\n // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype).\n Object.defineProperty(constructor, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // JsonObjectMetadata already exists on 'constructor'.\n objectMetadata = constructor[METADATA_FIELD_KEY];\n }\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n objectMetadata.knownTypes.add(metadata.ctor);\n }\n\n if (metadata.keyType)\n objectMetadata.knownTypes.add(metadata.keyType);\n\n if (metadata.elementType)\n metadata.elementType.forEach(elemCtor => objectMetadata.knownTypes.add(elemCtor));\n\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\n/**\n * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree.\n * It is used after parsing a JSON-string.\n */\nexport class Deserializer\n{\n private _typeResolver: (sourceObject: Object, knownTypes: Map) => Function|undefined;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeResolver = (sourceObject: any, knownTypes: Map) =>\n {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: (sourceObject: Object, knownTypes: Map) => Function)\n {\n if (typeof typeResolverCallback !== \"function\") throw new TypeError(\"'typeResolverCallback' is not a function.\");\n\n this._typeResolver = typeResolverCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n public convertAsObject(\n sourceObject: IndexedObject,\n sourceObjectTypeInfo: IScopeTypeInfo,\n objectName = \"object\",\n ) {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n this._errorHandler(new TypeError(`Cannot deserialize ${objectName}: 'sourceObject' must be a defined object.`));\n return undefined;\n }\n\n let expectedSelfType = sourceObjectTypeInfo.selfConstructor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = sourceObjectTypeInfo.knownTypes;\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n\n // Check if a type-hint is available from the source object.\n let typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint)\n {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType))\n {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata)\n {\n // Also merge new known types from subtype.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked)\n {\n const sourceMetadata = sourceObjectMetadata;\n // Strong-typed deserialization available, get to it.\n // First deserialize properties into a temporary object.\n const sourceObjectWithDeserializedProperties = {} as IndexedObject;\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((memberMetadata, propKey) =>\n {\n const memberValue = sourceObject[propKey];\n const memberNameForDebug = `${nameof(sourceMetadata.classType)}.${propKey}`;\n\n let revivedValue;\n if (memberMetadata.deserializer) {\n revivedValue = memberMetadata.deserializer(memberValue);\n } else if (memberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n memberValue,\n {\n selfConstructor: memberMetadata.ctor,\n elementConstructor: memberMetadata.elementType,\n keyConstructor: memberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n memberNameForDebug,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${memberNameForDebug} thers is`\n + ` no constructor nor deserlization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue))\n {\n sourceObjectWithDeserializedProperties[memberMetadata.key] = revivedValue;\n }\n else if (memberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${memberNameForDebug}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === \"function\")\n {\n try\n {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject)\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n }\n else if (!(targetObject instanceof sourceObjectMetadata.classType))\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + `'initializer' returned '${nameof(targetObject.constructor)}'`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected,`\n + `and '${nameof(targetObject.constructor)}' is not a subtype of`\n + ` '${nameof(sourceObjectMetadata.classType)}'`,\n );\n }\n }\n catch (e)\n {\n this._errorHandler(e);\n return undefined;\n }\n }\n else\n {\n targetObject = this._instantiateType(expectedSelfType);\n }\n\n // Finally, assign deserialized properties to target object.\n Object.assign(targetObject, sourceObjectWithDeserializedProperties);\n\n // Call onDeserialized method (if any).\n if (sourceObjectMetadata.onDeserializedMethodName)\n {\n if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n this._errorHandler(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`\n ));\n }\n }\n\n return targetObject;\n }\n else\n {\n // Untyped deserialization into Object instance.\n let targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(sourceObject[sourceKey], {\n selfConstructor: sourceObject[sourceKey].constructor,\n knownTypes: sourceObjectTypeInfo.knownTypes,\n elementConstructor: sourceObjectTypeInfo.elementConstructor,\n keyConstructor: sourceObjectTypeInfo.keyConstructor\n }, sourceKey);\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (!isValueDefined(sourceObject))\n {\n return sourceObject;\n }\n else if (this._isDirectlyDeserializableNativeType(expectedSelfType))\n {\n if (sourceObject.constructor === expectedSelfType)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName));\n }\n }\n else if (expectedSelfType === Date)\n {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === \"string\" || (typeof sourceObject === \"number\" && sourceObject > 0))\n return new Date(sourceObject as any);\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array)\n {\n // Deserialize Float32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float32Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float64Array)\n {\n // Deserialize Float64Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float64Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float64Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8Array)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8ClampedArray)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8ClampedArray(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8ClampedArray\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint16Array)\n {\n // Deserialize Uint16Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint16Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint16Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint32Array)\n {\n // Deserialize Uint32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint32Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === ArrayBuffer)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToArrayBuffer(sourceObject);\n else\n this._throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === DataView)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToDataView(sourceObject);\n else\n this._throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Array)\n {\n if (sourceObject instanceof Array)\n return this.convertAsArray(sourceObject, typeInfo, memberName);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (sourceObject instanceof Array)\n return this.convertAsSet(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (sourceObject instanceof Array)\n return this.convertAsMap(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n public convertAsArray(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\"): any[]\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n return sourceObject.map(element =>\n {\n // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try\n {\n return this.convertSingleValue(element, elementTypeInfo);\n }\n catch (e)\n {\n this._errorHandler(e);\n\n // Keep filling the array here with undefined to keep original ordering.\n // Note: this is just aesthetics, not returning anything produces the same result.\n return undefined;\n }\n });\n }\n\n public convertAsSet(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`));\n return new Set();\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n let resultSet = new Set();\n\n sourceObject.forEach((element, i) =>\n {\n try\n {\n resultSet.add(this.convertSingleValue(element, elementTypeInfo, memberName + `[${i}]`));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n\n if (!typeInfo.keyConstructor)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.keyConstructor,\n knownTypes: typeInfo.knownTypes\n };\n\n let valueTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n let resultMap = new Map();\n\n sourceObject.forEach((element: any) =>\n {\n try\n {\n let key = this.convertSingleValue(element.key, keyTypeInfo);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(key, this.convertSingleValue(\n element.value, valueTypeInfo, `${memberName}[${key}]`,\n ));\n }\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultMap;\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string = \"object\",\n ) {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n }\n\n private _makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName = \"object\")\n {\n let expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n let actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n }\n\n private _instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n private _mergeKnownTypes(...knownTypeMaps: Array>)\n {\n let result = new Map();\n\n knownTypeMaps.forEach(knownTypes =>\n {\n knownTypes.forEach((ctor, name) =>\n {\n if (this._nameResolver)\n {\n result.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n private _createKnownTypesMap(knowTypes: Set)\n {\n const map = new Map();\n\n knowTypes.forEach(ctor =>\n {\n if (this._nameResolver)\n {\n map.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name\n ? knownTypeMeta.name\n : ctor.name;\n map.set(name, ctor);\n }\n });\n\n return map;\n }\n\n private _isDirectlyDeserializableNativeType(ctor: any)\n {\n return ~([Number, String, Boolean].indexOf(ctor));\n }\n\n public convertNativeObject(sourceObject: any)\n {\n return sourceObject;\n }\n\n private _stringToArrayBuffer(str: string)\n {\n let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = str.length; i < strLen; i++)\n {\n bufView[i] = str.charCodeAt(i);\n }\n\n return buf;\n }\n\n private _stringToDataView(str: string)\n {\n return new DataView(this._stringToArrayBuffer(str));\n }\n}\n","import { nameof, logError, isValueDefined, isInstanceOf, isTypeTypedArray, isDirectlySerializableNativeType } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfType: Function;\n elementTypes?: Function[];\n keyType?: Function;\n}\n\nexport interface IScopeArrayTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Array;\n elementTypes: Function[];\n}\n\nfunction isArrayTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeArrayTypeInfo {\n return typeInfo.selfType === Array;\n}\n\nexport interface IScopeSetTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Set;\n elementTypes: [Function];\n}\n\nfunction isSetTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeSetTypeInfo {\n return typeInfo.selfType === Set;\n}\n\nexport interface IScopeMapTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Map;\n elementTypes: [Function];\n keyType: Function;\n}\n\nfunction isMapTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeMapTypeInfo {\n return typeInfo.selfType === Map;\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class instances, and so on) to an untyped javascript object (also\n * called \"simple javascript object\"), and emits any necessary type hints in the process (for polymorphism).\n *\n * The converted object tree is what will be given to `JSON.stringify` to convert to string as the last step, the serialization is basically like:\n *\n * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string\n */\nexport class Serializer\n{\n private _typeHintEmitter: (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeHintEmitter = (targetObject, sourceObject, expectedSourceType, sourceTypeMetadata?: JsonObjectMetadata) =>\n {\n // By default, we put a \"__type\" property on the output object if the actual object is not the same as the expected one, so that deserialization\n // will know what to deserialize into (given the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n const name = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n // TODO: Perhaps this can work correctly without string-literal access?\n // tslint:disable-next-line:no-string-literal\n targetObject[\"__type\"] = name;\n }\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setTypeHintEmitter(typeEmitterCallback: (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void)\n {\n if (typeof typeEmitterCallback !== \"function\")\n {\n throw new TypeError(\"'typeEmitterCallback' is not a function.\");\n }\n\n this._typeHintEmitter = typeEmitterCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n /**\n * Convert a value of any supported serializable type.\n * The value type will be detected, and the correct serialization method will be called.\n */\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName: string = \"object\"): any\n {\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeInfo.selfType))\n {\n let expectedName = nameof(typeInfo.selfType);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(`Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`));\n return;\n }\n\n if (isDirectlySerializableNativeType(typeInfo.selfType))\n {\n return sourceObject;\n }\n else if (typeInfo.selfType === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeInfo.selfType === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (isArrayTypeInfo(typeInfo))\n {\n return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName);\n }\n else if (isTypeTypedArray(typeInfo.selfType))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple javascript object for serialization.\n */\n public convertAsObject(sourceObject: IndexedObject, typeInfo: IScopeTypeInfo, memberName?: string)\n {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType)\n {\n // The source object is not of the expected type, but it is a valid subtype.\n // This is OK, and we'll proceed to gather object metadata from the subtype instead.\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor);\n }\n else\n {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeInfo.selfType);\n }\n\n if (sourceTypeMetadata)\n {\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), and perform recursive conversion on\n // each of them. The converted objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n sourceTypeMetadata.dataMembers.forEach((memberMetadata) =>\n {\n if (memberMetadata.serializer) {\n targetObject[memberMetadata.name] =\n memberMetadata.serializer(sourceObject[memberMetadata.key]);\n } else if (memberMetadata.ctor) {\n targetObject[memberMetadata.name] = this.convertSingleValue(\n sourceObject[memberMetadata.key],\n {\n selfType: memberMetadata.ctor,\n elementTypes: memberMetadata.elementType,\n keyType: memberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${memberMetadata.key}`,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${memberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n });\n }\n else\n {\n // Untyped serialization, \"as-is\", we'll just pass the object on.\n // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata);\n\n return targetObject;\n }\n\n /**\n * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for\n * serialization.\n * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsArray(sourceObject: any[], expectedElementType: Function[], memberName = \"object\"): any[]\n {\n if (expectedElementType.length === 0 || !expectedElementType[0])\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n\n // Check the type of each element, individually.\n // If at least one array element type is incorrect, we return undefined, which results in no value emitted during serialization.\n // This is so that invalid element types don't unexpectedly alter the ordering of other, valid elements, and that no unexpected undefined values are in\n // the emitted array.\n sourceObject.forEach((element, i) =>\n {\n if (!isInstanceOf(element, expectedElementType[0]))\n {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]: expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], // For multidimensional arrays.\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(element => this.convertSingleValue(element, typeInfoForElements, memberName));\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @returns\n */\n public convertAsSet(sourceObject: Set, expectedElementType: Function, memberName = \"object\"): any[]\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n };\n\n // For debugging and error tracking.\n if (memberName) memberName += \"[]\";\n\n let resultArray: any[] = [];\n\n // Convert each element of the set, and put it into an output array.\n // The output array is the one serialized, as JSON.stringify does not support Set serialization. (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName);\n\n // Add to output if the source element was undefined, OR the converted element is defined. This will add intentionally undefined values to output,\n // but not values that became undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement))\n {\n resultArray.push(resultElement);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a map of typed objects (or primitive values) into an array of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsMap(sourceObject: Map, expectedKeyType: Function, expectedElementType: Function, memberName = \"object\"): Array<{ key: any, value: any }>\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n\n if (!expectedKeyType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n elementTypes: [expectedElementType]\n };\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfType: expectedKeyType\n };\n\n if (memberName) memberName += \"[]\";\n\n let resultArray: Array<{ key: any, value: any }> = [];\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) =>\n {\n let resultKeyValuePairObj = {\n key: this.convertSingleValue(key, keyTypeInfo, memberName),\n value: this.convertSingleValue(value, elementTypeInfo, memberName)\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n if (isValueDefined(resultKeyValuePairObj.key) && isValueDefined(resultKeyValuePairObj.value))\n {\n resultArray.push(resultKeyValuePairObj);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a typed javascript array to a simple untyped javascript array.\n * This is needed because typed arrays are otherwise serialized as objects, so we'll end up with something like \"{ 0: 0, 1: 1, ... }\".\n *\n * @param sourceObject\n * @returns\n */\n public convertAsTypedArray(sourceObject: ArrayBufferView)\n {\n return Array.from(sourceObject as any);\n }\n\n /**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\n public convertAsArrayBuffer(buffer: ArrayBuffer)\n {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(\"\");\n }\n\n /**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n}\n","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IJsonObjectOptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints,\n * or the name of a static method used for determining known types.\n */\n knownTypes?: Function[] | string;\n\n /**\n * The name of a static or instance method to call when deserialization\n * of the object is completed.\n */\n onDeserialized?: string;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer: (sourceObject: T, rawSourceObject: T) => T;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer?: (sourceObject: T, rawSourceObject: T) => T;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: ParameterlessConstructor): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Constructor\n): ((target: Constructor) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n options = {};\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Function\n ): void {\n let objectMetadata: JsonObjectMetadata;\n\n // Create or obtain JsonObjectMetadata object.\n if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n objectMetadata = new JsonObjectMetadata(target);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = target.prototype[METADATA_FIELD_KEY];\n if (parentMetadata)\n {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) =>\n objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n }\n\n Object.defineProperty(target.prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // Target already has JsonObjectMetadata associated with it.\n objectMetadata = target.prototype[METADATA_FIELD_KEY];\n objectMetadata.classType = target;\n }\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name)\n {\n objectMetadata.name = options.name;\n }\n\n // Obtain known-types.\n if (typeof options.knownTypes === \"string\")\n {\n objectMetadata.knownTypeMethodName = options.knownTypes;\n }\n else if (options.knownTypes instanceof Array)\n {\n options.knownTypes\n .filter(knownType => !!knownType)\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property is part of the object when serializing, with additional options.\n * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared.\n * @param options Additional options.\n */\nexport function jsonMember(options: IJsonMemberOptions): PropertyDecorator;\n\n/**\n * Specifies that a property is part of the object when serializing.\n * This call signature requires ReflectDecorators and that the property type is always explicitly declared.\n */\nexport function jsonMember(target: Object, propertyKey: string | symbol): void;\n\nexport function jsonMember(optionsOrTarget?: IJsonMemberOptions | Object, propKey?: string | symbol): PropertyDecorator | void\n{\n if (optionsOrTarget instanceof Object && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const target = optionsOrTarget;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and propKey.\n // Obtain property constructor through ReflectDecorators.\n if (isReflectMetadataSupported)\n {\n const reflectPropCtor = Reflect.getMetadata(\"design:type\", target, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime.`);\n return;\n }\n\n if (isSpecialPropertyType(decoratorName, reflectPropCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: reflectPropCtor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n }\n else\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n else\n {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) =>\n {\n let options: IJsonMemberOptions = optionsOrTarget || {};\n let propCtor: Function|undefined;\n let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty(\"constructor\"))\n {\n if (!isValueDefined(options.constructor))\n {\n logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`);\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not.\n if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n\n propCtor = options.constructor;\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n propCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!propCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n }\n else if (!options.deserializer)\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (isSpecialPropertyType(decoratorName, propCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, _propKey, {\n ctor: propCtor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: _propKey.toString(),\n name: options.name || _propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n }\n}\n\nfunction isSpecialPropertyType(decoratorName: string, propCtor?: Function)\n{\n if (propCtor === Array)\n {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Set)\n {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Map)\n {\n logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n return false;\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property, of type array, is part of an object when serializing.\n * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(elementConstructor: Function, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`);\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1)\n {\n logError(`${decoratorName}: 'dimensions' option must be at least 1.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Array)\n {\n logError(`${decoratorName}: property is not an Array.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nfunction createArrayElementType(elementCtor: Function, dimensions: number) {\n const elementTypes = new Array(dimensions).fill(Array, 0, -1);\n elementTypes[dimensions-1] = elementCtor;\n return elementTypes;\n}\n","import { nameof } from \"./helpers\";\nimport { IJsonMemberOptions } from \"./json-member\";\nimport { JsonMemberMetadata, JsonObjectMetadata, injectMetadataInformation } from \"./metadata\";\nimport * as Helpers from \"./helpers\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Set.\n * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n var decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n Helpers.logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not.\n if (Helpers.isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n Helpers.logError(`${decoratorName}: property is not a Set.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Map.\n * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map').\n * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map').\n * @param options Additional options.\n */\nexport function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options: IJsonMapMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof keyConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (typeof valueConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map values at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Map)\n {\n logError(`${decoratorName}: property is not a Map.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, logWarning } from './typedjson/helpers';\nimport { Constructor } from \"./typedjson/types\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { Deserializer } from \"./typedjson/deserializer\";\nimport { Serializer } from \"./typedjson/serializer\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\n\nexport interface ITypedJSONSettings\n{\n /**\n * Sets the handler callback to invoke on errors during serializing and deserializing.\n * Re-throwing errors in this function will halt serialization/deserialization.\n * The default behavior is to log errors to the console.\n */\n errorHandler?: (e: Error) => void;\n\n /**\n * Sets a callback that determines the constructor of the correct sub-type of polymorphic\n * objects while deserializing.\n * The default behavior is to read the type-name from the '__type' property of 'sourceObject',\n * and look it up in 'knownTypes'.\n * The constructor of the sub-type should be returned.\n */\n typeResolver?: (sourceObject: Object, knownTypes: Map) => Function;\n\n nameResolver?: (ctor: Function) => string;\n\n /**\n * Sets a callback that writes type-hints to serialized objects.\n * The default behavior is to write the type-name to the '__type' property, if a derived type\n * is present in place of a base type.\n */\n typeHintEmitter?:\n (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void;\n\n /**\n * Sets the amount of indentation to use in produced JSON strings.\n * Default value is 0, or no indentation.\n */\n indent?: number;\n\n replacer?: (key: string, value: any) => any;\n\n knownTypes?: Array>;\n}\n\nexport class TypedJSON\n{\n //#region Static\n public static parse(\n object: any, rootType: Constructor, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: number\n ): any[] {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n public static parseAsSet(\n object: any, elementType: Constructor, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Constructor,\n valueType: Constructor,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): any[] {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n public static toPlainSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n public static stringifyAsSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n public static setGlobalConfig(config: ITypedJSONSettings)\n {\n if (this._globalConfig)\n {\n Object.assign(this._globalConfig, config);\n }\n else\n {\n this._globalConfig = config;\n }\n }\n\n //#endregion\n\n private serializer: Serializer = new Serializer();\n private deserializer: Deserializer = new Deserializer();\n private globalKnownTypes: Array> = [];\n private indent: number = 0;\n private rootConstructor: Constructor;\n private errorHandler: (e: Error) => void;\n private nameResolver: (ctor: Function) => string;\n private replacer?: (key: string, value: any) => any;\n\n /**\n * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object\n * instances of the specified root class type.\n * @param rootType The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings)\n {\n let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation))\n {\n throw new TypeError(\"The TypedJSON root data type must have the @jsonObject decorator used.\");\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings)\n {\n this.config(settings);\n }\n else if (TypedJSON._globalConfig)\n {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n public config(settings: ITypedJSONSettings)\n {\n if (TypedJSON._globalConfig)\n {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes)\n {\n // Merge known-types (also de-duplicate them, so Array -> Set -> Array).\n settings.knownTypes = Array.from(new Set(\n settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes),\n ));\n }\n }\n\n if (settings.errorHandler)\n {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) this.replacer = settings.replacer;\n if (settings.typeResolver) this.deserializer.setTypeResolver(settings.typeResolver);\n if (settings.typeHintEmitter) this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n if (settings.indent) this.indent = settings.indent;\n\n if (settings.nameResolver)\n {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes)\n {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) =>\n {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === \"undefined\" || knownType === null)\n {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`);\n }\n });\n\n this.globalKnownTypes = settings.knownTypes;\n }\n }\n\n /**\n * Converts a JSON string to the root class type.\n * @param object The JSON to parse and convert.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns Deserialized T or undefined if there were errors.\n */\n public parse(object: any): T|undefined\n {\n const json = JSON.parse(object);\n\n let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T|undefined;\n let knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata)\n {\n rootMetadata.knownTypes.forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try\n {\n result = this.deserializer.convertSingleValue(json, {\n selfConstructor: this.rootConstructor,\n knownTypes: knownTypes,\n }) as T;\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n public parseAsArray(object: any, dimensions?: 1): T[];\n public parseAsArray(object: any, dimensions: 2): T[][];\n public parseAsArray(object: any, dimensions: 3): T[][][];\n public parseAsArray(object: any, dimensions: 4): T[][][][];\n public parseAsArray(object: any, dimensions: 5): T[][][][][];\n public parseAsArray(object: any, dimensions: number): any[];\n public parseAsArray(object: any, dimensions: number = 1): any[]\n {\n const json = JSON.parse(object);\n if (json instanceof Array)\n {\n return this.deserializer.convertAsArray(json, {\n selfConstructor: Array,\n elementConstructor: new Array(dimensions - 1)\n .fill(Array)\n .concat(this.rootConstructor),\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define an Array`\n + `, but got ${typeof json}.`));\n }\n\n return [];\n }\n\n public parseAsSet(object: any): Set\n {\n const json = JSON.parse(object);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsSet(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes)\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Set();\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = JSON.parse(object);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsMap(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n keyConstructor: keyConstructor\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Map();\n }\n\n /**\n * Converts an instance of the specified class type to a plain JSON object.\n * @param object The instance to convert to a JSON string.\n * @returns Serialized object or undefined if an error has occured.\n */\n public toPlainJson(object: T): JsonTypes\n {\n try\n {\n return this.serializer.convertSingleValue(object, {\n selfType: this.rootConstructor\n });\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainArray(object: T[], dimensions?: 1): Object[];\n public toPlainArray(object: T[][], dimensions: 2): Object[][];\n public toPlainArray(object: T[][][], dimensions: 3): Object[][][];\n public toPlainArray(object: T[][][][], dimensions: 4): Object[][][][];\n public toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][];\n public toPlainArray(object: any[], dimensions: 1|2|3|4|5 = 1): Object[]|undefined\n {\n try\n {\n const elementConstructorArray =\n new Array(dimensions - 1).fill(Array).concat(this.rootConstructor);\n return this.serializer.convertAsArray(object, elementConstructorArray);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainSet(object: Set): Object[]|undefined\n {\n try\n {\n return this.serializer.convertAsSet(object, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): { key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n /**\n * Converts an instance of the specified class type to a JSON string.\n * @param object The instance to convert to a JSON string.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns String with the serialized object or an empty string if an error has occured, but\n * the errorHandler did not throw.\n */\n public stringify(object: T): string\n {\n const result = this.toPlainJson(object);\n if (result === undefined) {\n return '';\n }\n return JSON.stringify(result, this.replacer, this.indent);\n }\n\n public stringifyAsArray(object: T[], dimensions?: 1): string;\n public stringifyAsArray(object: T[][], dimensions: 2): string;\n public stringifyAsArray(object: T[][][], dimensions: 3): string;\n public stringifyAsArray(object: T[][][][], dimensions: 4): string;\n public stringifyAsArray(object: T[][][][][], dimensions: 5): string;\n public stringifyAsArray(object: any[], dimensions: any): string\n {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n public stringifyAsSet(object: Set): string\n {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n public stringifyAsMap(object: Map, keyConstructor: Constructor): string\n {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>)\n {\n let map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n\nexport { jsonObject } from \"./typedjson/json-object\";\nexport { jsonMember } from \"./typedjson/json-member\";\nexport { jsonArrayMember } from \"./typedjson/json-array-member\";\nexport { jsonSetMember } from \"./typedjson/json-set-member\";\nexport { jsonMapMember } from \"./typedjson/json-map-member\";\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://typedjson/webpack/universalModuleDefinition","webpack://typedjson/webpack/bootstrap","webpack://typedjson/./src/typedjson/helpers.ts","webpack://typedjson/./src/typedjson/metadata.ts","webpack://typedjson/./src/typedjson/deserializer.ts","webpack://typedjson/./src/typedjson/serializer.ts","webpack://typedjson/./src/typedjson/json-object.ts","webpack://typedjson/./src/typedjson/json-member.ts","webpack://typedjson/./src/typedjson/json-array-member.ts","webpack://typedjson/./src/typedjson/json-set-member.ts","webpack://typedjson/./src/typedjson/json-map-member.ts","webpack://typedjson/./src/typedjson.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","object","property","prototype","hasOwnProperty","p","s","METADATA_FIELD_KEY","isDirectlySerializableNativeType","type","Date","Number","String","Boolean","indexOf","isTypeTypedArray","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","parseToJSObject","json","expectedType","jsonStr","expectsTypesSerializedAsStrings","ArrayBuffer","DataView","hasQuotes","length","isInteger","test","trim","shouldOmitParseString","JSON","parse","isSubtypeOf","A","B","logError","message","optionalParams","_i","arguments","console","error","apply","concat","log","logWarning","warn","isValueDefined","isInstanceOf","constructor","isObject","isReflectMetadataSupported","Reflect","getMetadata","nameof","fn","metadata_JsonObjectMetadata","JsonObjectMetadata","classType","dataMembers","Map","knownTypes","Set","isExplicitlyMarked","isHandledWithoutAnnotation","getJsonObjectName","ctor","metadata","getFromConstructor","doesHandleWithoutAnnotation","primitiveMeta","getKnownTypeNameFromType","injectMetadataInformation","propKey","objectMetadata","decoratorName","deserializer","parentMetadata","forEach","_metadata","_propKey","set","writable","add","keyType","elementType","elemCtor","deserializer_Deserializer","Deserializer","_typeResolver","sourceObject","__type","_errorHandler","setNameResolver","nameResolverCallback","_nameResolver","setTypeResolver","typeResolverCallback","TypeError","setErrorHandler","errorHandlerCallback","convertAsObject","sourceObjectTypeInfo","objectName","_this","expectedSelfType","selfConstructor","sourceObjectMetadata","knownTypeConstructors","_mergeKnownTypes","_createKnownTypesMap","typeFromTypeHint","sourceMetadata_1","sourceObjectWithDeserializedProperties_1","memberMetadata","revivedValue","memberValue","memberNameForDebug","convertSingleValue","elementConstructor","keyConstructor","key","isRequired","targetObject","initializerCallback","e","_instantiateType","assign","onDeserializedMethodName","targetObject_1","keys","sourceKey","typeInfo","memberName","srcTypeNameForDebug","_isDirectlyDeserializableNativeType","_makeTypeErrorMessage","_throwTypeMismatchError","Array","every","elem","isNaN","map","_stringToArrayBuffer","_stringToDataView","convertAsArray","convertAsSet","convertAsMap","elementTypeInfo","slice","element","resultSet","keyTypeInfo","valueTypeInfo","resultMap","targetType","expectedSourceType","actualSourceType","actualType","knownTypeMaps","result","knowTypes","knownTypeMeta","name_1","convertNativeObject","str","buf","bufView","strLen","charCodeAt","serializer_Serializer","Serializer","_typeHintEmitter","sourceTypeMetadata","setTypeHintEmitter","typeEmitterCallback","selfType","convertAsArrayBuffer","convertAsDataView","isArrayTypeInfo","elementTypes","isSetTypeInfo","isMapTypeInfo","convertAsTypedArray","expectedName","actualName","sourceMeta_1","serializer","__assign","expectedElementType","expectedTypeName","actualTypeName","typeInfoForElements","resultArray","resultElement","push","expectedKeyType","resultKeyValuePairObj","from","buffer","charCode","fromCharCode","join","dataView","jsonObject","optionsOrTarget","options","decorator","target","knownType","onDeserialized","initializer","knownTypeMethodName","filter","jsonMember","propCtor","isSpecialPropertyType","emitDefaultValue","toString","reflectPropCtor","jsonArrayMember","dimensions","undefined","elementCtor","fill","createArrayElementType","jsonSetMember","jsonMapMember","valueConstructor","typedjson_TypedJSON","TypedJSON","rootConstructor","settings","globalKnownTypes","indent","rootMetadata","nameResolver","errorHandler","config","_globalConfig","rootType","parseAsArray","parseAsSet","parseAsMap","valueType","toPlainJson","toPlainArray","toPlainSet","stringifyAsSet","toPlainMap","keyCtor","valueCtor","stringifyAsMap","stringify","stringifyAsArray","setGlobalConfig","typedjson_assign","replacer","typeResolver","typeHintEmitter","ktc","knownTypeCtor","_mapKnownTypes","elementConstructorArray","constructors"],"mappings":"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","file":"typedjson.min.js","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(\"typedjson\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"typedjson\"] = factory();\n\telse\n\t\troot[\"typedjson\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","declare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport const METADATA_FIELD_KEY = \"__typedJsonJsonObjectMetadataInformation__\";\n\nexport function getDefaultValue(type: { new (): T }): T|undefined\n{\n switch (type as any)\n {\n case Number:\n return 0 as any;\n\n case String:\n return \"\" as any;\n\n case Boolean:\n return false as any;\n\n case Array:\n return [] as any;\n\n default:\n return undefined;\n }\n}\n\n/**\n * Determines whether the specified type is a type that can be passed on \"as-is\" into `JSON.stringify`.\n * Values of these types don't need special conversion.\n * @param ctor The constructor of the type (wrapper constructor for primitive types, e.g. `Number` for `number`).\n */\nexport function isDirectlySerializableNativeType(type: Function): boolean\n{\n return !!(~[Date, Number, String, Boolean].indexOf(type as any));\n}\n\nexport function isTypeTypedArray(type: Function): boolean\n{\n return !!(~[Float32Array, Float64Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array]\n .indexOf(type as any));\n}\n\nexport function isPrimitiveValue(obj: any): boolean\n{\n switch (typeof obj)\n {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return true;\n default:\n return (obj instanceof String || obj instanceof Number || obj instanceof Boolean);\n }\n}\n\nexport function isObject(value: any): value is Object\n{\n return typeof value === \"object\";\n}\n\nfunction shouldOmitParseString(jsonStr: string, expectedType: Function): boolean {\n const expectsTypesSerializedAsStrings = expectedType === String\n || expectedType === ArrayBuffer\n || expectedType === DataView;\n\n const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '\"' && jsonStr[jsonStr.length-1] === '\"';\n const isInteger = /^\\d+$/.test(jsonStr.trim());\n\n return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date);\n}\n\nexport function parseToJSObject(json: any, expectedType: Function): Object {\n if (typeof json !== 'string' || shouldOmitParseString(json, expectedType))\n {\n return json;\n }\n return JSON.parse(json);\n}\n\n/**\n * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B').\n * @param A The supposed derived type.\n * @param B The supposed base type.\n */\nexport function isSubtypeOf(A: Function, B: Function)\n{\n return A === B || A.prototype instanceof B;\n}\n\nexport function logError(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.error === \"function\")\n {\n console.error.apply(console, [message].concat(optionalParams));\n }\n else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"ERROR: \" + message].concat(optionalParams));\n }\n}\n\nexport function logMessage(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [message].concat(optionalParams));\n }\n}\n\nexport function logWarning(message?: any, ...optionalParams: any[])\n{\n if (typeof console === \"object\" && typeof console.warn === \"function\")\n {\n console.warn.apply(console, [message].concat(optionalParams));\n } else if (typeof console === \"object\" && typeof console.log === \"function\")\n {\n console.log.apply(console, [\"WARNING: \" + message].concat(optionalParams));\n }\n}\n\n/**\n * Checks if the value is considered defined (not undefined and not null).\n * @param value\n */\nexport function isValueDefined(value: T): value is Exclude\n{\n return !(typeof value === \"undefined\" || value === null);\n}\n\nexport function isInstanceOf(value: any, constructor: Function): boolean\n{\n if (typeof value === \"number\")\n {\n return (constructor === Number);\n }\n else if (typeof value === \"string\")\n {\n return (constructor === String);\n }\n else if (typeof value === \"boolean\")\n {\n return (constructor === Boolean);\n }\n else if (isObject(value))\n {\n return (value instanceof constructor);\n }\n\n return false;\n}\n\nexport const isReflectMetadataSupported =\n (typeof Reflect === \"object\" && typeof Reflect.getMetadata === \"function\");\n\n/**\n * Gets the name of a function.\n * @param fn The function whose name to get.\n */\nexport function nameof(fn: Function & { name?: string })\n{\n if (typeof fn.name === \"string\")\n {\n return fn.name;\n }\n else\n {\n return \"undefined\";\n }\n}\n","import { nameof, logError, METADATA_FIELD_KEY, isDirectlySerializableNativeType, isTypeTypedArray } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\n\nexport interface JsonMemberMetadata\n{\n /** If set, a default value will be emitted for uninitialized members. */\n emitDefaultValue?: boolean;\n\n /** Member name as it appears in the serialized JSON. */\n name: string;\n\n /** Property or field key of the json member. */\n key: string;\n\n /** Constuctor (type) reference of the member. */\n ctor?: Function;\n\n /** If set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** If the json member is an array, map or set, sets member options of elements/values. Subsequent values define the types of nested arrays. */\n elementType?: Function[];\n\n /** If the json member is a map, sets member options of array keys. */\n keyType?: Function;\n\n /** Custom deserializer to use. */\n deserializer?: (json: any) => any;\n\n /** Custom serializer to use. */\n serializer?: (value: any) => any;\n}\n\nexport class JsonObjectMetadata\n{\n //#region Static\n /**\n * Gets the name of a class as it appears in a serialized JSON string.\n * @param ctor The constructor of a class (with or without jsonObject).\n */\n public static getJsonObjectName(ctor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(ctor);\n return metadata ? nameof(metadata.classType) : nameof(ctor);\n }\n\n /**\n * Gets jsonObject metadata information from a class.\n * @param ctor The constructor class.\n */\n public static getFromConstructor(ctor: Function): JsonObjectMetadata|undefined\n {\n const prototype = ctor.prototype;\n if (!prototype)\n {\n return;\n }\n\n let metadata: JsonObjectMetadata|undefined;\n if (prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // The class prototype contains own jsonObject metadata\n metadata = prototype[METADATA_FIELD_KEY];\n }\n\n // Ignore implicitly added jsonObject (through jsonMember)\n if (metadata && metadata.isExplicitlyMarked)\n {\n return metadata;\n }\n\n // In the end maybe it is something which we can handle directly\n if (JsonObjectMetadata.doesHandleWithoutAnnotation(ctor))\n {\n const primitiveMeta = new JsonObjectMetadata(ctor);\n primitiveMeta.isExplicitlyMarked = true;\n // we do not store the metadata here to not modify builtin prototype\n return primitiveMeta;\n }\n }\n\n /**\n * Gets the known type name of a jsonObject class for type hint.\n * @param constructor The constructor class.\n */\n public static getKnownTypeNameFromType(constructor: Function): string\n {\n const metadata = JsonObjectMetadata.getFromConstructor(constructor);\n return metadata ? nameof(metadata.classType) : nameof(constructor);\n }\n\n private static doesHandleWithoutAnnotation(ctor: Function): boolean\n {\n return isDirectlySerializableNativeType(ctor) || isTypeTypedArray(ctor)\n || ctor === DataView || ctor === ArrayBuffer;\n }\n //#endregion\n\n constructor(\n classType: Function,\n ) {\n this.classType = classType;\n }\n\n public dataMembers: Map = new Map();\n\n public knownTypes: Set = new Set();\n\n public knownTypeMethodName?: string;\n\n /** Gets or sets the constructor function for the jsonObject. */\n public classType: Function;\n\n /**\n * Indicates whether this class was explicitly annotated with @jsonObject\n * or implicitly by @jsonMember\n */\n public isExplicitlyMarked: boolean = false;\n\n /**\n * Indicates whether this type is handled without annotation. This is usually\n * used for the builtin types (except for Maps, Sets, and normal Arrays).\n */\n public isHandledWithoutAnnotation: boolean = false;\n\n /** Name used to encode polymorphic type */\n public name?: string;\n\n public onDeserializedMethodName?: string;\n\n public initializerCallback?: (sourceObject: Object, rawSourceObject: Object) => Object;\n}\n\nexport function injectMetadataInformation(constructor: IndexedObject, propKey: string | symbol, metadata: JsonMemberMetadata)\n{\n const decoratorName = `@jsonMember on ${nameof(constructor.constructor)}.${String(propKey)}`; // For error messages.\n let objectMetadata: JsonObjectMetadata;\n\n // When a property decorator is applied to a static member, 'constructor' is a constructor function.\n // See: https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md#property-decorators\n // ... and static members are not supported here, so abort.\n if (typeof constructor === \"function\")\n {\n logError(`${decoratorName}: cannot use a static property.`);\n return;\n }\n\n // Methods cannot be serialized.\n // @ts-ignore symbol indexing is not supported by ts\n if (typeof constructor[propKey] === \"function\")\n {\n logError(`${decoratorName}: cannot use a method property.`);\n return;\n }\n\n if (!metadata || (!metadata.ctor && !metadata.deserializer))\n {\n logError(`${decoratorName}: JsonMemberMetadata has unknown ctor.`);\n return;\n }\n\n // Add jsonObject metadata to 'constructor' if not yet exists ('constructor' is the prototype).\n // NOTE: this will not fire up custom serialization, as 'constructor' must be explicitly marked with '@jsonObject' as well.\n if (!constructor.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // No *own* metadata, create new.\n objectMetadata = new JsonObjectMetadata(constructor.constructor);\n\n // Inherit @JsonMembers from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = constructor[METADATA_FIELD_KEY];\n if (parentMetadata) // && !constructor.hasOwnProperty(Helpers.METADATA_FIELD_KEY)\n {\n parentMetadata.dataMembers.forEach((_metadata, _propKey) => objectMetadata.dataMembers.set(_propKey, _metadata));\n }\n\n // ('constructor' is the prototype of the involved class, metadata information is added to this class prototype).\n Object.defineProperty(constructor, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // JsonObjectMetadata already exists on 'constructor'.\n objectMetadata = constructor[METADATA_FIELD_KEY];\n }\n\n if (!metadata.deserializer)\n {\n // @ts-ignore above is a check (!deser && !ctor)\n objectMetadata.knownTypes.add(metadata.ctor);\n }\n\n if (metadata.keyType)\n objectMetadata.knownTypes.add(metadata.keyType);\n\n if (metadata.elementType)\n metadata.elementType.forEach(elemCtor => objectMetadata.knownTypes.add(elemCtor));\n\n objectMetadata.dataMembers.set(metadata.name, metadata);\n}\n","import { nameof, logError, isSubtypeOf, isValueDefined } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfConstructor: Function;\n elementConstructor?: Function[];\n keyConstructor?: Function;\n knownTypes: Map;\n}\n\n/**\n * Utility class, converts a simple/untyped javascript object-tree to a typed object-tree.\n * It is used after parsing a JSON-string.\n */\nexport class Deserializer\n{\n private _typeResolver: (sourceObject: Object, knownTypes: Map) => Function|undefined;\n private _nameResolver?: (ctor: Function) => string;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeResolver = (sourceObject: any, knownTypes: Map) =>\n {\n if (sourceObject.__type) return knownTypes.get(sourceObject.__type);\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setNameResolver(nameResolverCallback: (ctor: Function) => string)\n {\n this._nameResolver = nameResolverCallback;\n }\n\n public setTypeResolver(typeResolverCallback: (sourceObject: Object, knownTypes: Map) => Function)\n {\n if (typeof typeResolverCallback !== \"function\") throw new TypeError(\"'typeResolverCallback' is not a function.\");\n\n this._typeResolver = typeResolverCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n public convertAsObject(\n sourceObject: IndexedObject,\n sourceObjectTypeInfo: IScopeTypeInfo,\n objectName = \"object\",\n ) {\n if (typeof sourceObject !== \"object\" || sourceObject === null)\n {\n this._errorHandler(new TypeError(`Cannot deserialize ${objectName}: 'sourceObject' must be a defined object.`));\n return undefined;\n }\n\n let expectedSelfType = sourceObjectTypeInfo.selfConstructor;\n let sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(expectedSelfType);\n let knownTypeConstructors = sourceObjectTypeInfo.knownTypes;\n\n if (sourceObjectMetadata)\n {\n // Merge known types received from \"above\" with known types defined on the current type.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n\n // Check if a type-hint is available from the source object.\n let typeFromTypeHint = this._typeResolver(sourceObject, knownTypeConstructors);\n\n if (typeFromTypeHint)\n {\n // Check if type hint is a valid subtype of the expected source type.\n if (isSubtypeOf(typeFromTypeHint, expectedSelfType))\n {\n // Hell yes.\n expectedSelfType = typeFromTypeHint;\n sourceObjectMetadata = JsonObjectMetadata.getFromConstructor(typeFromTypeHint);\n\n if (sourceObjectMetadata)\n {\n // Also merge new known types from subtype.\n knownTypeConstructors = this._mergeKnownTypes(\n knownTypeConstructors,\n this._createKnownTypesMap(sourceObjectMetadata.knownTypes),\n );\n }\n }\n }\n\n if (sourceObjectMetadata && sourceObjectMetadata.isExplicitlyMarked)\n {\n const sourceMetadata = sourceObjectMetadata;\n // Strong-typed deserialization available, get to it.\n // First deserialize properties into a temporary object.\n const sourceObjectWithDeserializedProperties = {} as IndexedObject;\n\n // Deserialize by expected properties.\n sourceMetadata.dataMembers.forEach((memberMetadata, propKey) =>\n {\n const memberValue = sourceObject[propKey];\n const memberNameForDebug = `${nameof(sourceMetadata.classType)}.${propKey}`;\n\n let revivedValue;\n if (memberMetadata.deserializer) {\n revivedValue = memberMetadata.deserializer(memberValue);\n } else if (memberMetadata.ctor) {\n revivedValue = this.convertSingleValue(\n memberValue,\n {\n selfConstructor: memberMetadata.ctor,\n elementConstructor: memberMetadata.elementType,\n keyConstructor: memberMetadata.keyType,\n knownTypes: knownTypeConstructors\n },\n memberNameForDebug,\n );\n } else {\n throw new TypeError(\n `Cannot deserialize ${memberNameForDebug} thers is`\n + ` no constructor nor deserlization function to use.`,\n );\n }\n\n if (isValueDefined(revivedValue))\n {\n sourceObjectWithDeserializedProperties[memberMetadata.key] = revivedValue;\n }\n else if (memberMetadata.isRequired)\n {\n this._errorHandler(new TypeError(`Missing required member '${memberNameForDebug}'.`));\n }\n });\n\n // Next, instantiate target object.\n let targetObject: IndexedObject;\n\n if (typeof sourceObjectMetadata.initializerCallback === \"function\")\n {\n try\n {\n targetObject = sourceObjectMetadata.initializerCallback(\n sourceObjectWithDeserializedProperties,\n sourceObject,\n );\n\n // Check the validity of user-defined initializer callback.\n if (!targetObject)\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + ` 'initializer' function returned undefined/null`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected.`,\n );\n }\n else if (!(targetObject instanceof sourceObjectMetadata.classType))\n {\n throw new TypeError(\n `Cannot deserialize ${objectName}:`\n + `'initializer' returned '${nameof(targetObject.constructor)}'`\n + `, but '${nameof(sourceObjectMetadata.classType)}' was expected,`\n + `and '${nameof(targetObject.constructor)}' is not a subtype of`\n + ` '${nameof(sourceObjectMetadata.classType)}'`,\n );\n }\n }\n catch (e)\n {\n this._errorHandler(e);\n return undefined;\n }\n }\n else\n {\n targetObject = this._instantiateType(expectedSelfType);\n }\n\n // Finally, assign deserialized properties to target object.\n Object.assign(targetObject, sourceObjectWithDeserializedProperties);\n\n // Call onDeserialized method (if any).\n if (sourceObjectMetadata.onDeserializedMethodName)\n {\n if (typeof (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName] === \"function\")\n {\n (targetObject.constructor as any)[sourceObjectMetadata.onDeserializedMethodName]();\n }\n else\n {\n this._errorHandler(new TypeError(\n `onDeserialized callback '${nameof(sourceObjectMetadata.classType)}.${sourceObjectMetadata.onDeserializedMethodName}' is not a method.`\n ));\n }\n }\n\n return targetObject;\n }\n else\n {\n // Untyped deserialization into Object instance.\n let targetObject = {} as IndexedObject;\n\n Object.keys(sourceObject).forEach(sourceKey =>\n {\n targetObject[sourceKey] = this.convertSingleValue(sourceObject[sourceKey], {\n selfConstructor: sourceObject[sourceKey].constructor,\n knownTypes: sourceObjectTypeInfo.knownTypes,\n elementConstructor: sourceObjectTypeInfo.elementConstructor,\n keyConstructor: sourceObjectTypeInfo.keyConstructor\n }, sourceKey);\n });\n\n return targetObject;\n }\n }\n\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n let expectedSelfType = typeInfo.selfConstructor;\n let srcTypeNameForDebug = sourceObject ? nameof(sourceObject.constructor) : \"undefined\";\n\n if (!isValueDefined(sourceObject))\n {\n return sourceObject;\n }\n else if (this._isDirectlyDeserializableNativeType(expectedSelfType))\n {\n if (sourceObject.constructor === expectedSelfType)\n {\n return sourceObject;\n }\n else\n {\n throw new TypeError(this._makeTypeErrorMessage(nameof(expectedSelfType), sourceObject.constructor, memberName));\n }\n }\n else if (expectedSelfType === Date)\n {\n // Support for Date with ISO 8601 format, or with numeric timestamp (milliseconds elapsed since the Epoch).\n // ISO 8601 spec.: https://www.w3.org/TR/NOTE-datetime\n\n if (typeof sourceObject === \"string\" || (typeof sourceObject === \"number\" && sourceObject > 0))\n return new Date(sourceObject as any);\n else\n this._throwTypeMismatchError(\"Date\", \"an ISO-8601 string\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float32Array)\n {\n // Deserialize Float32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float32Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Float64Array)\n {\n // Deserialize Float64Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Float64Array(sourceObject);\n else\n this._throwTypeMismatchError(\"Float64Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8Array)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint8ClampedArray)\n {\n // Deserialize Uint8Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint8ClampedArray(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint8ClampedArray\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint16Array)\n {\n // Deserialize Uint16Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint16Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint16Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Uint32Array)\n {\n // Deserialize Uint32Array from number[].\n\n if (sourceObject instanceof Array && sourceObject.every(elem => !isNaN(elem)))\n return new Uint32Array(sourceObject.map(value => ~~value));\n else\n this._throwTypeMismatchError(\"Uint32Array\", \"a numeric source array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === ArrayBuffer)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToArrayBuffer(sourceObject);\n else\n this._throwTypeMismatchError(\"ArrayBuffer\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === DataView)\n {\n if (typeof sourceObject === \"string\")\n return this._stringToDataView(sourceObject);\n else\n this._throwTypeMismatchError(\"DataView\", \"a string source\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Array)\n {\n if (sourceObject instanceof Array)\n return this.convertAsArray(sourceObject, typeInfo, memberName);\n else\n throw new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName));\n }\n else if (expectedSelfType === Set)\n {\n if (sourceObject instanceof Array)\n return this.convertAsSet(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Set\", \"Array\", srcTypeNameForDebug, memberName);\n }\n else if (expectedSelfType === Map)\n {\n if (sourceObject instanceof Array)\n return this.convertAsMap(sourceObject, typeInfo, memberName);\n else\n this._throwTypeMismatchError(\"Map\", \"a source array of key-value-pair objects\", srcTypeNameForDebug, memberName);\n }\n else if (sourceObject && typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n public convertAsArray(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\"): any[]\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return [];\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Array: missing constructor reference of Array elements.`));\n return [];\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n return sourceObject.map(element =>\n {\n // If an array element fails to deserialize, substitute with undefined. This is so that the original ordering is not interrupted by faulty\n // entries, as an Array is ordered.\n try\n {\n return this.convertSingleValue(element, elementTypeInfo);\n }\n catch (e)\n {\n this._errorHandler(e);\n\n // Keep filling the array here with undefined to keep original ordering.\n // Note: this is just aesthetics, not returning anything produces the same result.\n return undefined;\n }\n });\n }\n\n public convertAsSet(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n {\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n return new Set();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Set: missing constructor reference of Set elements.`));\n return new Set();\n }\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n let resultSet = new Set();\n\n sourceObject.forEach((element, i) =>\n {\n try\n {\n resultSet.add(this.convertSingleValue(element, elementTypeInfo, memberName + `[${i}]`));\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Set is not ordered, and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultSet;\n }\n\n public convertAsMap(sourceObject: any, typeInfo: IScopeTypeInfo, memberName = \"object\")\n {\n if (!(sourceObject instanceof Array))\n this._errorHandler(new TypeError(this._makeTypeErrorMessage(Array, sourceObject.constructor, memberName)));\n\n if (!typeInfo.keyConstructor)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing key constructor.`));\n return new Map();\n }\n\n if (!typeInfo.elementConstructor || !typeInfo.elementConstructor.length)\n {\n this._errorHandler(new TypeError(`Could not deserialize ${memberName} as Map: missing value constructor.`));\n return new Map();\n }\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.keyConstructor,\n knownTypes: typeInfo.knownTypes\n };\n\n let valueTypeInfo: IScopeTypeInfo = {\n selfConstructor: typeInfo.elementConstructor[0],\n elementConstructor: (typeInfo.elementConstructor.length > 1) ? typeInfo.elementConstructor.slice(1) : [],\n knownTypes: typeInfo.knownTypes\n };\n\n let resultMap = new Map();\n\n sourceObject.forEach((element: any) =>\n {\n try\n {\n let key = this.convertSingleValue(element.key, keyTypeInfo);\n\n // Undefined/null keys not supported, skip if so.\n if (isValueDefined(key))\n {\n resultMap.set(key, this.convertSingleValue(\n element.value, valueTypeInfo, `${memberName}[${key}]`,\n ));\n }\n }\n catch (e)\n {\n // Faulty entries are skipped, because a Map is not ordered,\n // and skipping an entry does not affect others.\n this._errorHandler(e);\n }\n });\n\n return resultMap;\n }\n\n private _throwTypeMismatchError(\n targetType: string,\n expectedSourceType: string,\n actualSourceType: string,\n memberName: string = \"object\",\n ) {\n throw new TypeError(\n `Could not deserialize ${memberName} as ${targetType}:`\n + ` expected ${expectedSourceType}, got ${actualSourceType}.`,\n );\n }\n\n private _makeTypeErrorMessage(expectedType: Function | string, actualType: Function | string, memberName = \"object\")\n {\n let expectedTypeName = (typeof expectedType === \"function\") ? nameof(expectedType) : expectedType;\n let actualTypeName = (typeof actualType === \"function\") ? nameof(actualType) : actualType;\n\n return `Could not deserialize ${memberName}: expected '${expectedTypeName}', got '${actualTypeName}'.`;\n }\n\n private _instantiateType(ctor: any)\n {\n return new ctor();\n }\n\n private _mergeKnownTypes(...knownTypeMaps: Array>)\n {\n let result = new Map();\n\n knownTypeMaps.forEach(knownTypes =>\n {\n knownTypes.forEach((ctor, name) =>\n {\n if (this._nameResolver)\n {\n result.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n result.set(name, ctor);\n }\n });\n });\n\n return result;\n }\n\n private _createKnownTypesMap(knowTypes: Set)\n {\n const map = new Map();\n\n knowTypes.forEach(ctor =>\n {\n if (this._nameResolver)\n {\n map.set(this._nameResolver(ctor), ctor);\n }\n else\n {\n const knownTypeMeta = JsonObjectMetadata.getFromConstructor(ctor);\n const name = knownTypeMeta && knownTypeMeta.isExplicitlyMarked && knownTypeMeta.name\n ? knownTypeMeta.name\n : ctor.name;\n map.set(name, ctor);\n }\n });\n\n return map;\n }\n\n private _isDirectlyDeserializableNativeType(ctor: any)\n {\n return ~([Number, String, Boolean].indexOf(ctor));\n }\n\n public convertNativeObject(sourceObject: any)\n {\n return sourceObject;\n }\n\n private _stringToArrayBuffer(str: string)\n {\n let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char\n let bufView = new Uint16Array(buf);\n\n for (let i = 0, strLen = str.length; i < strLen; i++)\n {\n bufView[i] = str.charCodeAt(i);\n }\n\n return buf;\n }\n\n private _stringToDataView(str: string)\n {\n return new DataView(this._stringToArrayBuffer(str));\n }\n}\n","import { nameof, logError, isValueDefined, isInstanceOf, isTypeTypedArray, isDirectlySerializableNativeType } from \"./helpers\";\nimport { IndexedObject } from \"./types\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IScopeTypeInfo\n{\n selfType: Function;\n elementTypes?: Function[];\n keyType?: Function;\n}\n\nexport interface IScopeArrayTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Array;\n elementTypes: Function[];\n}\n\nfunction isArrayTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeArrayTypeInfo {\n return typeInfo.selfType === Array;\n}\n\nexport interface IScopeSetTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Set;\n elementTypes: [Function];\n}\n\nfunction isSetTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeSetTypeInfo {\n return typeInfo.selfType === Set;\n}\n\nexport interface IScopeMapTypeInfo extends IScopeTypeInfo\n{\n selfType: new () => Map;\n elementTypes: [Function];\n keyType: Function;\n}\n\nfunction isMapTypeInfo(typeInfo: IScopeTypeInfo): typeInfo is IScopeMapTypeInfo {\n return typeInfo.selfType === Map;\n}\n\n/**\n * Utility class, converts a typed object tree (i.e. a tree of class instances, arrays of class instances, and so on) to an untyped javascript object (also\n * called \"simple javascript object\"), and emits any necessary type hints in the process (for polymorphism).\n *\n * The converted object tree is what will be given to `JSON.stringify` to convert to string as the last step, the serialization is basically like:\n *\n * (1) typed object-tree -> (2) simple JS object-tree -> (3) JSON-string\n */\nexport class Serializer\n{\n private _typeHintEmitter: (targetObject: IndexedObject, sourceObject: IndexedObject, expectedSourceType: Function, sourceTypeMetadata?: JsonObjectMetadata) => void;\n private _errorHandler: (error: Error) => void;\n\n constructor()\n {\n this._typeHintEmitter = (targetObject, sourceObject, expectedSourceType, sourceTypeMetadata?: JsonObjectMetadata) =>\n {\n // By default, we put a \"__type\" property on the output object if the actual object is not the same as the expected one, so that deserialization\n // will know what to deserialize into (given the required known-types are defined, and the object is a valid subtype of the expected type).\n if (sourceObject.constructor !== expectedSourceType)\n {\n const name = sourceTypeMetadata && sourceTypeMetadata.name\n ? sourceTypeMetadata.name\n : nameof(sourceObject.constructor);\n // TODO: Perhaps this can work correctly without string-literal access?\n // tslint:disable-next-line:no-string-literal\n targetObject[\"__type\"] = name;\n }\n };\n\n this._errorHandler = (error) => logError(error);\n }\n\n public setTypeHintEmitter(typeEmitterCallback: (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void)\n {\n if (typeof typeEmitterCallback !== \"function\")\n {\n throw new TypeError(\"'typeEmitterCallback' is not a function.\");\n }\n\n this._typeHintEmitter = typeEmitterCallback;\n }\n\n public setErrorHandler(errorHandlerCallback: (error: Error) => void)\n {\n if (typeof errorHandlerCallback !== \"function\")\n {\n throw new TypeError(\"'errorHandlerCallback' is not a function.\");\n }\n\n this._errorHandler = errorHandlerCallback;\n }\n\n /**\n * Convert a value of any supported serializable type.\n * The value type will be detected, and the correct serialization method will be called.\n */\n public convertSingleValue(sourceObject: any, typeInfo: IScopeTypeInfo, memberName: string = \"object\"): any\n {\n if (!isValueDefined(sourceObject)) return;\n\n if (!isInstanceOf(sourceObject, typeInfo.selfType))\n {\n let expectedName = nameof(typeInfo.selfType);\n let actualName = nameof(sourceObject.constructor);\n\n this._errorHandler(new TypeError(`Could not serialize '${memberName}': expected '${expectedName}', got '${actualName}'.`));\n return;\n }\n\n if (isDirectlySerializableNativeType(typeInfo.selfType))\n {\n return sourceObject;\n }\n else if (typeInfo.selfType === ArrayBuffer)\n {\n return this.convertAsArrayBuffer(sourceObject);\n }\n else if (typeInfo.selfType === DataView)\n {\n return this.convertAsDataView(sourceObject);\n }\n else if (isArrayTypeInfo(typeInfo))\n {\n return this.convertAsArray(sourceObject, typeInfo.elementTypes, memberName);\n }\n else if (isSetTypeInfo(typeInfo))\n {\n return this.convertAsSet(sourceObject, typeInfo.elementTypes[0], memberName);\n }\n else if (isMapTypeInfo(typeInfo))\n {\n return this.convertAsMap(sourceObject, typeInfo.keyType, typeInfo.elementTypes[0], memberName);\n }\n else if (isTypeTypedArray(typeInfo.selfType))\n {\n return this.convertAsTypedArray(sourceObject);\n }\n else if (typeof sourceObject === \"object\")\n {\n return this.convertAsObject(sourceObject, typeInfo, memberName);\n }\n }\n\n /**\n * Performs the conversion of a typed object (usually a class instance) to a simple javascript object for serialization.\n */\n public convertAsObject(sourceObject: IndexedObject, typeInfo: IScopeTypeInfo, memberName?: string)\n {\n let sourceTypeMetadata: JsonObjectMetadata|undefined;\n let targetObject: IndexedObject;\n\n if (sourceObject.constructor !== typeInfo.selfType && sourceObject instanceof typeInfo.selfType)\n {\n // The source object is not of the expected type, but it is a valid subtype.\n // This is OK, and we'll proceed to gather object metadata from the subtype instead.\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(sourceObject.constructor);\n }\n else\n {\n sourceTypeMetadata = JsonObjectMetadata.getFromConstructor(typeInfo.selfType);\n }\n\n if (sourceTypeMetadata)\n {\n const sourceMeta = sourceTypeMetadata;\n // Strong-typed serialization available.\n // We'll serialize by members that have been marked with @jsonMember (including array/set/map members), and perform recursive conversion on\n // each of them. The converted objects are put on the 'targetObject', which is what will be put into 'JSON.stringify' finally.\n targetObject = {};\n\n sourceTypeMetadata.dataMembers.forEach((memberMetadata) =>\n {\n if (memberMetadata.serializer) {\n targetObject[memberMetadata.name] =\n memberMetadata.serializer(sourceObject[memberMetadata.key]);\n } else if (memberMetadata.ctor) {\n targetObject[memberMetadata.name] = this.convertSingleValue(\n sourceObject[memberMetadata.key],\n {\n selfType: memberMetadata.ctor,\n elementTypes: memberMetadata.elementType,\n keyType: memberMetadata.keyType,\n },\n `${nameof(sourceMeta.classType)}.${memberMetadata.key}`,\n );\n } else {\n throw new TypeError(\n `Could not serialize ${memberMetadata.name}, there is`\n + ` no constructor nor serialization function to use.`,\n );\n }\n });\n }\n else\n {\n // Untyped serialization, \"as-is\", we'll just pass the object on.\n // We'll clone the source object, because type hints are added to the object itself, and we don't want to modify to the original object.\n targetObject = { ...sourceObject };\n }\n\n // Add type-hint.\n this._typeHintEmitter(targetObject, sourceObject, typeInfo.selfType, sourceTypeMetadata);\n\n return targetObject;\n }\n\n /**\n * Performs the conversion of an array of typed objects (or primitive values) to an array of simple javascript objects (or primitive values) for\n * serialization.\n * @param expectedElementType The expected type of elements. If the array is supposed to be multi-dimensional, subsequent elements define lower dimensions.\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsArray(sourceObject: any[], expectedElementType: Function[], memberName = \"object\"): any[]\n {\n if (expectedElementType.length === 0 || !expectedElementType[0])\n throw new TypeError(`Could not serialize ${memberName} as Array: missing element type definition.`);\n\n // Check the type of each element, individually.\n // If at least one array element type is incorrect, we return undefined, which results in no value emitted during serialization.\n // This is so that invalid element types don't unexpectedly alter the ordering of other, valid elements, and that no unexpected undefined values are in\n // the emitted array.\n sourceObject.forEach((element, i) =>\n {\n if (!isInstanceOf(element, expectedElementType[0]))\n {\n const expectedTypeName = nameof(expectedElementType[0]);\n const actualTypeName = nameof(element.constructor);\n throw new TypeError(`Could not serialize ${memberName}[${i}]: expected '${expectedTypeName}', got '${actualTypeName}'.`);\n }\n });\n\n const typeInfoForElements: IScopeTypeInfo = {\n selfType: expectedElementType[0],\n elementTypes: expectedElementType.length > 1 ? expectedElementType.slice(1) : [], // For multidimensional arrays.\n };\n\n if (memberName)\n {\n // Just for debugging purposes.\n memberName += \"[]\";\n }\n\n return sourceObject.map(element => this.convertSingleValue(element, typeInfoForElements, memberName));\n }\n\n /**\n * Performs the conversion of a set of typed objects (or primitive values) into an array of simple javascript objects.\n *\n * @param sourceObject\n * @param expectedElementType The constructor of the expected Set elements (e.g. `Number` for `Set`, or `MyClass` for `Set`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n * @returns\n */\n public convertAsSet(sourceObject: Set, expectedElementType: Function, memberName = \"object\"): any[]\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Set: missing element type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n };\n\n // For debugging and error tracking.\n if (memberName) memberName += \"[]\";\n\n let resultArray: any[] = [];\n\n // Convert each element of the set, and put it into an output array.\n // The output array is the one serialized, as JSON.stringify does not support Set serialization. (TODO: clarification needed)\n sourceObject.forEach(element =>\n {\n let resultElement = this.convertSingleValue(element, elementTypeInfo, memberName);\n\n // Add to output if the source element was undefined, OR the converted element is defined. This will add intentionally undefined values to output,\n // but not values that became undefined DURING serializing (usually because of a type-error).\n if (!isValueDefined(element) || isValueDefined(resultElement))\n {\n resultArray.push(resultElement);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a map of typed objects (or primitive values) into an array of simple javascript objects with `key` and `value` properties.\n *\n * @param sourceObject\n * @param expectedKeyType The constructor of the expected Map keys (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param expectedElementType The constructor of the expected Map values (e.g. `Number` for `Map`, or `MyClass` for `Map`).\n * @param memberName Name of the object being serialized, used for debugging purposes.\n */\n public convertAsMap(sourceObject: Map, expectedKeyType: Function, expectedElementType: Function, memberName = \"object\"): Array<{ key: any, value: any }>\n {\n if (!expectedElementType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing value type definition.`);\n\n if (!expectedKeyType)\n throw new TypeError(`Could not serialize ${memberName} as Map: missing key type definition.`);\n\n let elementTypeInfo: IScopeTypeInfo = {\n selfType: expectedElementType,\n elementTypes: [expectedElementType]\n };\n\n let keyTypeInfo: IScopeTypeInfo = {\n selfType: expectedKeyType\n };\n\n if (memberName) memberName += \"[]\";\n\n let resultArray: Array<{ key: any, value: any }> = [];\n\n // Convert each *entry* in the map to a simple javascript object with key and value properties.\n sourceObject.forEach((value, key) =>\n {\n let resultKeyValuePairObj = {\n key: this.convertSingleValue(key, keyTypeInfo, memberName),\n value: this.convertSingleValue(value, elementTypeInfo, memberName)\n };\n\n // We are not going to emit entries with undefined keys OR undefined values.\n if (isValueDefined(resultKeyValuePairObj.key) && isValueDefined(resultKeyValuePairObj.value))\n {\n resultArray.push(resultKeyValuePairObj);\n }\n });\n\n return resultArray;\n }\n\n /**\n * Performs the conversion of a typed javascript array to a simple untyped javascript array.\n * This is needed because typed arrays are otherwise serialized as objects, so we'll end up with something like \"{ 0: 0, 1: 1, ... }\".\n *\n * @param sourceObject\n * @returns\n */\n public convertAsTypedArray(sourceObject: ArrayBufferView)\n {\n return Array.from(sourceObject as any);\n }\n\n /**\n * Performs the conversion of a raw ArrayBuffer to a string.\n */\n public convertAsArrayBuffer(buffer: ArrayBuffer)\n {\n // ArrayBuffer -> 16-bit character codes -> character array -> joined string.\n return Array.from(new Uint16Array(buffer)).map(charCode => String.fromCharCode(charCode)).join(\"\");\n }\n\n /**\n * Performs the conversion of DataView, converting its internal ArrayBuffer to a string and returning that string.\n */\n public convertAsDataView(dataView: DataView)\n {\n return this.convertAsArrayBuffer(dataView.buffer);\n }\n}\n","import { Constructor, ParameterlessConstructor } from \"./types\";\nimport { METADATA_FIELD_KEY } from \"./helpers\";\nimport { JsonObjectMetadata } from \"./metadata\";\n\nexport interface IJsonObjectOptionsBase\n{\n /**\n * An array of known types to recognize when encountering type-hints,\n * or the name of a static method used for determining known types.\n */\n knownTypes?: Function[] | string;\n\n /**\n * The name of a static or instance method to call when deserialization\n * of the object is completed.\n */\n onDeserialized?: string;\n\n /**\n * The name used to differentiate between different polymorphic types.\n */\n name?: string;\n}\n\nexport interface IJsonObjectOptionsWithInitializer extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer: (sourceObject: T, rawSourceObject: T) => T;\n}\n\nexport interface IJsonObjectOptions extends IJsonObjectOptionsBase\n{\n /**\n * The name of a static method to call before deserializing and initializing the object, accepting two arguments: (1) sourceObject, an 'Object' instance\n * with all properties already deserialized, and (2) rawSourceObject, a raw 'Object' instance representation of the current object in the serialized JSON\n * (i.e. without deserialized properties).\n */\n initializer?: (sourceObject: T, rawSourceObject: T) => T;\n}\n\n/**\n * Marks that a class with a parameterized constructor is serializable using TypedJSON, with additional settings. The 'initializer' setting must be specified.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptionsWithInitializer): (target: Constructor) => void;\n\n/**\n * Marks that a class is serializable using TypedJSON, with additional settings.\n * @param options Configuration settings.\n */\nexport function jsonObject(options?: IJsonObjectOptions): (target: ParameterlessConstructor) => void;\n\n/**\n * Marks that a class with a parameterless constructor is serializable using TypedJSON.\n */\nexport function jsonObject(target: ParameterlessConstructor): void;\n\nexport function jsonObject(optionsOrTarget?: IJsonObjectOptions | Constructor\n): ((target: Constructor) => void) | void {\n let options: IJsonObjectOptions;\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n options = {};\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n options = optionsOrTarget || {};\n }\n\n function decorator(\n target: Function\n ): void {\n let objectMetadata: JsonObjectMetadata;\n\n // Create or obtain JsonObjectMetadata object.\n if (!target.prototype.hasOwnProperty(METADATA_FIELD_KEY))\n {\n // Target has no JsonObjectMetadata associated with it yet, create it now.\n objectMetadata = new JsonObjectMetadata(target);\n\n // Inherit json members and known types from parent @jsonObject (if any).\n const parentMetadata: JsonObjectMetadata = target.prototype[METADATA_FIELD_KEY];\n if (parentMetadata)\n {\n parentMetadata.dataMembers\n .forEach((memberMetadata, propKey) =>\n objectMetadata.dataMembers.set(propKey, memberMetadata));\n parentMetadata.knownTypes\n .forEach((knownType) => objectMetadata.knownTypes.add(knownType));\n }\n\n Object.defineProperty(target.prototype, METADATA_FIELD_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: objectMetadata\n });\n }\n else\n {\n // Target already has JsonObjectMetadata associated with it.\n objectMetadata = target.prototype[METADATA_FIELD_KEY];\n objectMetadata.classType = target;\n }\n\n // Fill JsonObjectMetadata.\n objectMetadata.isExplicitlyMarked = true;\n objectMetadata.onDeserializedMethodName = options.onDeserialized;\n // T extend Object so it is fine\n objectMetadata.initializerCallback = options.initializer as any;\n if (options.name)\n {\n objectMetadata.name = options.name;\n }\n\n // Obtain known-types.\n if (typeof options.knownTypes === \"string\")\n {\n objectMetadata.knownTypeMethodName = options.knownTypes;\n }\n else if (options.knownTypes instanceof Array)\n {\n options.knownTypes\n .filter(knownType => !!knownType)\n .forEach(knownType => objectMetadata.knownTypes.add(knownType));\n }\n }\n\n if (typeof optionsOrTarget === \"function\")\n {\n // jsonObject is being used as a decorator, directly.\n decorator(optionsOrTarget);\n }\n else\n {\n // jsonObject is being used as a decorator factory.\n return decorator;\n }\n}\n","import {\n nameof, logError, isReflectMetadataSupported, isValueDefined, logWarning, isSubtypeOf\n} from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMemberOptions\n{\n /**\n * Sets the constructor of the property.\n * Optional with ReflectDecorators.\n */\n constructor?: Function;\n\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted if the property is uninitialized/undefined. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name. */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property is part of the object when serializing, with additional options.\n * Omitting the 'constructor' option requires ReflectDecorators and that the property type is always explicitly declared.\n * @param options Additional options.\n */\nexport function jsonMember(options: IJsonMemberOptions): PropertyDecorator;\n\n/**\n * Specifies that a property is part of the object when serializing.\n * This call signature requires ReflectDecorators and that the property type is always explicitly declared.\n */\nexport function jsonMember(target: Object, propertyKey: string | symbol): void;\n\nexport function jsonMember(optionsOrTarget?: IJsonMemberOptions | Object, propKey?: string | symbol): PropertyDecorator | void\n{\n if (optionsOrTarget instanceof Object && (typeof propKey === \"string\" || typeof propKey === \"symbol\"))\n {\n const target = optionsOrTarget;\n // For error messages.\n const decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(propKey)}`;\n\n // jsonMember used directly, no additional information directly available besides target and propKey.\n // Obtain property constructor through ReflectDecorators.\n if (isReflectMetadataSupported)\n {\n const reflectPropCtor = Reflect.getMetadata(\"design:type\", target, propKey) as Function;\n\n if (!reflectPropCtor)\n {\n logError(`${decoratorName}: could not resolve detected property constructor at runtime.`);\n return;\n }\n\n if (isSpecialPropertyType(decoratorName, reflectPropCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: reflectPropCtor,\n key: propKey.toString(),\n name: propKey.toString(),\n });\n }\n else\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n else\n {\n // jsonMember used as a decorator factory.\n return (target: Object, _propKey: string | symbol) =>\n {\n let options: IJsonMemberOptions = optionsOrTarget || {};\n let propCtor: Function|undefined;\n let decoratorName = `@jsonMember on ${nameof(target.constructor)}.${String(_propKey)}`; // For error messages.\n\n if (options.hasOwnProperty(\"constructor\"))\n {\n if (!isValueDefined(options.constructor))\n {\n logError(`${decoratorName}: cannot resolve specified property constructor at runtime.`);\n return;\n }\n\n // Property constructor has been specified. Use ReflectDecorators (if available) to check whether that constructor is correct. Warn if not.\n if (isReflectMetadataSupported && !isSubtypeOf(options.constructor, Reflect.getMetadata(\"design:type\", target, _propKey)))\n {\n logWarning(`${decoratorName}: detected property type does not match 'constructor' option.`);\n }\n\n propCtor = options.constructor;\n }\n else\n {\n // Use ReflectDecorators to obtain property constructor.\n if (isReflectMetadataSupported)\n {\n propCtor = Reflect.getMetadata(\"design:type\", target, _propKey) as Function;\n\n if (!propCtor)\n {\n logError(`${decoratorName}: cannot resolve detected property constructor at runtime.`);\n return;\n }\n }\n else if (!options.deserializer)\n {\n logError(`${decoratorName}: ReflectDecorators is required if no 'constructor' option is specified.`);\n return;\n }\n }\n\n if (isSpecialPropertyType(decoratorName, propCtor))\n {\n return;\n }\n\n injectMetadataInformation(target, _propKey, {\n ctor: propCtor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: _propKey.toString(),\n name: options.name || _propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n }\n}\n\nfunction isSpecialPropertyType(decoratorName: string, propCtor?: Function)\n{\n if (propCtor === Array)\n {\n logError(`${decoratorName}: property is an Array. Use the jsonArrayMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Set)\n {\n logError(`${decoratorName}: property is a Set. Use the jsonSetMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n if (propCtor === Map)\n {\n logError(`${decoratorName}: property is a Map. Use the jsonMapMember decorator to`\n + ` serialize this property.`);\n return true;\n }\n\n return false;\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonArrayMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, an empty array is emitted if the property is undefined/uninitialized. */\n emitDefaultValue?: boolean;\n\n /** Sets array dimensions (e.g. 1 for 'number[]' or 2 for 'number[][]'). Defaults to 1. */\n dimensions?: number;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that a property, of type array, is part of an object when serializing.\n * @param elementConstructor Constructor of array elements (e.g. 'Number' for 'number[]', or 'Date' for 'Date[]').\n * @param options Additional options.\n */\nexport function jsonArrayMember(elementConstructor: Function, options: IJsonArrayMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonArrayMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of array elements at runtime.`);\n return;\n }\n\n const dimensions = options.dimensions === undefined ? 1 : options.dimensions;\n if (!isNaN(dimensions) && dimensions < 1)\n {\n logError(`${decoratorName}: 'dimensions' option must be at least 1.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonArrayMember' has been used on an array.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Array)\n {\n logError(`${decoratorName}: property is not an Array.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Array,\n elementType: createArrayElementType(elementConstructor, dimensions),\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n\nfunction createArrayElementType(elementCtor: Function, dimensions: number) {\n const elementTypes = new Array(dimensions).fill(Array, 0, -1);\n elementTypes[dimensions-1] = elementCtor;\n return elementTypes;\n}\n","import { nameof } from \"./helpers\";\nimport { IJsonMemberOptions } from \"./json-member\";\nimport { JsonMemberMetadata, JsonObjectMetadata, injectMetadataInformation } from \"./metadata\";\nimport * as Helpers from \"./helpers\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonSetMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Set.\n * @param elementConstructor Constructor of set elements (e.g. 'Number' for Set or 'Date' for Set).\n * @param options Additional options.\n */\nexport function jsonSetMember(elementConstructor: Function, options: IJsonSetMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n var decoratorName = `@jsonSetMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof elementConstructor !== \"function\")\n {\n Helpers.logError(`${decoratorName}: could not resolve constructor of set elements at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonSetMember' has been used on a set. Warn if not.\n if (Helpers.isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Set)\n {\n Helpers.logError(`${decoratorName}: property is not a Set.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Set,\n elementType: [elementConstructor],\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, isReflectMetadataSupported } from \"./helpers\";\nimport { injectMetadataInformation } from \"./metadata\";\n\ndeclare abstract class Reflect\n{\n public static getMetadata(metadataKey: string, target: any, targetKey: string | symbol): any;\n}\n\nexport interface IJsonMapMemberOptions\n{\n /** When set, indicates that the member must be present when deserializing. */\n isRequired?: boolean;\n\n /** When set, a default value is emitted for each uninitialized json member. */\n emitDefaultValue?: boolean;\n\n /** When set, the key on the JSON that should be used instead of the class property name */\n name?: string;\n\n /** When set, this deserializer will be used to deserialize the member. The callee must assure the correct type. */\n deserializer?: (json: any) => any;\n\n /** When set, this serializer will be used to serialize the member. */\n serializer?: (value: any) => any;\n}\n\n/**\n * Specifies that the property is part of the object when serializing.\n * Use this decorator on properties of type Map.\n * @param keyConstructor Constructor of map keys (e.g. 'Number' for 'Map').\n * @param valueConstructor Constructor of map values (e.g. 'Date' for 'Map').\n * @param options Additional options.\n */\nexport function jsonMapMember(keyConstructor: Function, valueConstructor: Function, options: IJsonMapMemberOptions = {})\n{\n return (target: Object, propKey: string | symbol) =>\n {\n let decoratorName = `@jsonMapMember on ${nameof(target.constructor)}.${String(propKey)}`; // For error messages.\n\n if (typeof keyConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map keys at runtime.`);\n return;\n }\n\n if (typeof valueConstructor !== \"function\")\n {\n logError(`${decoratorName}: could not resolve constructor of map values at runtime.`);\n return;\n }\n\n // If ReflectDecorators is available, use it to check whether 'jsonMapMember' has been used on a map. Warn if not.\n if (isReflectMetadataSupported && Reflect.getMetadata(\"design:type\", target, propKey) !== Map)\n {\n logError(`${decoratorName}: property is not a Map.`);\n return;\n }\n\n injectMetadataInformation(target, propKey, {\n ctor: Map,\n elementType: [valueConstructor],\n keyType: keyConstructor,\n emitDefaultValue: options.emitDefaultValue || false,\n isRequired: options.isRequired || false,\n key: propKey.toString(),\n name: options.name || propKey.toString(),\n deserializer: options.deserializer,\n serializer: options.serializer,\n });\n };\n}\n","import { nameof, logError, logWarning, parseToJSObject } from './typedjson/helpers';\nimport { Constructor } from \"./typedjson/types\";\nimport { JsonObjectMetadata } from \"./typedjson/metadata\";\nimport { Deserializer } from \"./typedjson/deserializer\";\nimport { Serializer } from \"./typedjson/serializer\";\n\nexport type JsonTypes = Object|boolean|string|number|null|undefined;\n\nexport interface ITypedJSONSettings\n{\n /**\n * Sets the handler callback to invoke on errors during serializing and deserializing.\n * Re-throwing errors in this function will halt serialization/deserialization.\n * The default behavior is to log errors to the console.\n */\n errorHandler?: (e: Error) => void;\n\n /**\n * Sets a callback that determines the constructor of the correct sub-type of polymorphic\n * objects while deserializing.\n * The default behavior is to read the type-name from the '__type' property of 'sourceObject',\n * and look it up in 'knownTypes'.\n * The constructor of the sub-type should be returned.\n */\n typeResolver?: (sourceObject: Object, knownTypes: Map) => Function;\n\n nameResolver?: (ctor: Function) => string;\n\n /**\n * Sets a callback that writes type-hints to serialized objects.\n * The default behavior is to write the type-name to the '__type' property, if a derived type\n * is present in place of a base type.\n */\n typeHintEmitter?:\n (targetObject: Object, sourceObject: Object, expectedSourceType: Function) => void;\n\n /**\n * Sets the amount of indentation to use in produced JSON strings.\n * Default value is 0, or no indentation.\n */\n indent?: number;\n\n replacer?: (key: string, value: any) => any;\n\n knownTypes?: Array>;\n}\n\nexport class TypedJSON\n{\n //#region Static\n public static parse(\n object: any, rootType: Constructor, settings?: ITypedJSONSettings,\n ): T|undefined {\n return new TypedJSON(rootType, settings).parse(object);\n }\n\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: 1\n ): T[];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 2\n ): T[][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 3\n ): T[][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 4\n ): T[][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings: ITypedJSONSettings|undefined,\n dimensions: 5\n ): T[][][][][];\n public static parseAsArray(\n object: any,\n elementType: Constructor,\n settings?: ITypedJSONSettings,\n dimensions?: number\n ): any[] {\n return new TypedJSON(elementType, settings).parseAsArray(object, dimensions as any);\n }\n\n public static parseAsSet(\n object: any, elementType: Constructor, settings?: ITypedJSONSettings,\n ): Set {\n return new TypedJSON(elementType, settings).parseAsSet(object);\n }\n\n public static parseAsMap(\n object: any,\n keyType: Constructor,\n valueType: Constructor,\n settings?: ITypedJSONSettings,\n ): Map {\n return new TypedJSON(valueType, settings).parseAsMap(object, keyType);\n }\n\n public static toPlainJson(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): JsonTypes {\n return new TypedJSON(rootType, settings).toPlainJson(object);\n }\n\n public static toPlainArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): Object[];\n public static toPlainArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): Object[][];\n public static toPlainArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): Object[][][];\n public static toPlainArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): Object[][][][];\n public static toPlainArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): Object[][][][][];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): any[];\n public static toPlainArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): any[] {\n return new TypedJSON(elementType, settings).toPlainArray(object, dimensions);\n }\n\n public static toPlainSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static toPlainMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n public static stringify(\n object: T, rootType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(rootType, settings).stringify(object);\n }\n\n public static stringifyAsArray(\n object: T[], elementType: Constructor, dimensions?: 1, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][], elementType: Constructor, dimensions: 2, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][], elementType: Constructor, dimensions: 3, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][], elementType: Constructor, dimensions: 4, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: T[][][][][], elementType: Constructor, dimensions: 5, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions: number, settings?: ITypedJSONSettings,\n ): string;\n public static stringifyAsArray(\n object: any[], elementType: Constructor, dimensions?: any, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsArray(object, dimensions);\n }\n\n public static stringifyAsSet(\n object: Set, elementType: Constructor, settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(elementType, settings).stringifyAsSet(object);\n }\n\n public static stringifyAsMap(\n object: Map,\n keyCtor: Constructor,\n valueCtor: Constructor,\n settings?: ITypedJSONSettings,\n ): string {\n return new TypedJSON(valueCtor, settings).stringifyAsMap(object, keyCtor);\n }\n\n private static _globalConfig: ITypedJSONSettings;\n\n public static setGlobalConfig(config: ITypedJSONSettings)\n {\n if (this._globalConfig)\n {\n Object.assign(this._globalConfig, config);\n }\n else\n {\n this._globalConfig = config;\n }\n }\n\n //#endregion\n\n private serializer: Serializer = new Serializer();\n private deserializer: Deserializer = new Deserializer();\n private globalKnownTypes: Array> = [];\n private indent: number = 0;\n private rootConstructor: Constructor;\n private errorHandler: (e: Error) => void;\n private nameResolver: (ctor: Function) => string;\n private replacer?: (key: string, value: any) => any;\n\n /**\n * Creates a new TypedJSON instance to serialize (stringify) and deserialize (parse) object\n * instances of the specified root class type.\n * @param rootType The constructor of the root class type.\n * @param settings Additional configuration settings.\n */\n constructor(rootConstructor: Constructor, settings?: ITypedJSONSettings)\n {\n let rootMetadata = JsonObjectMetadata.getFromConstructor(rootConstructor);\n\n if (!rootMetadata || (!rootMetadata.isExplicitlyMarked && !rootMetadata.isHandledWithoutAnnotation))\n {\n throw new TypeError(\"The TypedJSON root data type must have the @jsonObject decorator used.\");\n }\n\n this.nameResolver = (ctor) => nameof(ctor);\n this.rootConstructor = rootConstructor;\n this.errorHandler = (error) => logError(error);\n\n if (settings)\n {\n this.config(settings);\n }\n else if (TypedJSON._globalConfig)\n {\n this.config({});\n }\n }\n\n /**\n * Configures TypedJSON through a settings object.\n * @param settings The configuration settings object.\n */\n public config(settings: ITypedJSONSettings)\n {\n if (TypedJSON._globalConfig)\n {\n settings = {\n ...TypedJSON._globalConfig,\n ...settings\n };\n\n if (settings.knownTypes && TypedJSON._globalConfig.knownTypes)\n {\n // Merge known-types (also de-duplicate them, so Array -> Set -> Array).\n settings.knownTypes = Array.from(new Set(\n settings.knownTypes.concat(TypedJSON._globalConfig.knownTypes),\n ));\n }\n }\n\n if (settings.errorHandler)\n {\n this.errorHandler = settings.errorHandler;\n this.deserializer.setErrorHandler(settings.errorHandler);\n this.serializer.setErrorHandler(settings.errorHandler);\n }\n\n if (settings.replacer) this.replacer = settings.replacer;\n if (settings.typeResolver) this.deserializer.setTypeResolver(settings.typeResolver);\n if (settings.typeHintEmitter) this.serializer.setTypeHintEmitter(settings.typeHintEmitter);\n if (settings.indent) this.indent = settings.indent;\n\n if (settings.nameResolver)\n {\n this.nameResolver = settings.nameResolver;\n this.deserializer.setNameResolver(settings.nameResolver);\n // this.serializer.set\n }\n\n if (settings.knownTypes)\n {\n // Type-check knownTypes elements to recognize errors in advance.\n settings.knownTypes.forEach((knownType, i) =>\n {\n // tslint:disable-next-line:no-null-keyword\n if (typeof knownType === \"undefined\" || knownType === null)\n {\n logWarning(\n `TypedJSON.config: 'knownTypes' contains an undefined/null value (element ${i}).`);\n }\n });\n\n this.globalKnownTypes = settings.knownTypes;\n }\n }\n\n /**\n * Converts a JSON string to the root class type.\n * @param object The JSON to parse and convert.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns Deserialized T or undefined if there were errors.\n */\n public parse(object: any): T|undefined\n {\n const json = parseToJSObject(object, this.rootConstructor);\n\n let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor);\n let result: T|undefined;\n let knownTypes = new Map();\n\n this.globalKnownTypes.filter(ktc => ktc).forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n\n if (rootMetadata)\n {\n rootMetadata.knownTypes.forEach(knownTypeCtor =>\n {\n knownTypes.set(this.nameResolver(knownTypeCtor), knownTypeCtor);\n });\n }\n\n try\n {\n result = this.deserializer.convertSingleValue(json, {\n selfConstructor: this.rootConstructor,\n knownTypes: knownTypes,\n }) as T;\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n\n return result;\n }\n\n public parseAsArray(object: any, dimensions?: 1): T[];\n public parseAsArray(object: any, dimensions: 2): T[][];\n public parseAsArray(object: any, dimensions: 3): T[][][];\n public parseAsArray(object: any, dimensions: 4): T[][][][];\n public parseAsArray(object: any, dimensions: 5): T[][][][][];\n public parseAsArray(object: any, dimensions: number): any[];\n public parseAsArray(object: any, dimensions: number = 1): any[]\n {\n const json = parseToJSObject(object, Array);\n if (json instanceof Array)\n {\n return this.deserializer.convertAsArray(json, {\n selfConstructor: Array,\n elementConstructor: new Array(dimensions - 1)\n .fill(Array)\n .concat(this.rootConstructor),\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define an Array`\n + `, but got ${typeof json}.`));\n }\n\n return [];\n }\n\n public parseAsSet(object: any): Set\n {\n const json = parseToJSObject(object, Set);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsSet(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes)\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Set();\n }\n\n public parseAsMap(object: any, keyConstructor: Constructor): Map\n {\n const json = parseToJSObject(object, Map);\n // A Set is serialized as T[].\n if (json instanceof Array)\n {\n return this.deserializer.convertAsMap(json, {\n selfConstructor: Array,\n elementConstructor: [this.rootConstructor],\n knownTypes: this._mapKnownTypes(this.globalKnownTypes),\n keyConstructor: keyConstructor\n });\n }\n else\n {\n this.errorHandler(new TypeError(`Expected 'json' to define a Set (using an Array)`\n + `, but got ${typeof json}.`,\n ));\n }\n\n return new Map();\n }\n\n /**\n * Converts an instance of the specified class type to a plain JSON object.\n * @param object The instance to convert to a JSON string.\n * @returns Serialized object or undefined if an error has occured.\n */\n public toPlainJson(object: T): JsonTypes\n {\n try\n {\n return this.serializer.convertSingleValue(object, {\n selfType: this.rootConstructor\n });\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainArray(object: T[], dimensions?: 1): Object[];\n public toPlainArray(object: T[][], dimensions: 2): Object[][];\n public toPlainArray(object: T[][][], dimensions: 3): Object[][][];\n public toPlainArray(object: T[][][][], dimensions: 4): Object[][][][];\n public toPlainArray(object: T[][][][][], dimensions: 5): Object[][][][][];\n public toPlainArray(object: any[], dimensions: 1|2|3|4|5 = 1): Object[]|undefined\n {\n try\n {\n const elementConstructorArray =\n new Array(dimensions - 1).fill(Array).concat(this.rootConstructor);\n return this.serializer.convertAsArray(object, elementConstructorArray);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainSet(object: Set): Object[]|undefined\n {\n try\n {\n return this.serializer.convertAsSet(object, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n public toPlainMap(object: Map, keyConstructor: Constructor): { key: any, value: any }[]|undefined\n {\n try\n {\n return this.serializer.convertAsMap(object, keyConstructor, this.rootConstructor);\n }\n catch (e)\n {\n this.errorHandler(e);\n }\n }\n\n /**\n * Converts an instance of the specified class type to a JSON string.\n * @param object The instance to convert to a JSON string.\n * @throws Error if any errors are thrown in the specified errorHandler callback (re-thrown).\n * @returns String with the serialized object or an empty string if an error has occured, but\n * the errorHandler did not throw.\n */\n public stringify(object: T): string\n {\n const result = this.toPlainJson(object);\n if (result === undefined) {\n return '';\n }\n return JSON.stringify(result, this.replacer, this.indent);\n }\n\n public stringifyAsArray(object: T[], dimensions?: 1): string;\n public stringifyAsArray(object: T[][], dimensions: 2): string;\n public stringifyAsArray(object: T[][][], dimensions: 3): string;\n public stringifyAsArray(object: T[][][][], dimensions: 4): string;\n public stringifyAsArray(object: T[][][][][], dimensions: 5): string;\n public stringifyAsArray(object: any[], dimensions: any): string\n {\n return JSON.stringify(this.toPlainArray(object, dimensions), this.replacer, this.indent);\n }\n\n public stringifyAsSet(object: Set): string\n {\n return JSON.stringify(this.toPlainSet(object), this.replacer, this.indent);\n }\n\n public stringifyAsMap(object: Map, keyConstructor: Constructor): string\n {\n return JSON.stringify(this.toPlainMap(object, keyConstructor), this.replacer, this.indent);\n }\n\n private _mapKnownTypes(constructors: Array>)\n {\n let map = new Map>();\n\n constructors.filter(ctor => ctor).forEach(ctor => map.set(this.nameResolver(ctor), ctor));\n\n return map;\n }\n}\n\nexport { jsonObject } from \"./typedjson/json-object\";\nexport { jsonMember } from \"./typedjson/json-member\";\nexport { jsonArrayMember } from \"./typedjson/json-array-member\";\nexport { jsonSetMember } from \"./typedjson/json-set-member\";\nexport { jsonMapMember } from \"./typedjson/json-map-member\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/typedjson/helpers.d.ts b/js/typedjson/helpers.d.ts index 8ab697a..96a95a7 100644 --- a/js/typedjson/helpers.d.ts +++ b/js/typedjson/helpers.d.ts @@ -11,6 +11,7 @@ export declare function isDirectlySerializableNativeType(type: Function): boolea export declare function isTypeTypedArray(type: Function): boolean; export declare function isPrimitiveValue(obj: any): boolean; export declare function isObject(value: any): value is Object; +export declare function parseToJSObject(json: any, expectedType: Function): Object; /** * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B'). * @param A The supposed derived type. diff --git a/spec/just-json.spec.ts b/spec/just-json.spec.ts new file mode 100644 index 0000000..173ae85 --- /dev/null +++ b/spec/just-json.spec.ts @@ -0,0 +1,94 @@ +import { jsonArrayMember, jsonMember, jsonObject, TypedJSON } from "../js/typedjson"; + +describe('json (without automatic stringify)', function () { + describe('string', function () { + it('should deserialize', function () { + // stringified json version cuz "" + expect(TypedJSON.parse('"str"', String)).toEqual('str'); + // already parsed + expect(TypedJSON.parse('str', String)).toEqual('str'); + + // because we detect naively + try { + expect(TypedJSON.parse('"sdfs"fdsf"', String)).toEqual(undefined); + fail(); + } catch(e) {} + }); + + it('should serialize', function () { + expect(TypedJSON.toPlainJson('str', String)).toEqual('str'); + }); + }); + + describe('rest of primitives', function () { + it('should deserialize', function () { + expect(TypedJSON.parse(45834, Number)).toEqual(45834); + expect(TypedJSON.parse(true, Boolean)).toEqual(true); + expect(TypedJSON.parse(1543915254, Date)).toEqual(new Date(1543915254)); + expect(TypedJSON.parse('1970-01-18T20:51:55.254Z', Date)).toEqual(new Date(1543915254)); + + const dataBuffer = Uint8Array.from([100, 117, 112, 97]) as any; + expect(TypedJSON.parse('畤慰', ArrayBuffer)).toEqual(dataBuffer); + expect(TypedJSON.parse('畤慰', DataView)).toEqual(dataBuffer); + expect(TypedJSON.parse([100, 117, 112, 97], Uint8Array)).toEqual(dataBuffer); + }); + + it('should serialize', function () { + expect(TypedJSON.toPlainJson(45834, Number)).toEqual(45834); + expect(TypedJSON.toPlainJson(true, Boolean)).toEqual(true); + const dateMs = new Date(1543915254); + expect(TypedJSON.toPlainJson(dateMs, Date)).toEqual(dateMs); + const dateStr = new Date('2018-12-04T09:20:54'); + expect(TypedJSON.toPlainJson(dateStr, Date)).toEqual(dateStr); + + const buffer = new ArrayBuffer(4); + const view = new DataView(buffer); + view.setInt8(0, 100); + view.setInt8(1, 117); + view.setInt8(2, 112); + view.setInt8(3, 97); + expect(TypedJSON.toPlainJson(buffer, ArrayBuffer)).toEqual('畤慰'); + expect(TypedJSON.toPlainJson(view, DataView)).toEqual('畤慰'); + expect(TypedJSON.toPlainJson(new Uint8Array(buffer), Uint8Array)).toEqual([100, 117, 112, 97]); + }); + }); + + describe('object', function () { + + @jsonObject + class SomeThing { + @jsonMember + propStr: String; + @jsonMember + propNum: number; + @jsonArrayMember(String) + propArr: String[]; + } + + const json = Object.freeze({ + propStr: 'dsgs', + propNum: 653, + propArr: ['dslfks'], + }); + + it('should deserialize', function () { + expect(TypedJSON.parse(json, SomeThing)).toEqual(Object.assign(new SomeThing(), json)); + expect(TypedJSON.parseAsArray([json], SomeThing)).toEqual([Object.assign(new SomeThing(), json)]); + }); + + it('should serialize', function () { + expect(TypedJSON.toPlainJson(Object.assign(new SomeThing(), json), SomeThing)).toEqual(json); + expect(TypedJSON.toPlainArray([Object.assign(new SomeThing(), json)], SomeThing)).toEqual([json]); + }); + }); + + describe('array', function () { + it('should deserialize', function () { + expect(TypedJSON.parseAsArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); + }); + + it('should serialize', function () { + expect(TypedJSON.toPlainArray(['alas', 'dfsd'], String)).toEqual(['alas', 'dfsd']); + }); + }); +}); diff --git a/spec/parse-to-object.spec.ts b/spec/parse-to-object.spec.ts new file mode 100644 index 0000000..e16cbc5 --- /dev/null +++ b/spec/parse-to-object.spec.ts @@ -0,0 +1,58 @@ +import { parseToJSObject } from '../src/typedjson/helpers'; + +describe("parse To Object", function () { + it("should passthrough objects", function () { + const obj = { + a: 1, + b: 2, + }; + + const obj2 = parseToJSObject(obj, Object); + expect(obj2).toBe(obj); + }); + + it("should passthrough arrays", function () { + const arr = [{ + a: 1, + b: 2, + }]; + + const arr2 = parseToJSObject(arr, Array); + expect(arr2).toBe(arr); + }); + + it("should parse object string", function () { + const arr = { + a: 1, + b: 2, + }; + + const arr2 = parseToJSObject(JSON.stringify(arr), Object); + expect(arr2).toEqual(arr); + }); + + it("should passthrough primitives", function () { + expect(parseToJSObject(1, Number)).toBe(1); + expect(parseToJSObject(false, Boolean)).toBe(false); + }); + + it("should parse strings with quotes, but passthrough other", function () { + // string is obvious + expect(parseToJSObject('"I am a string"', String)).toEqual('I am a string'); + expect(parseToJSObject('just a string', String)).toBe('just a string'); + // but also the types that are serialized to string + expect(parseToJSObject('"1970-01-18T20:51:55.254Z"', Date)).toEqual('1970-01-18T20:51:55.254Z'); + expect(parseToJSObject('1970-01-18T20:51:55.254Z', Date)).toBe('1970-01-18T20:51:55.254Z'); + expect(parseToJSObject('"畤慰"', ArrayBuffer)).toEqual('畤慰'); + expect(parseToJSObject('畤慰', ArrayBuffer)).toBe('畤慰'); + expect(parseToJSObject('"畤慰"', DataView)).toEqual('畤慰'); + expect(parseToJSObject('畤慰', DataView)).toBe('畤慰'); + }); + + it("should passthrough builtins", function () { + const date = new Date; + expect(parseToJSObject(date, Date)).toBe(date); + const buffer = new ArrayBuffer(3); + expect(parseToJSObject(buffer, ArrayBuffer)).toBe(buffer); + }); +}); diff --git a/src/typedjson.ts b/src/typedjson.ts index 5665dc4..04b7fe7 100644 --- a/src/typedjson.ts +++ b/src/typedjson.ts @@ -1,4 +1,4 @@ -import { nameof, logError, logWarning } from './typedjson/helpers'; +import { nameof, logError, logWarning, parseToJSObject } from './typedjson/helpers'; import { Constructor } from "./typedjson/types"; import { JsonObjectMetadata } from "./typedjson/metadata"; import { Deserializer } from "./typedjson/deserializer"; @@ -318,7 +318,7 @@ export class TypedJSON */ public parse(object: any): T|undefined { - const json = JSON.parse(object); + const json = parseToJSObject(object, this.rootConstructor); let rootMetadata = JsonObjectMetadata.getFromConstructor(this.rootConstructor); let result: T|undefined; @@ -360,7 +360,7 @@ export class TypedJSON public parseAsArray(object: any, dimensions: number): any[]; public parseAsArray(object: any, dimensions: number = 1): any[] { - const json = JSON.parse(object); + const json = parseToJSObject(object, Array); if (json instanceof Array) { return this.deserializer.convertAsArray(json, { @@ -382,7 +382,7 @@ export class TypedJSON public parseAsSet(object: any): Set { - const json = JSON.parse(object); + const json = parseToJSObject(object, Set); // A Set is serialized as T[]. if (json instanceof Array) { @@ -404,7 +404,7 @@ export class TypedJSON public parseAsMap(object: any, keyConstructor: Constructor): Map { - const json = JSON.parse(object); + const json = parseToJSObject(object, Map); // A Set is serialized as T[]. if (json instanceof Array) { diff --git a/src/typedjson/helpers.ts b/src/typedjson/helpers.ts index f409e9f..71c4a24 100644 --- a/src/typedjson/helpers.ts +++ b/src/typedjson/helpers.ts @@ -60,6 +60,25 @@ export function isObject(value: any): value is Object return typeof value === "object"; } +function shouldOmitParseString(jsonStr: string, expectedType: Function): boolean { + const expectsTypesSerializedAsStrings = expectedType === String + || expectedType === ArrayBuffer + || expectedType === DataView; + + const hasQuotes = jsonStr.length >= 2 && jsonStr[0] === '"' && jsonStr[jsonStr.length-1] === '"'; + const isInteger = /^\d+$/.test(jsonStr.trim()); + + return (expectsTypesSerializedAsStrings && !hasQuotes) || ((!hasQuotes && !isInteger) && expectedType === Date); +} + +export function parseToJSObject(json: any, expectedType: Function): Object { + if (typeof json !== 'string' || shouldOmitParseString(json, expectedType)) + { + return json; + } + return JSON.parse(json); +} + /** * Determines if 'A' is a sub-type of 'B' (or if 'A' equals 'B'). * @param A The supposed derived type.